예를 들어 자동으로 괄호/인용 부호, 파일 유형 특정 규칙 등을 포함하는 플러그인을 작성하고 예기치 않은 문제가 발생합니다. 처럼이 플러그인 규칙이 보인다 : 나는 InsertCharPre 누른 것을 키 감지 할 수 이벤트를 수신하고 있기 때문에급지 버튼으로 문자를 즉시 붙여 넣기
{"key": "'", "pattern": '...', "keys": "'\<Left>"}
직접 setline
를 사용하여 편집 버퍼에 몇 가지 제한이있다, 예를 들어 (: 도움말 textlock) . 따라서 v:char
변수를 변경하거나 feedkeys
대신에 전화해야합니다. v:char
의 문제점은 "\", "\"및 플러그인에서 자주 사용되는 ("\"이 올바르게 처리되는 것처럼 보이는) 특수 키 (이스케이프 된 시퀀스 만 삽입 함)로 작동 할 수 없다는 것입니다. 그래서 내 유일한 옵션은 feedkeys이지만, keys
(위 참조)에 key
이 있으면, vim은 재귀를 시작합니다. 나는 <C-v>
삽입 모드 매핑에 대해 알고 있지만 새로운 규칙을 더 복잡하게 만드는 많은 열쇠가있을 수 있습니다. 다른 옵션이 없다면 최선의 결정은 set paste
옵션을 사용하는 것이지만 주제가 문제가 있음을 나타냅니다.
...
set paste
call feedkeys("'\<Left>")
set nopaste
...
이 함수의 온 몸이 먼저 실행되고 paste
이미 nopaste
때 다음 문자가 순간에 버퍼에 삽입 것으로 보인다. feedkeys
의 추가 읽기가 성공적이지 않았습니다 (다른 모드를 시도했습니다). 당신은 내가 무슨 말을하고 무엇을보고이 간단한 코드를 시도 할 수 있습니다 :
function! s:Foo()
startinsert
call feedkeys("ff")
stopinsert
endfunction
nnoremap <silent><CR> :call <SID>Foo()<CR>
버퍼 가를 Enter 키를 눌러하지만 stopinsert
명령을 언급하는 경우 예상대로 모든 것이 진행 한 후 텍스트를 포함 할 수 없습니다.
Ps : 약 lexima 플러그인을 알고 있지만 사용하고 싶지 않습니다. 나는 lexima의 소스 코드를 탐구하는 문제를 해결하려했지만, 사용하지 않으려는 것이 inoremap <expr>
입니다 :).
예,이 작동합니다. 그러나 플러그인이 삽입 모드에서 작동하기 때문에'\ : paste \ '또는'\ = SomeFunction() \ '으로 설정해야합니다. 나에 관해서는, 커서가 한 문자 왼쪽으로 이동하게하는 삽입 모드를 떠나지 않기 때문에 마지막 것이 더 좋습니다.또한': set paste'를'feedkeys' 함수로 옮길 필요가 없으므로, 마지막 코드는 다음과 같습니다 : 'set paste' 'let output = printf ("% s \ = lexics # setNoPaste() \ ", rule.keys)' 'call feedkeys (출력,"n ")' –
Evgeniy
코드는 이미 작동하지만 'v : char' 변수가있는 트릭이 있다면 더 좋을 것입니다. 너 몇 가지 알아? 이전에 언급했지만 파서가 이것을 망쳤다. 'v : char'는'\'키를 포함 할 수 있습니다 (올바른 방법으로 개행 문자가 삽입되었음을 의미합니다). –
Evgeniy