我想使用FZF搜索文件,然后在我选择的编辑器中打开它们,例如 Sublime、Atom。我不确定如何为此配置我的外壳,我已经尝试了以下方法,但我无法让它工作。
你能帮我吗?
谢谢!
fe() {
local files
IFS=$'\n' files=($(fzf-tmux --query="$1" --multi --select-1 --exit-0))
[[ -n "$files" ]] && ${EDITOR:-atom} "${files[@]}"
}
根据您的评论,唯一的问题可能来自这部分:
${EDITOR:-atom}
如果变量 EDITOR 具有非空值,则扩展为变量 EDITOR 的内容,atom
如果它为空值或未设置,则扩展为变量 EDITOR 的内容。您可能将该变量初始化为atom
. 尝试简单地使用atom
,如下所示:
fe() {
local files
IFS=$'\n' files=($(fzf-tmux --query="$1" --multi --select-1 --exit-0))
[[ -n "$files" ]] && atom "${files[@]}"
}
当然,您也可以保留该功能,但请确保您的环境包含类似EDITOR=atom
.
我写了一个函数,我保存在我的 .bashrc 中,您可以使用它来通过 fzf 选择任何文件并将它们传递给您想要的任何程序(因此不仅是 sublime,还有您添加到函数列表中的任何 GUI 程序),它也可与 cd、cat、tail、head 等命令行工具配合使用。您还可以循环浏览您的历史记录并找到在 fzf 完成操作后扩展的命令。如果您将 fzf 配置为在默认情况下查看文件系统上的许多常见位置(或参见此处),此功能真的很出色。我每天都用很多次,主要是换目录(f cd)或者打开文件。
在您的情况下,您只需在终端中输入:
f sublime
fzf 将启动,在您选择文件后,sublime 会打开它们。
我把函数放在下面,我在这里得到了灵感
#!/bin/bash
# Run command/application and choose paths/files with fzf.
# Always return control of the terminal to user (e.g. when opening GUIs).
# The full command that was used will appear in your history just like any
# other (N.B. to achieve this I write the shell's active history to
# ~/.bash_history)
#
# Usage:
# f cd [OPTION]... (hit enter, choose path)
# f cat [OPTION]... (hit enter, choose files)
# f vim [OPTION]... (hit enter, choose files)
# f vlc [OPTION]... (hit enter, choose files)
f() {
# if no arguments passed, just lauch fzf
if [ $# -eq 0 ]
then
fzf | sort
return 0
fi
# store the program
program="$1"
# remove first argument off the list
shift
# store any option flags
options="$@"
# store the arguments from fzf
arguments=$(fzf --multi)
# if no arguments passed (e.g. if Esc pressed), return to terminal
if [ -z "${arguments}" ]; then
return 1
fi
# sanitise the command:
# put an extra single quote next to any pre-existing single quotes
# put single quotes around each argument
# put them all on one line.
for arg in "${arguments[@]}"; do
arguments=$(echo "$arg" | sed "s/'/''/g;
s/.*/'&'/g;
s/\n//g"
)
done
# if the program is on the GUI list, add a '&'
if [[ "$program" =~ ^(nautilus|zathura|evince|vlc|eog|kolourpaint)$ ]]; then
arguments="$arguments &"
fi
# write the shell's active history to ~/.bash_history.
history -w
# add the command with the sanitised arguments to .bash_history
echo $program $options $arguments >> ~/.bash_history
# reload the ~/.bash_history into the shell's active history
history -r
# execute the last command in history
fc -s -1
}