Adicionar automaticamente um fechamento "ou 'ao inserir um, mas apenas se o cursor não estiver dentro de uma sequência

14

Eu defini mapeamentos no meu vimrcpara inserir automaticamente parênteses e chaves quando digito os que estão abrindo inoremap ( ()<esc>i.

Eu gostaria de fazer o mesmo para "e ', mas apenas quando o cursor não está atualmente dentro de uma string - como dentro de uma string 'é provavelmente um apóstrofo, e não um delimitador de string. Como posso fazer isso?

rlms
fonte

Respostas:

5

Uma abordagem pode ser usar syn*funções. 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('"')

A idéia é aproveitar a sintaxe do buffer na posição do cursor. Talvez isso possa ser resolvido melhor. Mas espero que seja um começo.

Runium
fonte
Qual é a lógica por trás do nome da função Qtx?
Martin Tournoij
@Carpetsmoker: Quouotix encerra eXitus.
Runium 20/02
2

Como foi dito, você terá que verificar o contexto de sintaxe. A API lh-brackets antiga fornece funções para esse propósito: Map*Context()funções . Desde então, as definições de colchetes foram encapsuladas :Bracket, levando o contexto (seqüências de caracteres ou comentários) em consideração.

Por padrão, os mapeamentos com reconhecimento de contexto são definidos para todos os pares de colchetes comuns 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
fonte