Поддержка относительных путей в Named Folders 3.0
Основное назначение NF - обеспечить возможность переходить в директории, помеченные ярлыками. Пример: создаем ярлык pf для C:\Program Files, переходим в C:\Program files командой cd:pf
Но плагин позволяет перейти не только в базовую директорию, на которую непосредственно указывает ярлык, но и в директорию, заданную относительно базовой.
Пример: Команда cd:pf\a задает путь "a" относительно базовой директории C:\Program files. Плагин автоматически найдет и покажет все подходящие пути c:\Program files\a* в виде меню - пользователю останется выбрать нужный.
Общий принцип задания "относительных" путей прост - "все так же как в FAR". Можно указать путь явно, можно использовать в нем стандартные метасимволы *, ? и [a-z], задавать переход в вышерасположенную директорию через ".." и т.д. Но есть и ряд отличительных особенностей. В частности, с помощью специальных метасимволов \**:N и \..*:N, можно задавать глубину поиска.
Поддержка относительных путей существовала начиная с NF2. В NF3 она была существенно переработана, а ее синтаксис был изменен. Естественно, в лучшую сторону. Обсуждение всех внесенных изменений можно посмотреть в issue #7 .
Ниже приведены детали реализации, актуальные для NF3.0.
Автоматическое расширение имен
Если вы подаете команду cd:abc\a\b\*c, то NF выполняет команду cd:abc\*a*\*b*\*c. Звездочки до и после "a" и "b" подставляются автоматически. После "c" звездочка не подставляется, т.к. *c уже содержит один из метасимволов. Правило простое: если в имени используется хотя бы один метасимвол, то имя звездочками не дополняется; если метасимволов нет, то дополняется.
Как именно дополнять имя метасимволами задает настройка "Режим расширения команд". Варианта три:
Последний вариант, по сути, отключает автоматическое дополнение имен звездочками. Звездочки всегда придется прописывать вручную.
Где используются относительные пути
В трех местах:
- В команде запуска ярлыка: cd:a\path
- В названии директории, на которую ссылается ярлык. Т.е. ярлык может, например, указывать не просто на c:\program files, но и на c:\program files* или на c:\program files\**:4
- В командах прямого поиска, когда вместо ярлыка указывается путь к директории cd:c:\path"
Автоматическое расширение имен применяется в случаях 1 и 3. В варианте 2 все необходимые метасимволы надо всегда указывать явно, вне зависимости от выбранного режима расширения команд.
Метасимволы
В относительных путях можно использовать метасимволы. Их поддерживается несколько штук. Во-первых, метасимволы используемые в FAR:
- * - 0 или больше символов.
- ? - любой символ
- [a-z] - любой символ из перечисленных
Во-вторых, специфичные метасимволы NF, позволяющие регулировать глубину поиска:
- \** - искать вглубь без ограничений уровня поиска.
- \..* - искать вверх без ограничения уровня поиска.
- \**:N - искать вглубь не более чем на N уровней. У команды есть "короткий" вариант, оставшийся от NF2.5. Вместо cd:pf\**:3 можно написать cd:pf\\\, т.е. N слешей заменяет \**:N. Короткий синтаксис включается в настройках. Если он отключен, то N повторяющихся слешей интерпретируется как один слеш.
- \..*:N - искать вверх не более чем на N уровней. Короткий вариант команды \.... (N + 1 точек). Если короткий синтаксис отключен, то N точек интерпретируется как 2 точки (при N > 2; одна точка интерпретируется как одна точка).
- .. - артефакт, оставшийся от NF 2.5, работает только при включенном в настройках коротком синтаксисе команд. Команда cd:pf.. интерпретируется как cd:pf\..
Возможность регулировки глубины поиска нужна, чтобы ускорить поиск. Например команда cd:pf\**\a - поиск в Program Files всех директорий, начинающихся на a, - может занять несколько минут. Если же вы точно знаете, что директория находится на первом-втором уровне вложенности, то можете подать команду cd:pf\**:2a и найти нужную директорию менее чем за секунду.
Если же вы все-таки запустили поиск без ограничения уровня вложенности, то помните о возможности нажать Esc в процессе поиска. Поиск не будет отменен. Вместо этого NF покажет меню вариантов, содержащее уже найденные результаты. Правда, продолжить остановленный поиск нельзя - придется запускать его по новой.
Отличия NF 2.5 и NF 3.0
Есть ряд особенностей, которые коренным образом отличают поведение NF 3.0 от NF 2.5.
- Последний слеш всегда отбрасывается. Т.е. если вы даете команду cd:abc\, то будет отработана команда cd:abc.
- В NF 2.X последовательные команды \* и \.. вычитали друг друга. В NF 3.X они выполняются последовательно. Т.е. команда cD:abc\..\* сделает следующее:
- найдет директорию, на которую ссылается алиас abc;
- перейдет в родительскую директорию, т.е. на один уровень вверх от найденной;
- вернет все директории, непосредственно вложенные в родительскую директорию.
- В NF 3.0 введены новые метасимволы \**, \..* для поиска без ограничения уровня вложенности. В NF 2.5 вместо с этой целью использовались метасимволы \*\ и \.\, которые более не поддерживаются.
- В NF 3.0 введены новые метасимволы \**:N, \..*:N для поиска с ограничнием уровня вложенности. В NF 2.5 вместо этих команд нужно было использовать последовательности из N-слешей или N-точек.
Примеры использования
Примеры команды для поиска относительно директории, заданной алиасом sh:
- cd:sh\ - то же самое, что сd:sh (последний слеш всегда игнорируется).
- cd:sh\** - неограниченный поиск вглубь.
- cd:sh\**:2 - поиск вглубь на два уровня вниз.
- cd:sh\\ - если в настройках разрешен короткий синтаксис команд, то такая команда означает поиск вглубь на два уровня вниз; если короткий синтаксис запрещен, то команда работает как cd:sh
- cd:sh\*\* - поиск вглубь на два уровня вниз. Эта команда похожа на cd:sh\**:2, но есть важное отличие. Команда cd:sh\*\* включит в результаты только директории второго уровня, а команда {{{cd:sh\:2}} - как второго, так и первого уровня.
- cd:sh\*\*\a - найти директории, расположенные на третьем уровне вложенности, удовлетворяющие маске "a".
- cd:sh\**:3a - найти все директории, расположенные на первом, втором и третьем уровнях вложенности, и удовлетворяющие маске "a".
- cd:sh\**:3\a - найти все директории, расположенные на первом, втором и третьем уровнях вложенности, а затем в каждой из них провести поиск директории, удовлетворяющей маске "a".
- cd:sh\.. - директория на 1 уровень выше, чем alias
- cd:sh\..\* - найти все директории, вложенные в родительскую директорию.
- cd:sh\..*:2 - вернуть две директорию: родительскую и ту, в которую родительская вложена.
- cd:sh\..* - вернуть все родительские директории. Если наша директория находится на N-ном уровне в файловой системе, то команда вернет N - 1 директорию.
- cd:sh\..* - вернуть все родительские директории, удовлетворяющие маске "a".
- cd:sh\..*\a - найти все родительские директории и в каждой из них провести поиск поддиректорий, удовлетворяющих маске "a".
- cd:sh.. - если в настройках разрешен короткий синтаксис команд, то такая команда означает переход в родительскую директорию относительно sh; если короткий синтаксис запрещен, то команда работает как cd:sh.
Короткий синтаксис в путях
Если включить флаг "Короткий синтаксис в путях" то можно будет использовать укороченный синтаксис команд поиска, практически идентичный тому, что использовался в NF 2.5. А именно:
- \\\ вместо \**:3 - N слешей вместо \**:N;
- .... вместо \..*:3 - N + 1 двоеточие вместо \..:N
- cd:abc.. вместо cd:abc\..
Дальнейшие направления развития
- Возможность использование средств индексации. Прежде всего, службы Win7, а возможно и другие средства (например, google, www.voidtools.com, www.locate32.net). Если возможность окажется полезной, можно будет сделать субплагины и переключатель средств поиска в меню вариантов.
- Фоновый поиск. Не ждать завершения поиска, а выводить результаты прямо в процессе поиска.
> Использовать средства индексированного поиска Win7 для быстрого перебора директорий. Есть такая очень полезная штука www.voidtools.com (и аналогичная www.locate32.net). К ним есть API
>Переделать диалог поиска так, чтобы результаты поиска начинали выводиться прямо в процессе поиска, т.е. ДО полного его завершения. Это было бы здорово.
NF это не средство поиска каталогов по всему диску. идея тут в создании алиасов к конкретным основным важным точкам в ФС, и потом переходить по ним или около них. для того и ведется работа с относительными путями. мне так кажется
Не вижу противоречия между вашим и моим тезисами. Использование готовой базы данных РАЗИТЕЛЬНО ускорит поиск в конкретных основных важных точках в ФС, и соответственно переходы вокруг да около.
> abc - любой символ из перечисленных вот этого как то недопонял) это про abc? - любой символ из множества или о то что любой символ просто воспринимается как символ ?