在检查了fzf/shell/key-bindings.bash之后,我想出了以下内容,放在我的~/.bashrc中:
fzf_get_env_vars() {
local cmd opts selected
cmd='command env | command sed "s/=.*//;s/^/$/"'
opts="--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore --reverse $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS -m"
selected="$(eval "$cmd" \
| FZF_DEFAULT_OPTS="$opts" $(__fzfcmd) "$@" \
| while read -r item; do
printf '%s ' "$item"
done
)"
READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}"
READLINE_POINT=$(( READLINE_POINT + ${#selected} ))
}
# I'm a vi-mode user, so no need for emacs mapping
bind -m vi-command -x '"\ee": fzf_get_env_vars'
bind -m vi-insert -x '"\ee": fzf_get_env_vars'我在链接文件中看到的主要更改是:
fzf的函数,并从重新组合READLINE_LINE和READLINE_POINT的函数中检索用户选择的值;'%s '而不是'%q ')是安全的,$的情况下(通过sed脚本中的第二个s命令)添加D16。ShellCheck没有检测到代码中的问题。
发布于 2023-05-27 01:08:49
如果可能的话,避免eval是值得的。
考虑到您的代码,在没有eval的情况下,我想出了以下内容:
fzf_sed_env_vars_cmd() {
builtin command env |
builtin command awk -F'=' '{printf "$%s\n", $1}'
# builtin command sed "s/=.*//;s/^/$/"'
}
fzf_get_env_vars() {
builtin local opts selected
opts="--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore --reverse $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS -m"
selected="$( ##: Look Mah, No Eval!!! :-)
fzf_sed_env_vars_cmd |
FZF_DEFAULT_OPTS="$opts" $(__fzfcmd) "$@" |
while builtin read -r item; do
builtin printf '%s ' "$item"
done
)"
READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}"
READLINE_POINT=$(( READLINE_POINT + ${#selected} ))
}
# I'm a vi-mode user, so no need for emacs mapping
builtin bind -m vi-command -x '"\ee": fzf_get_env_vars'
builtin bind -m vi-insert -x '"\ee": fzf_get_env_vars'https://codereview.stackexchange.com/questions/280980
复制相似问题