Fügen Sie beim Einfügen automatisch ein schließendes "oder" hinzu, jedoch nur, wenn sich der Cursor noch nicht in einer Zeichenfolge befindet

14

Ich habe Mappings in meinem definiert vimrc, um beim Öffnen von Mappings mit Klammern und Klammern automatisch zu schließen inoremap ( ()<esc>i.

Ich möchte dasselbe für "und tun ', aber nur, wenn sich der Cursor derzeit nicht in einer Zeichenfolge befindet - da sich in einer Zeichenfolge 'wahrscheinlich eher ein Apostroph als ein Zeichenfolgentrennzeichen befindet. Wie kann ich das machen?

rlms
quelle

Antworten:

5

Ein Ansatz könnte darin bestehen, syn*Funktionen zu verwenden . Etwas wie:

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

Idee ist, die Syntax für den Puffer an der Cursorposition zu nutzen. Dies kann vielleicht besser gelöst werden. Aber hoffentlich ein Anfang.

Runium
quelle
Was ist das Grundprinzip hinter dem Funktionsnamen Qtx?
Martin Tournoij
@Carpetsmoker: Quouotix beendet eXitus.
Runium
2

Wie gesagt, müssen Sie den Syntax-Kontext überprüfen. Die alte lh-brackets- API bietet Funktionen für diesen Zweck: Map*Context()Funktionen . Seitdem wurden die Klammerdefinitionen gekapselt, in :Bracketdenen der Kontext (Zeichenfolgen oder Kommentare) berücksichtigt wird.

Standardmäßig sind kontextsensitive Zuordnungen für alle gängigen Klammerpaare wie folgt definiert:

  :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
quelle