Переименование/перемещение файлов Topic is solved

Столкнулись с проблемой в использовании Far? Здесь можно получить помощь.
Post Reply
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

Здравствуйте.

При переименовании/перемещении файла из одного каталога в другой Far убирает из активной панели перемещенный файл и перемещает выделение на файл, который был ниже перемещенного.

Если же в обоих панелях один и тот же каталог, то выделение остается на переименованном файле, а он при этом может оказаться далеко от исходного положения в панели из-за сортировки (хотя режим "Не сортировать" и включен), и следующий за ним файл приходится искать по списку.

Есть ли возможность настроить Far так, чтобы переименование/перемещение при одном и том же каталоге в обоих панелях работало бы так же, как и в случае различных каталогов в панелях? То есть, переименованный файл "улетал" бы по списку в зависимости от сортировки, а выделение бы перемещалось на следующий в списке файл. Либо, как вариант, файл бы переименовывался "по месту", то есть, при переименовании не менял бы своего положения в списке.
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

ps. Сортировка по размеру позволяет переименовывать "по месту". Но для меня этот вариант не годится: мне необходимо переименовать большое количество файлов, часть уже переименованы, непереименованые файлы идут подряд в начале списка, а если включить сортировку по размеру, то файлы, требующие переименования, будут раскиданы по списку как попало.
User avatar
John Doe
Бюрократ
Posts: 12998
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 40 times
Been thanked: 310 times

Переименование/перемещение файлов

Post by John Doe »

iojikin wrote: Sat 26 Dec, 2020 06:11 Есть ли возможность настроить Far так [...]
Прямой нет, но макросами можно.
iojikin wrote: Sat 26 Dec, 2020 06:54 Сортировка по размеру позволяет переименовывать "по месту"
Есть ещё режим "без сортировки".
https://t.me/FarManager — Telegram чат
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

John Doe wrote: Sat 26 Dec, 2020 09:01 Прямой нет, но макросами можно.
А как можно построить такой макрос?
John Doe wrote: Sat 26 Dec, 2020 09:01 Есть ещё режим "без сортировки".
Если Вы имеете в виду Ctrl+F12 -> "Не сортировать", то этот режим у меня включен, но все равно переименованный файл "улетает" в другое место списка. Или я не правильно пользуюсь этим режимом?
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Переименование/перемещение файлов

Post by buniak_a_h »

iojikin!
Первое. Как оказалось, достаточно перед именем файла указать полный путь - и будет работать так, как и при перемещении в другую папку (т.е. то, что Вы хотите, по-моему).
Второе. Про скрипт.
iojikin wrote: Sat 26 Dec, 2020 10:39 А как можно построить такой макрос?
Попробуйте создать файл в любом подкаталоге папки cd %FARPROFILE%\Macros\scripts (доступна из ФАРа) с любым именем в одировке UTF-8 следующего содержания:
  1. local F = far.Flags
  2. local G = far.Guids
  3. local function AScan(what, where)
  4.  for _,v in ipairs(where) do
  5.   if what == v then return true end
  6.  end
  7. end
  8. Event {
  9.   id = "ED892E8E-D58E-46C7-B23F-1FB1B4FAD038";
  10.   group       = "DialogEvent"; -- export.ProcessDialogEvent
  11.   description = "Сохранение позиции указателя при переименовании/копировании внутри каталога";
  12.   condition   = function(Event, Param)
  13.    return AScan(Dlg.Id, {G.MoveFilesId, G.MoveCurrentOnlyFileId}) and -- Диалог копирования или перемещения/переименования
  14.           Event == F.DE_DLGPROCEND and -- Событие - конец обработки
  15.           Param.Msg == F.DN_CLOSE and  -- закрытия диалога
  16.           ( not Dlg.GetValue(3, 0):find('\\', 1, true) and -- В назначении нет слэша
  17.             not ( (win.GetFileAttr(Dlg.GetValue(3, 0)) or ''):match"d" ) -- и приёмник - не каталог
  18.           ) and
  19.           ( Param.Param1 > 0 and Dlg.GetValue(Param.Param1, 9) == 1) -- Выбрано копирование
  20.   end;
  21.   action      = function(Event, Param)
  22.    local iPos = math.min(APanel.CurPos, APanel.ItemCount)
  23.    mf.postmacro(function() Panel.SetPosIdx(0, iPos) end)
  24.   end;
  25. }
