View Issue Details

IDProjectCategoryView StatusLast Update
0000281Wishes_Commonpublic2018-11-01 13:30
ReporterZuz Assigned To2useven10  
PrioritynormalSeverityfeatureReproducibilityalways
Status newResolutionopen 
Product Version1.71 
Summary0000281: Автоподстановка переменных среды не позволяет работать с путями вида C:\%AppData%
Description1. В диалоге копирования файлов/папок, в диалоге переноса/переименования файлов/папок, в диалоге создания папок, в диалоге открытия файла в редакторе, в командной строке FAR (CD, CHDIR, SET и что там ещё он сам умеет), метасимволы, ссылки на папки (ПравыйCtrl+цифра), настройки где есть указания на путь типа пути к персональным плагинам не позволяют экранировать строки в пути вида %AppData% и в случае, если переменная среды определена, то провети требуемую операцию не возможно.

Для решения это проблемы предлагается TI, включенное по умолчанию, отключающее подстановку переменных среды, в случае же, когда TI отключено, то допустима и подстановка и экранирование % символом ^, как это сделано в штатном командном процессоре (сmd.exe).
Дополнительно появляется некоторый интеллект в диалогах, когда TI отключено, например в диалоге копирования файла (для определенности пример)в каталог "C:\%AppData%" в диалоге копирования должно быть "C:\^%AppData^%".
Правда, в этом случае вылазит проблема с удвоением ^, т.к. возникают проблемы с созданием папок вида "C:\^%AppData^%".

2. Для сведения в сmd.exe сделано вот так:
C:\>echo C:\%AppData%
C:\C:\Documents and Settings\AuzinYV\Application Data

C:\>echo C:\^%AppData^%
C:\%AppData%

C:\>echo "C:\^%AppData^%"
"C:\^%AppData^%"

C:\>echo C:\^%AppData^%\ ^^
C:\%AppData%\ ^

C:\>echo "C:\^%AppData^%\ ^^"
"C:\^%AppData^%\ ^^"

Т.е. по аналогии можно предложить такой вариант реализации, если путь заключен в двойные кавычки, то делаем подстановку переменных среды, иначе реализуем повоедения с экранированием % символом ^.

3. TI вообще нужно для того, чтобы плагины могли тоже его использовать и соответсвующим образом себя вести.

P.S. Вообще проблема несколько надумана, но чтоб не забыть записал сие.
TagsNo tags attached.
Build

Relationships

has duplicate 0003057 closed2useven10 Far Manager Неуместное раскрытие переменных в путях при копировании/переносе 

Activities

HaRT

2008-10-13 03:18

reporter   bugnote:0001881

Родственное обсуждение и УЖЕ работающий способ экранирования тут: http://forum.farmanager.com/viewtopic.php?p=35833#p35833

JohnDoe

2010-09-29 09:06

updater   bugnote:0005850

До кучи: исходная тема http://forum.farmanager.com/viewtopic.php?f=9&t=2616

JohnDoe

2010-09-29 09:08

updater   bugnote:0005851

>УЖЕ работающий способ экранирования
Если принять этот способ за решение, то необходимо его описать в хелпе.

И главное: при попытке скопировать что-то в такую папку фар САМ должен экранировать имя.

JohnDoe

2013-02-24 15:07

updater   bugnote:0010387

Очередной виток http://forum.farmanager.com/viewtopic.php?p=104409#p104409

2useven10

2015-08-14 08:28

developer   bugnote:0013764

Предлагаю добавить небольшой ИИ:
Если имя папки назначения в диалоге копирования/перемещения не изменено,
т.е. совпадает с каталогом пассивной панели - не делать подстановку.
На мой взгляд, это больше 90% обломов.
В остальном использование кавычки, можно считать приемлемым решением.

JohnDoe

2015-08-14 17:25

updater   bugnote:0013767

>Предлагаю добавить небольшой ИИ:
Лучше немного иначе: если папка совпадающая с именем переменной существует, то не разворачивать.
Это покроет дополнительно ещё 5% обломов.
Возможно для таких случаев нужно особое подтверждение.


