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関数を含む実行可能ファイルのフルパスを渡します。