Автозаполнение для часто используемых команд командной строки?

15

Для некоторых проектов я часто набираю пару команд, например:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

и

./runmyproject --with some --command line --options set

Видя, что я довольно ленив, я стараюсь не вводить эти команды снова и снова. Поэтому я, конечно, могу много раз использовать клавишу up, чтобы найти эти команды, но часто у меня так много команд между ними, что поиск занимает даже больше времени, чем просто ввод.

Теперь мне интересно, есть ли какая-нибудь утилита, которая может предложить полную команду, которую я часто использую, когда я еще не набрал ее все. Так что я могу, например, набрать «cd an /», и он уже предлагает остальную часть пути, потому что я так часто использовал его в прошлом месяце.

Я нашел что-то под названием Bash Smart Complete. Но это немного «глупо» в том смысле, что в нем не рассматриваются команды, которые я использовал раньше. Я также нашел этот ТАК ответ , который предлагает поместить в файл команды, которые я часто использую. Это, однако, недостаточно отзывчиво, потому что мне нужно будет создавать новый файл для него каждый раз, когда я запускаю новые проекты или изменяю папки или аргументы программы.

Кто-нибудь знает какую-либо другую утилиту или другой способ добиться этого? Или кто-нибудь знает, как я могу изменить Bash Smart Complete, чтобы он мог просматривать команды, которые я использовал, скажем, в прошлом месяце, и завершать команду, которая подходит и использовалась чаще всего в прошлом месяце?

[РЕДАКТИРОВАТЬ] Ниже приведены некоторые действительно хорошие ответы. Я еще не пометил их как определенный ответ. Не потому, что мне не нравятся ответы, а потому, что ни один из них не является абсолютным победителем. Я думаю, что Finalterm - отличный проект. К сожалению, это все еще довольно грубо по краям. Например; он еще не поддерживает копирование-вставку. Я бы следил за этим проектом, потому что, когда он станет зрелым, я думаю, что он будет отличным терминальным приложением. Что касается других ответов; они либо предложили создать псевдоним, а это не то, что я хочу сделать, потому что это создает дополнительную работу вместо того, чтобы убирать работу, или использовать Ctrl + R, что замечательно (я не знал об этом!). Несколько человек предложили использовать Ctrl + R, поэтому я не могу выделить один ответ над другим.

Так что сейчас я определенно использую Ctrl + R, и в будущем я мог бы использовать Finalterm.

Спасибо за отличные ответы, ребята!

kramer65
источник
2
Вы должны действительно попробовать zsh. Он предлагает все, что вы просите, и многое другое. Переход от bash к zsh
Башарат Сиалви
Согласно справочной странице BASH, эта функция также присутствует в BASH как «dynamic-complete-history». По умолчанию он привязан к Alt + Tab, что делает его бесполезным, но можно изменить привязку с помощью «bind».
Борис Бух,
1
@BasharatSial, что конкретно делает Zsh, чтобы помочь с этим?
пул

Ответы:

16

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

Теперь хитрость: вы можете выполнить обратный поиск в этой истории, чтобы повторно выполнить команды, нажав CTRL-r .

В режиме поиска в обратном журнале bash показывает в режиме реального времени самую свежую команду в истории, которая начинается с заданного вами ввода. Затем нажмите клавишу ввода, чтобы принять и выполнить предложенную команду. Продолжайте нажимать CTRL-R, чтобы переходить к более старым командам с тем же префиксом.

Это встроенный в bash, нет необходимости настраивать скрипты или устанавливать программное обеспечение :) Это одна из самых полезных функций bash, imho.

catchmeifyoutry
источник
3
Используйте [ CTRL-g ] для выхода из режима поиска по истории, если не выполняете команду (например, если вы не нашли нужную вам).
MountainX-for-Monica
8

Вставьте (Ctrl-Shift-V) следующее в экран терминала:

echo '"\e[A": history-search-backward' > ~/.inputrc
echo '"\e[B": history-search-forward' >> ~/.inputrc
echo 'set show-all-if-ambiguous on' >> ~/.inputrc
echo 'set completion-ignore-case on' >> ~/.inputrc

Выйдите (Ctrl-D) из экрана терминала, затем снова откройте терминал.

Теперь вы можете просто набрать первую пару символов, а затем нажать Вверх или Вниз, чтобы прокрутить отфильтрованный список.

Скотт Мэй
источник
3
Это самый простой ответ, который выполняет свою работу!
cxrodgers
8

Окончательный срок

Есть это очень многообещающее приложение терминала под названием Final Term . Среди многих его функций, он также имеет историю запоминания команд, так что вы можете выбрать его. Вот еще несколько функций:

Окончательный срок

Вы можете прочитать больше об этом в этой статье .

Вот сайт от создателей. http://finalterm.org/

Чтобы установить это

sudo add-apt-repository ppa:versable/finalterm-daily
sudo apt-get update
sudo apt-get install finalterm

Предупреждение

Я сказал, что это многообещающе. Единственная проблема в том, что это версия 0.1. Так что некоторые вещи, как vimи nanoне работают еще хорошо. Я также заметил, что он еще не поддерживает Drag-and-Drop, а также копировать и вставлять. Но у него есть функция, которую вы запрашиваете. По мере развития программного обеспечения оно станет одним из лучших терминалов для настольных ПК.

