如何映射一个vim命令来执行基于操作系统的bash命令?

如何映射一个vim命令来执行基于操作系统的bash命令?

简而言之,终端中的单个 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 文件中的条件来完成吗?

答案1

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

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

这已经过测试并且似乎可以工作,但是由于我的 Vim 脚本有点不稳定,而且我可能错过了一些细节,例如正确的引用,我可能会更多地采用 Jander 的方法,只使用 shell 包装器,我在写作方面要优越得多。

map ,v :!open.sh '%<.pdf'<CR><CR>

并在~/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

答案2

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

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

#!/bin/sh
open "$@"

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

#!/bin/sh
gnome-open "$@"

在 vimrc 中:

map ,v :!open.sh %<.pdf<CR><CR>

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

... if [ "$OSTYPE" == "darwin10.0" ]; then open %<.pdf; else gnome-open %<.pdf; fi

相关内容