特定のファイルタイプを除くすべてのファイルで機能するようにオートコマンドを定義するにはどうすればよいですか?


8

たとえば、次のautocommand定義があります。

augroup cursorline
    autocmd!
    autocmd WinLeave,BufLeave * set nocursorline
    autocmd WinEnter,BufEnter * set cursorline
augroup end

*.texファイルを除外するものを定義したい:

autocmd WinEnter,BufEnter * "except *.tex" set cursorline

そのための構文は何ですか?ヘルプドキュメントを検索するためのキーワードがわかりません。

回答:


8

@Sundarの回答と同じ精神で、少し柔軟な構文を使用して次のことができます。

let ftToIgnore = ['latex', 'plaintex']
autocmd BufWritePre * if index(ftToIgnore, &ft) < 0 | set your options

私はこの構文を好む傾向があります:

  • 必要に応じて、新しいfiltetypeを簡単に追加できます。
  • チェックするファイルタイプの数に関係なく、条件の長さは変わりません。

きちんと!自動コマンド内で条件/関数を実行できることをどこで見つけましたか?
nobe4

2
条件が変数の値ではなく関数の戻り値にあることを除いて、@ sundarの回答と同じ原則です。
statox

3

どうですか:

autocmd WinEnter,BufEnter * if &filetype != "latex" && &filetype != "plaintex" | set cursorline | endif

より良いフォーマット

autocmd WinEnter,BufEnter * if &filetype != "latex" && &filetype != "plaintex" 
                            \ | set cursorline 
                            \ | endif

これはfiletypeVimによって検出または設定されたに依存するため、大文字と小文字の区別に関する問題はありません。(set filetype?Vimのコマンドラインで実行して、texファイルが何として検出されているかを確認したい場合があります)。


1

私はあなたが望むものをサポートしているように見えるものは何も見つかりませんでしたが、少しのスクリプトでまったく同じことができます:

function! s:ToggleCursorLine(open) abort
  let l:extension = expand('%:e')
  if l:extension !=? 'tex'
    if a:open
      set cursorline
    else
      set nocursorline
    endif
  endif
endfunction

augroup cursorline
  autocmd!
  autocmd WinLeave,BufLeave * call s:ToggleCursorLine(1)
  autocmd WinEnter,BufEnter * call s:ToggleCursorLine(0)
augroup end

参照 : :h expand()


1
UNIXやWindows !=#ではなく使用したい!=場合があり!=?ます。それ以外の場合、結果はの値によって異なりますignorecase
佐藤桂

との違いを説明!=#して!=?ください。上なので:h expr4、それは、Windows / Unixのは言及していません。
nobe4

1
UNIXのファイル名では(通常)大文字と小文字が区別され、Windowsのファイル名では大文字と小文字が区別されません。
佐藤桂

0

これSyntaxは、パターン(<match>)が単なるファイルタイプであるオートコマンドに対して機能します。それはすべてのrstファイルを除外します:

au Syntax *\(^rst\)\@<! …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.