Ликбез по 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.

Для того, чтобы получить начальное представление о языке достаточно почитать какую-нибудь короткую обзорную статью, например:
Для более близкого знакомства рекомендую эти документы:
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 »

Latest post of the previous page:

Необходимо всю строку обрамить в дополнительные кавычки.

Code: Select all

[[bad =]][[""7z.exe" e -so "H:\Program Files\Far Manager\Encyclopedia\FarEncyclopedia.ru.chm" *.hhk"]] }
P.S.
Это общее правило, а не особенность lua.
В batch-файлах тоже, увидите если запишите команду как cmd /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. Как корректно закрыть файл при выходе из цикла io.lines()

Post by buniak_a_h »

Маленький вопрос по LUA.
Как показал , при прерывании цикла for l in io.lines(FName) файл FName остаётся заблокированным. А есть ли возможность корректно закрыть файл? Или надо "добивать" цикл до Eof, пока Lua его сам не закроет?
Yegor
Posts: 1326
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Вопрос по Lua. Как корректно закрыть файл при выходе из цикла io.lines()

Post by Yegor »

Therefore, the construction

Code: Select all

for line in io.lines(filename) do ... end
will iterate over all lines of the file. When the iterator function detects the end of file, it closes the file and returns nil (to finish the loop).
Возможно это означает что если вы прервали сами, то файл закрыт не будет.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (C) Мичурин
Yegor
Posts: 1326
Joined: Mon 04 Apr, 2005 13:41
Location: San Ramon, CA / Kharkov, UA
Has thanked: 32 times
Been thanked: 61 times

Вопрос по Lua. Как корректно закрыть файл при выходе из цикла io.lines()

Post by Yegor »

Согласно исходникам lua:

Code: Select all

  if (lua_toboolean(L, -n))  /* read at least one value? */
    return n;  /* return them */
  else {  /* first result is nil: EOF or error */
    if (n > 1) {  /* is there error information? */
      /* 2nd result is error message */
      return luaL_error(L, "%s", lua_tostring(L, -n + 1));
    }
    if (lua_toboolean(L, lua_upvalueindex(3))) {  /* generator created file? */
      lua_settop(L, 0);
      lua_pushvalue(L, lua_upvalueindex(1));
      aux_close(L);  /* close it */
    }
    return 0;
  }
