Данный скрипт позволяет назначать на папки и файлы закладки (закладка может содержать ссылки как на одну, так и на несколько целей, для разных панелей; подробнее во встроенной справке скрипта) и переходить по ним (или запускать их средствами ОС), а также по переменным окружения, содержащим пути. Идея взята у Shell Bookmark (с) Max Rusov, текст написан с нуля.
Не требуются дополнительные плагины, чистый lua-скрипт;
Если закладка не опознана, нажатые клавиши возвращаются Far-у;
Закладки могут храниться и в локальном, и в глобальном профиле;
Локализация;
Встроенная справка;
Настройки хранятся не в файле скрипта, а в профиле Far-а;
Скрипт добавляет себя в меню плагинов и дисков;
Если имя набрано частично, предлагается выбор из меню;
Позволяет переходить по путям из переменных окружения;
Если значение закладки/переменной указывает на несколько целей, можо выбрать одну с помощью меню;
Цель можно не только выбрать в панели Far, но и выполнить системные команды "открыть" и "редактировать";
Позволяет работать с закладками через префиксы командной строки;
При работе с префиксами командной строки позволяет добавлять после закладки относительный путь;
Скрипт можно вызывать как функцию (подробности в справке).
Скрипт содержит три макроса.
Сохранение текущей папки в новой закладке.
Клавиша вызова: RCtrl+Shift/RAlt+последовательность клавиш.
Переход по закладке.
Клавиша вызова: RCtrl+последовательность клавиш.
Меню закладок и настроек.
Клавиша вызова: RCtrl+/.
bm - перейти по закладке/переменной окружения;
bma - добавить закладку;
bmal - добавить локальную закладку;
bmag - добавить глобальную закладку;
bme - редактировать в диалоге закладку;
bmel - редактировать в диалоге локальную закладку;
bmeg - редактировать в диалоге глобальную закладку;
bmr - удалить закладку;
bmrl - удалить локальную закладку;
bmrg - удалить глобальную закладку;
bmhelp - вызов справки.
Требуемая версия Far 3.0.4324+.
Версия 1.0 - Первый релиз.
Версия 1.0.1 - Исправлена ошибка, когда скрипт не запускался, пока не вызовешь меню закладок, мелкие правки
Версия 1.0.2 - Локализация работы с настройками, более корректная обработка ситуации, когда локальный и глобальный профили совпадают и когда не совпадают, мелкие правки
Версия 1.0.3 - Сообщение при сохранении новой закладки, мелкие правки
Версия 1.0.4 - Небольшая оптимизация формирования меню, поддержка плагиновых панелей, мелкие правки
Версия 1.1 - Поддержка установки одновременно активной и пассивной панели, мелкие правки. Экспериментально: изменён принцип хранения и загрузки языковых данных. Просьба отписаться в теме, который вариант лучше на Ваш взгляд. Если новый вариант понравится, внедрю его и в остальные свои скрипты с поддержкой настройки языка.
Версия 1.1.1 - Корректная обработка пустой строки
Версия 1.1.2 - Исправлена ошибка с обращением к старым языковым файлам, мелкие правки
Версия 1.2 - Расширение формата каталога. Теперь можно указывать панели: активную, пассивную, левую, правую. Изгнание io.lines. Если языка нет, подгружается английский, при загрузке настроек язык не подгружается, если не менялся. Мелкие правки.
Версия 1.2.1 - Срабатывание быстрых клавиш в меню RCtrl+/, рефакторинг, добавим uid-ы в макросы и пункт в меню плагинов.
Версия 1.2.2 - "&" в меню отрабатывался как акселератор, а не символ. Запрет вводить символы, которые нельзя ввести в сочетании с Ctrl.
Версия 1.2.3 - В версии 1.2.1 была поломана загрузка части параметров, в результате чего при некоторых комбинациях настроек скрипт падал при попытке создать новую закладку.
Версия 1.2.4 - Скрипт зачем-то вызывался из любых меню. Исправлено. В целях унификации с другими скриптами автора изменен механизм языковой настройки. Исправлена ошибка с разной шириной столбца закладок для локальных и глобальных закладок. Теперь в менеджере закладок по F4 закладка не копируется при её изменении. Для копирования жать F5.
Версия 2.0.0 - Помимо закладок поддерживаются переменные окружения (только переход на папки). Если закладка или переменная набрана частично, выводится список всех, содержащих набранный фрагмент. Мелкие правки.
Версия 2.0.1 - Мелкие правки.
Версия 2.1.0 - Добавлена работа из командной строки через префиксы. Можно переходить по закладкам и переменным окружения, добавлять/редактировать в диалоге/удалять закладки. Рефакторинг. Исправление кучи внезапно обнаруженных ошибок.
Версия 2.1.1 - Сокращённые меню позволяют все те же действия, что и полное. Комбинации RCtrlЦифра передаются Far-у, если такой закладки или переменной нет. Не совпадающие даже частично ни с одной закладкой или переменной окружения, содержащей путь, тоже.
Версия 2.1.2 - При вызове через префикс несуществующая комбинация не возвращается в виде нажатий клавиатуры.
Версия 2.2.0 - Настройка вынесена в отдельный диалог. Улучшены диалоги для совпадающих локального и глобального профилей. Переработана справка. Добавлен префикс для вызова справки. Мелкие правки.
Версия 2.2.1 - Исправлена ошибка, из-за которой не показывалась справка.
Версия 2.3.0 - Теперь можно использовать в командной строке конструкции вида "bm:<метка><подкаталог>", к примеру, "bm:фильмы\Мульфильмы\Фиксики". Nfo. Смена места хранения данных. Разделение префиксов. При выводе справки используется язык справки фара. Улучшение быстрого позиционирования в главном меню. Мелкие правки.
Версия 2.3.1 - В прошлой версии забыл сменить uid на id в зависимости от версии LuaMacro. Изменено определение Info.
Версия 2.4.0 - Скрипт можно вызывать из меню дисков; показываются только актуальные пункты. Исправлены замеченные ошибки. Мелкие правки.
Версия 2.4.1 - Исправлены свежевыявленные ошибки.
Версия 2.4.2 - Исправлена ошибка с вызовом меню при пустом списке закладок. Исправлены свежевыявленные ошибки в справке.
Версия 2.5.0 - Изменён формат хранения закладок в БД. Старый формат пока поддерживается. Рефакторинг.
Версия 2.5.1 - Исправлены некоторые недоделки и упущения предыдущей версии.
Версия 2.5.2 - Исправлен вызов из меню дисков, там же изменена логика работы.
Версия 2.5.3 - Теперь можно указать с помощью модификатора "C" необходимость смены панели. Подробности в справке.
Версия 2.5.4 - Работа над ошибками.
Версия 3.0.0 - Если в качестве цели указан файл, не просто переходим в папку, но и позиционируемся на файле. Возможно не только переходить в папку или на файл, но и выполнять системные контекстные команды "открыть" (выполнить) и "редактировать"; можно указывать действие в параметрах закладки. Можно указывать маски для пути (включая маску имени локального диска); основа алгоритма разработана buniak_a_h. Если элемент пути не найден, ищем его же, но в обрамлении "*" (настраивается). Скрипт теперь можно вызывать как функцию, параметры как для префиксов. При наборе последовательности символов она опционально отображается на экране. При неполном наборе закладки/переменной, если подходит всего один вариант, меню может не выводиться (настраивается). Отдельная настройка для показа переменных окружения в меню. Рефакторинг.
Версия 3.0.1 - Исправление ошибки с переходом в сетевую папку. Исправление справки. Рефакторинг.
Версия 3.0.2 - При вызове скрипта как функции без параметров ошибка не выдаётся. Исправлена ошибка при переходе в плагин.
Версия 3.0.3 - Исправлена ошибка при нажатии клавиш в режиме активной фильтрации. Предпочтительное место хранения закладок теперь настраивается. Доработан вызов action-функций с учётом введённых в build 717 параметров для condition/action. Рефакторинг.
Версия 3.0.4 - Исправлена работа диалога настроек. Дополнена справка по диалогу настроек.
Версия 3.0.5 - Исправлена работа с закладкой на файл. Дополнена справка по закладкам.
Версия 3.0.6 - Исправлена ошибка с удалением несуществующей закладки. Рефакторинг.
Версия 3.0.7 - Исправлена ошибка с ненужными сообщениями об удалении несуществующей закладки. Исправлена опечатка в английском языковом файле.
Версия 3.0.8 - Исправлена ошибка с некорректной обработкой модификатора "C". Небольшой рефакторинг.
Версия 3.0.9 - Исправлена ошибка с выводом информации о новой папке при переходе для правой панели.
LuaMacro
cannot open C:\APPs\Far3\Profile\Macros\scripts\BookmarkManager\BookmarkManagerEng.lng: No such file
or directory
stack traceback:
[C]: in function 'dofile'
...ofile\Macros\scripts\BookmarkManager\BookmarkManager.lua:97: in function 'LoadSettings'
...ofile\Macros\scripts\BookmarkManager\BookmarkManager.lua:283: in function <...ofile\Macros\
scripts\BookmarkManager\BookmarkManager.lua:210>
OK
Версия 1.1.2 - Исправлена ошибка с обращением к старым языковым файлам.
Работа, работа, работа... Запарка, извиняюсь. Но, вроде, больше ошибок быть не должно.
P. S. Одна ошибка таки нашлась. При переключении языка в Far-е язык в скрипте не переключается. Перезалил, версию не правил. Кто успел скачать - перекачайте.
IgorZ wrote:Экспериментально: изменён принцип хранания и загрузки языковых данных. Просьба отписаться в теме, который вариант лучше на Ваш взгляд.
А как мы должны оценивать этот эксперимент?
Один lng на все языки это хорошо или плохо? Мне как пользователю безразлично.
Многострочные значения оканчиваются слешем? Тому кто будет править удобства не добавится, но по большому счёту неважно.
Вообще собственная процедура загрузки lng это прежде всего головная боль для самого автора (написать, отладить, поддерживать).
Может в вашем случае всё просто, но я лично не возьмусь протестировать на всех возможных некорректных данных.
IgorZ wrote:Экспериментально: изменён принцип хранания и загрузки языковых данных. Просьба отписаться в теме, который вариант лучше на Ваш взгляд.
А как мы должны оценивать этот эксперимент?
1. Новый вариант, возможно, будет у кого-то подтормаживать - кода-то больше.
2. В идеале, хорошо бы, чтоб кто-то попробовал локализовать скрипт на какой-либо язык (мечты, мечты...) и определить, который вариант в этом плане удобнее.
3. Не я один делаю скрипты с локализацией. Взгляд коллег, обладающих аналогичным опытом, тоже интересен. Возможно, в итоге получится какой-то единый стандарт локализации скриптов.
IgorZ wrote:3. Не я один делаю скрипты с локализацией. Взгляд коллег, обладающих аналогичным опытом, тоже интересен. Возможно, в итоге получится какой-то единый стандарт локализации скриптов.
Что может быть проще - файл локализации это скрипт на lua?
Пример из собственного скрипта
IgorZ wrote:3. Не я один делаю скрипты с локализацией. Взгляд коллег, обладающих аналогичным опытом, тоже интересен. Возможно, в итоге получится какой-то единый стандарт локализации скриптов.
Что может быть проще - файл локализации это скрипт на lua?
Загружать через loadfile
Примерно так я и делал в предыдущем варианте. Но в силу некоторых нюансов (в т. ч., ради соблюдения правил хорошего тона, которые рекомендуют разделять код и данные) решил попробовать другой способ.
К слову, я использовал не loadfile(), а dofile() - удобней.
IgorZ wrote:ради соблюдения правил хорошего тона, которые рекомендуют разделять код и данные) решил попробовать другой способ.
Так данные и код разделены, просто формат записи данных получается другой.
Сравнить diEdit_Folder="Folder:" и langs.english.diEdit_Folder="Folder:"
Только в первом случае надо писать свой загрузчик, а во втором всё сделает сам lua
IgorZ wrote:ради соблюдения правил хорошего тона, которые рекомендуют разделять код и данные
Напрасно, в lua такая загрузка данных идиоматична.
Привычка. Просто некомфортно даже, когда в формальном файле данных фактически исполняемый код (даже в столь малой дозе).
John Doe wrote:
IgorZ wrote:К слову, я использовал не loadfile(), а dofile() - удобней.
dofile работает с глобальной средой, что в общем случае нежелательно.
В данном конкретном случае это было несущественно. А в новом варианте этого вообще нет.
Smitis wrote:
IgorZ wrote:ради соблюдения правил хорошего тона, которые рекомендуют разделять код и данные) решил попробовать другой способ.
Так данные и код разделены, просто формат записи данных получается другой.
Сравнить diEdit_Folder="Folder:" и langs.english.diEdit_Folder="Folder:"
Только в первом случае надо писать свой загрузчик, а во втором всё сделает сам lua
Потому что во втором мы имеем исполняемый файл, который условно назвали файлом данных. Так что фактически идёт разделение одного исполняемого файла на две исполняемые части. Это проще, это легче, это быстрее исполняется, но мне такой код не особо нравится, это "низкий класс" согласно моим привычкам.
В данном конкретном случае разницу заметить невозможно, т.к. время выполнения ничтожно мало.
А если в вашем варианте избавиться от построчного чтения из файла, то наверно никакой разницы и вовсе не будет.
IgorZ wrote:Потому что во втором мы имеем исполняемый файл, который условно назвали файлом данных. Так что фактически идёт разделение одного исполняемого файла на две исполняемые части. Это проще, это легче, это быстрее исполняется, но мне такой код не особо нравится, это "низкий класс" согласно моим привычкам.
А если закрыть глаза и представить, что это действительно файл данных... но просто очень продвинутый (с поддержкой выражений, условных операторов, циклов и др.)?
В конце концов, макросы ФАРа когда-то тоже были "конфигурационными" и представляли просто последовательность нажимаемых клавиш + некоторые параметры (область действия и т.п.)
В данном конкретном случае разницу заметить невозможно, т.к. время выполнения ничтожно мало.
А если в вашем варианте избавиться от построчного чтения из файла, то наверно никакой разницы и вовсе не будет.
Ради интереса попробовал заменить io.line на чтение всего файла целиком и затем лущение полученной строки с помощью gmatch. io.line работает даже чуть быстрее (примерно на 10%). Издержки интерпретации, однако...
Smitis wrote:
IgorZ wrote:Потому что во втором мы имеем исполняемый файл, который условно назвали файлом данных. Так что фактически идёт разделение одного исполняемого файла на две исполняемые части. Это проще, это легче, это быстрее исполняется, но мне такой код не особо нравится, это "низкий класс" согласно моим привычкам.
А если закрыть глаза и представить, что это действительно файл данных... но просто очень продвинутый (с поддержкой выражений, условных операторов, циклов и др.)?
В конце концов, макросы ФАРа когда-то тоже были "конфигурационными" и представляли просто последовательность нажимаемых клавиш + некоторые параметры (область действия и т.п.)
К сожалению, моё воображение тоже разбирается в программировании и разделяет мои взгляды на "хороший стиль программирования". С нашей общей точки зрения данные должны быть пассивны, ну, в крайнем случае, восклицать: "Ещё! Прочитай меня ещё! Да! Да!! А теперь запиши!"
В данном конкретном случае разницу заметить невозможно, т.к. время выполнения ничтожно мало.
А если в вашем варианте избавиться от построчного чтения из файла, то наверно никакой разницы и вовсе не будет.
Ради интереса попробовал заменить io.line на чтение всего файла целиком и затем лущение полученной строки с помощью gmatch. io.line работает даже чуть быстрее (примерно на 10%). Издержки интерпретации, однако...
Интересно. Из PIL можно сделать другие выводы. Полноценно тестировать лень, и в любом случае для мелких файлов разницы не будет.
А разницу во времени выполнения dofile и вашей новой функции вы измеряли?