![如何映射一个vim命令来执行基于操作系统的bash命令?](https://linux22.com/image/1354/%E5%A6%82%E4%BD%95%E6%98%A0%E5%B0%84%E4%B8%80%E4%B8%AAvim%E5%91%BD%E4%BB%A4%E6%9D%A5%E6%89%A7%E8%A1%8C%E5%9F%BA%E4%BA%8E%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84bash%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
简而言之,终端中的单个 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