Заха́р
Мне сейчас уходить надо, позже отпишусь.
Snusmumriken
Через консоль — у тебя не будет функций SysUtils.ExtractFileName, они относятся к твоей фиговине (файл-менеджеру?), так что не получится.
Snusmumriken
Пиши логи в файл.
Snusmumriken
function getLog(filename) return function(text) local f = assert(io.open(filename, "wb")) f:write(tostring(text) .. "\n") f:close() end end local log = getLog("/home/mylog.log") log("Это сообщение будет записано в файлик") log("И это тоже")
Snusmumriken
И вот теперь используй это вместо print'а, смотри что конкретно ты переименовываешь и во что.
Highly Likely
Комрады, есть тут виндузятники в связке Lua + Sublime + Luarocks? Какие подводные камни настройки? Куда идти, что заранее чинить?
Snusmumriken
Заранее ставить vs/mingw и писать в конфиг луарокса пути до канпелятора/либ.
Highly Likely
Понял, спасибо
Snusmumriken
В остальном проблем особо быть не должно.
Highly Likely
Жизнь всё-таки меня привела к разработке на винде :(
Snusmumriken
Велком
Snusmumriken
Leon174
Ну, фиг знает насчет отсутствия проблем. Я вот подобное, например, хапнул, только у меня другая версия busted не ставилась. По итогу послал в жопу и luarocks, и busted. Если есть выбор, пользуюсь вариантами на pure lua. Вместо того же busted прекрасно подошел lust. Винда, конечно, та еще боль. https://github.com/Olivine-Labs/busted/issues/169
Highly Likely
Классно, мне то бастед пригодится :)
Highly Likely
А то у меня luarocks считает, что он 5.3, хотя луашка стоит 5.2
Lämppi
Полный доступ к внутрянке?
Snusmumriken
Потому что весь интерпретатор — это стековый автомат, а c-api модифицирует состояние этого стекового автомата. Внутри самих луёв нет каких-то объектов и их конвертации. Хотя, разумеется, у меня есть обёртка выгрузки в луа структур/методов как объектов, кто бы мог подумать.
Александр
низкоуровневый и детальный API позволяет построить поверх него любой высокоуровневый, при желании. наоборот не прокатит
Snusmumriken
Плюс за счёт стековости и простоты, биндинги делаются в три тычки. Ты пробовал биндить питон или жаваскрипт? Насколько просто там биндить простые штуки, и насколько просто что-то сколько-нибудь сложное?
Заха́р
function getLog(filename) return function(text) local f = assert(io.open(filename, "wb")) f:write(tostring(text) .. "\n") f:close() end end local log = getLog("/home/mylog.log") log("Это сообщение будет записано в файлик") log("И это тоже")
... Смотри, вот я добавил в скрипт функцию function getLog(filename) return function(text) local f = assert(io.open(filename, "wb")) f:write(tostring(text) .. "\n") f:close() end end local log = getLog("/home/mylog.log") log("Это сообщение будет записано в файлик") log("И это тоже") log("И это тоже выводит") и выводит она мне строку "И это тоже выводит" (почему-то только последнюю) Но как сделать, чтобы логировалось выполнение скрипта? Нашёл в доках программы функцию, которая вроде бы как раз для логирования: http://doublecmd.github.io/doc/ru/lua.html#libdc
Snusmumriken
А, сорян
Snusmumriken
io.open(filename, "a+")
Заха́р
Отлично! Теперь все строки выводит. Но только, которые внутри log("...") А как таким образом выполнение скрипта фиксировать?
Snusmumriken
Ммм. local params = {...}; local n = SysUtils.ExtractFileName(params[1]) n = string.sub(n, 1, string.len(n) - string.len(e)) local file = n:gsub("%s+", "_") log("Trying to rename from") log(params[1]) log("to") log(file .. e) local succ, res = os.rename(params[1], file .. e); log("Result: " .. tostring(succ) .. " " .. tostring(res)) А потом берёшь такой, и читаешь содержимое файла.
Snusmumriken
Отлично! Теперь все строки выводит. Но только, которые внутри log("...") А как таким образом выполнение скрипта фиксировать?
Ну это было как бы очевидно. Берёшь и фиксируешь исполнение в лог. Читаешь его. Оп, чот не то? Исправляешь. Потом снова читаешь лог. Когда станет всё ок — всё ок.
Maxim
Как в Lua по полному имени файла определить каталог в котором этот файл находится? Есть ли в lua стандартная функция для этого? Я смотрел lfs и не нашел ничего подходящего.
6 :)
Год задался нынче - жесть! Даром, что високосный. Но прочие високосные не в пример. Только полгода прошло, а чего только не случилось?! Так теперь ещё и комета 😱 (видна ранним утром на северо-востоке).
Vlad
Ну это если путь есть :)
Ждём его дефиницию "полного имени файла"
Maxim
Начинается со слеша
Maxim
Например: с:abc\def.lua - относительное имя файла \\?\с:\foo\bar\abc\def.lua полное имя файла С:\foo\bar\abc\def.lua - тоже полное имя файла
Maxim
В моем определении что-то неожиданное? Нужно подкреплять ссылками?
Maxim
Подкрепляю ссылкой https://ru.m.wikipedia.org/wiki/%D0%98%D0%BC%D1%8F_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0
Maxim
найти последний символ '\\' или '/' и сделать подстроку до него?
Как строку превратить в массив уникодных символов? Р.s. я то надеялся на стандартный механизм, а не изобретение собственного велосипеда.
Maxim
спасибо
Заха́р
Возможно ли каким-то образом избежать «накладок» при последовательном вызове команд? Вроде очевидная задача, но проблемы возникают практически всегда. Вот пример скрипта, и какие проблемы возникают (см. комментарии к коду): local params = {...} local TempDir = "tmppp/" SysUtils.CreateDirectory(TempDir) DC.ExecuteCommand("cm_ChangeDir", "inactivepath=%D/" .. TempDir) -- выделить только файлы изоражений DC.ExecuteCommand("cm_MarkPlus", "mask=*.bmp;*.jpg;*.jpeg;*.svg;*.ico;*.gif;*.png;*.tiff;*.tif;*.webp;*.svg;*.svgz;*.xcf;", "attr=d-", "casesensitive=0"); DC.ExecuteCommand("cm_MarkPlus", "mask=*.", "attr=d-", "casesensitive=0"); DC.ExecuteCommand("cm_MarkMinus", "mask=\.*"); DC.ExecuteCommand("cm_RenameNoAsk", "confirmation=no", "queueid=1"); DC.ExecuteCommand("cm_FocusSwap"); DC.ExecuteCommand("cm_MarkMarkAll"); DC.ExecuteCommand("cm_ExecuteScript", "$DC_CONFIG_PATH/scripts/autorename.lua", "%LU", "1", "-1", "image. large", ""); -- здесь скрипт пытается выполнить следующую команду (cm_MarkMarkAll) не успев выполнить переименование DC.ExecuteCommand("cm_MarkMarkAll"); DC.ExecuteCommand("cm_RenameNoAsk", "confirmation=no", "queueid=2"); DC.ExecuteCommand("cm_FocusSwap"); -- здесь скрипт пытается удалить каталог не успев выполнить перемещение local br, es, en local h, d = SysUtils.FindFirst(TempDir .. SysUtils.PathDelim .. '*') if h == nil then br, es, en = os.remove(TempDir) if br == nil then Dialogs.MessageBox('Error: ' .. en .. '\n' .. es, 'Delete folder', 0x0040) end else SysUtils.FindClose(h) br = Dialogs.MessageBox('Temporary folder is not empty!\nDo you want to delete anyway?', 'Delete folder', 0x0001 + 0x0030) if br == 0x0001 then br, es, en = os.remove(TempDir) if br == nil then Dialogs.MessageBox('Error: ' .. en .. '\n' .. es, 'Delete folder', 0x0040) end end end Вижу только вариант с тем, чтобы расставлять паузы в нужных местах, но это очень сомнительный приём, к тому же объём обработки может очень сильно разниться и угадать паузу становится просто невозможно. Может быть есть какие-то решения?
Snusmumriken
Только условные паузы. Оно кажись пытается асинхронно выполнять скрипты. Напиши автору DC.
Заха́р
А, то есть это не типичное поведение? Зависит от DC?
Snusmumriken
Конечно.
Заха́р
А, понял, оно вызывает функции DC, которые, по идее, должны возвращать сигнал завершения
Snusmumriken
Все функции которые начинаются с DC — относятся к DC.
Maxim
А что такое DC? DirectConnect?
fgntfg
Doloy Capitalism
Заха́р
Double Commander — файловый менеджер. Двухпанельник.
Заха́р
Doloy Capitalism
))) отличное название для ФМ!
Maxim
Double Commander — файловый менеджер. Двухпанельник.
Больше похож на midnight commander или на Far manager?
Snusmumriken
SysUtils — тоже DC, как и Dialogs.
Заха́р
Больше похож на midnight commander или на Far manager?
На Тотал коммандер больше похож. Всё же гуй, панельки, кнопочки. Задумывался как мультиплатформенная опенсорс-альтернатива.
Snusmumriken
Doloy Capitalism
Сначала прочитал как deploy capitalizm
Maxim
А в реальности работает только в Windows? Или в Linux тоже работает, просто ночные сборки не собираются?
Snusmumriken
Ну откуда столько токсичности? Прям разлил радиоактивное болото ))
Заха́р
А в реальности работает только в Windows? Или в Linux тоже работает, просто ночные сборки не собираются?
Отлично под Линуксом работает, там ведь и «портативные» версии ночных сборок имеются и авторские репы под CentOS/Debian/Fedora/openSUSE/Ubuntu. Вот тут варианты можешь глянуть: http://doublecmd.github.io/doc/ru/faq.html#repo
Maxim
Вы автор Double Commander? Я просто заглянул на сайт, увидел декларацию кросплатформености, но ехзешники только для Windows
Snusmumriken
Меня в подобных фм в основном интересует в основном две фишки: 1. Могут ли они открывать директории, содержащие несколько миллионов файлов 2. Могут ли они просматривать файлы объёмом в несколько терабайт (на f3) и искать по ним Эх.
Sarvar
хех нихера себе тут кейсов под луа. Я вообще начинал писать на нем под сампчик))
Snusmumriken
Под вендой ))
fgntfg
Сначала прочитал как deploy capitalizm
тоже ничего так вариант
Sasha
Всем привет. В луа никак нельзя использовать обычные регэкспы?
аннлн
при желании можно
аннлн
lua-rex же
аннлн
ты скозал?
Lämppi
Но лучше не надо
Лучше не надо регекспы
Highly Likely
ты скозал?
Я скозал
аннлн
авторитетное, уважаемое мнение
Highly Likely
авторитетное, уважаемое мнение
Хамить, конечно, не надо
аннлн
это комплимент
Sasha
Можете перевести это на луашный регэксп? "(\s|\S)+(?=\r\n)"
Snusmumriken
Можете перевести это на луашный регэксп? "(\s|\S)+(?=\r\n)"
Очень интересный регекс \s|\S )) Думаю сойдёт (.*)\r\n
Snusmumriken
Ла-адно, (.+)\r\n