zsh에서 fzf를 사용하여 흐릿한 xdg-open을 얻는 방법은 무엇입니까?

zsh에서 fzf를 사용하여 흐릿한 xdg-open을 얻는 방법은 무엇입니까?

질문

사용해보려고 했는데후지브바로가기(바람직하게는 Ctrl+ o)를 바인딩하여 파일을 대화식으로 검색하고 xdg-openzsh로 파이프합니다. fzf소스 파일이 다음 위치에 있는 한 많은 단축키는 이미 유틸리티의 일부입니다 .fzf/쉘/keybinding.zsh. 여기서는 바인딩 Ctrl+ r명령 기록의 퍼지 검색 및 Ctrl+ t현재 명령줄의 퍼지 완성에 대한 스니펫을 찾을 수 있습니다 . fzf 소스 코드의 첫 번째 단축키는 다음과 같습니다.

# 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,ctrl-z:ignore $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

물론 선택한 결과를 명령에 직접 연결하는 대신 명령줄에 붙여넣기 때문에 내가 원하는 것과 약간 다르게 동작합니다. 그러나 아래 bash 스크립트는 정확히 내가 기대하는 동작을 갖고 있으며, 이를 실행하면 내가 직접 할 수 있는 것보다 더 잘 해석할 수 있습니다.

bind -x '"\C-o": file="$(fzf --height 40% --reverse)" && [ -f "$file" ] && xdg-open "$file"'

나도 이걸 찾았어물고기 기능동작은 동일하지만 Fish의 구문은 zsh 및 bash와 같은 POSIX 호환 셸과 매우 다르기 때문에 이것이 얼마나 도움이 되는지 모르겠습니다.

그렇다면 +를 대화형 fzf 검색에 Ctrl바인딩 하고 그 결과를 zsh 로 직접 파이프하는 방법을 아는 사람이 있습니까 ?oxdg-open

미리 감사드립니다!


답변

다음은 내가 작성한 작업 스크립트입니다.이것스택 오버플로 답변.

fuzzy-xdg-open() {
  local output
  output=$(fzf --height 40% --reverse </dev/tty) && xdg-open ${(q-)output}
  zle reset-prompt
}

zle -N fuzzy-xdg-open
bindkey '^o' fuzzy-xdg-open

답변1

에서 zsh키 또는 키 조합( 사용 bindkey) 을 바인딩합니다.작은 부품, 라인 편집기에서 특수 작업을 수행하는 위젯입니다.

내장된 함수를 사용하여 사용자 정의 위젯을 정의할 수 있습니다 zle.

이 사용자 정의 위젯 내에서 임의의 명령을 실행할 수 있지만 숫자 인수를 처리하는 방법을 고려할 수도 있습니다.

예를 들어, 사용자가 ++ 를 입력하면 Alt대부분 3 Ctrl의 위젯에 대한 규칙대로 명령을 세 번 실행하시겠습니까?o

또한 명령을 실행한 후 라인 편집기 버퍼(지금까지 입력한 내용)나 프롬프트를 다시 그려야 하는지, 아니면 실행한 명령이 터미널 내용에 쓰여지는 경우를 대비해 명령을 실행하기 전에 숨겨야 하는지도 고려해야 합니다. 또한 명령의 종료 상태는 위젯이 성공했는지 여부를 결정해야 합니다(예: 시각적 또는 청각적 알림 발생).

사용자의 입력이 필요한 위젯에서 도구를 실행하는 경우 ZLE 리디렉션 시 tty에서 표준 입력을 복원하여 줄 /dev/null편집기의 일반적인 입력 흐름을 방해하지 않도록 해야 합니다. 명령이 터미널을 발견 당시와 동일한 상태로 유지하는지 확인해야 합니다 fzf.

예를 들어 다음과 같습니다.

my-open-widget() {
  zle -I # invalidate current zle display
  local file ret=0
  repeat ${NUMERIC-1} {
    file="$(fzf --height 40% --reverse)" &&
      [ -f "$file" ] &&
      xdg-open "$file" ||
      ret=$?
  } < /dev/tty
  return $ret
}

zle -N my-open-widget
bindkey '^o' my-open-widget

요청에 따라 코드를 여러 번 실행하고 실패 시 실패를 반환하려면 미리 표시를 무효화하여 코드 출력이 프롬프트를 복잡하게 만들지 않도록 하세요.

또는 인스턴스가 실패할 경우 즉시 중단( || ret=$?로 대체)할 수도 있습니다 || return. 또는 코드가 디스플레이를 엉망으로 만들지 않고 더 일반적으로 tty와 상호 작용하지 않는다는 것을 알고 있으면 건너뛰십시오 zle -I. 또는 숫자 인수를 무시하고 무조건 코드를 한 번만 실행하면 궁극적으로 작동합니다. 위젯 함수의 본문도 마찬가지로 간단합니다.

답변2

이런 종류의 키 바인딩은 원본 버전에서 직접 구현되지 않습니다.. 그러나 설치하면zsh-edit플러그인, 다음을 사용할 수 있습니다.

bind '^O' 'file="$(fzf --height 40% --reverse)" && [ -f "$file" ] && xdg-open "$file"'

답변3

#!/bin/bash
xdg-open "$(rg --no-messages --files ~/Music ~/Series ~/Films ~/Documents ~/pdf \
    ~/Dropbox/calibre2 ~/Downloads \
    -g "!{*.srt,*.rar,*.txt,*.zip,*.nfo}" | rofi -threads 0 \
    -theme-str "#window { width: 900;}" \
    -dmenu -sort -sorting-method fzf -i -p "find")"

완전히 똑같지는 않지만 xdg-open + rofi 스크립트 조합이 파일을 여는 데 유용하다는 것을 알았습니다. (zsh 종속성 없음).

원천:https://www.reddit.com/r/i3wm/comments/c17m5e/launcher_to_open_files_with_xdgopen_using_fzf/

관련 정보