使用 vim 仅打开文件存在的情况

使用 vim 仅打开文件存在的情况

使用 vim 打开文件时,即使该文件不存在,vim 也会以我作为参数传递的名称打开一个空白文件。如何让 vim 仅打开文件存在的文件?

答案1

[ -e $1 ] && vim $1

是一个简单解决方案的核心。我通过将这一行写入文件“pv.cmd”(p如受保护的...)并定义一个“新命令”来测试它

alias pv='source pv.cmd'

我认为所有这些都是必要的,因为我们希望它通过(我希望是唯一的……)论证来发挥作用。

现在我可以走了

pv filename<enter>

而且,如果该文件名不存在(“-e”测试),您将在 0.000 秒内收到一个新的提示行(我确实做到了time pv jjjjjj)。

否则文件只会在 vim 中打开。

即使只是没有参数的 pv 也会启动 vim - 欢迎屏幕。

这里有很多选择:如何命名“pv”别名?一个快速但危险的“v”?您在哪里最好地定义这个别名?你在 vim 或 vi 上使用别名吗?使该衬垫成为 bash 可执行文件吗?外壳函数?

你知道我之前想知道当这种情况发生时(编辑不需要的空文件)是我还是 vim。但现在我:q立即走了,却没有创建任何文件。

您无法直接在 pv.cmd 中测试该行,因为它需要第一个参数(在 bash 中称为“$1”)。我认为用于检查参数的 oneliner 的别名$1是最低要求的。

...或者 VIM 中有一个选项吗?


我想说,使用一个函数几乎是一样的——品味和你的组织方式(或者系统如何组织你:-)

答案2

粗略地浏览一下各种 Vim 帮助文件并不能揭示在不使用 Vim 脚本的情况下是否可以实现这一点。如果您:e filename在 Vim 中使用并且filename不存在,编辑器将打开一个具有该名称的新缓冲区,并在您使用时将该缓冲区保存为该名称:w。这通常是你会做的去做。

要求文件名存在时开始Vim,您可以vim使用 shell 函数重载该命令:

vim () {
    if [ -e "$1" ] || [ -z "$1" ]; then
        command vim ${1:+"$1"}
    else
        printf 'No such file or directory: %s\n' "$1" >&2
        return 1
    fi
}

这将使您能够

  1. 仅编辑现有文件,并且
  2. 启动 Vim在命令行上创建文件(这将使您能够在:e filenameVim 中创建新文件)。

[ -e "$1" ]和两个测试[ -z "$1" ]检测函数的第一个参数是否作为文件名存在,或者是否为空。

参数扩展${1:+"$1"}将扩展到给定的带引号的文件名,或者如果没有给定文件名,则扩展为空。

command vim确保我们不会递归调用我们的函数。


为了还处理用户可能传递给 Vim 的可能选项,必须解析命令行参数并删除与不存在名称对应的文件名操作数的参数:

vim () {
    dashdash=false

    for arg do
        use_arg=false

        case $arg in
            --)
                dashdash=true
                use_arg=true
                ;;
            -*)
                if "$dashdash"; then
                    [ -e "$arg" ] && use_arg=true
                else
                    use_arg=true
                fi
                ;;
            *)
                [ -e "$arg" ] && use_arg=true
        esac

        if "$use_arg"; then
            set -- "$@" "$arg"
        else
            printf 'No such file or directory (skipping): %s\n' "$arg" >&2
        fi

        shift
    done

    unset arg dashdash use_arg

    command vim "$@"
}

这里唯一棘手的一点是--命令行上的参数表示选项的结束。这意味着后面的每个参数都--需要作为文件名进行测试,而虽然我们还没有看到 a,但--我们可以跳过-e对以破折号开头的任何内容的测试。

如果没有给出现有文件名,此函数将打开带有空白缓冲区的编辑器。

相关内容