Vim run autocmd für alle Dateitypen AUSSER

81

Ich habe ein Vim-Autocmd, das nachgestellte Leerzeichen in Dateien vor dem Schreiben entfernt. Ich möchte dies fast 100% der Zeit, aber es gibt einige Dateitypen, die ich deaktivieren möchte. Herkömmliche Weisheit besteht darin, die Dateitypen, gegen die ein Autocmd ausgeführt werden soll, in einer durch Kommas getrennten Liste aufzulisten, z.

autocmd BufWritePre *.rb, *.js, *.pl

Aber in diesem Fall wäre das lästig.

Gibt es eine Möglichkeit, ein Autocmd-Muster mit allen Dateien abzugleichen, mit Ausnahme derjenigen, die mit dem Muster übereinstimmen? Ich kann in den Dokumenten kein Äquivalent zu einem NICHT-Matcher finden.

Jerodsanto
quelle

Antworten:

66

*.rbist kein Dateityp. Es ist ein Dateimuster. rubyist der Dateityp und kann sogar für Dateien festgelegt werden, die keine .rbErweiterung haben. Was Sie also höchstwahrscheinlich wollen, ist eine Funktion, die Ihr Autocmd aufruft, um nach Dateitypen zu suchen, auf die nicht reagiert werden soll, und um das Leerzeichen zu entfernen.

fun! StripTrailingWhitespace()
    " Don't strip on these filetypes
    if &ft =~ 'ruby\|javascript\|perl'
        return
    endif
    %s/\s\+$//e
endfun

autocmd BufWritePre * call StripTrailingWhitespace()

Aufbauend auf Evans Antwort könnten Sie nach einer pufferlokalen Variablen suchen und bestimmen, ob der Strip damit ausgeführt werden soll. Auf diese Weise können Sie auch eine einmalige Deaktivierung durchführen, wenn Sie entschieden haben, dass Sie keinen Puffer entfernen möchten, der ein Dateityp ist, den Sie normalerweise entfernen würden.

fun! StripTrailingWhitespace()
    " Only strip if the b:noStripeWhitespace variable isn't set
    if exists('b:noStripWhitespace')
        return
    endif
    %s/\s\+$//e
endfun

autocmd BufWritePre * call StripTrailingWhitespace()
autocmd FileType ruby,javascript,perl let b:noStripWhitespace=1
Jamessan
quelle
1
Richtig, ich hatte auf ein Muster gehofft, das bestimmte Dateierweiterungen ausschließt und die Begriffe in meiner Beschreibung definitiv missbraucht. Während ich auf einen Einzeiler gehofft habe, ist es nicht allzu schäbig, die Logik in eine Funktion zu packen und sie aufzurufen. Vielen Dank!
Jerodsanto
Wenn Sie Ihre vim-Konfiguration modularer gestalten möchten, können Sie die Einstellung let b:noStripWhitespacezu den Dateien im Abschnitt Dateityp-Plugin hinzufügen. Fx, um das Entfernen von nachgestellten Leerzeichen für Git-Commits zu deaktivieren, fügen Sie die Zeile zu hinzu ~/.vim/ftplugin/gitcommit.vim.
Flyingdutchman
58

Eine andere Wahl für einen Linienweg:

let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like

Dann können Sie für alle Dateitypen außer denen auf der schwarzen Liste etwas tun, das Ihnen gefällt.

Wedgwood
quelle
15

Am einfachsten wäre es, eine lokale Variable für den einen Dateityp auf true zu setzen. Setzen Sie dann den Befehl autom, wenn diese Variable falsch ist (wenn sie für alles andere festgelegt ist) oder wenn sie überhaupt existiert (keine Voreinstellung erforderlich).

autocmd BufWritePre *.foo let b:foo=true

if !exists("b:foo")
    autocmd ...
endif

Variable Präfixe basierend auf Kommentar geändert

evan
quelle
1

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\)\@<! …
blau gefärbt
quelle
1

Unsere .vimrc-Konfigurationsdatei wird beim Start nur einmal ausgeführt. Wenn Sie zu diesem Zeitpunkt einen if-Test durchführen, funktioniert dies nicht, da derzeit keine Python-Datei bearbeitet wird.

Sie können jedoch .vimrc verwenden, um ein automatisches Verhalten einzurichten: etwas, das vim jedes Mal tut, wenn es auf eine spezielle Bedingung stößt. Die Bedingung kann in Ihrem Fall sein: "Eine neue Datei wird gerade bearbeitet und ihr Dateityp ist 'Python'." Siehe: h: au

Xinyu Yang
quelle