Автоматично додайте закриття "або", коли вставляєте його, але тільки якщо курсор вже не знаходиться в рядку


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

Ідея полягає в тому, щоб скористатися синтаксисом буфера в позиції курсору. Це, можливо, можна вирішити краще. Але, сподіваємось, початок.


Що обґрунтовує назву функції Qtx?
Мартін Турной

@Carpetsmoker: Quouotix припиняє eXitus.
Руніум

2

Як було сказано, вам доведеться перевірити синтаксис-контекст. Старий API lh-дужок забезпечує функції для цього: 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>{
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.