Como mapear um comando vim para executar comandos bash baseados em SO?

4

Em suma, os comandos bash únicos no terminal contêm condicionais? Se sim, como?

Eu tenho no meu vimrc (compartilhado entre sistemas) o seguinte comando para abrir meu documento atual do LaTeX em formato .pdf: map ,v :!gnome-open %<.pdf <CR> <CR>

A minha pergunta é, qual é a melhor maneira de ter, v executar simplesmente "abrir% < .pdf" quando estou em casa na minha máquina OS X? Aqui está o meu palpite de pseudo-código:

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

Isso é executado como um único comando BASH. Tais condicionais são possíveis? Se assim for, alguém poderia me ajudar com a sintaxe? Se não, isso pode ser feito via condicionais no arquivo vimrc?

    
por user6845 22.04.2011 / 04:21

2 respostas

6

Uma alternativa seria apenas gerar a associação de teclas do mapa corretamente para o sistema operacional. Por exemplo:

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

Isso foi testado e parece funcionar, mas como o meu script Vim é um pouco instável e eu poderia ter perdido alguns detalhes como uma cotação apropriada, eu provavelmente iria mais com a abordagem do Jander e usaria um wrapper shell que eu estou longe superior por escrito.

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

E em ~/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
    
por 22.04.2011 / 09:16
5

Pessoalmente, se eu fosse fazer isso, criaria um script ~/bin/open.sh com qualquer comando "open" correto para o sistema operacional e garantiria que ~/bin estivesse em meu caminho em todas as minhas máquinas. Ele escala melhor assim, caso eu queira adicionar uma caixa do Windows + Cygwin, por exemplo. A desvantagem é que você precisa ter um script diferente para cada tipo de máquina, embora os scripts sejam simples, então não é muito ruim.

Então, em ~ / bin / open.sh no Mac:

#!/bin/sh
open "$@"

E em ~ / bin / open.sh no Linux:

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

E no vimrc:

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

... Como alternativa, se você preferir ter tudo na linha :! , use um ponto-e-vírgula sempre que normalmente usaria uma nova linha em um script de shell. Para adaptar o seu exemplo:

... if [ "$OSTYPE" == "darwin10.0" ]; then open %<.pdf; else gnome-open %<.pdf; fi
    
por 22.04.2011 / 08:26

Tags