29

いくつかのbashスクリプトファイルをvimで開くと、ファイルとして識別されることがあります。これは問題ありません。ファイルタイプをでconfに設定することで修正できます。sh:setf sh

これで問題が完全に修正されるわけではないことに気付いた場合を除いて、これはすばらしいことです。

異なる強調表示で並んだ2つのファイル

shopt左側では正しく強調表示されていますが、右側では強調表示されていないことに注意してください。手動でファイルタイプをに設定しましたsh

これは、ファイルがvimとして、bashまたはshvimによって識別されると、ファイルタイプをに設定しshますが、ファイルタイプを手動で設定した場合には実行していない追加の手順を実行することを意味します。

誰かがそれが何であるか、そして私がそれをどのように修正できるか知っていますか?

4

4 に答える 4

33

vimはすでにデフォルトで多くのファイルタイプを認識しています。それらのほとんどはファイル拡張子で動作しますが、このような場合、vimはファイルの内容を分析して正しいタイプを推測します。

.bashrcvimは、、などの特定のファイル名のファイルタイプを.tcshrc自動的に設定します。ただし、.sh拡張子が付いたファイルは、csh、ksh、またはbashスクリプトとして認識されます。これが正確にどのような種類のスクリプトであるかを判断するために、vimはファイルの最初の行を読み取って#!ライン。

最初の行に単語が含まれている場合bash、ファイルはbashスクリプトとして識別されます。通常#!/bin/bash、スクリプトが直接実行されることを意図しているかどうかを確認します。他のシェル構成ファイルの場合は、ファイル拡張子を使用する必要があります.bash

vimのヘルプでは、これについても説明しています:help ft-bash-syntaxlet g:is_bash=1.vimrcで使用して、。を含むすべてのファイルのデフォルトを強調表示するbash構文を作成することもできますfiletype=sh。詳細を確認したい場合は、に実装されてい$VIMRUNTIME/filetype.vimます。

于 2011-09-16T23:37:46.327 に答える
7

KornBashshsyntax/sh.vimの特定の強調表示が含まれていることがわかりました。使用しているものを指定するだけで、これは、、およびでそれぞれ実行されます。b:is_kornshellb:is_bashb:is_sh

状況に応じて、次のものを使用すると思います。

ftdetect / bash.vim:

au BufRead,BufNewFile *bash* let g:is_bash=1
au BufRead,BufNewFile *bash* setf sh

モデリン:

# vim:let g:is_bash=1:set filetype=sh:

キーマッピング

nmap <silent> <leader>b :let g:is_bash=1<cr> :setf sh<cr> 
于 2011-09-16T22:12:27.123 に答える
4

Peter Coultonのソリューションと同様に、「filetype」Vimヘルプの「new-filetype」セクションに記載されている代替案と同様に、~/.vim/filetype.vimファイルに次のコードを含めることができます。

if exists("did_load_filetypes")
  finish
endif

augroup filetypedetect
  au! BufRead,BufNewFile *bash* let b:is_bash = 1 | setfiletype sh
augroup END

このアプローチには、次の意味があります。

  1. ~/.vim/filetype.vimディレクトリの下のファイルタイプごとに1つではなく、1つのファイルがあります~/.vim/ftdetect
  2. 変数は、b:is_bashを参照することにより、グローバルではなくローカルに設定されg:is_bashます。
于 2012-11-18T22:25:24.173 に答える
3

効果的な構文設定を表示してみてください

:windo echo b:current_syntax

(最初のウィンドウが言うことを期待しbash、2番目のウィンドウが言うことを期待していますsh...?)

また、synatx同期をいじってみてください。

:windo syn sync fromstart
:windo syn sync minlines=300

一般に

:he syn-sync

詳細については


PS。

ロングショットですが、他のいくつかのハイライトが干渉している可能性があります。

:windo se @/=''
:match none
:2match none
:3match none
于 2011-09-16T21:29:21.577 に答える