Agregue automáticamente un cierre "o" al insertar uno, pero solo si el cursor no está dentro de una cadena

14

He definido asignaciones en mi vimrcpara ingresar automáticamente paréntesis y llaves cerca cuando ingreso las iniciales con inoremap ( ()<esc>i.

Me gustaría hacer lo mismo para "y ', pero solo cuando el cursor actualmente no está dentro de una cadena, ya que dentro de una cadena 'es probablemente un apóstrofe en lugar de un delimitador de cadena. ¿Cómo puedo hacer esto?

rlms
fuente

Respuestas:

5

Un enfoque podría ser utilizar syn*funciones. Algo como:

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('"')

La idea es aprovechar la sintaxis para el búfer en la posición del cursor. Quizás esto se pueda resolver mejor. Pero con suerte un comienzo.

Runium
fuente
¿Cuál es la razón detrás del nombre de la función Qtx?
Martin Tournoij
@Carpetsmoker: Quouotix termina eXitus.
Runium
2

Como se ha dicho, deberá verificar el contexto de sintaxis. La antigua API lh-brackets proporciona funciones para ese fin: Map*Context()funciones . Desde entonces, se han encapsulado las definiciones de corchetes en las :Bracketque se tendrá en cuenta el contexto (cadenas o comentarios).

Por defecto, las asignaciones de contexto se definen para todos los pares de paréntesis habituales como este:

  :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>{
Luc Hermitte
fuente