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プレビューウィンドウ環境が私の​​端末環境を見ることができない理由の1つは、プロセス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関数を含む実行可能ファイルのフルパスを渡します。

関連情報