История команд, запущенных из текущего каталога

Здесь выкладываются готовые к использованию макросы и скрипты.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

История команд, запущенных из текущего каталога

Post by fml2 »

Предлагаемый вашему вниманию макрос показывает историю команд, запущенных из текущего каталога (см. также хотелку на Мантис: http://bugs.farmanager.com/view.php?id=2208). Т.е., по сути, это история команд с наложенным фильтром "показывать только те, что были запущены из текущего каталога".

Минимальная требуемая сборка -- Far 3, 3713.

Внимание: записи, помещенные в историю команд до установки сборки 3713, макросом показаны не будут, т.к. для них в истории команд еще не сохранялся каталог запуска команды.

Установка
Файл с макро нужно поместить в каталог %farprofile%\Macros\scripts

Использование
Для вызова макроса нажмите Ctrl+Shift+F8. Это кнопкосочетание может быть изменено -- см. самый конец файла с макро. (Alt+Shift+F8 было бы, наверное, более логично с точки зрения уже имеющихся кнопкосочетаний для вызова истории команд, но лично мне Ctrl+Shift+F8 нажимать проще.)

Во время отображения списка команд действуют следующие клавиши:
Ctrl+F1: показать список возможных действий и соответствующих кнопкосочетаний
Ctrl+F3: сортировать список по команде (повторное нажатие сортирует в обратном порядке). Индикатор в левом верхнем углу: "C".
Ctrl+F4: сортировать список по дате запуска (повторное нажатие сортирует в обратном порядке). Индикатор в левом верхнем углу: "T". (Для сортировки по дате я вначале хотел использовать Ctrl+F5, но Far перехватывает это сочетание и обрабатывает его сам)
Enter: запустить выбранную команду
Ctrl+Enter: поместить выбранную команду в командную строку, но не запускать ее
Shift+Enter: запустить выбранную команду в отдельном окне
Del: удалить выбранную команду из истории
Esc: погасить список и ничего не делать

Изначально комады сортируются по возрастанию по дате запуска, т.е. последние запущенные команды находятся снизу.

Если фильтрация по текущему каталогу будет встроена в стандартную историю или в плагины "AltHistory" или "MoreHistory" (тогда появится возможность поиска по фрагменту), то этот макрос станет излишним.

Attachments
CmdsFromCurDir.zip
(2.59 KiB) Downloaded 228 times
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Как читать историю команд из Lua-макро?

Post by Shmuel »

fml2 wrote:Хочу на досуге попробовать реализовать идею, описанную тут: http://bugs.farmanager.com/view.php?id=2208 Пробовать думаю с помощью макро на Lua.

Не подскажете, как из макро прочитать историю запущенных команд, включая также дополнительную информацию (если таковая имеется), сохраненную с каждой командой в истории.
  1. local settings = far.CreateSettings("far")
  2.  
  3. local items = settings:Enum("FSSF_HISTORY_CMD")
  4.  
  5. settings:Free()
  6.  
  7.  
  8.  
  9. far.Message("Total items: "..#items)
  10.  
  11.  
  12.  
  13. -- inspect the first item
  14.  
  15. for k,v in pairs(items[1]) do
  16.  
  17.   far.Show(k, v, type(v))
  18.  
  19. end
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

Re: Как читать историю команд из Lua-макро?

Post by fml2 »

Спасибо, Shmuel!

А где эта история хранится физически? В каких-то таблицах SQLite? Или где? Спрашиваю просто из интереса, т.к. приведенный фрагмент действительно читает историю.

Теперь бы еще сохранять в истории каталог, из которого была запущена команда... (как это сделать, вроде понятно и было написано тут: http://bugs.farmanager.com/view.php?id=2208#c10369 Но у меня сейчас нету среды компиляции).
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Как читать историю команд из Lua-макро?

Post by Shmuel »

fml2 wrote:А где эта история хранится физически? В каких-то таблицах SQLite? Или где?
Если не ошибаюсь, история хранится в %farlocalprofile%\history.db.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

Re: Как читать историю команд из Lua-макро?

Post by fml2 »

Вот, написал макро на Луа. По-моему, работает. Может, кто посмотрит и скажет, что там можно сделать лучше? Лично мне бы хотелось реализовать фильтрацию и сортировку прямо через SQLite, но только я не знаю, как это делается.

Чтобы этот макрос работал, нужно сделать изменение в коде Фар, а именно в файле cmdline.cpp заменить вызов Global->CtrlObject->CmdHistory->AddToHistory(strStr); на Global->CtrlObject->CmdHistory->AddToHistory(strStr, 0, nullptr, nullptr, strCurDir.data(), false);

Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Как читать историю команд из Lua-макро?

Post by Shmuel »

fml2 wrote:Вот, написал макро на Луа. По-моему, работает. Может, кто посмотрит и скажет, что там можно сделать лучше?
В целом нормально. В заключительной части есть ошибка и излишества, правильнее сделать так (не тестировалось):

Если поместите виш на Мантис, шансы на принятие изменения в Фаре несколько повысятся.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

Re: Как читать историю команд из Lua-макро?

Post by fml2 »

Shmuel wrote:правильнее сделать так (не тестировалось)
А разве это правильно? В пояснении к функции far.Menu (luafar_manual.chm) написано:
The second return value (Position) does not necessarily correspond to the position of the menuitem that the user have chosen
Я это понимаю так, что лучше ориентироваться на первый возвращаемый параметр. К тому же это "красивее", на мой взгляд: зачем доставать элемент по индексу, если он есть "прямо так"? Тогда и SelectedIndex не нужен. Он лишний, я его ввел по аналогии с RecentScreens. Но там он необходим, а тут не нужен. А откуда в Item берется поле BreakKey? Это недокументированная фича?
Shmuel wrote:Если поместите виш на Мантис, шансы на принятие изменения в Фаре несколько повысятся.
Запись на мантис есть уже давно (см. первое сообщение в этой ветке), но особого интереса у разработчиков она, похоже, не вызывает. Хотя мне бы эта функция сильно облегчила бы жизнь. До того, что я даже взялся писать макро :-)
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Как читать историю команд из Lua-макро?

Post by Shmuel »

Поскольку и far.Menu, и его описание писал ваш покорный слуга, то он не стал бы делать замечания зря. :)

Первое возвращаемое значение при закрытии меню с помощью BreakKey - это не элемент массива menuItems, а элемент массива breakKeys.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

Re: Как читать историю команд из Lua-макро?

Post by fml2 »

Shmuel wrote:Поскольку и far.Menu, и его описание писал ваш покорный слуга, то он не стал бы делать замечания зря. :)
Ой! :-)
Shmuel wrote:Первое возвращаемое значение при закрытии меню с помощью BreakKey - это не элемент массива menuItems, а элемент массива breakKeys.
А-а-а, Семен Семеныч! Теперь понятно как оно работает. А то я ломал голову, как это action попадает в item. Еще бы это в manual написать... А то между строк читать приходится.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Как читать историю команд из Lua-макро?

