FZF 미리보기 창에서 Bash 기능을 표시할 수 없습니다.

FZF 미리보기 창에서 Bash 기능을 표시할 수 없습니다.

FZF 미리보기 창을 사용하여 현재 Bash 환경에서 기능을 표시하는 방법은 무엇입니까?

FZF를 사용하여 사용자 정의 bash 함수를 나열하고 FZF 미리보기 창에서 선택한 함수의 코드를 보고 싶습니다.

그러나 FZF가 내 명령을 실행하는 데 사용하는 bash 환경은 내 터미널 bash 환경의 기능을 볼 수 없는 것 같습니다. 예를 들어:

$ declare -F | fzf --preview="type {3}"

/bin/bash: line 1: type: g: not found

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

그러나 다음은 작동합니다.

$ declare -F

declare -f fcd
declare -f fz
declare -f g

$ type g
g is a function
g ()
{
    search="";
    for term in $@;
    do
        search="$search%20$term";
    done;
    nohup google-chrome --app-url "http://www.google.com/search?q=$search" > /dev/null 2>&1 &
}

declare -F | fzf --preview="echo {3}"

g # my function g()

FZF 미리보기 창 환경이 내 터미널 환경을 볼 수 없는 이유 중 하나가 프로세스 ID가 다르기 때문이라고 생각합니다.

$ echo $BASHPID

1129439

$ declare -F | fzf --preview="echo $BASHPID"

1208203

FZF 미리보기 창을 사용하여 현재 Bash 환경에서 기능을 표시하는 방법은 무엇입니까?

답변1

서브쉘이 상속하도록 함수를 내보내야 합니다. 예는 다음과 같습니다.

#!/usr/bin/env bash
header_info='CTRL+D or ESCAPE to exit, ENTER attaches to a Detached screen'
export FZF_DEFAULT_COMMAND="list_screens"
export FZF_DEFAULT_OPTS="--info=inline --header '${header_info}' --preview 'screen_peek {1}' --preview-window top,80%,follow "
function screen_peek() {
  local screen=$1
  local pipe="/tmp/${RANDOM}-$(date +%s).peek"
  mkfifo "${pipe}"
  screen -S "${screen}" -X hardcopy "${pipe}"
  cat "${pipe}" | sed -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;};/\n$/ba'
  rm -f "${pipe}"
}

function list_screens() {
  screen -ls | column -t | grep tached
}
export -f screen_peek
export -f list_screens
screen_id=$(list_screens | fzf | awk '{print $1}')
[[ "${screen_id}" ]] && screen -x "${screen_id}"

답변2

이는 실제로 텍스트 파일/청크를 수신하는 가능하고 좋은 방법입니다.

fzf에서 사용하는 셸에 함수를 알려야 합니다. 미리보기 창에서 bash 명령을 사용하여 함수가 포함된 파일을 가져오면 됩니다. 예는 다음과 같습니다.

$ compgen -c | fzf --preview='bash -c "source ~/bin/all-my-functions.sh;type {}"'

바꾸다~/bin/all-my-functions.sh함수가 포함된 실행 파일의 전체 경로를 전달합니다.

관련 정보