オペレーティングシステムベースのbashコマンドを実行するためにvimコマンドをマッピングする方法は?

オペレーティングシステムベースのbashコマンドを実行するためにvimコマンドをマッピングする方法は?

つまり、端末の単一のbashコマンドに条件を含めることができますか?それでは、どうすればいいですか?

vimrc(システム間共有)で、次のコマンドを使用して現在のLaTeX文書を.pdf形式で開きます。 map ,v :!gnome-open %<.pdf <CR> <CR>

私の質問は、私が家にOS Xコンピュータにいるときにvに「%<.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のアプローチに従うことができ、シェルラッパーを使用することもできます. 。

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

個人的にこれを行うには、オペレーティングシステムに適した「open」コマンドを使用してスクリプトを生成し、そのコマンドがすべてのコンピュータのパスにあることを~/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>

...またはすべての内容を1行に表示するには、:!通常はシェルスクリプトで改行文字を使用する場所にセミコロンを使用できます。お客様の例を適用するには:

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

関連情報