Post by Shmuel »

Перечитал описание far.Menu - действительно местами оно вводит в заблуждение.
Исправил и несколько сократил.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

Re: Как читать историю команд из Lua-макро?

Post by fml2 »

А как насчет этого: "Лично мне бы хотелось реализовать фильтрацию и сортировку прямо через SQLite"? Сортировку, может, лучше оставить макро, ведь ее можно проводить по разным критериям (команда, дата вызова), но фильтрацию хорошо бы реализовать через SQLite.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Как читать историю команд из Lua-макро?

Post by Shmuel »

fml2 wrote:А как насчет этого: "Лично мне бы хотелось реализовать фильтрацию и сортировку прямо через SQLite"?
1. http://forum.farmanager.com/viewtopic.p ... 41#p110141
2. http://lua.sqlite.org/
Есть ещё много чего - гугл вам в помощь.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

Re: Как читать историю команд из Lua-макро?

Post by fml2 »

Нет, это слишком муторно. Я думал, это можно как-то через фаровское API, т.е. что Фар (settings API) позволяет сделать какие-то вызовы, которые потом переводятся в "where" в SQLite. Если нет, то пусть уж лучше остается как есть. И спасибо за ответы и ссылки!
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

Re: Как читать историю команд из Lua-макро?

Post by fml2 »

Вот, еще подправил макрос и навесил его на Ctrl+Shift+F8 (свободная кнопка, удобно нажимать на клавиатуре, присутствует F8). Но чтобы это работало, надо чуть-чуть подправить Фар (сохранять каталог запуска команды в истории). Уважаемые разработчики, может, все же включить это в Фар? Пусть эта функция управляется опцией и будет неактивна по умолчанию. Но чтобы это было возможно. А?

2useven10
Posts: 5209
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Re: Как читать историю команд из Lua-макро?

Post by 2useven10 »

Простой патч, который Вы просите сделать, скорее всего приведёт к тому, что история сохраняться будет, но из 2-команд dir в разных каталогах сохранена будет только последняя (если опции одинаковые).
Это то о чём Вы мечтаете?
Post Reply

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