Помощь в написании Lua-плагина

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

Latest post of the previous page:

zg, кросава!!!!!
deleted: А где лежит имя-файла запускаемого макро? (вопрос отпал)
Last edited by Majestio on Mon 13 Apr, 2020 18:10, edited 1 time in total.
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 »

Majestio wrote: Mon 13 Apr, 2020 17:36 Smitis, увы - все равно ругается.
вот полный код макро:
Я же писал: троеточие должно быть ВНЕ функции. Потому что внутри - это относится к аргументам вызова именно этой функции.
И к тому же я аргументировал, почему для этого надо завести отдельную переменную.
Если выполнить - как раз и получите код от zg
Last edited by buniak_a_h on Tue 14 Apr, 2020 08:37, edited 1 time in total.
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

buniak_a_h, сорри, тупанул с ...)
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

С очередным вопросом прошу хелпу!

Ситуация следующая. Из файла у меня скрипт читает строки. Нужно отсеять все строки кроме строк формата:
'F,"Инструмент-1","Команда-1.cmd"' или 'С,"Инструмент-2","Команда-2.cmd"', а результат положить в ранее
объявленный массив Cmd. Где каждый элемент массива - должен быть тройкой из распарсенных значений,
если парсинг прошел удачно. Я этого написал регулярку ^(F|C)\s*,\s*"\s*([^"]+?)\s*"\s*,\s*"\s*([^"]+?)\s*"\s*$

Только вот как ее использовать? Допустим тем же far'овским regex?


Отбой, решил сам:

Code: Select all

    local Cmd = {}
    local Idx = 1
    for line in Conf:lines() do 
      if regex.match(line,'^(F|C)') then
        for w1,w2,w3 in regex.gmatch(line, '^(F|C)\\s*,\\s*"\\s*([^"]+?)\\s*"\\s*,\\s*"\\s*([^"]+?)\\s*"\\s*$') do 
          Cmd[Idx] = {w1,w2,w3}
        end
        Idx = Idx + 1
      end
    end
Last edited by Majestio on Fri 17 Apr, 2020 19:19, edited 2 times in total.
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

Ну вот тут уж точно без вас закопаюсь ... Я гарантирую!!! Image

Синтетический пример ...

Мне нужно из моего макро запустить команду, например, 'cmd /C ruby.exe stuff.rb ', но выполнить так:

1) Чтобы не открывалось консольное окно
2) Чтобы вывод этой команды в STDOUT я мог записать в переменную моего скрипта

Хелп !!!
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

buniak_a_h wrote: Sat 11 Apr, 2020 08:03a) Для "обработчиков текста" - может, вообще имело бы смысл написать его на макро? Чтоб не париться с временным файлом?
Не не не ... То, что я смогу написать на Perl 5 за 5 мин, на Lua я потрачу день. Я уже был столкнулся с работой с регэкспами на Lua. По сравнению с Перловкой - это просто кровище из глаз!
buniak_a_h wrote: Sat 11 Apr, 2020 08:03б) Для компилятора: есть у меня скрипт, запускающий компилятор с языка Харбор (наследник Clipper-а). Скрипт при наличии ошибок открывает новый редактор внизу экрана и вешает на Enter переход в основной редактор на соответствующую ошибке строку. На самом деле скриптом пользовался довольно интенсивно года три (это я к тому, что тяжёлых ошибок там уже нет, и он удобен). Видимо, для адаптации к Вашим условиям надо будет подправить пути к компилятору, команды вызова (у меня их две - для компиляции с отладкой и без) и шаблон парсинга строки с описанием ошибки. Если Ваш компилятор возвращает ErrorLevel, то это будет просто замечательно.Надо?(для примера
Пока нужен просто запуск без открытия консольного окна и чтение STDOUT запускаемого процесса. Я об этом чуть выше написал. Может быть потом парсинг STDOUT прикручу - но пока нужно просто добить макро "в базовой комплектации" ))
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 »

Majestio wrote: Fri 17 Apr, 2020 21:39Мне нужно из моего макро запустить команду, например, 'cmd /C ruby.exe stuff.rb ', но выполнить так:

1) Чтобы не открывалось консольное окно
2) Чтобы вывод этой команды в STDOUT я мог записать в переменную моего скрипта

