Альтернатива должна была бы просто генерировать привязку клавиш карты правильно для ОС. Например:
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 и просто использовать обертку оболочки, которая я намного выше в письменной форме.
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
Лично, если бы я собирался сделать это, то я создал бы a ~/bin/open.sh
сценарий с любой "открытой" командой корректен для ОС, и удостовериться ~/bin
находится в моем пути на всех моих машинах. Это масштабирует лучше тот путь в случае, если я хочу добавить поле Windows+Cygwin, например. Оборотная сторона - то, что у Вас должен быть другой сценарий для каждого типа машины, хотя сценарии очень просты, таким образом, это действительно не слишком плохо.
Так, в ~/bin/open.sh на Mac:
#!/bin/sh
open "$@"
И в ~/bin/open.sh на Linux:
#!/bin/sh
gnome-open "$@"
И в vimrc:
map ,v :!open.sh %<.pdf<CR><CR>
... Поочередно, если Вы предпочитаете иметь все на :!
строка, затем можно использовать точку с запятой везде, где Вы обычно использовали бы новую строку в сценарии оболочки. Адаптировать Ваш пример:
... if [ "$OSTYPE" == "darwin10.0" ]; then open %<.pdf; else gnome-open %<.pdf; fi