如何根据操作系统映射一个 vim 命令来执行 bash 命令?

use*_*845 4 bash vim

简而言之,终端中的单个 bash 命令可以包含条件吗?如果是这样,如何?

我在我的 vimrc(跨系统共享)中使用以下命令以 .pdf 格式打开我当前的 LaTeX 文档: map ,v :!gnome-open %<.pdf <CR> <CR>

我的问题是,当我在家中使用 OS X 机器时,让 ,v 简单地执行“open %<.pdf”的最佳方法是什么?这是我的伪代码猜测:

... if [$OSTYPE == "darwin*"] then open %<.pdf else gnome-open %<.pdf ...

这是作为单个 BASH 命令执行的。这样的条件可能吗?如果是这样,有人可以帮我语法吗?如果没有,这可以通过 vimrc 文件中的条件来完成吗?

pen*_*359 6

另一种方法是为操作系统正确生成地图键绑定。例如:

if executable("cmd.exe")
    map ,v :!cmd.exe /C start "" "%<.pdf"<CR><CR>
elseif $OSTYPE =~ "darwin.*"
    map ,v :!open '%<.pdf'<CR><CR>
elseif executable("gnome-open")
    map ,v :!gnome-open '%<.pdf'<CR><CR>
endif
Run Code Online (Sandbox Code Playgroud)

这已经过测试并且似乎有效,但是由于我的 Vim 脚本有点不稳定,而且我可能错过了一些细节,例如正确引用,我可能会更多地使用 Jander 的方法,只使用我在写作方面非常出色的外壳包装器.

map ,v :!open.sh '%<.pdf'<CR><CR>
Run Code Online (Sandbox Code Playgroud)

并在~/bin/open.sh

#!/bin/sh

if echo "$OSTYPE" | grep "^darwin" >/dev/null 2>&1; then
    open "$@" &
elif type gnome-open &>/dev/null; then
    gnome-open "$@" &
fi
Run Code Online (Sandbox Code Playgroud)


Jan*_*der 5

就我个人而言,如果我打算这样做,我会创建一个~/bin/open.sh脚本,其中包含适用于操作系统的任何“打开”命令,并确保~/bin在我所有机器上的路径中。例如,如果我想添加一个 Windows+Cygwin 框,它可以更好地扩展。缺点是您需要为每种类型的机器使用不同的脚本,尽管脚本非常简单,所以它真的还不错。

因此,在 Mac 上的 ~/bin/open.sh 中:

#!/bin/sh
open "$@"
Run Code Online (Sandbox Code Playgroud)

在 Linux 上的 ~/bin/open.sh 中:

#!/bin/sh
gnome-open "$@"
Run Code Online (Sandbox Code Playgroud)

在 vimrc 中:

map ,v :!open.sh %<.pdf<CR><CR>
Run Code Online (Sandbox Code Playgroud)

...或者,如果您希望将所有内容都放在:!一行,那么您可以在通常在 shell 脚本中使用换行符的任何地方使用分号。调整您的示例:

... if [ "$OSTYPE" == "darwin10.0" ]; then open %<.pdf; else gnome-open %<.pdf; fi
Run Code Online (Sandbox Code Playgroud)