2017-12-12 1 views
0

예를 들어 자동으로 괄호/인용 부호, 파일 유형 특정 규칙 등을 포함하는 플러그인을 작성하고 예기치 않은 문제가 발생합니다. 처럼이 플러그인 규칙이 보인다 : 나는 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>입니다 :).

답변

1

feedkeys()은 대략 선행 버퍼에 키를 삽입하는 것입니다. 이 버퍼의 키는 과 같이 현재 명령/기능이 종료 된 경우에만 이후에 으로 소비됩니다. 즉, 키를 즉시 처리하도록하는 데 어려움을 겪고 있습니다. 그 기능은 그런 의미가 아닙니다 :-) 즉시 키를 제출하려면 :normal을 사용하십시오. 예, textlock에서는 작동하지 않습니다.

가 문제를 바탕으로, 나는 일을해야한다 (즉 를 매핑하지 않습니다)에 n 모드 feedkeys()를 사용하여 생각합니다. 키는 사용자 맵핑의 영향을받지 않으므로 정확한 (내장 된) 키를 이스케이프해야하는지 정확히 알 수 있습니다. 예를 들어 키를 대담하게해야하는 경우 'paste' 변경, 당신은뿐만 아니라 feedkeys() 내부 토글 명령을 넣어야 할 것 :

:call feedkeys(":set paste\<CR>\<Left>:set nopaste\<CR>") 
+0

예,이 작동합니다. 그러나 플러그인이 삽입 모드에서 작동하기 때문에'\ : paste \ '또는'\ = SomeFunction() \ '으로 설정해야합니다. 나에 관해서는, 커서가 한 문자 왼쪽으로 이동하게하는 삽입 모드를 떠나지 않기 때문에 마지막 것이 더 좋습니다.또한': set paste'를'feedkeys' 함수로 옮길 필요가 없으므로, 마지막 코드는 다음과 같습니다 : 'set paste' 'let output = printf ("% s \ = lexics # setNoPaste() \ ", rule.keys)' 'call feedkeys (출력,"n ")' – Evgeniy

+0

코드는 이미 작동하지만 'v : char' 변수가있는 트릭이 있다면 더 좋을 것입니다. 너 몇 가지 알아? 이전에 언급했지만 파서가 이것을 망쳤다. 'v : char'는'\ '키를 포함 할 수 있습니다 (올바른 방법으로 개행 문자가 삽입되었음을 의미합니다). – Evgeniy

관련 문제