>В остальном использование кавычки, можно считать приемлемым решением.
Не согласен, т.к. это неочевидно, недокументировано, и после очередного рефакторинга работать перестанет.

В идеале нужен способ, позволяющий пользователю явно сообщить о своих намерениях.
Например специальный чекбокс (и надо ещё подумать каково должно быть его умолчательное состояние, и должно ли это состояние запоминаться при изменении, и если да, то навсегда, или только на текущий сеанс)
Другой вариант: специальная кнопка, явно разворащивающая переменные.

2useven10

2015-08-14 18:02

developer   bugnote:0013768

Не лучше. И не очевидно.
Существовать могут обе папки, а решать за пользователя, в какую из существующих папок надо копировать файлы я бы не стал.
В предлагаемом варианте, если пользователь не изменил папку назначения, то понятно что он хотел сделать.

Про идеал не знаю, речь идёт о приемлемом разумном варианте.

2useven10

2015-08-14 21:28

developer   bugnote:0013771

4408

AleXH

2015-08-15 15:05

reporter   bugnote:0013772

Имхо прозрачнее чекбокс "[x] разворачивать переменные", но тогда его придётся добавить во все диалоги с путями FS. Если пользователю потребуется выборочное экранирование, то он может использовать двойные кавычки как сейчас.

Состояние чекбокса по умолчанию - разворачивание включено (cmd так делает, плюс исторически так сложилось).

АИ.
> В предлагаемом варианте, если пользователь не изменил папку назначения, то понятно что он хотел сделать.

- Не факт. Пользователь может распаковывать чужой архив, и что там хотел его создатель - не известно.

JohnDoe

2015-08-16 08:05

updater   bugnote:0013773

Last edited: 2015-08-16 08:06

AleXH
>но тогда его придётся добавить во все диалоги с путями FS
Или завести общий параметр, доступный макросам

>Не факт.
Имеется ввиду случай, когда путь с "%" открыт на целевой панели.

> Пользователь может распаковывать чужой архив[...]
А сейчас что происходит в этих случаях? Имхо, если папка в архиве содержит %, то разворачивать нельзя

JohnDoe

2015-08-16 08:20

updater   bugnote:0013774

2useven10
>Существовать могут обе папки, а решать за пользователя, в какую из существующих папок надо копировать файлы я бы не стал.
Согласен. Предлагаю в этом случае предлагать пользователю выбор.
Т.е.: если путь в строке редактирования изменён, и существуют обе папки, то требовать подтверждения.

