FIN alt. — Fix Incorrect Names

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

FIN alt. — Fix Incorrect Names

Post by John Doe »

Автор — Shmuel.
Макрос получен из LuaFAR-плагина LF_FIN, представляющего собой аналог другого плагина (автор Тигренок).
Плагин перехватывает закрытие диалогов «Сохранить файл как» редактора и «Открыть/создать файл», «Копировать», «Переименовать или перенести», «Создать папку», «Создать ссылку» панелей, а также диалога «Распаковка архива» плагина ArcLite, удаляя с конца введённого имени пробелы и точки
P.S.
В случае если всё-таки необходимо создать файл/папку, имя которой оканчивается пробелами — можно завершить имя кавычкой.
Last edited by John Doe on Thu 20 Feb, 2020 08:24, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: FIN alt. — Fix Incorrect Names

Post 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
В случае если завершающая часть пути представляет собой "..." (или ".. . . . . .") то диалог не закроется, плюс об ошибке сообщит звуковой сигнал (но это на любителя)
User avatar
Тигрёнок
Posts: 391
Joined: Wed 03 May, 2006 06:07
Location: Россия
Contact:

Re: FIN alt. — Fix Incorrect Names

Post by Тигрёнок »

John Doe wrote:1) ".." и "xxx\.." это корректные имена.
2) "..." и "xxx\..." - некорректные, но исправлять их молча нельзя, потому что результат исправления может сильно отличаться от задуманного (не знаю как поступает оригинальный FIN).
Оригинальный FIN помнит, что операции, скажем, создания папки и копирования – операции существенно разные. Поэтому для первой будут с имён вида xxx\.. и xxx\... будут срублены все финальные точки, а для второй – оставлены две.
Съешь мыша – стань настоящим клавишником!
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: FIN alt. — Fix Incorrect Names

Post by Shmuel »

John Doe wrote:В отличии от оригинального плагина не обрабатываются точки.

Это можно преодолеть задав local Pattern = "[%s.]+$"
Манипуляции с точками убраны сознательно. Точки видны, поэтому мне такой искусственный интеллект не нужен.
(Теперь уже и пробелы концевые видны, но во время создания плагина на Lua этого ещё не было).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: FIN alt. — Fix Incorrect Names

Post by John Doe »

Тигрёнок wrote:Оригинальный FIN помнит, что операции, скажем, создания папки и копирования – операции существенно разные. Поэтому для первой будут с имён вида xxx\.. и xxx\... будут срублены все финальные точки, а для второй – оставлены две.
Да, но согласитесь что ситуация эта редкая и странная, и например если в диалоге копирования стоит "..." это не обязательно значит, что пользователь будет рад копированию в родительскую папку.
Поэтому в таких случаях я предлагается ничего не делать, оставлять диалог открытым, предлагая пользователю самому разобраться что он там хотел.
Код, предложенный выше, именно такое поведение и реализует.
Shmuel wrote:Манипуляции с точками убраны сознательно. Точки видны, поэтому мне такой искусственный интеллект не нужен.
(Теперь уже и пробелы концевые видны, но во время создания плагина на Lua этого ещё не было).
Есть ведь стереотипные действия типа "CtrlV Enter", во время которых никто и не смотрит что там видно. Плюс возможно пользователь это не сам делает, а другим макросом.
(В любом случае, макрос в шапке ваш, и его я не трогаю)
User avatar
Тигрёнок
Posts: 391
Joined: Wed 03 May, 2006 06:07
Location: Россия
Contact:

Re: FIN alt. — Fix Incorrect Names

Post by Тигрёнок »

John Doe wrote:если в диалоге копирования стоит "..." это не обязательно значит, что пользователь будет рад копированию в родительскую папку.
А чему он будет рад, написав в путь три точки?

John Doe wrote:Поэтому в таких случаях предлагается ничего не делать, оставлять диалог открытым, предлагая пользователю самому разобраться что он там хотел.
Диалог по Еnter'у должен закрываться и что-то делать, т.к. может быть вызван из макроса.
Съешь мыша – стань настоящим клавишником!
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: FIN alt. — Fix Incorrect Names

