6

vimでファイルのファイルタイプを判断し、ファイルタイプに基づいて構文の強調表示を設定する方法を探しています。唯一の問題は、ファイルの種類を判断するためにファイル拡張子を使用できないことです。

これが私のシナリオです。私はvimdifforgvimdiffP4DIFFツールとして使用しています。これは、ローカル コピー内のファイルと perforce サーバーからのファイルとの間の変更を表示します。Perforce は、perforce サーバーから /tmp ディレクトリにファイルを取り込み、 を使用しPIDてファイルに名前を付けているようです。次に例を示します。

/tmp/tmp.24673.23

これは C++ ソース ファイル用でした。

perforce リポジトリで最も頻繁に遭遇するファイルの種類は、C/C++ ソースとヘッダー ファイル、Makefile、python スクリプト、perl スクリプト、ruby スクリプト、および tcl スクリプトです。

  • の使用を検討しましたがmodeline、ツリー内のほとんどのソースには、この情報がファイルに埋め込まれていません。

  • この投稿では、魔法のパターンを検索して識別するための可能なアプローチについて言及しています。高い成功率が得られる一貫した魔法のパターンは見つかりませんでした。

  • Linux ボックスでバイナリを使用して、fileどのような結果が得られるかを確認してみました。C/C++ ソースを適切に識別しているように見えますが、Makefile や Python スクリプト (ハッシュバンを持たない) でさえ失敗します。

良い点の 1 つは、比較される 2 つのファイルのうち、右側のファイルはローカル コピーからのものであり、拡張子付きの正しいファイル名を持っているため、右側のファイルに対して構文の強調表示が正しく有効になっていることです。

これを利用して、左側に表示されているファイルに同じ構文の強調表示を設定する方法はありますか?

この問題に対する別の解決策も歓迎します。

4

2 に答える 2

6

これは面白いパズルでした。:)

aug SmartDiffType
  au!
  au VimEnter * :if &diff && len(&ft) | call setwinvar(2/winnr(),'&ft',&ft) | elseif &diff | let &ft=getwinvar(2/winnr(),'&ft') | endif
aug END

ノート:

  • 上記の 4 行のうち、必要なのは1au VimEnter行だけですが、通常は、先頭にリセット ( au!) を付けて自動コマンド グループに自動コマンドを配置することをお勧めします。
  • VimEnterそうでない場合diff、またはウィンドウがまだ適切に初期化されていないため、自動コマンドがオンになっています
  • vimdiff分割の右側または左側にある古いファイルでトリガーされた可能性があるため、両方のケースを検討します。
  • 2/winnr()、1 と 2 の間で反転する数学のトリックです (2/2 = 1、2/1 = 2)
于 2013-03-12T22:30:09.857 に答える
3

2 つの分割のみを開いていて、左側の分割がローカル ファイルであると仮定すると、次のことができます。

:windo let &ft = getwinvar(1, '&ft')

これfiletypeにより、すべてのウィンドウの左上のウィンドウの値が設定されます。

詳細については、次を参照してください。

:h :windo
:h 'ft'
:h getwinvar(
于 2013-03-12T21:18:24.043 に答える