Поиск предыдущей команды с тем же префиксом, когда я нажимаю вверх в приглашении оболочки

19

Исходя из мира FreeBSD, я хочу, чтобы терминал Linux вел себя как FreeBSD, особенно в версии 9.1, в основном, когда вы вводите cdв терминал и нажимаете стрелку «вверх», вы можете просматривать все команды в истории, начиная с cdкоторых вы можете выиграть много времени.

Я не знаю, как включить эту функцию в Linux Debian или CentOS, которая заставляет меня печатать целое, может кто-нибудь, пожалуйста, помогите.

Абделила Бенау
источник
7
Это функция оболочки, а не терминала. Какую оболочку вы используете во FreeBSD? Вы можете получить такую ​​же (или похожую) оболочку для Linux.
CJM
Я использую оболочку tcsh.
Абделила Бенау
2
Я использую tcsh под OS X и у меня не было такого удобного поведения… После некоторых поисков я обнаружил, что могу включить его, вставив bindkey -k (up|down) history-search-(back|for)wardсвой, .tcshrc как описано здесь . Здорово!
Гаррет Олбрайт

Ответы:

34

Добавьте к следующему ~/.inputrc:

# Press up-arrow for previous matching command
"\e[A":history-search-backward
# Press down-arrow for next matching command
"\e[B":history-search-forward

объяснение

~/.inputrcэто файл конфигурации для GNU readline . Многие оболочки, в том числе bashи tcshиспользуют readline для редактирования командной строки. Две строки выше сообщат readline, чтобы вызвать его функцию поиска в истории, когда будут найдены escape-последовательности для клавиши со стрелкой вверх ( \e[A) и клавиши со стрелкой вниз ( \e[B).

Томас Найман
источник
Мне нравится добавлять F12, чтобы поместить последнее слово последней строки в конец текущей команды. Last wordчасто это путь, который я хочу попробовать в различных тайных клише. И Shift F12, чтобы вернуть меня к редактированию всей последней строки с самого начала. ~/.inputrcэто удобный инструмент
Джаланб
Для Shift F12 требуется режим vi .
Джаланб
6

Что происходит, так это то, что FreeBSD и Linux по умолчанию используют разные оболочки. По умолчанию FreeBSD использует tcsh , который имел лучшие интерактивные функции, чем bash в прошлом (но bash догнал), но заметно хуже скриптовых функций .

Самый простой способ получить среду, к которой вы привыкли, - это переключить вашу оболочку на tcsh в Linux. При условии, что tcsh установлен в масштабе всей системы (если это не так, попросите системного администратора установить его), запустите chsh -s tcshдля изменения оболочки по умолчанию.

Кроме того, вы можете настроить bash на использование этой команды, к которой вы привыкли. По умолчанию, Upи Downстрелки навигации среди всех команд в истории, а не только те , которые начинаются с префикса вы набрали. Чтобы изменить это на поведение, к которому вы привыкли, поместите следующие строки в файл инициализации bash, который находится .bashrcв вашем домашнем каталоге. Либо запустить . ~/.bashrcили начать новую оболочку , чтобы перечитать файл инициализации.

bind '"\eOA": history-search-backward'
bind '"\e[A": history-search-backward'
bind '"\eOB": history-search-forward'
bind '"\e[B": history-search-forward'

Escape-последовательности - это то, что ваш терминал отправляет в оболочку, когда вы нажимаете клавишу со стрелкой. Upможет быть \eOA(побег, O, A) или в \e[Aзависимости от вашего терминала, а так же для Down.

По умолчанию bash предлагает различные привязки клавиш для поиска в истории команд. Вы можете нажать Ctrl+ R, а затем ввести несколько символов для поиска команды, содержащей эту подстроку в любом месте строки. Нажмите Ctrl+, Sчтобы идти вперед, а не назад. Поиск является инкрементным (т. Е. По типу ввода); Alt+ Pи Alt+ Nдают вам неинкрементный поиск.

Вместо bash и tcsh вы можете переключиться на zsh, который обладает некоторыми полезными функциями, которых нет в других оболочках . Zsh имеет Ctrl+ Rи Ctrl+ Sпо умолчанию, как и bash. Чтобы получить Upи Downкак в tcsh, вставьте следующие строки ~/.zshrc:

bindkey '\eOA' history-beginning-search-backward
bindkey '\e[A' history-beginning-search-backward
bindkey '\eOB' history-beginning-search-forward
bindkey '\e[B' history-beginning-search-forward

Если вы хотите использовать везде одинаковую оболочку, вы также можете использовать bash или zsh во FreeBSD при условии, что порт установлен (снова, обратитесь к системному администратору).

Жиль "ТАК - прекрати быть злым"
источник
1

tcshдоступно для большинства дистрибутивов Linux. Попробуйте установить tcshпакет и запустить его, chsh -s /bin/tcshчтобы сделать его оболочкой по умолчанию.

CJM
источник
1
Или вы можете рассмотреть переход на Bash (я сделал).
Кит Томпсон
1

Другие ответы решают это, но если вы хотите больше, взгляните на https://github.com/zsh-users/zsh-history-substring-search

Презто ( https://github.com/sorin-ionescu/prezto ) также полно zsh лакомств.

Фуад сауд
источник
Спасибо за ваш ответ, кстати, я до сих пор не понимаю, какие преимущества у zsh по сравнению с bash или tcsh?
Абделила Бенау
1
Хм, ты можешь делать почти все основные вещи во всех этих оболочках. Я использую zsh из-за довольно ухоженного пакета prezto (вероятно, большого изменения игры), правильного приглашения (что является эксклюзивной функцией) и из-за того, что он выглядит более отточенным, чем bash (конфигурация и прочее).
Фуад Сауд