Ex 모드에서 실행 보통을 통해 프로그래밍 방식으로 정상 모드 명령을 수행 할 수 있습니다."정상 실행"후 삽입 모드에서 정상 모드로 돌아 가기
:execute "normal" "iNEWTEXT\<Esc>0"
이 모드 (i)를 삽입하도록 스위치 "를 newText"을 기록한다 (> < Esc 키 \) 정상 모드로 탈출, 행 (0)의 선두로 이동한다.
그러나 상수가 아닌 문자열 인 레지스터 또는 변수를 사용하면 동작이 달라집니다. 그런 다음 "zy$
를 통해 (여기서, Z) 어떤 레지스터에 텍스트를 복사하여 실행할 수 있습니다
iNEWTEXT\<Esc>0
예를 들어, 어떤 파일의 라인 (A vim 스크립트 파일 반드시)에 저장된 위에 같은 명령이 있다고 가정 등록 번호는 @z
입니다.
NEWTEXT\<Esc>0
삽입 모드를 입력 한 후 탈출이 더 이상 특수 문자로 취급하고, 대신에 문자 그대로있다 : 이번에는하지만, 출력은 다르지 않습니다. \ e와 같은 다른 형식은 작동하지 않습니다. 이 문제를 해결할 방법이 있습니까?
EDIT : Ingo의 대답을 사용하여 다음과 같은 기능을 만들었습니다. 기본적으로 파일의 텍스트 안에 일반/삽입 명령 세트가 포함되어 있고이를 실행할 수 있습니다. 더 일반적으로 비슷한 것이 running Ex commands from a line of text에 사용되었지만 일반 모드와 삽입 모드에서 정확히 똑같은 것을 찾지 못했습니다.
jy10j10jpO\<Esc>jEll
그 라인에, 당신은 함수 또는 다시 매핑을 호출 할 수 있고 명령이 예에서 (실행 것, 복사 :
그래서, 당신은 당신의 파일에 다음과 같은 텍스트가 줄 10 줄 붙여 넣기, 첫 번째 단어를지나 2 열 이동). Ingo의 대안은 심각한 사용법, 즉 .vimrc에 명령이 있거나 다른 파일에서 명령을 소싱하거나 파일 유형별 옵션을 사용하는 것이 좋습니다. 세션에 의해 저장된 매크로는 마찬가지로 잘 작동 할뿐 아니라 파일 전체에 명령을 분산시키는 것보다 더 실용적입니다. 필자의 경우, 여러 장치에 걸쳐 동기화하고 있었고 다른 특정 파일을 갖고 싶지 않거나이 특정 명령을 사용하여 vimrc를 복잡하게 만들지는 않았지만이 특정 파일 자체가 복잡하지는 않습니다. 이것을 휴대용 매크로처럼 생각하십시오.
" Execute current line as Vim normal mode commands.
nnoremap <A-y> :call EvaluateLineAsNormalModeCmd()<CR>
function! EvaluateLineAsNormalModeCmd()
let g:getCurrentLine = getline(".")
"have to :execute twice: once to get the contents of the
"register inserted into a double-quoted string, and then once for
"the :normal to evaluate the string.
execute 'execute "normal" "' . g:getCurrentLine . '"'
endfunction
EDIT2/3
: 여기에 기독교 Brabandt의 답변을 사용하여 두 함수입니다. 그들은 동일하게 작동하지만 끝에 삽입 모드로 사용자를 넣을 수 있습니다. (필자의 최소한의 정보를 기반로하면 다른 컨텍스트에서 'i'는 불완전한 명령으로 간주되어 실행되지 않으며 startinsert를 사용할 수 없습니다. 그 상황). PS : 당신이 정말이 (유스 케이스는 반신 반의) 필요하면 내가function! EvaluateLineAsNormalModeCmd()
normal! 0y$
execute ':call feedkeys("'[email protected]".'", "t")'
endfunction
function! EvaluateLineAsNormalModeCmd()
let g:getCurrentLine = getline(".")
execute ':call feedkeys("'.g:getCurrentLine.'", "t")'
endfunction
'\'시퀀스를'^ ['? (즉, '') –
시도해 보았지만 똑같은 문제가 있습니다. 모든 것이 문자 그대로 취해진 것입니다. Ingo의 double execute 함수는 이것을 해결합니다. – traycerb