Page 1 of 2

FIN alt. — Fix Incorrect Names

Posted: Sat 06 Apr, 2013 23:25
by John Doe
Автор — Shmuel.
Макрос получен из LuaFAR-плагина LF_FIN, представляющего собой аналог другого плагина (автор Тигренок).
Плагин перехватывает закрытие диалогов «Сохранить файл как» редактора и «Открыть/создать файл», «Копировать», «Переименовать или перенести», «Создать папку», «Создать ссылку» панелей, а также диалога «Распаковка архива» плагина ArcLite, удаляя с конца введённого имени пробелы и точки
P.S.
В случае если всё-таки необходимо создать файл/папку, имя которой оканчивается пробелами — можно завершить имя кавычкой.

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 01:51
by John Doe
В отличии от оригинального плагина не обрабатываются точки.

Это можно преодолеть задав local Pattern = "[%s.]+$"
Но необходимо учитывать, что
1) ".." и "xxx\.." это корректные имена.
2) "..." и "xxx\..." - некорректные, но исправлять их молча нельзя, потому что результат исправления может сильно отличаться от задуманного (не знаю как поступает оригинальный FIN).
И имена, начинающиеся на \\?\, тоже лучше пропускать.

Возможно стоит использовать такой код:
  1. local str = FarDialogItem[10]
  2.  
  3.           if str:match([[^\\%?\]]) then return end
  4.  
  5.           local lastname = str:match("[^\\/]*$")
  6.  
  7.           local extra = lastname:match("%.%.?[%s.]$")
  8.  
  9.           if extra then return extra~="" and mf.beep() end
  10.  
  11.           local str, n = str:gsub(Pattern, "")
  12.  
  13.           if n > 0 then
  14.  
  15.             SendDlgMessage(hDlg, "DM_SETTEXT", item, str)
  16.  
  17.           end
  18.  
  19.           break
В случае если завершающая часть пути представляет собой "..." (или ".. . . . . .") то диалог не закроется, плюс об ошибке сообщит звуковой сигнал (но это на любителя)

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 04:35
by Тигрёнок
John Doe wrote:1) ".." и "xxx\.." это корректные имена.
2) "..." и "xxx\..." - некорректные, но исправлять их молча нельзя, потому что результат исправления может сильно отличаться от задуманного (не знаю как поступает оригинальный FIN).
Оригинальный FIN помнит, что операции, скажем, создания папки и копирования – операции существенно разные. Поэтому для первой будут с имён вида xxx\.. и xxx\... будут срублены все финальные точки, а для второй – оставлены две.

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 06:10
by Shmuel
John Doe wrote:В отличии от оригинального плагина не обрабатываются точки.

Это можно преодолеть задав local Pattern = "[%s.]+$"
Манипуляции с точками убраны сознательно. Точки видны, поэтому мне такой искусственный интеллект не нужен.
(Теперь уже и пробелы концевые видны, но во время создания плагина на Lua этого ещё не было).

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 11:31
by John Doe
Тигрёнок wrote:Оригинальный FIN помнит, что операции, скажем, создания папки и копирования – операции существенно разные. Поэтому для первой будут с имён вида xxx\.. и xxx\... будут срублены все финальные точки, а для второй – оставлены две.
Да, но согласитесь что ситуация эта редкая и странная, и например если в диалоге копирования стоит "..." это не обязательно значит, что пользователь будет рад копированию в родительскую папку.
Поэтому в таких случаях я предлагается ничего не делать, оставлять диалог открытым, предлагая пользователю самому разобраться что он там хотел.
Код, предложенный выше, именно такое поведение и реализует.
Shmuel wrote:Манипуляции с точками убраны сознательно. Точки видны, поэтому мне такой искусственный интеллект не нужен.
(Теперь уже и пробелы концевые видны, но во время создания плагина на Lua этого ещё не было).
Есть ведь стереотипные действия типа "CtrlV Enter", во время которых никто и не смотрит что там видно. Плюс возможно пользователь это не сам делает, а другим макросом.
(В любом случае, макрос в шапке ваш, и его я не трогаю)

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 12:42
by Тигрёнок
John Doe wrote:если в диалоге копирования стоит "..." это не обязательно значит, что пользователь будет рад копированию в родительскую папку.
А чему он будет рад, написав в путь три точки?

