LuaShell — запуск lua/moon скриптов из командной строки

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

LuaShell

Назначение данной утилиты — реализовать запуск lua/moon скриптов из командной строки
максимально естественным образом, наподобие команд оболочки, и наравне с ними.

Точно так же скрипты можно запускать просто по имени, не задумываясь где именно
они расположены (в текущей папке, или где-то в PATH).
И по тем же правилам им можно передавать аргументы в командной строке.

Скрипты удобно не только запускать вручную, но и использовать в ассоциациях,
меню пользователя, диалоге "Применить команду" и т.п.

Область действия не ограничена панелями, командная строка доступна в любой области
фара, с автодополнением и историей.

Скриптам: предоставляется ряд средств, в числе которых — простое обращение к другим
скриптам, доступным в PATH, что позволяет сформировать собственную экосистему,
в некотором роде альтернативную модулям Lua.

Макросам: предоставляется модуль sh для доступа к скриптам (см. [API]).

Установка


Опции



Использование

Скрипты можно запускать из командной строки фара по имени, как исполняемые файлы.
Кроме того, по Ctrl[-Shift]-G доступен Диалог запуска скрипта, предоставляющий дополнительные возможности (см.),
такие как работу во всех макрообластям (с раздельной историей), запуск с просмотром возвращаемых значений,
а также непосредственное исполнение набранных в строке ввода lua-выражений.

Для создания нового скрипта необязательно переходить в целевую директорию, достаточно в том же диалоге
набрать его имя и нажать F4 - скрипт будет создан в директории заднанной по умолчанию.
Таким же образом можно открыть и существующий скрипт на редактирование.

Альтернативно: запустить в командной строке edit <scriptname>.

Это лишь краткий обзор возможностей, подробнее см. в соответствующих разделах.

Скрипты



Диалог запуска скрипта



Просмотр возвращаемых значений



Повторный запуск скрипта



API, предоставляемый скрипту


Командная строка

Attachments
3rd-party-macros.7z
21/08/2021
(116.24 KiB) Downloaded 20 times
LuaShell-02.7z
20/08/2021
(34.44 KiB) Downloaded 13 times
3rd-party.7z
08/08/2021
(57.77 KiB) Downloaded 19 times
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Latest post of the previous page:

citRiks wrote: Thu 08 Jul, 2021 06:30 Может как-то обьединить фичеры/АПИ оттуда и отсюда?
Предлагайте, почему нет.
Пока что мне кажется что LuaShell уже покрывает все возможности подобных скриптов, но интерфейс конечно не дублирует.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1600
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 491 times
Been thanked: 95 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by citRiks »

John Doe wrote: Thu 08 Jul, 2021 07:27Пока что мне кажется что LuaShell уже покрывает все возможности подобных скриптов, но интерфейс конечно не дублирует.
очень замечательно если перекрывает, а можно это точно выяснить? :)
и может продублировать и интерфейс тоже?
в том числе, затем, например, чтобы запускать из редактора, а не только из команд лайна.
И для подобных похожих инструментов, я бы хотел чтобы была сравнительная таблица фичеров/АПИ/ограничений.
типа того:

Code: Select all

----------------------------------------+-------------------------------+-----------------------+-----------------------+---------------+
		| Executed from cmd line| Executed from everywhere	| Has exec history	| Has UI (dialog)	| comment	|
----------------+-----------------------+-------------------------------+-----------------------+-----------------------+---------------|
LuaShell	|	V		|		-		|	V		| 	V		|               |
----------------+-----------------------+-------------------------------+-----------------------+-----------------------+---------------|
PostMacro	|	V		|		V		|	V		|	V		|tried partially|
----------------+-----------------------+-------------------------------+-----------------------+-----------------------+---------------|
EvalMacro	|	?		|		?		|	?		|	?		|  (not tried)  |
----------------+-----------------------+-------------------------------+-----------------------+-----------------------+---------------|
FastMacro	|	?		|		?		|	?		|	?		|  (not tried)  |
----------------+-----------------------+-------------------------------+-----------------------+-----------------------+---------------+
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

citRiks wrote: Thu 08 Jul, 2021 07:58 чтобы запускать из редактора, а не только из команд лайна.
В шапке ведь указано, что запуск отовсюду.
История есть, независимо для каждой области.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Финальное описание и альфа - в шапке.
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1600
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 491 times
Been thanked: 95 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by citRiks »

Для установки содержимое архива (директории scripts и utils) достаточно распаковать в %FARPROFILE%\Macros\ и перезагрузить макросы.
работает, протестировал запустив luash:waitkey
Но вот этот путь %APPDATA%\Far Manager\Profile\Macros\scripts\Macro\LuaShell\ выглядит странно,
\Macro\ здесь лишнее какое-то.
почему не %APPDATA%\Far Manager\Profile\Macros\scripts\LuaShell\ ?
Тем более что если перенести, то тоже вроде работает.
Спасибо
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
citRiks
Posts: 1600
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 491 times
Been thanked: 95 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by citRiks »


