Как изменить завершение истории bash, чтобы завершить то, что уже на линии?

133

Пару месяцев назад я нашел команду, которая автоматически завершала мою историю bash на том, что уже находится на линии при нажатии стрелки вверх:

$ vim fi

Нажмите

$ vim file.py

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

Кто-нибудь знает команду?

blokkie
источник

Ответы:

223

Наверное, что-то вроде

# ~ / .inputrc
"\ e [A": история-поиск-назад
"\ e [B": история-поиск-вперед

или эквивалентно,

# ~ / .bashrc
если [[$ - == * i *]]
затем
    связать '"\ e [A": история-поиск-назад "
    связать '"\ e [B": история поиска вперед "
фи

(оператор if проверяет интерактивный режим)

Обычно Up и Down связаны с функциями Readline previous-historyи next-historyсоответственно. Я предпочитаю связывать PgUp / PgDn с этими функциями, вместо того, чтобы смещать обычную операцию Up / Down.

# ~ / .inputrc
"\ e [5 ~": история-поиск-назад
"\ e [6 ~": история-поиск-вперед

После того, как вы измените ~/.inputrc, перезапустите вашу оболочку или используйте Ctrl+ X, Ctrl+, Rчтобы сказать ей перечитать ~/.inputrc.


Кстати, если вы ищете соответствующую документацию:

Bash использует GNU Readline Library для командной строки и истории.

ephemient
источник
Спасибо за Ваш ответ. Это звучит знакомо, но, к сожалению, не работает для меня. Помещение в .inputrc ничего не меняет, а в .bashrc не дает стрелам что-либо делать. Любые идеи?
блок
Неважно. история-полная- * не существует; существуют только функции history-search- *. Спасибо!
блок
Ах, я явно ошибся в первых двух примерах ... хотя последний был верным. Я исправлю это.
Эфимент
@ user1037114: это вопрос сам по себе, вы должны задать его в своем посте.
kamaradclimber
Это исправило стрелки вверх / вниз для меня, используя режим vi в bash. Обратите внимание, я должен нажать «Esc» (командный режим), чтобы он работал.
Крис
5

Обновите .inputrc следующим:

"\C-[OA": history-search-backward
"\C-[[A": history-search-backward

"\C-[OB": history-search-forward
"\C-[[B": history-search-forward
nate_weldon
источник
4
Что это за ключи?
Крис
Я не знаю, что конкретно представляют собой эти ключи, но этот ответ исправил эту функцию для меня, когда клавиши вверх и вниз не выполняли поиск в истории при использовании tmux и st Terminal на X11.
Раззинтаун
1
@razzintown прп вы , вероятно, set enable-keypad onдля delключа для правильной работы ( чаво ). Когда клавиатура включена, клавиши со стрелками есть "\C-[OA"и "\C-[OB"(и, "\C-[OC"и "\C-[OD"). Я написал ответ ниже, чтобы уточнить это.
МаурисиоРобайо
@Chris Это клавиши со стрелками вверх и вниз в режиме клавиатуры и клавиши со стрелками вверх и вниз в режиме ANSI. Смотрите мой ответ ниже.
МаурисиоРобайо
3

Если set enable-keypad onвы, ~/.inputrcкак некоторые другие пользователи ( простой терминал ), помните, что клавиши со стрелками находятся в режиме клавиатуры. Ubuntu поставляется с этим полезным /usr/share/doc/bash/inputrc.arrows:

# This file controls the behaviour of line input editing for
# programs that use the Gnu Readline library.
#
# Arrow keys in keypad mode
#
"\C-[OD"        backward-char
"\C-[OC"        forward-char
"\C-[OA"        previous-history
"\C-[OB"        next-history
#
# Arrow keys in ANSI mode
#
"\C-[[D"        backward-char
"\C-[[C"        forward-char
"\C-[[A"        previous-history
"\C-[[B"        next-history
#
# Arrow keys in 8 bit keypad mode
#
"\C-M-OD"       backward-char
"\C-M-OC"       forward-char
"\C-M-OA"       previous-history
"\C-M-OB"       next-history
#
# Arrow keys in 8 bit ANSI mode
#
"\C-M-[D"       backward-char
"\C-M-[C"       forward-char
"\C-M-[A"       previous-history
"\C-M-[B"       next-history

Так что я не уверен, что вам понадобится все, но это может быть не больно иметь в вашем ~/.inputrc:

# Arrow keys in keypad mode
"\C-[OA": history-search-backward
"\C-[OB": history-search-forward
"\C-[OC": forward-char
"\C-[OD": backward-char

# Arrow keys in ANSI mode
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
"\C-[[C": forward-char
"\C-[[D": backward-char

Это также на ту же тему: мои клавиши курсора не работают, а также этот xterm: специальные клавиши

MauricioRobayo
источник
1

С ohmyzsh, используйте это в вашем .zshrc :

bindkey '^[OA' history-search-backward
bindkey '^[OB' history-search-forward

Перезагрузить source ~/.zshrcили перезапустить терминал.

Источник: https://superuser.com/a/418299/71680

Бенджамин Крузье
источник
Для меня в zsh работал вариант, указанный в ссылке на источник: bindkey '\ e [A' history-search-backward bindkey '\ e [B' history-search-forward
Майкл Мэсси
-3

Возможно, вам нужно включить завершение bash.

Проверьте

  • /etc/profile
  • /etc/bash.bashrc
  • ~/.bashrc

чтобы увидеть, если какой-либо из вышеуказанных файлов источника /etc/bash_completion. т.е.

, / И т.д. / bash_completion

Если /etc/bash___completionни один из перечисленных выше файлов не получен, вам необходимо добавить его в один из них.

Если вы хотите, чтобы все пользователи bash на вашем компьютере имели завершение bash, отправьте их /etc/bash_completionиз /etc/bash.bashrc.

Если это только вы, кто хочет завершения bash, источник /etc/bash_completionиз вашего ~/.bashrc.

Признать виновным
источник
2
Завершение вкладки приятно, но не то же самое, что вспомнить историю, о чем просил оригинальный постер.
Эфимент