ZSH: 기록 검색을 위한 메뉴 선택 자동 완성

ZSH: 기록 검색을 위한 메뉴 선택 자동 완성

ZSH에는 디렉토리 선택, kill(kill[tab][tab])을 사용하여 프로세스 선택 등을 위한 강력한 메뉴 선택 자동 완성 기능이 있습니다. 화살표를 사용하여 선택 사항을 탐색할 수 있습니다.

기록 검색(CTRL+R) 메뉴 팝업도 가능합니까? 메뉴를 통해 현재 CTRL+R 검색 표시줄과 일치하는 항목을 탐색할 수 있습니까?

답변1

나는 이것이 당신이 요구하는 것과는 거리가 멀다는 것을 알고 있지만 이것이 당신의 근본적인 문제를 해결할 수도 있습니다.

기록을 검색할 때 결과가 가득한 페이지를 표시하는 쉘 기록 확장이 있습니다. 또한 현재 디렉터리, Git 저장소, 종료 상태 및 호스트를 기반으로 관련 결과를 먼저 표시합니다.

여기에서 프로젝트를 설치할 수 있습니다.https://github.com/curusarn/resh
CTRL+ (역방향 검색 대체)를 사용하여 실행하세요 R.
검색 애플리케이션은 다음과 같습니다.

검색 애플리케이션의 스크린샷

면책조항: 저는 프로젝트의 창시자이며 이는 뻔뻔한 자기 홍보입니다.

답변2

zsh-navigation-tools이런 일을합니다. oh-my-zsh를 사용하는 경우 ctrl-R을 추가 zsh-navigation-tools하면 plugins=(...).zshrc/아래 및 검색/필터링이 포함된 스크롤 기록이 제공됩니다. oh-my-zsh 없이도 사용할 수 있지만 설정이 더 많은 작업처럼 보입니다.

답변3

  1. 내가 아는 한에서는 아니다.

  2. 아마도predict-on당신이 요청하는 것과 관련된 작업을 수행하려고 합니다 .

    autoload -U predict-on
    zle -N predict-on
    zle -N predict-off
    bindkey '^X1' predict-on
    bindkey '^X2' predict-off
    

답변4

그것은 가능합니다. 원칙적으로 _kill역사 이벤트에도 작동하도록 완성 기능을 수정했습니다 .

다음은 예입니다. 항목을 선택한 후 [ENTER]를 한 번 눌러 이벤트 번호를 승인하고(명령줄에서는 fe 로 읽음 hc 780) 다시 [ENTER]를 눌러 명령을 실행합니다. ( 실행하기 전에 명령줄을 수정하려는 경우 fc대신 사용하십시오.)hc

$ hc Makefile[TAB]
history event
 1906  9.3.2013 18:10  vi Makefile
 1867  9.3.2013 17:26  less Makefile
  780  3.2.2013 17:54  cat Makefile                
  776  3.2.2013 17:51  cat ../Makefile     

이를 사용하려면 추가된 파일을 의 디렉터리에 넣고 다음 $fpath줄을 다음 줄에 추가하세요 ~/.zshrc.

zstyle ':completion:*:historyevent' command 'fc -dE -lr 1'
zstyle ':completion:*:historyevent' sort no

마지막으로 새 zsh세션을 시작합니다.

조심하세요. 빠르고 더러운 해결책이지만 한동안은 잘 작동했습니다.


_역사이벤트

#autoload

local out histevent list expl match desc listargs all nm ret=1

_tags historyevent || return 1

all=(-U)
match="*[[:blank:]]*[[/[:blank:]]$PREFIX*$SUFFIX*"
nm="$compstate[nmatches]"

out=( "${(@f)$(_call_program historyevent fc -l 2>/dev/null)}" )
desc="$out[1]"
out=( "${(@M)out[2,-1]:#${~match}}" )

histevent=( "${(@)${(@M)out##[^0-9]#[0-9]#}##*[[:blank:]]}" )

if zstyle -T ":completion:${curcontext}:historyevent" verbose; then
  list=( "${(@Mr:COLUMNS-1:)out}" )
  desc=(-ld list)
else
  desc=()
fi

_wanted processes expl 'history event' \
    compadd "$@" "$desc[@]" "$all[@]" -a - histevent && ret=0

if [[ -n "$all" ]]; then
  zstyle -s ":completion:${curcontext}:historyevent" insert-ids out || out=menu

  case "$out" in
  menu)   compstate[insert]=menu ;;
  single) [[ $compstate[nmatches] -ne nm+1 ]] && compstate[insert]= ;;
  *)      [[ ${#:-$PREFIX$SUFFIX} -gt ${#compstate[unambiguous]} ]] &&
              compstate[insert]=menu ;;
  esac
fi

return ret

_fc

#compdef fc

local curcontext="$curcontext" line state ret=1

_arguments -C \
   '-e[editor command]' \
   '-l[list last history events]' \
   '-n[suppress numbers]' \
   '-r[reverse order]' \
   '*:history event:->historyevent' && ret=0

if [[ -n "$state" ]]; then
  _alternative \
    'historyevent:: _historyevent' && ret=0
fi

return ret

관련 정보