Автоматически добавлять закрывающее "или" при вставке, но только если курсор уже не находится внутри строки

14

Я определил в себе сопоставления vimrcдля автоматического ввода закрывающих скобок и фигурных скобок при вводе открывающих скобок с помощью inoremap ( ()<esc>i.

Я хотел бы сделать то же самое для "и ', но только когда курсор в данный момент находится не внутри строки - так как внутри строки ', вероятно, апостроф, а не разделитель строк. Как я могу это сделать?

РМЭЗ
источник

Ответы:

5

Одним из подходов может быть использование syn*функций. Что-то вроде:

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

Идея состоит в том, чтобы воспользоваться синтаксисом для буфера в позиции курсора. Возможно, это можно решить лучше. Но надеюсь начало.

Runium
источник
Какой смысл в названии функции Qtx?
Мартин Турной
@Carpetsmoker: Quouotix прекращает eXitus.
Runium
2

Как уже было сказано, вам придется проверить синтаксис-контекст. Старый API lh-brackets предоставляет функции для этой цели: Map*Context()функции . С тех пор были заключены в скобки определения, в :Bracketкоторых будет учитываться контекст (строки или комментарии).

По умолчанию контекстно-зависимые отображения определены для всех обычных пар скобок, например:

  :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>{
Люк Эрмитт
источник