커서를 삽입 할 때 닫는 "또는 '를 자동으로 추가하지만 커서가 이미 문자열 안에없는 경우에만


14

vimrc으로 여는 괄호와 괄호를 자동으로 입력하도록 매핑을 정의 했습니다 inoremap ( ()<esc>i.

"and에 대해 동일한 작업을 수행하고 싶지만 '커서가 현재 문자열 안에없는 경우에만-문자열 내부 '는 문자열 구분 기호가 아닌 아포스트로피 일 수 있습니다. 어떻게해야합니까?

답변:


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?
Martin Tournoij

@Carpetsmoker : Quouotix는 eXitus를 종료합니다.
Runium

2

이미 말했듯이 구문 컨텍스트를 확인해야합니다. 이전 lh-brackets API는 해당 목적을위한 함수를 제공 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>{
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.