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?

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.


¿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>{
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.