简而言之,终端中的单个 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 文件中的条件来完成吗?
另一种方法是为操作系统正确生成地图键绑定。例如:
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)
就我个人而言,如果我打算这样做,我会创建一个~/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)