3

我想使用FZF搜索文件,然后在我选择的编辑器中打开它们,例如 Sublime、Atom。我不确定如何为此配置我的外壳,我已经尝试了以下方法,但我无法让它工作。

你能帮我吗?

谢谢!

fe() {
local files
  IFS=$'\n' files=($(fzf-tmux --query="$1" --multi --select-1 --exit-0))
  [[ -n "$files" ]] && ${EDITOR:-atom} "${files[@]}"
}
4

2 回答 2

3

根据您的评论,唯一的问题可能来自这部分:

${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.

于 2017-02-01T15:01:27.953 回答
2

写了一个函数,我保存在我的 .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
}
于 2020-10-18T18:35:45.787 回答