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

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

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

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

나는 bash를 고수하고 싶다. 대체 쉘을 제안해도 이 문제는 해결되지 않습니다.

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

PyCharm과 같은 jetbrains IDE에 대해 아는 사람이 있을 수도 있습니다. "foobar"를 검색하면 "foo_bar"가 포함된 행도 표시됩니다. 굉장해요, 그건 유닉스예요 :-)

답변1

퍼지 파인더를 사용하고 있습니다후지프. 사용할 키 바인딩과 쉘 스크립트를 직접 작성했습니다.후지프역방향 검색을 위해 선택한 대화형 도구불다쉘 역사. 내 코드를 자유롭게 복사하여 붙여넣으세요.구성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

스마트한 방식으로 정렬된 전체 화면 사용자 인터페이스를 제공합니다.

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

답변4

후지프bash(zsh 및 Fish)도 지원합니다.

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

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

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

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

관련 정보