如何像 vim 的 ctrlp 插件一样在 bash 中模糊完整的文件名?

如何像 vim 的 ctrlp 插件一样在 bash 中模糊完整的文件名?

假设我的密码是~/myproject/,并且我有一个文件~/myproject/scripts/com/example/module/run_main_script.sh

在 vim 中使用ctrlp 插件,我可以按Ctrl+ P,输入run_main_ Enter,我正在编辑该脚本。

我想在 bash 中运行该脚本(带一些参数)。但我不想输入完整路径。有什么方法可以在 bash 中做到这一点吗?

答案1

这就是PATH变量的通常用途。不过,我不会将整个主目录添加到您的PATH。考虑添加一个专用目录(如~/bin)以将您的可执行文件添加到您的路径中。

但是,您可以添加一个功能~/.bashrc,使您可以搜索并运行脚本......如下所示:

# brun stands for "blindly run"
function brun {
    # Find the desired script and store
    # store the results in an array.
    results=(
        $(find ~/ -type f -name "$1")
    )

    if [ ${#results[@]} -eq 0 ]; then   # Nothing was found
        echo "Could not find: $1"
        return 1

    elif [ ${#results[@]} -eq 1 ]; then   # Exactly one file was found
        target=${results[0]}

        echo "Found: $target"

        if [ -x  "$target" ]; then   # Check if it is executable
            # Hand over control to the target script.
            # In this case we use exec because we wanted
            # the found script anyway.
            exec "$target" ${@:2}
        else
            echo "Target is not executable!"
            return 1
        fi

    elif [ ${#results[@]} -gt 1 ]; then   # There are many!
        echo "Found multiple candidates:"
        for item in "${results[@]}"; do
            echo $item
        done
        return 1
    fi
}

答案2

我也想要这个。
我为此写了一个小的 perl 脚本,请随意查看。
Ctrl-P 类似于命令行(bash)脚本。

答案3

不完全是你想要的,但相当不错,并且内置在你已经使用的 bash 中,即 Ctrl-r http://ruslanspivak.com/2010/11/20/bash-history-reverse-intelligent-search/

如果它更模糊一些就好了,就像 vim 中的 ctrlp 一样。这里提到了一些更高级别的实现是否有像 Sublime Text 一样支持模糊完成的 shell?

你可以使用 readline 和 .inputrc 来让整个 bash 提示符更像 vim http://vim.wikia.com/wiki/Use_vi_shortcuts_in_terminal

相关内容