Я счастлив и мне очень нравится функция Ctrlобратного Rпоиска оболочки bash. Некоторым моим коллегам она не нравится, так как иногда она сбивает с толку. Я их понимаю. Если вы введете неправильные символы, текущая позиция в истории окажется где-то в прошлом, и вы не найдете недавних совпадений.
Существует ли более удобная альтернатива для поиска в истории оболочки?
Я хочу придерживаться bash. Предложение альтернативной оболочки не является ответом на этот вопрос.
Проблема с «потерянной позицией» объясняется здесь:Сбросить позицию поиска истории bash. Эти решения работают. Это верно. Но, с моей точки зрения, эти решения не являются простыми и удобными для пользователя. Эти решения не являются простыми и прямыми. Это решения прошлого. В прошлом человеку нужно было узнать, каким образом компьютер хотел получить ввод. Но сегодня инструменты должны принимать ввод таким образом, чтобы это было легко для пользователя.
Может кто знает IDE для jetbrains типа PyCharm. Если поискать "foobar", то даже строки, содержащие "foo_bar", будут. Это здорово, это unix :-)
решение1
Я использую программу Fuzzy Finder.ФЗФ. Я написал свои собственные сочетания клавиш и скрипты оболочки для использованияФЗФкак мой инструмент для обратного поиска интерактивногоБашИстория оболочки. Не стесняйтесь копировать и вставлять код из моегоКонфигурацияРепозиторий GitHub.
Файл конфигурации ~/.bashrc
# Test if fuzzy finder program _Fzf_ is installed.
#
if type -p fzf &> /dev/null; then
# Test if _Fzf_ specific _Readline_ file is readable.
#
if [[ -f ~/.inputrc.fzf && -r ~/.inputrc.fzf ]]; then
# Make _Fzf_ available through _Readline_ key bindings.
#
bind -f ~/.inputrc.fzf
fi
fi
Файл конфигурации ~/.inputrc.fzf ##
$if mode=vi
# Key bindings for _Vi_ _Insert_ mode
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set keymap vi-insert
"\C-x\C-a": vi-movement-mode
"\C-x\C-e": shell-expand-line
"\C-x\C-r": redraw-current-line
"\C-x^": history-expand-line
"\C-r": "\C-x\C-addi$(HISTTIMEFORMAT= history | fzf-history)\C-x\C-e\C-x\C-r\C-x^\C-x\C-a$a"
# Key bindings for _Vi_ _Command_ mode
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set keymap vi-command
"\C-r": "i\C-r"
"\ec": "i\ec"
$endif
fzf-history исполняемый Bash-скрипт
#!/usr/bin/env bash
#
# Retrieve command from history with fuzzy finder
# ===============================================
# Tim Friske <[email protected]>
#
# See also:
# * man:bash[1]
# * man:fzf[1]
# * man:cat[1]
shopt -os nounset pipefail errexit errtrace
shopt -s extglob globstar
function print_help {
1>&2 cat \
<<'HELP'
usage:
HISTTIMEFORMAT= history | fzf-history
HELP
}
function fzf_history {
if [[ -t 0 ]]; then
print_help
exit
fi
local fzf_options=()
fzf_options+=(${FZF_DEFAULT_OPTS:-})
fzf_options+=('--tac' '-n2..,..' '--tiebreak=index')
fzf_options+=(${FZF_HISTORY_FZF_OPTS:-})
fzf_options+=('--print0')
local cmd='' cmds=()
while read -r -d '' cmd; do
cmds+=("${cmd/#+([[:digit:]])+([[:space:]])/}")
done < <(fzf "${fzf_options[@]}")
if [[ "${#cmds[*]}" -gt 0 ]]; then
(IFS=';'; printf '%s\n' "${cmds[*]}")
fi
}
fzf_history "$@"
key-bindings.bash исходный скрипт Bash
Взято и немного адаптировано изFZF-ы Баш привязки клавишфайл, в котором приведены сочетания клавиш, совместимые с режимом Emacs, для обратного поиска по истории Bash Ctrl-R(не проверено):
if [[ ! -o vi ]]; then
# Required to refresh the prompt after fzf
bind '"\er": redraw-current-line'
bind '"\e^": history-expand-line'
# CTRL-R - Paste the selected command from history into the command line
bind '"\C-r": " \C-e\C-u\C-y\ey\C-u$(HISTTIMEFORMAT= history | fzf-history)\e\C-e\er\e^"'
fi
решение2
- Стрелка вверх: применимо только для совсем недавних событий.
grep blablabla ~/.bash_history
: вам придется настроить bash на сохранение истории в файл после каждой команды.
Из моего руководства ~/.bashrc
Вы, возможно, захотите узнать, что делают команды, и что можно изменить.
# don't put duplicate lines in the history. See bash(1) for more options
HISTCONTROL=ignorespace:ignoredups:erasedups
HISTFILESIZE=99999
HISTSIZE=99999
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
# append to the history file, don't overwrite it
shopt -s histappend
#history
shopt -s cmdhist
shopt -s histreedit
shopt -s histverify
shopt -s lithist
решение3
МакФлайэто еще один вариант. Его очень легко установить - вы можете сделать это через brew
или просто скачатьпоследний двоичный файл. Он написан на Rust, поэтому они статически связаны. Никакой ерунды с зависимостями.
Затем просто добавьте это в свой .bashrc
/ .zshrc
:
eval "$(mcfly init bash)" # or zsh
Он предоставляет вам полноэкранный пользовательский интерфейс, упорядоченный каким-то разумным образом.
решение4
ФЗФпоставляется с поддержкой bash (также zsh и fish).
Ответ @Tim Freskeописывает их модификации для сочетания клавиш в стиле vi.
Привязки клавиш по умолчаниюявляются стилем emacs. Который даже переопределяет поведение Ctrl- rдля fuzzy find без потери позиции. Они могут быть не включены по умолчанию. Чтобы включить их, добавьте это в .bashrc
:
source /usr/share/doc/fzf/examples/key-bindings.bash
(Если это не сработает, выполните команду apt-cache show fzf
find ...fzf/README...
file, в ней перечислены команды для bash, zsh, fish и vim)