Ликбез по Lua

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ликбез по Lua

Post by John Doe »

В данной теме задаём вопросы по Lua.

Для того, чтобы получить начальное представление о языке достаточно почитать какую-нибудь короткую обзорную статью, например:
Для более близкого знакомства рекомендую эти документы:
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Ликбез по Lua

Post by gotar »

Latest post of the previous page:

Вы пробовали? Может подскажите где посмотреть пример
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

gotar, как это сделано в в модуле dialog:
  1. -- item_map - таблица соответствия "внутреннего" имени (тут - номера элемента) и "внешнего" (имени проперти).
  2.  
  3. -- И - да, я пробовал.
  4.  
  5. local item_meta = {
  6.  
  7.   __index    = function (self, key)
  8.  
  9.                  local ind = item_map[key]
  10.  
  11.                  return rawget (self, ind) or ind
  12.  
  13.                end,
  14.  
  15.   __newindex = function (self, key, val)
  16.  
  17.                  rawset (self, item_map[key] or key, val)
  18.  
  19.                end,
  20.  
  21. }
  22.  
  23. setmetatable (item, item_meta)
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Ликбез по Lua

Post by zg »

gotar wrote: Mon 10 Aug, 2020 18:02 Вы пробовали? Может подскажите где посмотреть пример
что там пробовать, там две строчки кода:

Code: Select all

local tr=function(key) return key=='ln' and 'longname' or key end
local test=setmetatable({},{__newindex=function(table,key,value) key=tr(key);rawset(table,key,value) end,__index=function(table,key) key=tr(key);return rawget(table,key) end})
test.longname='hello'
far.Show(test.ln)
test.ln='world'
far.Show(test.longname)
User avatar
raven428
Posts: 51
Joined: Sat 28 Mar, 2009 11:17
Has thanked: 10 times
Been thanked: 1 time

Ликбез по Lua

Post by raven428 »

Подскажите, пожалуйста, что поправить, чтобы кодировка правильная передавалась?

Code: Select all

CommandLine {
 description = 'run with new conemu window';
 prefixes = "emc";
 action = function(prefix, text)
  os.execute(
   'start conemu64 -run ' .. text ..
   ' -cur_console:cd:"' .. panel.GetPanelDirectory(nil, 1).Name .. '"'
  );
 end;
}
На запуск комстроки "emc:echo тестовая строчка" в новом окне выводится "тестовая строчка". Заранее спасибо.
too much raVen over paradise...
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

Попробуйте перед строкой os.execute… вставить строку

Code: Select all

  text = win.WideCharToMultiByte(win.MultiByteToWideChar(text, 65001), win.GetACP())
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

Указанная строка переводит text в кодировку ASCII.
1. Так у меня работает
2. Почему работает - непонятно: chcp возвращает кодировку консоли 866; т.е. надо переводить строку из UTF8 не в ASCII, а в OEM. Видимо, дальше портит conemu
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ликбез по Lua

Post by John Doe »

os.execute функция неюникодная.
Используйте win.system или win.ShellExecute
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Пометить на панелях файлы с одинаковым содержимым независимо от имён

Post by buniak_a_h »

Novosedoff wrote: Fri 15 Jan, 2021 01:13 Кстати, не нашёл в интернете в доступном описании по языку lua описание использованной Вами в скрипте команды tin ..
В моём скрипте в самом начале указано присвоение local tin = table.insert. Эта строка описывает локальную переменную с именем tin и значением - функция table.insert. Сделано по двум причинам: (1) от лени (короче писать) и (2) говорят, что так намного быстрее работает, чем поиск поля в таблице. Приём довольно распространённый (например, local F = far.Flags - вообще общее место)
Last edited by buniak_a_h on Fri 15 Jan, 2021 02:59, edited 2 times in total.
Novosedoff
Posts: 69
Joined: Wed 02 Mar, 2011 19:31
Has thanked: 43 times

Ликбез по Lua

Post by Novosedoff »



Я так понял, на форуме приветствуется под-спойлерное общение :-)

Last edited by Novosedoff on Fri 15 Jan, 2021 06:17, edited 1 time in total.
Покажи мне список твоих плагинов, и я скажу кто ты...
2useven10
Posts: 5204
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Ликбез по Lua

Post by 2useven10 »

Под спойлер убирают офтопик, который на форуме не приветствуется.
Если вам за него не ещё не прилетело, это только вопрос времени (судя по упорству).
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

Novosedoff wrote: Fri 15 Jan, 2021 06:04 Я так и не понял, если честно, как лечится моя ситуация с кракозябрами штатными средствами Фар без спец.скрипта.
Открываете файл в редакторе, жмёте Shift+F8 (а не F8), выбираете кодировку utf-8 (65001). Это надо сделать для файла только один раз, потом запомнится.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Ликбез по Lua

Post by John Doe »

buniak_a_h wrote: Fri 15 Jan, 2021 02:57 В моём скрипте в самом начале указано присвоение local tin = table.insert. Эта строка описывает локальную переменную с именем tin и значением - функция table.insert. Сделано по двум причинам: (1) от лени (короче писать) и (2) говорят, что так намного быстрее работает, чем поиск поля в таблице.
Я бы за такое руки отрывал.
Если писать лень, то можно использовать автодополняющие макросы.
От таких нестандартных сокращений сильно страдает читаемость кода (а код читать приходится во много раз чаще чем писать).

Да, действительно существует практика замены локальными переменными ссылок на глобальные идентификаторы, но оправдано это лишь для действительно горячих участков кода. И то используется обычно что-то более явное, типа tinsert.
buniak_a_h wrote: Fri 15 Jan, 2021 02:57 Приём довольно распространённый (например, local F = far.Flags - вообще общее место)
А вот это в контексте фара действительно идиома.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

John Doe,
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Ликбез по Lua

Post by citRiks »

Last edited by HaRT on Thu 21 Jan, 2021 00:09, edited 2 times in total.
Reason: Спрятан офтопик
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Ликбез по Lua

Post by buniak_a_h »

Что-то я не понимаю …
У меня есть файл в кодировке 1200 │ UTF-16 (Little endian). Длина файла - 8716 байт.
Открываю на чтение:

Code: Select all

local hf = io.read('moovi.lap', 'rb') -- 'b' указывает на открытие в двоичном формате. При записи файла в этой кодировке без 'b' символ \n удваивался!
Пытаюсь прочитать весь файл:

Code: Select all

local l = hf:read('*a')
Проверяю, сколько байтов прочиталось:

Code: Select all

far.Show('Прочитано:', string.len(l))
Выводит 410 байт; соответственно, после преобразования в UTF-8 содержимое файла обрезано.
───────────────────────
Два вопроса:
  1. ЧЯДНТ?
  2. Как прочитать файл в кодировке 1200 ?
--
Пример файла, на котором всё это происходит, а также макрос, в котором обнаружено. Для справки, макрос создаёт/пополняет список воспроизведения для видеопроигрывателя Light Alloy
Error.7z
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Ликбез по Lua

Post by Shmuel »

Замените io.read на io.open.
Post Reply

Return to “Нужна помощь”