Execute Normal!
지금까지 우리는 vimscript에서 자주 쓰이는 execute
와 normal!
명령어에 대해서 알아보았다. 다음 명령어를 실행해보자.
:execute "normal! gg/foo\<cr>dd"
foo
를 찾아서 해당 라인을 지워줄 것이다.
이전 장에서는 normal!
명령어를 사용해보았지만 special character를 인식하지 못해 작동이 안 되었다. execute
와 normal!
명령어를 합치는 것으로 이 문제를 해결할 수 있다.
:normal! /foo<cr>
명령어를 실행해도 검색이 안 되는 것을 볼 수 있다.
execute
는 명령어를 프로그래밍적으로(?) 빌드해 주기 때문에 필요한 escape 문법을 사용할 수 있다.
다음 명령어를 실행해보자.
:execute "normal! mqA;\<esc>`q"
해당 라인의 마지막에 세미콜론(;
)을 추가하고 다시 원래 자리로 커서를 이동해준다. 각각의 명령어의 역할을 분해해보자.
:execute "normal! ..."
: normal mode로 작성한 명령어를 실행시켜준다. (모든 매핑을 무시하고, escape 문법이 적용된다)mq
: 현재 커서의 위치를q
mark에 저장한다.A
: 해당 줄의 마지막 위치로 이동하여 insert mode에 진입한다.;
: insert mode에서 세미콜론을 입력한다.\<esc>
: 다시 normal mode로 돌아간다.- ``q`: "q" 마크에 지정해 두었던 위치로 돌아간다.
처음에는 조금 무서워 보이지만 상당히 유용하게 쓰일 수 있는 명령어이다.
비슷한 응용으로 python에서 주석을 달고 다시 원래 위치로 돌아오는 명령어를 작성해보았다. 기존에는
:norm I#
을 사용하였는데 아래 명령어 사용하면 커서 위치가 이동되지 않는 장점이 있겠다. (다시 제거하는것도 같은 키로 등록하는 것은 조금 더 까다로울 것 같다)
:execute "normal! mqI# \<esc>`q"
:nnoremap <leader>/ mqI# <esc>`q
Exercise
- Read :help expr-quote again (you've seen it before) to remind yourself how to use string escapes to pass special characters to normal! with execute.
\b backspace <BS>
\e escape <Esc>
\f formfeed <FF>
\n newline <NL>
\r return <CR>
\t tab <Tab>
\\ backslash
\" double quote
\<esc>
를 \e
로 사용 가능하다.
:execute "normal! mqI# \e`q"
- Put down this book for a while before you go on to the next chapter. Get a sandwich or a cup of coffee, feed your pets if you have them, and relax for a bit before continuing.
'tools > vim' 카테고리의 다른 글
Learn Vimscript The Hard Way - 32. Case Study: Grep Operator, Part One - 1/2 (0) | 2020.04.09 |
---|---|
Learn The Vimscript The Hard Way - 31. Basic Regular Expressions (0) | 2020.04.08 |
Learn Vimscript The Hard Way - 29. Normal (0) | 2020.04.06 |
Learn Vimscript The Hard Way - 28. Execute (0) | 2020.04.05 |
Learn Vimscript The Hardway - 27: String Functions (0) | 2020.04.04 |