키 바인딩을 통해 fzf를 사용하여 퍼지 검색 후 선택한 후보를 터미널에 채우시겠습니까?

키 바인딩을 통해 fzf를 사용하여 퍼지 검색 후 선택한 후보를 터미널에 채우시겠습니까?

그리고이 플러그인적절한 패키지 후보를 통해 퍼지 검색을 수행할 수 있습니다.

실행 결과는 다음과 같습니다.

# apt zzuf zziplib-bin zytrax

링크의 코드(저는 if [[ "${BASH_<...> fi함수 에 넣었습니다 my-fuzzy-test):

#!/usr/bin/env bash
function insert_stdin {
    # if this wouldn't be an external script
    # we could use 'print -z' in zsh to edit the line buffer
    stty -echo
    perl -e 'ioctl(STDIN, 0x5412, $_) for split "", join " ", @ARGV;' \
        "$@"
}
function my-fuzzy-test() {
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    packages="$(apt list --verbose 2>/dev/null | \
        # remove "Listing..."
        tail --lines +2 | \
        # place the description on the same line
        # separate the description and the other information
        # with a ^
        sd $'\n {2}([^ ])' $'^$1' | \
        # place the package information and the package description
        # in a table with two columns
        column -t -s^ | \
        # select packages with fzf
        fzf --multi | \
        # remove everything except the package name
        cut --delimiter '/' --fields 1 | \
        # escape selected packages (to avoid unwanted code execution)
        # and remove line breaks
        xargs --max-args 1 --no-run-if-empty printf "%q ")"

    if [[ -n "${packages}" ]]; then
        insert_stdin "# apt ${@}" "${packages}"
    fi
fi
}

위의 코드를 넣고 키바인딩에 ~/.zshrc매핑했습니다 .my-fuzzy-test

zle -N my-fuzzy-test
bindkey "^[k" my-fuzzy-test

프레스 alt-k트리거 my-fuzzy-test기능으로 인해 를 눌러도 아무것도 표시되지 않습니다 alt-k. 마지막에 행 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then합계를 제거하면 fi함수가 실행될 수 있지만 위의 예상 출력이 표시되지 않고 오류가 표시됩니다.stty: 'standard input': Inappropriate ioctl for device

다음과 같이 터미널 프롬프트에 후보자를 채울 수 있다는 것을 알고 있습니다.이 코드다음과 같이:

# CTRL-R - Paste the selected command from history into the command line
fzf-history-widget() {
  local selected num
  setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null
  selected=( $(fc -rl 1 | perl -ne 'print if !$seen{(/^\s*[0-9]+\s+(.*)/, $1)}++' |
    FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) )
  local ret=$?
  if [ -n "$selected" ]; then
    num=$selected[1]
    if [ -n "$num" ]; then
      zle vi-fetch-history -n $num
    fi
  fi
  zle reset-prompt
  return $ret
}
zle     -N   fzf-history-widget
bindkey '^R' fzf-history-widget

그렇다면 터미널 프롬프트에 후보를 올바르게 입력하려면 어떻게 해야 합니까 my-fuzzy-test?

답변1

Ctrl-R 위젯은 zle vi-fetch-history과거 일치 항목을 삽입하는 데 사용되며 여기서 수행하는 작업에는 작동하지 않습니다.

당신이 해야 할 일은 생성된 일치 항목을 편집 버퍼에 삽입하는 것입니다. 여기 같은 코드에서 다른 위젯이 하는 것처럼:https://github.com/junegunn/fzf/blob/master/shell/key-bounds.zsh#L62

echo이 위젯은 함수에 의해 삽입된 일치 항목을 __fsel버퍼 왼쪽 부분의 오른쪽에 삽입합니다(즉, 일치 항목을 커서의 현재 위치에 삽입한 다음 커서는 삽입된 내용의 오른쪽으로 끝납니다).

LBUFFER="${LBUFFER}$(__fsel)"

관련 정보