如何使用 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
您需要导出函数,以便子 shell 继承它们。这是一个例子:
#!/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 使用的 shell 知道您的函数。您可以通过在预览窗口中使用 bash 命令获取包含函数的文件来实现此目的。这是一个例子:
$ compgen -c | fzf --preview='bash -c "source ~/bin/all-my-functions.sh;type {}"'
代替〜/bin/all-my-functions.sh通过包含函数的可执行文件的完整路径。