Скриншот

Вот функция в действии:

 функция в действии

Надеюсь это поможет.

* Я нахожусь на Saucy, поэтому у меня есть опыт саламандры :)

Макс Титер
источник
Спасибо за чаевые! Я проверил finalterm, и это выглядит хорошо. К сожалению, пока не поддерживается копирование-вставка. Я попробовал Ctrl + V, Ctrl + Shift + V и щелкнул правой кнопкой мыши, но ни один из них, похоже, не работает. Так что я буду помнить это на будущее!
kramer65
Это самый большой недостаток, который я видел. Тем не менее, проект молодой, и поэтому я надеюсь, что это будет добавлено в ближайшее время. Я вижу приложение терминала без поддержки копирования и вставки.
Макс Титер
7

Используйте aliasвсю команду или добавьте каталог в свой $PATH. Кроме того, вам не нужно менять каталоги, где ваш исполняемый файл (или сценарий, или что-то еще), чтобы запустить его, так что это довольно просто. Оба метода требуют перезагрузки терминала, который вы используете, прежде чем изменения вступят в силу.

Вот как создать bash aliasдля вашего примера (добавьте следующую строку в ваш ~/.bashrcфайл):

alias runmyproject='an/extremely/long/path/in/which/I/have/some/kinda/project/runmyproject --with some --command line --options set'

Таким образом, все, что вам нужно сделать, это ввести runmyprojectв терминал, где бы вы ни находились, без необходимости указывать опции / аргументы.

В качестве альтернативы, вы можете добавить свой путь проекта в $PATHпеременную среды. Для этого добавьте следующие строки в ваш ~/.bashrcфайл:

PATH=an/extremely/long/path/in/which/I/have/some/kinda/project:$PATH
export PATH

В этом случае вам все равно нужно будет указать параметры / аргументы для исполняемого файла при его запуске.

oaskamay
источник
1
Дело в том, что я хотел бы, чтобы терминал реагировал на мое использование. При этом мне приходится менять псевдоним каждый раз, когда я начинаю работать над новыми проектами или когда меняю структуру каталогов моего проекта. Основная часть моего вопроса заключается в том, что я хочу, чтобы он учился на том, что я использую, вместо того, чтобы говорить, что делать.
kramer65
Ах я вижу. Тогда ответ с самым высоким рейтингом должен сделать свое дело. Или, по крайней мере, близко.
oaskamay
4

Когда мне часто приходится переходить в такой каталог:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

Я бы просто сделал это один раз:

ln -s an/extremely/long/path/in/which/I/have/some/kinda/project ~/project

И с тех пор используйте:

cd ~/pr[tab]

Когда дело доходит до:

./runmyproject --with some --command line --options set

Я бы использовал поиск по истории bash. В командной строке просто нажмите Ctrl-R и введите «runmy». Вуаля, вся команда со всеми вариантами, как она была введена в последний раз, находится тут же для повторного ввода. Если мне не нравятся параметры, которые я использовал в прошлый раз, и я хотел посмотреть на более ранние команды, я продолжал нажимать Ctrl-R, чтобы циклически перебирать все предыдущие команды, которые содержали «runmy».

Поиск в истории Ctrl-R также может помочь с командой 'cd', если вам не нравится идея символической ссылки. [Ctrl-R] ​​/ proj действительно может вернуть последнюю команду, которую вы использовали для перехода в этот каталог.

Вместо того, чтобы добавлять псевдоним или переключаться на специальную оболочку, я всегда предпочитаю научиться использовать функции bash, предназначенные для решения подобных задач. Таким образом, я могу использовать те же функции на удаленных машинах или если мне нужно сесть за терминал коллеги.

Стивен К
источник
Спасибо за ваше предложение. Дело в том, что я не хочу устанавливать другую вещь, о которой я позабочусь, например, когда папка проекта изменяется или я запускаю новый проект. Дело в том, что я хотел бы, чтобы терминал реагировал на мое использование. Основная часть моего вопроса заключается в том, что я хочу, чтобы он учился на том, что я использую, вместо того, чтобы говорить, что делать. Мне действительно нравится функция Ctrl-R, хотя. Спасибо за это!
kramer65
4

нажмите Ctrl + R на клавиатуре - это переведет вас в режим обратной истории, и вы сможете ввести часть, которую вы знаете, и вся команда покажет

Есть и другие способы, перечисленные здесь

http://www.talug.org/events/20030709/cmdline_history.html

Я склонен использовать контроль R наиболее

exussum
источник
2

Попробуйте это ... Это работает для всех команд в вашем файле истории ... это то же самое, что и Ctrl+ R, но я думаю, что это более интуитивно понятно :)

  1. редактировать /etc/inputrc

    sudo vim /etc/inputrc
  2. раскомментируйте или добавьте две строки

    "\e[5~": history-search-backward
    
    "\e[6~": history-search-forward
  3. выход из системы / Логин


затем попробуйте написать какую-нибудь команду из истории ...

нравиться...

ls -lah

записывать

ls

и нажмите

Page Upили Page Dnперемещаться по файлу истории в поисках команд, начинающихся с "ls"

Если вы все сделали правильно, вы должны автоматически завершить команду ...

Волчок
источник