hoopoe wrote: но есть желание управлять этим из командной строки (a-la ViFM) + добавить логику для обработки хвоста команды
Не спорю, что стало удобнее, но хочу отметить, что через алиасы всё это было доступно и раньше.
Например.
Открыть из командной строки список ассоциаций: ass=lua: Keys "F9 c a RAlt" print "$*"
Перейти во временную папку: tmp=chdir "%TMP%"
Выполнить произвольный lua-скрипт (с передачей параметров): un=lua:@%FARPROFILE%\Macros\utils\un.lua
И т.п.
hoopoe wrote: согласен, функционал префиксов и алиасов очень близок, но префиксы как раз удобнее тем, что гарантированно не пересекутся с дос командами
Вот тут как раз разницы нет, алиасы могут быть и с двоеточием
Может поделить строку после префикса на отдельные слова как это делает shell для Си main() и передавать в action массив строкок-параметров с ученом кавычек и т.п. вместо одной строки text?
gotar wrote: Может поделить строку после префикса на отдельные слова как это делает shell для Си main() и передавать в action массив строкок-параметров с ученом кавычек и т.п. вместо одной строки text?
Если выскажется достаточное количество людей в пользу этого, можно будет сделать.
local SplitCommandLine do --removed in https://code.google.com/p/farmanager/source/detail?r=12035
local pattern = regex.new([=[
" ( (?: \\" | [^"] )* ) "? |
( (?: \\" | [^"\s] )+ ) |
\s+
]=], "x")
SplitCommandLine = function (str)
local t, n, outside = {}, 0, true
pattern:gsub(str, function(a,b)
if a or b then
a = (a or b):gsub("\\\"", "\"")
if outside then
n = n + 1
t[n] = a
outside = false
else
t[n] = t[n]..a
end
else
outside = true
end
end)
return t
end
end
John Doe, как Вы считаете, если SplitCommandLine будет вызываться до action, то это может комунибудь помешать? Как Вы думаете будут ли у Вас обработчики CommandLine с парметрами, которым функциональность SplitCommandLine будет не нужна?
да запросто... далеко не всегда нужно пилить ком.строку: при работе с префиксами распил может усложнить жизнь. я за предложение джедая: добавить в API функу для распила - кому надо будет тот распилит. или совсем альтернативное предложение: массив отдавать третьим параметром callback'а (после префикса и оригинальной строки)
То есть у Вас было так: пишу программу на Си и думаю,-жалко, что не могу получить командную строку целиком, а только в виде отдельных параметров в массиве argv?
local ffi = require"ffi"
local Shell32,C = ffi.load"Shell32",ffi.C
ffi.cdef[[//https://msdn.microsoft.com/library/bb776391
LPWSTR* CommandLineToArgvW(
LPCWSTR lpCmdLine,//_In_
int *pNumArgs //_Out_
);
//http://msdn.microsoft.com/library/ms647492
int lstrlenW(const wchar_t *lpString);
]]
local wsize = ffi.sizeof"wchar_t"
local function CommandLineToArgv(CommandLine)
local pNumArgs = ffi.new("int[1]")
local CommandlineW = win.Utf8ToUtf16(CommandLine).."\0"
local Argv = Shell32.CommandLineToArgvW(ffi.cast("LPCWSTR",CommandlineW),pNumArgs)
if Argv~=nil then
local argv = {}
for i=0,pNumArgs[0]-1 do
argv[i] = win.Utf16ToUtf8(ffi.string(Argv[i],C.lstrlenW(Argv[i])*wsize))
end
return argv
end
end
Last edited by John Doe on Sun 17 Sep, 2017 13:12, edited 1 time in total.