Он закрывает файл, только если дочитал до конца и не произошло никаких ошибок.
Мы не можем ждать милостей от Фара, взять их у него — наша задача! (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. Как корректно закрыть файл при выходе из цикла io.lines()

Post by buniak_a_h »

Yegor wrote: Thu 05 Dec, 2019 22:06 если вы прервали сами, то файл закрыт не будет.
Ну я так и думал. Надеялся, что к дескриптору этого файла есть доступ как-то другим способом.
Значит, через последовательность file=o.open(), for l in file:lines(), file:close()
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Ликбез по Lua

Post by citRiks »

John Doe wrote: Sat 07 Mar, 2020 17:10 Я не хочу догадываться что это такое страшное вы имели ввиду.
Хотите обсудить - пожалуйста в viewtopic.php?f=57&t=7742
и что, тут можно сразу спрашивать, или сначала надо прочитать и запомнить 17 страниц?
Last edited by citRiks on Sat 07 Mar, 2020 17:23, edited 1 time in total.
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 »

Не с той стороны.
Опишите задачу, как пытались её решить с помощью find, и с каким затруднением столкнулись.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Ликбез по Lua

Post by citRiks »

John Doe,
С "find(..)" проблем уже нет, параметр "plain" дает все что нужно было,
хоть и несколько нетрадиционно для всех остальных языков.
Впрочем нетрадиционность является сама по себе проблемой, ну да ладно.
Проблема все еще есть с аналогом "plain" для "gsub(..)", которого нет
Т.е. "gsub(..)" считает что в паттерне (="string-to-be-replaced") у него должно быть регексп,
и непонятно как сказать ему не считать "string-to-be-replaced" регекспом

Предполагаю что вы предложите использовать escape-characters,
но тогда надо что-то универсальное, что и спрашиваю тут
Last edited by citRiks on Mon 09 Mar, 2020 09:07, edited 1 time in total.
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 »

http://lua-users.org/lists/lua-l/2014-08/msg00584.html

Т. е. да, удобной и простой функции действительно не хватает.

Простейшая функция для экранирования паттерна может быть такой:

gsub( '%p', '%%%0’ )
Last edited by John Doe on Mon 09 Mar, 2020 10:08, edited 1 time in total.
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 wrote: Mon 09 Mar, 2020 09:36 Т. е. да, удобной и простой функции действительно не хватает.
Это Вы к тому, что mf.peplace всё же имеет смысл оставить?
По-моему, это действительно полезная функция, не имеющая простого заменителя. Поэтому я использую её (ну и ещё mf.trim - чтоб не затуманивать текст скрипта)
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: Mon 09 Mar, 2020 14:11 Это Вы к тому, что mf.peplace всё же имеет смысл оставить?
Я нет.
Но никто вроде бы и не собирается удалять.
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 wrote: Mon 09 Mar, 2020 19:08 Но никто вроде бы и не собирается удалять.
Собственно, разговор про mf.replace перешёл сюда из темы Лишние функции macro api начиная примерно отсюда. Там сравнивалось быстродействие gsub и mf.replace; сравнение не в пользу последней. А вкупе с названием темы это выглядит как предложение отказаться от mf.replace.
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: Tue 10 Mar, 2020 00:16 А вкупе с названием темы это выглядит как предложение отказаться от mf.replace.
Именно предложение, без принуждения.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Ликбез по Lua

Post by citRiks »

buniak_a_h wrote: Mon 09 Mar, 2020 14:11 чтоб не затуманивать текст скрипта
это вы удачно выразились, я в том же духе сказал в той теме viewtopic.php?p=159608#p159608
John Doe,
я бы еще сказал, что очень сильно будет здорово, если mf.replace и иже с ними, и останутся быть,
и их переопределят на Луа (сейчас это медленноватые вызовы FAR API, насколько я понимаю)
User avatar
raven428
Posts: 51
Joined: Sat 28 Mar, 2009 11:17
Has thanked: 10 times
Been thanked: 1 time

Ликбез по Lua

Post by raven428 »

Хочется по Shift-Enter запускать командную строку, обрамлённую в префикс 'conemu64 -run ' и суффикс ' -cur_console:c'. Родился такой макрос:

Code: Select all

Macro {
 description = 'run with new conemu window';
 area="Shell"; key="ShiftEnter"; flags="NotEmptyCommandLine"; action = function()
  local prefix = 'conemu64 -run ';
  local suffix = ' -cur_console:c';
  local CmdLine = panel.GetCmdLine(nil);
  local CmdLinePos = panel.GetCmdLinePos(nil)
  if(CmdLine == nul) then
   return;
  end;
  local res = CmdLine:find(prefix, 1, true);
  if(not res or res > 1) then
   CmdLine = prefix .. CmdLine;
   CmdLinePos = CmdLinePos + prefix:len();
  end;
  local LenTail = CmdLine:len() - suffix:len();
  res = CmdLine:find(suffix, LenTail, true);
  if(not res or res <= LenTail) then
   CmdLine = CmdLine .. suffix;
  end;
  panel.SetCmdLine(nil, CmdLine);
  panel.SetCmdLinePos(nil, CmdLinePos);
  Keys('Enter')
 end;
}
Задача, в общем-то, выполняется, за тем нюансом, что история команд теперь загромождается этими префиксами и суффиксами. Ну и предыдущая команда вызывается тоже уже с префиксом и суффиксом, которые не очень хочется там видеть. Как бы так сделать, чтобы и рыбку съесть и не загромождать историю команд?
too much raVen over paradise...
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Ликбез по Lua

Post by Shmuel »

Вызывайте Far.DisableHistory(0x1) в начале функции action.
Post Reply

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