Ajouter automatiquement une fermeture "ou 'lors de l'insertion, mais uniquement si le curseur n'est pas déjà dans une chaîne


14

J'ai défini des mappages dans my vimrcpour saisir automatiquement les parenthèses fermées et les accolades lorsque j'en saisis des d'ouverture avec inoremap ( ()<esc>i.

Je voudrais faire la même chose pour "et ', mais seulement lorsque le curseur n'est actuellement pas à l'intérieur d'une chaîne - car à l'intérieur d'une chaîne se 'trouve probablement une apostrophe plutôt qu'un délimiteur de chaîne. Comment puis-je faire ceci?

Réponses:


5

Une approche pourrait être d'utiliser des syn*fonctions. Quelque chose comme:

fun! Qtx(qt)
    let x = synIDattr(synIDtrans(synID(line("."), col("."), 1)), "name")
    if x != "String" && x != "Comment" && x != "Constant"
        return a:qt . a:qt
    endif
    return a:qt
endfun


inoremap <silent> <expr> ' Qtx("'")
inoremap <silent> <expr> " Qtx('"')

L'idée est de profiter de la syntaxe du tampon à la position du curseur. Cela peut peut-être être mieux résolu. Mais j'espère un début.


Quelle est la raison d'être du nom de la fonction Qtx?
Martin Tournoij

@Carpetsmoker: Quouotix met fin à eXitus.
Runium

2

Comme cela a été dit, vous devrez vérifier le contexte syntaxique. L'ancienne API lh-brackets fournit des fonctions à cet effet: des Map*Context()fonctions . Depuis lors, les définitions des crochets ont été encapsulées dans :Bracketlesquelles le contexte (chaînes ou commentaires) sera pris en considération.

Par défaut, les mappages sensibles au contexte sont définis pour toutes les paires de crochets habituelles comme ceci:

  :Brackets! ( )
  :Brackets! [ ] -visual=0
  :Brackets! [ ] -insert=0 -trigger=<leader>[

  :Brackets! " " -visual=0 -insert=1
  :Brackets! " " -visual=1 -insert=0 -trigger=""
  :Brackets! ' ' -visual=0 -insert=1 -but=function('lh#ft#is_text')
  :Brackets! ' ' -visual=1 -insert=0 -trigger=''

  :Brackets! < > -visual=1 -insert=0 -trigger=<localleader><

  :Brackets! { }
  :Brackets! { } -visual=1 -insert=0 -nl -trigger=<leader>{
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.