Автоматичне завершення для часто використовуваних команд командного рядка?


15

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

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

і

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

Бачачи, що я досить ледачий, я намагаюся уникати цих команд повністю і знову. Тож я, звичайно, можу багато разів використовувати клавішу для того, щоб знайти ці команди, але часто у мене є стільки команд між ними, що пошук цього займає навіть більше часу, ніж просто введення його.

Мені зараз цікаво, чи є якась утиліта, яка може запропонувати повну команду, яку я дуже багато використовую, коли я ще не все це не набрала. Так що я, наприклад, можу набрати 'cd an /' і що він вже пропонує іншу частину шляху, тому що я його так багато використовував минулого місяця.

Я знайшов щось під назвою Bash Smart Complete. Але це трохи "тупо", оскільки він не дивиться на команди, які я використовував раніше. Я просто знайшов цю відповідь ТА , яка пропонує розмістити команди, які я багато використовую у файлі. Це, однак, недостатньо реагує на те, що мені потрібно створювати новий файл для нього кожного разу, коли я запускаю нові проекти або змінюю папки або програмні аргументи.

Хтось знає якусь іншу корисність чи інший спосіб досягти цього? Або хтось би знав, як я міг змінити Bash Smart Complete, щоб він міг переглянути команди, які я використовував, скажімо, за останній місяць, і виконати команду, яка найбільше відповідає та використовувалась за останній місяць?

[EDIT] Нижче наведено кілька справді чудових відповідей. Я ще не позначив жодної як однозначної відповіді. Я не тому, що відповіді мені не подобаються, а тому, що жодна з них не є абсолютним переможцем. Я думаю, що Finalterm - це чудовий проект. На жаль, він все ще досить шорсткий по краях. Наприклад; він ще не підтримує копію-вставити. Я хотів би постійно спостерігати за цим проектом, тому що, коли він дозріє, я думаю, що це буде чудовий додаток для терміналів. Щодо інших відповідей; вони або запропонували створити псевдонім, який я не хочу робити, оскільки він створює додаткову роботу замість того, щоб забрати роботу, або використовувати Ctrl + R, що є геніальним (я про це не знав!). Кілька людей запропонували використовувати Ctrl + R, тому я не можу реально виділити одну відповідь над іншою.

Тому я напевно використовую Ctrl + R, і в майбутньому я можу використовувати Finalterm.

Дякую за всі чудові відповіді, хлопці!


2
Вам справді слід спробувати zsh. Він пропонує все, що ви просите, та багато іншого. Перехід від баш до zsh
Башарат Сіальві

За даними сторінки BASH, функція також присутня в BASH як "динамічна-повна-історія". За замовчуванням він прив’язаний до Alt + Tab, що робить його марним, але можна змінити прив'язку на "bind".
Борис Бух

1
@BasharatSial, що конкретно робить zsh, щоб допомогти у цьому?
poolie

Відповіді:


16

Якщо команди часто використовуються, вони записуються в історії команд bash .bash_history.

Тепер хитрість: Ви можете повернути пошук цієї історії, щоб повторно виконати команди, натиснувши CTRL-r .

У режимі зворотного пошуку історії баш-шоу показує, під час введення , останню команду в історії, яка починається з даного вводу. Потім натисніть клавішу Enter, щоб прийняти та виконати запропоновану команду. Продовжуйте натискати CTRL-R, щоб перейти до старших команд з тим самим префіксом.

Це вбудовано в bash, немає потреби в налаштуваннях скриптів або встановленні програмного забезпечення :) Це одна з найкорисніших функцій bash, imho.


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

Остаточний термін

Існує цей дуже перспективний термінальний додаток, який називається остаточним терміном . Серед багатьох його функцій є також історія команд, що запам'ятовуються, щоб потім можна було вибрати її. Ось ще кілька можливостей:

Остаточний термін

Детальніше про це ви можете прочитати в цій статті .

Ось веб-сайт від творців. http://finalterm.org/

Щоб встановити його

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

Увага

Я вже сказав, що це перспективно. Єдине питання полягає в тому, що він знаходиться у версії 0.1. Тож деякі речі люблять vimі nanoпоки не працюють добре. Я також помітив, що він ще не підтримує функцію перетягування та копіювання, а також копіює та вставляє. Але він має функцію, яку ви запитуєте. По мірі дозрівання програмного забезпечення воно стане одним з кращих терміналів для робочого столу.

Знімок екрана

Ось функція в дії:

 функція в дії

Сподіваюсь, це допомагає.

* Я перебуваю на соусі, тому у мене є фон Саламандра :)


Дякую за пораду! Я перевірив остаточний термін, і це виглядає добре. На жаль, воно, схоже, ще не підтримує копію-вставити. Я спробував 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

У цьому випадку вам все одно потрібно буде вказати параметри / аргументи для вашого виконуваного файлу під час його запуску.


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

Я б використовував пошук історії баш. У командному рядку просто натисніть Ctrl-R і введіть 'runmy'. Voila, вся команда з усіма параметрами, як вона востаннє була введена, є правильною для повторного введення. Якщо мені не сподобалися варіанти, які я використовував останній раз, і хотів переглянути попередні команди, я продовжував би натискати Ctrl-R, щоб переглядати всі попередні команди, що містили "runmy".

Пошук історії Ctrl-R також може допомогти команді 'cd', якщо вам не подобається ідея symlink. [Ctrl-R] ​​/ proj , ймовірно, поверне останню команду, яку ви використовували для CD в цей каталог.

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


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

4

натисніть клавішу управління + r на клавіатурі - вона переведе вас у режим зворотної історії, і ви зможете набрати відому вам частину, і вся команда покаже

Тут перераховані інші способи

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

Я, як правило, найбільше використовує управління R


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"

Якщо ви зробили все правильно, він повинен автоматично виконати вашу команду ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.