Aggiungi automaticamente una chiusura "o" quando ne inserisci una, ma solo se il cursore non si trova già all'interno di una stringa


14

Ho definito i mapping nel mio vimrcper inserire automaticamente parentesi chiuse e parentesi graffe quando inserisco quelli di apertura con inoremap ( ()<esc>i.

Vorrei fare lo stesso per "e ', ma solo quando il cursore non è attualmente all'interno di una stringa, poiché all'interno di una stringa 'è probabilmente un apostrofo anziché un delimitatore di stringa. Come posso fare questo?

Risposte:


5

Un approccio potrebbe essere quello di utilizzare le syn*funzioni. Qualcosa di simile a:

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'idea è di sfruttare la sintassi per il buffer nella posizione del cursore. Questo può forse essere risolto meglio. Ma spero che un inizio.


Qual è la logica dietro il nome della funzione Qtx?
Martin Tournoij,

@Carpetsmoker: Quouotix termina eXitus.
Runium,

2

Come è stato detto, dovrai controllare il contesto di sintassi. La vecchia API parentesi graffe sinistra fornisce funzioni a tale scopo: Map*Context()funzioni . Da allora le definizioni delle parentesi sono state incapsulate in :Bracketcui si terrà conto del contesto (stringhe o commenti).

Per impostazione predefinita, i mapping consapevoli del contesto sono definiti per tutte le solite coppie di parentesi come questa:

  :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>{
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.