tools/vim

Learn Vimscript The Hard Way - 30. Execute Normal!

seul chan 2020. 4. 7. 22:56

Execute Normal!

지금까지 우리는 vimscript에서 자주 쓰이는 executenormal! 명령어에 대해서 알아보았다. 다음 명령어를 실행해보자.

:execute "normal! gg/foo\<cr>dd"

foo를 찾아서 해당 라인을 지워줄 것이다.

이전 장에서는 normal! 명령어를 사용해보았지만 special character를 인식하지 못해 작동이 안 되었다. executenormal! 명령어를 합치는 것으로 이 문제를 해결할 수 있다.

: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.