Wie definiere ich einen automatischen Befehl für alle Dateien mit Ausnahme eines bestimmten Dateityps?


8

Zum Beispiel habe ich die folgende autocommandDefinition:

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

Ich möchte etwas definieren, das *.texDateien ausschließt :

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

Wie lautet die Syntax dafür? Ich bin nicht sicher, mit welchen Schlüsselwörtern die Hilfedokumente durchsucht werden sollen.

Antworten:


8

Im gleichen Sinne wie die Antwort von @Sundar, aber mit einer etwas flexibleren Syntax können Sie Folgendes tun:

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

Ich bevorzuge diese Syntax, weil:

  • Sie können ganz einfach neue Filtetypen hinzufügen, wenn Sie möchten.
  • Die Bedingungslänge bleibt gleich, unabhängig davon, wie viele Dateitypen Sie überprüfen.

Ordentlich ! Wo haben Sie festgestellt, dass Sie eine Bedingung / Funktion innerhalb des Autobefehls ausführen können?
nobe4

2
Nun, es ist das gleiche Prinzip wie bei der @ Sundar-Antwort, außer dass die Bedingung nicht den Wert einer Variablen, sondern den Rückgabewert einer Funktion betrifft.
Statox

3

Wie wäre es mit:

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

besser formatiert als

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

Dies hängt davon ab, filetypewie es von Vim erkannt oder eingestellt wurde, und hat daher keine Probleme mit der Groß- und Kleinschreibung. (Möglicherweise möchten Sie überprüfen, als was Ihre Tex-Dateien erkannt werden, indem Sie set filetype?in der Befehlszeile von Vim ausgeführt werden.)


1

Ich habe nichts gefunden, was zu unterstützen scheint, was Sie wollen, aber Sie können das gleiche mit ein wenig Skripten tun:

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

Referenz : :h expand()


1
Möglicherweise möchten Sie !=#anstelle von !=UNIX und !=?Windows verwenden. Ansonsten hängt das Ergebnis vom Wert von ab ignorecase.
Sato Katsura

Könnten Sie mich auf eine Erklärung des Unterschieds zwischen !=#und hinweisen !=?? Denn :h expr4darauf wird Windows / Unix nicht erwähnt.
nobe4

1
UNIX-Dateinamen unterscheiden (normalerweise) zwischen Groß- und Kleinschreibung, Windows-Dateinamen nicht zwischen Groß- und Kleinschreibung.
Sato Katsura

0

Dies funktioniert für automatische Befehle Syntax, bei denen das Muster ( <match>) nur der Dateityp ist. Es schließt alle rstDateien aus:

au Syntax *\(^rst\)\@<! …
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.