web-dev-qa-db-fra.com

Vim exécute autocmd sur tous les types de fichiers SAUF

J'ai un autocmd Vim qui supprime les espaces de fin dans les fichiers avant l'écriture. Je veux cela presque 100% du temps, mais il y a quelques types de fichiers que je voudrais désactiver. La sagesse conventionnelle consiste à répertorier les types de fichiers avec lesquels vous souhaitez qu'un autocmd s'exécute dans une liste séparée par des virgules, par exemple:

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

Mais dans ce cas, ce serait coûteux.

Existe-t-il un moyen de faire correspondre un modèle autocmd avec tous les fichiers SAUF ceux correspondant au modèle? Je ne trouve pas l'équivalent d'un NOT matcher dans la documentation.

73
jerodsanto

*.rb n'est pas un type de fichier. C'est un modèle de fichier. Ruby est le type de fichier et pourrait même être défini sur des fichiers qui n'ont pas de .rb extension. Donc, ce que vous voulez le plus probablement, c'est une fonction que votre autocmd appelle à la fois pour rechercher les types de fichiers qui ne devraient pas être appliqués et pour supprimer les espaces.

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

autocmd BufWritePre * call StripTrailingWhitespace()

En vous basant sur la réponse d'Evan, vous pouvez rechercher une variable tampon locale et déterminer si vous souhaitez effectuer la bande à l'aide de cela. Cela vous permettrait également de procéder à une désactivation unique si vous décidiez de ne pas supprimer un tampon qui est un type de fichier que vous supprimeriez normalement.

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
57
jamessan

Un autre choix d'une voie en ligne:

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

Ensuite, vous pouvez faire quelque chose que vous aimez pour tous les types de fichiers, sauf ceux de la liste noire.

51
wedgwood

Le moyen le plus simple serait de définir une variable locale pour le seul type de fichier sur true. Ensuite, définissez la commande automatique si cette variable est fausse (si elle est définie pour tout le reste) ou si elle existe (pas besoin de la prédéfinir).

autocmd BufWritePre *.foo let b:foo=true

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

modification des préfixes de variables en fonction du commentaire

12
evan

Cela fonctionne pour les commandes automatiques Syntax, où le modèle (<match>) n'est que le type de fichier. Il exclut tous les fichiers rst:

au Syntax *\(^rst\)\@<! …
0
blueyed