Хелп !!!
на форуме поиск есть.
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 »

Majestio, посмотрите io.popen и hf:lines() - запуск внешнего процесса с перехватом stdout-а
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 »

Вот тут пример макроса, который берёт блок из редактора, и заменяет его содержимое на то что вернет внешний фильтр.
viewtopic.php?f=7&t=7383
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 »

Ладно, вот пример (хотя вся информация у Вас уже есть):
  1. local out={}
  2.  
  3. local hf = io.popen( [[ruby.exe "stuff.rb"]] ) -- Рекомендую в этом месте использовать [[…]] чтоб не париться с кавычками и слэшами
  4.  
  5. if hf then
  6.  
  7.   for l in hf:lines() do
  8.  
  9.     l = win.OemToUtf8(l) -- если вывод может содержать символы > 127
  10.  
  11.     out[#out+1] = l
  12.  
  13.   end
  14.  
  15.   hf::close()
  16.  
  17. end
Last edited by buniak_a_h on Sat 18 Apr, 2020 08:45, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Помощь в написании Lua-плагина

Post by citRiks »

Majestio wrote: Fri 17 Apr, 2020 21:52 Не не не ... То, что я смогу написать на Perl 5 за 5 мин, на Lua я потрачу день. Я уже был столкнулся с работой с регэкспами на Lua. По сравнению с Перловкой - это просто кровище из глаз!
Существуют интересные проекты по переводу с других языков в Луа,
или в исходный код Луа, или в байт-код Луа,
даю ссылку, может кому поможет:
https://github.com/hengestone/lua-languages

Про Перл я к сожалению там не нашел,
но например есть Питун, ЖабаCкрипт, Дот.Нет
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 »

Majestio wrote: Fri 17 Apr, 2020 21:52 То, что я смогу написать на Perl 5 за 5 мин, на Lua я потрачу день. Я уже был столкнулся с работой с регэкспами на Lua
Может, Вы не заметили… В LuaFAR-е две библиотеки работы с регэкспами: в стиле lua (escape-символ - "%") и в стале Perl (escape-символ - "\"). Перловский доступен из библиотеки regex.
Last edited by buniak_a_h on Sat 18 Apr, 2020 16:25, edited 1 time in total.
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

buniak_a_h wrote: Sat 18 Apr, 2020 08:44 Ладно, вот пример (хотя вся информация у Вас уже есть):
Сенкс, все работает норм, за исключением перехвата STDERR. Хотя изначально я про это и забыл.
Но вот John Doe (Thx!) дал ссылочку с примером расширенного варианта запуска (с перехватом STDOUT и STDERR).
Поэкспериментирую с тамошней самопальной функцией pipe.
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

buniak_a_h wrote: Sat 18 Apr, 2020 16:24 Может, Вы не заметили… В LuaFAR-е две библиотеки работы с регэкспами: в стиле lua (escape-символ - "%") и в стале Perl (escape-символ - "\"). Перловский доступен из библиотеки regex.
Нет, это я в самом начале своего скрипта уже начал пользовать - regex. Просто самое использование регэкспов в Перле и Lua - две громаднейшие разницы.
Last edited by Majestio on Tue 21 Apr, 2020 11:30, edited 1 time in total.
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

zg wrote: Fri 17 Apr, 2020 23:42на форуме поиск есть.
Да, спасибо, глянул - но это вариант наверное самый последний буду смотреть. Уж больно api-шный)
User avatar
Majestio
Posts: 32
Joined: Mon 22 Aug, 2016 08:58
Has thanked: 2 times

Помощь в написании Lua-плагина

Post by Majestio »

Всем привет, и очередной вопрос) Каким образом узнать, что в редакторе в данный момент установлена настройка "Использовать BOM" при записи файла? Это мне нужно для сброса текущего содержимого во временный файл, и чтобы было один-к-одному по сравнению со штатным сохранением. Пока без разбору пишу:

Code: Select all

File:write(string.char(239,187,191))
А хотелось бы немного более по-фэншую. А в chm-хелпе по LuaFar'у этого не нахожу.
Last edited by Majestio on Tue 21 Apr, 2020 17:25, edited 1 time in total.
Post Reply

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