Bash에서 Ctrl-R 역방향 검색의 대안

Bash에서 Ctrl-R 역방향 검색의 대안

나는 bash 쉘의 역방향 검색 기능을 Ctrl정말 좋아하고 행복합니다. R내 동료 중 일부는 때때로 혼란스럽기 때문에 그것을 좋아하지 않습니다. 나는 그들을 이해합니다. 잘못된 문자를 입력하면 기록의 현재 위치가 과거 어딘가에 있으며 최근 일치 항목을 찾을 수 없습니다.

쉘 기록에서 뒤로 검색할 수 있는 보다 사용자 친화적인 대안이 있습니까?

나는 bash를 고수하고 싶다. 대체 쉘을 제안하는 것은 이 질문에 대한 답이 아닙니다.

"위치 상실" 문제는 여기에 설명되어 있습니다.Bash 기록 검색 위치 재설정. 이러한 솔루션은 효과가 있습니다. 좋아요. 그러나 내 관점에 따르면 솔루션은 쉽고 사용자 친화적이지 않습니다. 이러한 솔루션은 간단하고 간단하지 않습니다. 이것은 과거의 솔루션입니다. 과거에는 인간이 컴퓨터가 입력을 원하는 방식을 배워야 했습니다. 그러나 오늘날 도구는 사용자가 쉬운 방식으로 입력을 받아들여야 합니다.

PyCharm과 같은 jetbrains IDE를 아는 사람이 있을 수도 있습니다. "foobar"를 검색하면 "foo_bar"가 포함된 줄도 표시됩니다. 훌륭해요. 유닉스죠 :-)

답변1

퍼지 찾기 프로그램을 사용하고 있습니다FZF. 나는 활용하기 위해 나만의 키 바인딩과 쉘 스크립트를 작성했습니다.FZF대화형 항목을 역검색하기 위해 제가 선택한 도구로세게 때리다쉘의 역사 내 코드를 자유롭게 복사하여 붙여넣으세요.구성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-binds.bash 소스 가능 Bash 스크립트

에서 촬영하고 약간 개조한 것입니다.FZF 세게 때리다 키 바인딩여기에 있는 파일은 Bash의 기록 역검색을 위한 Emacs 모드 호환 키 바인딩입니다 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

지능적인 방식으로 정렬된 전체 화면 UI를 제공합니다.

여기에 이미지 설명을 입력하세요

답변4

FZFbash(zsh 및 fish)도 지원됩니다.

@Tim Freske의 답변vi 스타일 키 바인딩에 대한 수정 사항을 설명합니다.

기본 키 바인딩이맥스 스타일입니다. 이는 위치를 잃지 않고 퍼지 찾기에 대한 Ctrl- 동작을 재정의합니다. r기본적으로 활성화되지 않을 수 있습니다. 활성화하려면 다음을 추가하세요 .bashrc.

source /usr/share/doc/fzf/examples/key-bindings.bash

(이것이 작동하지 않으면 파일을 찾아서 apt-cache show fzf찾으 십시오 ...fzf/README.... bash, zsh, fish 및 vim에 대한 명령이 나열됩니다.)

관련 정보