справка - супер.
Небольшое замечание, если запускать так как это предлагается в примере:
filesmenu changelog* edit: %FARHOME%\Plugins
.. то происходит бардак, потому что пробелы.
А вот так работает адекватно:
filesmenu changelog* edit: "%FARHOME%\Plugins"

Замечу еще, что в комплекте есть много интересных примеров использования, что весьма похвально.
осмелюсь предложит одну идею, сделать вызов редактирования таким способом:
luash:ed:filesmenu
чтобы в редакторе открывался запрашиваемый скрипт

уже есть edit filesmenu
Last edited by citRiks on Wed 21 Jul, 2021 22:06, edited 5 times in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Добавил утилиты для загрузки/выгрузки плагинов, как с выбором через меню, так и массово.
  • Load plugins located in specified path (recursively). If there are several plugins found then list is diplayed. Usage: load <path> [batch] - "batch" enforces mass loading (no list dispalayed) Note: if <path> is not specified then current directory is assumed.
  • Unloads plugins specified by name, path, guid or module. If there are several matches (and none of them is exact) then list is diplayed. Usage: unload [<str>] [x] [batch] - "x" inverts matching - "batch" enforces mass unloading (no list dispalayed) Note: if <arg> is not specified then current path assumed. Use * to show all plugins
В шапке.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Утилитка Mouse.EventFlags для изучения флагов Mouse.EventFlags

Code: Select all

--https://api.farmanager.com/ru/macro/macrocmd/prop_func/general.html#MsEventFlags
--https://farmanagerlegacy.github.io/macro-api/mouse.html
print "Inspect Mouse.EventFlags property"
print "Press key or Mouse button/wheel ('Esc' to quit)"
local MsEventFlags = {
  [1] = "MOUSE_MOVED",
  [2] = "DOUBLE_CLICK",
  [4] = "MOUSE_WHEELED",
  [8] = "MOUSE_HWHEELED",
}

local last = 0
repeat
  local key = mf.waitkey(100)
  local ms = Mouse.EventFlags
  if key~="" or last~=ms then
    last = ms
    print(("%-20s│ %s"):format(key, MsEventFlags[ms] or ms==0 and "-" or ms))
  end
until key=="Esc"
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Code: Select all

local function detabify (str, tabsize) --http://forum.farmanager.com/viewtopic.php?f=15&t=9209
  return string.gsub(str,"(.-)\t", function(s)
    return s..(" "):rep(tabsize-s:len()%tabsize)
  end)
end

if not _cmdline then
  return detabify
else
  local ei = editor.GetInfo()
  if not ei then
    print "Detabify lines in current editor selection (or current line)"
    return
  end
  editor.UndoRedo(ei.EditorID, "EUR_BEGIN")
  for li in sh.block_it{info=ei,ifnosel="curline"} do
    local str,n = detabify(li.StringText,ei.TabSize)
    if n~=0 then
      editor.SetString(ei.EditorID,li.StringNumber,str,li.StringEOL)
    end
  end
  editor.UndoRedo(ei.EditorID, "EUR_END")
end
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Адаптировал скрипт pickFromEditor.lua (by Shmuel), и задействовал его в std/files/edit.lua.
Теперь имя скрипта для редактирования подхватывается прямо из редактора.
Вот соответствующий макрос:

Code: Select all

Macro { description="LuaShell: open script under cursor";
  area="Editor"; key="F4"; filemask="*.lua;*.moon";
  id="CB8B43C7-946E-444E-9D3D-CB32F2D9BF63";
  action=function()
    sh.edit(sh.pickFromEditor())
  end;
}
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

  • Скрипт pickFromEditor.lua отрефакторен. Теперь определяется в какой среде запущен, и может быть использован как макрос.
  • Скрипт pickFromEditor.lua возвращает не только найденное слово, но его позицию в строке. Благодаря этому следующий пункт:
  • Новый скрипт guid.lua, вставляющий в редакторе гуид, и если в строке уже есть гуид, то он замещается.
    Если запущен в прочих макрообластях то просто копирует гуид в буфер обмена.
  • Скрипт StringIns.lua предоставляет функцию вставки подстроки в строку (опционально: с заменой).
Все обновления собраны в один архив. В шапке.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Итератор Block_it.lua теперь принимает новый параметр
last: boolean, `true` to include last line even if it has no visible selection (.SelStart==1 .SelEnd==0)
А суть в том, что если в редакторе например выделена одна целая строка, то у следующей за ней .SelStart==1/.SelEnd==0 (то есть выделение есть, но пустое).
Чаще всего нам не требуется пустая завершающая часть выделения, поэтому теперь Block-it игнорирует её, если только параметр last не указан явно.

Обновление в шапке.

Этот итератор используется в нескольких утилитах, поэтому хотелось бы вкратце написать о его пользе.
Вроде бы перебор строк с выделением не особо хитрая задача сама по себе:

Code: Select all