Post by John Doe »

Три точки в некоторых ОС означают папку на уровень выше родительской.
Также это может быть нечто случайно попавшее в поле ввода.
Вообще, вероятность того, что мы вставили в поле вводе произвольное имя случайно оканчивающееся точкой достаточно высока.
Но вероятность того, что мы вставили именно "..", со случайно добавленными в конец точками - стремится к 0.

А "делать по Enter что-то полезное" и "делать нечто непотребное" это разные вещи, и при вызове диалога из макроса всё то же самое.
User avatar
Тигрёнок
Posts: 391
Joined: Wed 03 May, 2006 06:07
Location: Россия
Contact:

Re: FIN alt. — Fix Incorrect Names

Post by Тигрёнок »

John Doe wrote:А "делать по Enter что-то полезное" и "делать нечто непотребное" это разные вещи, и при вызове диалога из макроса всё то же самое.
Оставить диалог открытым - это "делать что-то непотребное", т.к. дальше макрос туда может чего-то доввести и таки сделать это.
Съешь мыша – стань настоящим клавишником!
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: FIN alt. — Fix Incorrect Names

Post by John Doe »

А ничего, что при закрытии диалога могут всплывать всякие подтверждения перезаписи, запросы элевации, и всё такое?
Это вашему гипотетическому макросу не помешает?
Любой приличный макрос должен проверять, что он таки попал в панели, а если нет, то или обрабатывать дополнительные диалоги, или останавливаться.
User avatar
Тигрёнок
Posts: 391
Joined: Wed 03 May, 2006 06:07
Location: Россия
Contact:

Re: FIN alt. — Fix Incorrect Names

Post by Тигрёнок »

John Doe wrote:А ничего, что при закрытии диалога могут всплывать всякие подтверждения перезаписи, запросы элевации, и всё такое?
Это вашему гипотетическому макросу не помешает?
Перезапись - нет. О ней можно позаботиться заранее.
John Doe wrote:Любой приличный макрос должен проверять, что он таки попал в панели, а если нет, то или обрабатывать дополнительные диалоги, или останавливаться.
Как он проверит, закрылся диалог или нет?
Съешь мыша – стань настоящим клавишником!
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: FIN alt. — Fix Incorrect Names

Post by Smitis »

Тигрёнок wrote:Как он проверит, закрылся диалог или нет?
Area.Dialog
Всегда приходится проверять, закрылся ли диалог, открылся ли диалог и т.п. То же для меню. По Area, Title, Id и пр. Иначе макросы фиг знает куда занесёт.
Разум когда-нибудь победит.
Skaramush
Posts: 50
Joined: Mon 16 May, 2011 04:03
Has thanked: 5 times
Been thanked: 1 time

FIN alt. — Fix Incorrect Names

Post by Skaramush »

Прошу подсказать как добавить в макрос обработку вводимых данных в пользовательском меню. В частности для обработки ввода в конструкциях вида: !?<title>?<init>!
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

FIN alt. — Fix Incorrect Names

Post by Shmuel »

Skaramush wrote: для обработки ввода в конструкциях вида: !?<title>?<init>!
Нужно в Фаре присвоить GUID этому диалогу (конкретно - вызываемому посредством !?<title>?<init>!). После чего этот GUID добавить в макрос в его список GUID'ов.
Skaramush
Posts: 50
Joined: Mon 16 May, 2011 04:03
Has thanked: 5 times
Been thanked: 1 time

FIN alt. — Fix Incorrect Names

Post by Skaramush »

Shmuel wrote: Нужно в Фаре присвоить GUID этому диалогу
Спасибо за информацию. А как присвоить GUID диалогу?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

FIN alt. — Fix Incorrect Names

Post by Shmuel »

Skaramush wrote: А как присвоить GUID диалогу?
Это делается в исходниках Фара. Смотрите, например, в чейнжлоге Фара - билд 3868 и ему подобные.
Post Reply

Return to “Полезные макросы и скрипты”