Кроме того, предлагаю добавить в ИИ ещё одно правило: если развёрнутый путь получается невалидным (например содержит в середине ":\"), то не просто выдавать ошибку, а предлагать распаковать в "неразвёрнутом" виде.
(или же без подтверждений делать это по умолчанию)

2useven10

2015-08-16 16:23

developer   bugnote:0013775

>Т.е.: если путь в строке редактирования изменён, и существуют обе папки, то требовать подтверждения.
А если существует одна, а я ХОЧУ создать другую?
Сейчас правила достаточно просты. Для сложных случаев есть магическая кавычка. Излишний ИИ может создать очень неочевидные проблемы.

> Кроме того, предлагаю добавить в ИИ ещё одно правило...
Может быть. Но тут тоже могут быть сюрпризы. Сейчас (и с Вашими предложениями тоже) альтернатив всего 2 - разворачивать переменные или нет. А если переменных в пути 2 (3, ...) ?

JohnDoe

2015-08-16 16:35

updater   bugnote:0013776

> Излишний ИИ может создать очень неочевидные проблемы.
ИИ был изначально: если есть переменная, то пытаемся развернуть.
И излишняя простота этого ИИ создавала в некоторых случаях проблемы.

Вы добавили разумное правило, усложнив ИИ, но уменьшив вероятность проблем.

Добавляя новые правила, пытаясь покрыть больше случаев, мы усложняем ИИ, безусловно.

>А если переменных в пути 2 (3, ...) ?
Хороший вопрос, надо подумать.

AleXH

2015-08-17 07:05

reporter   bugnote:0013778

Last edited: 2015-08-17 07:12

>А если переменных в пути 2 (3, ...) ?
Валидный путь с точки зрения FS после разворота переменных и стоит галка разворачивать - разворачиваем, не валидный - выдаём соответствующий диалог с чекбоксом "[ ] запомнить выбор" и кнопками "не разворачивать все", "не разворачивать отмеченные", "Отмена". Отмеченные это те, которые отмечены двойной кавычкой (пример %"AppData%).

JohnDoe

2015-08-17 14:11

updater   bugnote:0013783

AleXH
Ситуация когда переменных более 1 на мой взгляд слишком нетипична, чтобы наворачивать такой интерфейс.
Имхо, никак особо обрабатывать такой случай не стоит.

2useven10

2015-08-17 20:11

developer   bugnote:0013789

@JohnDoe
Вот с этим согласен на 100%.
Даже с 1 переменной ситуация не слишком частая.

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

JohnDoe

2015-08-17 20:36

updater   bugnote:0013790

Last edited: 2015-08-17 21:15

>решить где и как легализовать трюк с кавычкой в документации.
Трюк по определению нельзя легализовать.

Предлагаю найти честный путь. Если не хочется городить интерфейс, то может макросами?
http://forum.farmanager.com/viewtopic.php?f=15&t=9778

JohnDoe

2017-10-31 12:49

updater   bugnote:0015775

Last edited: 2017-10-31 12:52

В идеале поле ввода с флагом DIF_EDITEXPAND могло бы иметь дополнительный встроенный элемент управления, позволяющий отключить разворачивание переменных.

Если без этого, то можно использовать макрос постом выше.
Для его нормальной работы в диалоге копирования предлагаю внести небольшое изменение.

В настоящий момент поле с назначением анализируется после закрытия диалога.
Предлагаю вернуть в поле DIF_EDITEXPAND, и перенести анализ его содержимого в обработчик диалога (DN_CLOSE): если путь не менялся пользователем, то снимать флаг DIF_EDITEXPAND.

Таким образом само поведение диалога не изменится, зато появится возможность влиять на него извне, макросом.

Issue History

Date Modified Username Field Change
2007-04-27 21:34 Zuz New Issue
2008-06-29 03:20 alexy Project Far Manager 1.7x => Known Error
2008-10-13 03:18 HaRT Note Added: 0001881
2010-09-29 09:06 JohnDoe Note Added: 0005850
2010-09-29 09:08 JohnDoe Note Added: 0005851
2013-02-24 15:07 JohnDoe Note Added: 0010387
2015-08-14 08:22 2useven10 Relationship added has duplicate 0003057
2015-08-14 08:28 2useven10 Note Added: 0013764
2015-08-14 17:25 JohnDoe Note Added: 0013767
2015-08-14 18:02 2useven10 Note Added: 0013768
2015-08-14 21:28 2useven10 Note Added: 0013771
2015-08-14 21:28 2useven10 Assigned To => 2useven10
2015-08-14 21:28 2useven10 Status new => feedback
2015-08-15 15:05 AleXH Note Added: 0013772
2015-08-16 08:05 JohnDoe Note Added: 0013773
2015-08-16 08:06 JohnDoe Note Edited: 0013773
2015-08-16 08:20 JohnDoe Note Added: 0013774
2015-08-16 16:23 2useven10 Note Added: 0013775
2015-08-16 16:35 JohnDoe Note Added: 0013776
2015-08-17 07:05 AleXH Note Added: 0013778
2015-08-17 07:07 AleXH Note Edited: 0013778
2015-08-17 07:12 AleXH Note Edited: 0013778
2015-08-17 14:11 JohnDoe Note Added: 0013783
2015-08-17 20:11 2useven10 Note Added: 0013789
2015-08-17 20:36 JohnDoe Note Added: 0013790
2015-08-17 21:15 JohnDoe Note Edited: 0013790
2017-10-31 12:49 JohnDoe Note Added: 0015775
2017-10-31 12:50 JohnDoe Note Edited: 0015775
2017-10-31 12:52 JohnDoe Note Edited: 0015775
2017-10-31 12:53 JohnDoe Project Known Error => Wishes
2018-11-01 13:30 JohnDoe Status feedback => new