После этого введите в командной строке команду macro:load.
Если в строке назначения диалога копирования нет символа \ и указана не папка, то текущая позиция на активной панели сохраняется.
Есть 2 особенности:
1. Если после переименования файл перемещается вверх, текущим становится не следующий а предыдущий файл (Собственно, как и стандартное перемещение)
2. Если в строке назначения указан новый файл с полным путём (даже если полный путь указывает на исходную папку), то скрипт не работает. Экзотика, но вдруг… К тому же это - возможность вызвать стандартное перемещение.
Last edited by buniak_a_h on Sat 26 Dec, 2020 20:28, edited 1 time in total.
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

buniak_a_h wrote: Sat 26 Dec, 2020 20:27 Как оказалось, достаточно перед именем файла указать полный путь - и будет работать так, как и при перемещении в другую папку (т.е. то, что Вы хотите, по-моему).
Да, это то что мне надо. Спасибо. Теперь понятно, как сделать макрос - Ctrl-. Home Ctrl-] Ctrl-.

Скрипт тоже работает, правда, при наборе нового имени файла выдает ошибку: "...lua:16 attempt to index a number value".
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

iojikin wrote: Sat 26 Dec, 2020 21:52 Ctrl-. Home Ctrl-] Ctrl-.
Точнее Ctrl-. Home Ctrl-[ Ctrl-.
при наборе нового имени файла выдает ошибку: "...lua:16 attempt to index a number value".
После набора нескольких символов появляется диалог с ошибкой (может появиться несколько раз). После закрытия диалога нажатия Enter, файл переименовывается и выделение не уходит вместе с ним.
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Переименование/перемещение файлов

Post by buniak_a_h »

iojikin wrote: Sat 26 Dec, 2020 22:13 После набора нескольких символов появляется диалог с ошибкой (может появиться несколько раз)
Я понял. Просто никак не могу воспроизвести. Вроде скрипт должен работать только при закрытии диалога; изменение содержимого поля никак не влияет. Ну, порядке бреда, попробуйте заменить строки 16 и 17 на следующие:
  1.           ( Dlg.GetValue(3, 0):find('\\', 1, true) == nil and -- В назначении нет слэша
  2.             (win.GetFileAttr(Dlg.GetValue(3, 0)) or ''):match"d" == nil -- и приёмник - не каталог
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

iojikin wrote: Sat 26 Dec, 2020 22:13 Точнее Ctrl-. Home Ctrl-[ Ctrl-.
Еще точнее: Ctrl-. F6 Home Ctrl-[ Ctrl-.
buniak_a_h wrote: Sun 27 Dec, 2020 04:41 Просто никак не могу воспроизвести. Вроде скрипт должен работать только при закрытии диалога; изменение содержимого поля никак не влияет. Ну, порядке бреда, попробуйте заменить строки 16 и 17 на следующие:
Попробовал обновить Far до сборки 5700.0 x64 (была 5000 x64). Попробовал сборку 5700.0 x86. На всех трех сборках проверил оба варианта скрипта. Во всех случаях была ошибка. Сообщение:

Code: Select all

C:\Program Files\Far Manager\Plugins\LuaMacro\LuaMacro.dll:
... Manager\Profile\Macros\scripts\myscripts\copyscript.lua:16: attempt to index a number value
stack traceback:
   ... Manager\Profile\Macros\scripts\myscripts\copyscript.lua:16: in function 'condition'
   C:\Program Files\Far Manager\Plugins\LuaMacro\utils.lua:192: in function <C:\Program Files\Far Manager\Plugins\LuaMacro\utils.lua:185>
Переименовывал файлы вида 010203.pdf, 010204.pdf, ..., 01020\d.pdf в Rubakin03.pdf, Rubakin04.pdf, ..., Rubakin\d.pdf.
Каталог - D:\Книги\Неразобранное
Нажимал F6, затем сразу же набирал имя файла: Rubakin06... В сборках x64 диалог чаще появляется при наборе второй цифры, в сборках x86 - при наборе буквы f в расширении.

На сборке 5700.0 x64 проверил в каталоге верхнего уровня без русских букв: D:\testcopy
Все равно показывает ошибку.
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Переименование/перемещение файлов

Post by buniak_a_h »

iojikin, я не понял про 01020\d.pdf. Это файл так называется? Со слэшом в имени файла? Как вы это сделали?
Кстати, для такой операции рекомендую плагин Visual Renaming. Там есть переименование по регэксп-шаблону. В Вашем случае было бы 0101(.*) -> Rubakin$1 (так примерно). Ну, правда, со слэшом в имени я не знаю, что делать…
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

buniak_a_h wrote: Sun 27 Dec, 2020 08:50 iojikin, я не понял про 01020\d.pdf.
Это я так любую цифру от 0 до 9 обозначил. Прошу прощения, думал, будет понятно.
Кстати, для такой операции рекомендую плагин Visual Renaming. Там есть переименование по регэксп-шаблону.
У меня переименование не по шаблону, а по содержимому файла. Открываешь pdf, смотришь пару-другую страниц, закрываешь, переименовываешь. Файлы 010200.pdf, 010201.pdf, ..., 010209.pdf с переименованием в Rubakin00.pdf и т. д. - это, на самом деле один файл, который я раскопировал для тестирования Вашего скрипта.
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Переименование/перемещение файлов

Post by buniak_a_h »

iojikin, пока никак не вылетает. Сейчас перепишу так, чтоб вообще не было шансов вылететь (лишние, на мой взгляд, проверки вставлю).
Может, ещё какой скрипт/плагин портит? Не понимаю…
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

buniak_a_h wrote: Sun 27 Dec, 2020 14:26 Может, ещё какой скрипт/плагин портит?
Я сейчас попробовал удалить и снова установить Far, отключив все аддоны и плагины, кроме LuaMacro. Все равно, если после открытия диалога перемещения сразу же начинаешь набирать новое имя, то через несколько нажатий клавиш ловишь ошибку. Но на этот раз заметил, что если после открытия диалога переместить курсор за расширение, стереть имя файла и набирать новое, то ошибка не появляется.

ps. Я попробовал два варианта: первый - закомментировать строки 16-18 в исходном скрипте и второй - переместить строку 19 на место перед строкой 16 (и переместить соответственно 'and' из конца строки 18). В обоих вариантах ошибки нет. Понятно, что в первом варианте часть логики теряется, а во втором она как-то изменяется?
Last edited by iojikin on Sun 27 Dec, 2020 16:21, edited 1 time in total.
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Переименование/перемещение файлов

Post by buniak_a_h »

iojikin wrote: Sun 27 Dec, 2020 15:44 Я попробовал два варианта: первый - закомментировать строки 16-18 в исходном скрипте и второй - переместить строку 19 на место перед строкой 16 (и переместить соответственно 'and' из конца строки 18). В обоих вариантах ошибки нет. Понятно, что в первом варианте часть логики теряется, а во втором она как-то изменяется?
Второй вариант - правильный без вариантов. В том скрипте, что я Вам начал писать, проверка, что нажата умолчательная кнопка ({ Move }), перенесена выше (после 15-й строки). И это - правильно и эффективно. Просто когда я начинал писать, я ещё не знал про Dlg.GetValue(…, 9).
iojikin
Posts: 9
Joined: Sat 26 Dec, 2020 05:50

Переименование/перемещение файлов

Post by iojikin »

buniak_a_h, спасибо большое!
Post Reply

Return to “Нужна помощь”