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

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

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

Post by fml2 » Wed 23 Oct, 2013 18:27

Предлагаемый вашему вниманию макрос показывает историю команд, запущенных из текущего каталога (см. также хотелку на Мантис: 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 127 times

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Wed 23 Oct, 2013 19:23

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

Не подскажете, как из макро прочитать историю запущенных команд, включая также дополнительную информацию (если таковая имеется), сохраненную с каждой командой в истории.
  1. local settings = far.CreateSettings("far")
  2. local items = settings:Enum("FSSF_HISTORY_CMD")
  3. settings:Free()
  4.  
  5. far.Message("Total items: "..#items)
  6.  
  7. -- inspect the first item
  8. for k,v in pairs(items[1]) do
  9.   far.Show(k, v, type(v))
  10. end

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

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

Post by fml2 » Thu 24 Oct, 2013 19:25

Спасибо, Shmuel!

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

Теперь бы еще сохранять в истории каталог, из которого была запущена команда... (как это сделать, вроде понятно и было написано тут: http://bugs.farmanager.com/view.php?id=2208#c10369 Но у меня сейчас нету среды компиляции).

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Thu 24 Oct, 2013 19:40

fml2 wrote:А где эта история хранится физически? В каких-то таблицах SQLite? Или где?
Если не ошибаюсь, история хранится в %farlocalprofile%\history.db.

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

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

Post by fml2 » Tue 12 Nov, 2013 00:10

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

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


Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Tue 12 Nov, 2013 08:33

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

Если поместите виш на Мантис, шансы на принятие изменения в Фаре несколько повысятся.

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

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

Post by fml2 » Tue 12 Nov, 2013 08:50

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: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Tue 12 Nov, 2013 08:59

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

Первое возвращаемое значение при закрытии меню с помощью BreakKey - это не элемент массива menuItems, а элемент массива breakKeys.

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

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

Post by fml2 » Tue 12 Nov, 2013 09:16

Shmuel wrote:Поскольку и far.Menu, и его описание писал ваш покорный слуга, то он не стал бы делать замечания зря. :)
Ой! :-)
Shmuel wrote:Первое возвращаемое значение при закрытии меню с помощью BreakKey - это не элемент массива menuItems, а элемент массива breakKeys.
А-а-а, Семен Семеныч! Теперь понятно как оно работает. А то я ломал голову, как это action попадает в item. Еще бы это в manual написать... А то между строк читать приходится.

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Tue 12 Nov, 2013 09:27

Перечитал описание far.Menu - действительно местами оно вводит в заблуждение.
Исправил и несколько сократил.

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

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

Post by fml2 » Tue 12 Nov, 2013 10:18

А как насчет этого: "Лично мне бы хотелось реализовать фильтрацию и сортировку прямо через SQLite"? Сортировку, может, лучше оставить макро, ведь ее можно проводить по разным критериям (команда, дата вызова), но фильтрацию хорошо бы реализовать через SQLite.

Shmuel
Posts: 5225
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

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

Post by Shmuel » Tue 12 Nov, 2013 10:43

fml2 wrote:А как насчет этого: "Лично мне бы хотелось реализовать фильтрацию и сортировку прямо через SQLite"?
1. viewtopic.php?p=110141#p110141
2. http://lua.sqlite.org/
Есть ещё много чего - гугл вам в помощь.

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

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

Post by fml2 » Tue 12 Nov, 2013 11:02

Нет, это слишком муторно. Я думал, это можно как-то через фаровское API, т.е. что Фар (settings API) позволяет сделать какие-то вызовы, которые потом переводятся в "where" в SQLite. Если нет, то пусть уж лучше остается как есть. И спасибо за ответы и ссылки!

fml2
Posts: 490
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 5 times

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

Post by fml2 » Thu 14 Nov, 2013 14:58

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


2useven10
Posts: 3045
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 83 times

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

Post by 2useven10 » Thu 14 Nov, 2013 16:05

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

User avatar
DrKnS
Posts: 4640
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

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

Post by DrKnS » Thu 14 Nov, 2013 16:16

История искаропки должна работать как сейчас.
Однако, можно сохранять каталог в бд и отдавать желающим через api, а дальше они уже как-то разберутся.

Post Reply

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