--get selection or all
local id = ei.EditorId
local sel = ei.BlockType~=F.BTYPE_NONE
local text = {}
for l=ei.BlockStartLine,ei.TotalLines do
  local li = editor.GetString(id,l,0)
  if sel then
    if not li.SelStart then break end
    text[#text+1] = li.StringText:sub(li.SelStart,li.SelEnd)
  else
    text[#text+1] = li.StringText
  end
end
local text = table.concat(text,"\n")
Однако её требуется решать регулярно, сверяясь с мануалом, помня об edge cases, ...
Или обобщить один раз и использовать везде.
Вот например как то же самое будет с помощью итератора Block_it:

Code: Select all

return table.concat(sh.map(sh.block_it{mode="str",ifnosel="all"}),"\n")
(Данный пример приложен в \std\far\shortcuts\sel.lua)
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Утилитка для редактора indent.lua, основанная на вышеупомянутом итераторе SelLines_it.lua.
Un/Indents lines in current editor selection (or current line) Usage: indent [un] [symbol] /default:existing or space/ If called from another script then returns function. Syntax: sh.indent(direction,symbol) /false dir. means unindent/
Запуск из командной строки подойдёт только для очень эпизодического использования.
Но при желании можно и макросы назначить, обычным образом:

Code: Select all

local sh = require"sh"
Macro { description="Indent block with tab";
  area="Editor"; key="ShiftTab";
  id="B175451A-9C27-4F07-A031-0C54B1C538CF";
  action=function()
    sh.indent(true,"\t")
  end;
}

Macro { description="Unindent block with tab";
  area="Editor"; key="ShiftBS";
  id="ADDB6C83-B7CA-46CB-92B4-6D0808060B3B";
  action=function()
    sh.indent(false,"\t")
  end;
}

Macro { description="Indent block with space";
  area="Editor"; key="";
  id="478DEAC0-6F1A-4BF3-819D-600A31258396";
  action=function()
    sh.indent(true," ")
  end;
}

Macro { description="Unindent block with space";
  area="Editor"; key="";
  id="ABEFF779-97DA-4860-B73C-DE3B4E3D5A45";
  action=function()
    sh.indent(false," ")
  end;
}

local function selectBlock ()
  if not Object.Selected then
    local sel = sh.block_pick()
    if sel then editor.Select(nil,sel) end
  end
end

Macro { description="Pick&Indent block";
  area="Editor"; key="AltShiftI";
  id="93ABFCC4-F627-4292-AC2E-E8A5C6578DB8";
  action=function()
    selectBlock()
    sh.indent(true)
  end;
}

Macro { description="Pick&Unindent block";
  area="Editor"; key="AltShiftU";
  id="D461EF2B-7CBF-49C6-98EF-F642E3FAC920";
  action=function()
    selectBlock()
    sh.indent(false)
  end;
}
(Два последних макроса сами выделяют блок, основываясь на отступах)

Кроме того, в планах есть утилита для оперативного назначения временных макросов на любые команды (я лично возлагаю на неё большие надежды в плане повышения удобства системы).

P.S.
Что до отступов, то на форуме конечно хватает и других скриптов с той же функцией:
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Примитивный калькулятор может быть реализован так (=.lua):

Code: Select all

print(_cmdline:eval())
Можно сделать чтобы результат подставлялся прямо в командную строку (для использования в дальнейших вычислениях):

Code: Select all

mf.print("= ".._cmdline:eval())
Можно сделать так, чтобы математические функции можно было бы использовать без префикса math. и скобки были бы необязательны,как в мунскрипте, например = sin 1:

Code: Select all

local mt = setmetatable({ }, {
  __index = function(t, k)
    return _G[k] or _G.math[k]
  end
})
local f = assert(require("moonscript").loadstring(_cmdline))
mf.print('= ' .. (setfenv(f, mt))())
Запишем всё вместе на мунскрипте (=.moon):

Code: Select all

if not ...
  print "Usage: = <expression>"
  return
mt = setmetatable {},{ __index:(t,k)-> _G[k] or _G.math[k]}
f = assert require"moonscript".loadstring _cmdline
mf.print '= '..(setfenv f,mt)!
P.S.
А консольным алиасом можно совсем коротко:

Code: Select all

==moon:print '= '..((f)->(setfenv f,setmetatable {},{__index:(t,k)->_G[k] or _G.math[k]})!) -> $*
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Новая утилитка, реализующая всплывающее сообщение.
Displays toast notification Usage: sh.toast(text[,title[,timeout[,keys]]]) - timeout: number (ms) | false | nil (==700) - keys: table, {<key>: function, ...} Toast notification is closed automatically by timeout, or if any key is pressed
Задействована в execCmdline.lua: теперь если какой-то скрипт возвращает значения - выводится нотификация Press Enter to see returned values.
Пока она на экране можно нажать Enter, и значения отобразятся.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13372
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 52 times
Been thanked: 347 times

LuaShell — запуск lua/moon скриптов из командной строки

Post by John Doe »

Новая утилита pipeTo.lua
Executes specified command, putting specified text to it's input stream, and returns it's output/err Syntax: out, err = sh.pipeto(cmd,input)
Задействована в em.lua
Expand Emmet's html abbreviations in editor To use it place cursor at the line with abbreviation and run 'em' See https://docs.emmet.io/cheat-sheet/
https://t.me/FarManager — Telegram чат
Post Reply

Return to “Обсуждение макросов”