John Doe wrote:Поэтому в таких случаях предлагается ничего не делать, оставлять диалог открытым, предлагая пользователю самому разобраться что он там хотел.
Диалог по Еnter'у должен закрываться и что-то делать, т.к. может быть вызван из макроса.

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 12:57
by John Doe
Три точки в некоторых ОС означают папку на уровень выше родительской.
Также это может быть нечто случайно попавшее в поле ввода.
Вообще, вероятность того, что мы вставили в поле вводе произвольное имя случайно оканчивающееся точкой достаточно высока.
Но вероятность того, что мы вставили именно "..", со случайно добавленными в конец точками - стремится к 0.

А "делать по Enter что-то полезное" и "делать нечто непотребное" это разные вещи, и при вызове диалога из макроса всё то же самое.

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 13:15
by Тигрёнок
John Doe wrote:А "делать по Enter что-то полезное" и "делать нечто непотребное" это разные вещи, и при вызове диалога из макроса всё то же самое.
Оставить диалог открытым - это "делать что-то непотребное", т.к. дальше макрос туда может чего-то доввести и таки сделать это.

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 13:24
by John Doe
А ничего, что при закрытии диалога могут всплывать всякие подтверждения перезаписи, запросы элевации, и всё такое?
Это вашему гипотетическому макросу не помешает?
Любой приличный макрос должен проверять, что он таки попал в панели, а если нет, то или обрабатывать дополнительные диалоги, или останавливаться.

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 16:29
by Тигрёнок
John Doe wrote:А ничего, что при закрытии диалога могут всплывать всякие подтверждения перезаписи, запросы элевации, и всё такое?
Это вашему гипотетическому макросу не помешает?
Перезапись - нет. О ней можно позаботиться заранее.
John Doe wrote:Любой приличный макрос должен проверять, что он таки попал в панели, а если нет, то или обрабатывать дополнительные диалоги, или останавливаться.
Как он проверит, закрылся диалог или нет?

Re: FIN alt. — Fix Incorrect Names

Posted: Sun 07 Apr, 2013 17:14
by Smitis
Тигрёнок wrote:Как он проверит, закрылся диалог или нет?
Area.Dialog
Всегда приходится проверять, закрылся ли диалог, открылся ли диалог и т.п. То же для меню. По Area, Title, Id и пр. Иначе макросы фиг знает куда занесёт.

FIN alt. — Fix Incorrect Names

Posted: Wed 13 May, 2015 09:31
by Skaramush
Прошу подсказать как добавить в макрос обработку вводимых данных в пользовательском меню. В частности для обработки ввода в конструкциях вида: !?<title>?<init>!

FIN alt. — Fix Incorrect Names

Posted: Wed 13 May, 2015 10:02
by Shmuel
Skaramush wrote: для обработки ввода в конструкциях вида: !?<title>?<init>!
Нужно в Фаре присвоить GUID этому диалогу (конкретно - вызываемому посредством !?<title>?<init>!). После чего этот GUID добавить в макрос в его список GUID'ов.

FIN alt. — Fix Incorrect Names

Posted: Wed 13 May, 2015 10:33
by Skaramush
Shmuel wrote: Нужно в Фаре присвоить GUID этому диалогу
Спасибо за информацию. А как присвоить GUID диалогу?

FIN alt. — Fix Incorrect Names

Posted: Wed 13 May, 2015 10:51
by Shmuel
Skaramush wrote: А как присвоить GUID диалогу?
Это делается в исходниках Фара. Смотрите, например, в чейнжлоге Фара - билд 3868 и ему подобные.