Automatycznie dodaj znak zamykający ”lub” podczas wstawiania, ale tylko wtedy, gdy kursor nie znajduje się już w ciągu

14

Zdefiniowałem w sobie mapowania, vimrcaby automatycznie wprowadzać zamknięte nawiasy i nawiasy klamrowe, gdy wprowadzam otwierające za pomocą inoremap ( ()<esc>i.

Chciałbym zrobić to samo dla "i ', ale tylko wtedy, gdy kursor nie znajduje się obecnie wewnątrz łańcucha - ponieważ wewnątrz łańcucha 'jest prawdopodobnie apostrof, a nie ogranicznik łańcucha. W jaki sposób mogę to zrobić?

rlms
źródło

Odpowiedzi:

5

Jednym z podejść może być użycie syn*funkcji. Coś jak:

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

Chodzi o to, aby skorzystać ze składni bufora w pozycji kursora. Być może można to rozwiązać lepiej. Ale mam nadzieję, że początek.

Runium
źródło
Jakie jest uzasadnienie nazwy funkcji Qtx?
Martin Tournoij
@Carpetsmoker: Quouotix Terminates eXitus.
Runium
2

Jak już powiedziano, będziesz musiał sprawdzić kontekst składni. Stare API lh-brackets udostępnia funkcje w tym celu: Map*Context()funkcje . Od tego czasu definicje w nawiasach zostały zamknięte, w :Bracketktórych uwzględni się kontekst (ciągi lub komentarze).

Domyślnie mapowania uwzględniające kontekst są zdefiniowane dla wszystkich zwykłych par nawiasów, takich jak to:

  :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
źródło