12 Vim 기본 - undo(되돌리기), redo(재실행)

반응형

Vim 에서 되돌리기(undo)와 재실행(redo)

Vim 에서는 '되돌리기' 동작을 Normal Mode 의 `u` 키로 수행할 수 있다. `u`를 입력하는 순간 직전에 수행했던 명령들이 되돌려진다. 다음 스크린샷은 되돌리기 및 재실행 동작이 어떻게 수행되는지를 보여준다. 

먼저 숫자 100을 200으로 바꾼 뒤, `+=` 연산자를 `-=` 으로 변경하고, sum 변수명을 total 로 변경하는 과정을 진행한 뒤, 되돌리기(`u`)와 재실행(`ctrl + r`)을 수행한 장면이다.

Vim 에서의 되돌리기(u)와 재실행(ctrl + r)

Vim 되돌리기와 명령블록

Vim 에서 되돌리기를 할 때에는 '명령 블록' 단위로 되돌리기가 수행된다는 점이 중요하다. 우리가 일반 에디터에서 Ctrl + z 로 되돌리기를 하던 것과는 그 느낌이 다르다. 이 명령블록을 이해하지 않고 Vim 을 사용하다보면, 의도치 않는 부분까지 되돌아가버리는 상황들을 자주 맞닥뜨리게 될 것이다. 다음은 명령블록을 잘못 이해한 예시이다. java의 main 함수를 작성한다고 가정했다.

insert 모드 진입 후 쉬지 않고 타이핑을 했다. i -> 문자열 타이핑 -> esc

자 이제, Normal Mode 에서 `u` 를 눌러보도록 한다.

입력했던 '모든 내용'이 되돌려져버린다.

여기서 우리가 확인할 수 있는 사실은 다음과 같다. 

 

Vim 에서 Insert 모드에 진입하여 문자열을 타이핑하고, Esc 를 눌러 나오는 순간까지가 하나의 '명령블록'이 된다. Vim 에서는 이 명령블록 단위로 작업 내역을 기록하고 있기 때문에 이 점을 잘 이해하고 활용해야한다.

'Practical Vim' 도서에서는 이를 설명하면서, '적절한 단위로 명령블록을 끊기'를 권장하고 있다. 이 방법은 적어도 우리가 코드를 입력할 때, 마치 버전관리를 할 때 '커밋'하듯이 블록단위를 생각하면서 적절히 빠져나와야 함을 의미한다. 가령 코드 한 줄을 적고 나면 Normal Mode 로 빠져나온 뒤 `o` 명령어로 다음줄 입력을 이어가는 식으로 말이다. 

[심화] 명령블록 생성을 위한 Insert Mode 임시 탈출

insert mode 에서는 ctrl 키와 조합하여 몇가지 기능들을 활용할 수 있다. 그 중 맨 처음 소개하게 되는 것이 `ctrl + o` 기능이다. 이 기능은 insert mode 에서의 명령임에 유의하자. insert mode 에서 타이핑 도중 `ctrl + o` 를 입력하게 되면 잠시 normal mode 로 빠져나오게 된다. 이 상태에서는 '모션'과 일부 '노멀모드 명령'을 입력받을 수 있는 상태가 되는데, 모션을 입력하게 되면 그 위치로 이동 후 바로 insert mode 로 재진입하게 되고, 명령을 입력하게 되면 그 명령을 수행함과 동시에 insert mode 로 진입하게 된다. 즉, esc 를 통해 빠져나갔다가 다시 insert 모드로 진입하는 명령을 수행하지 않고 바로 insert mode 로 재진입시켜주는 것이다.

 

굳이 이런 이유를 만들어놓은 이유는 바로 '명령 블록' 때문인데, insert mode 에서 타이핑을 하다가, 잠시 끊고 가야겠다 싶을 때 `ctrl + o` 기능을 활용하여 '명령 블록'을 구분할 수 있다. 다음 스크린샷은 insert mode 에서 타이핑 도중 `ctrl + o` 로 '임시 탈출' 후 모션(`^`, `$`)을 이용해 특정 위치로 커서를 이동시켜 바로 타이핑을 재개하는 모습을 보여준다. `ctrl + o` 로 탈출시마다 명령블록이 구분되어, `u` 명령어를 수행할 때마다 우리가 구분한 블록만큼 되돌려지는 모습을 확인할 수 있다.

ctrl + o 명령어로 insert mode 임시탈출하기, 임시탈출할 때마다 명령블록이 생성됐고, u 로 되돌릴 때 해당 블록만큼 되돌려진다.


이렇게 Vim 에서 제공하는 '기본 조작' 기능을 총 12개의 포스팅을 통해서 알아보았다. 지금까지 알아본 기능들만 잘 조합하여 익혀놓는 것만으로도 더욱 즐거운 코딩이 가능할 것이라고 기대해본다. 다음 테마는 'Vim Cheat Sheet' 를 살펴보면서 그동안 포스팅했던 Vim 의 기본 기능들을 정리하고, 미처 소개하지 못한 기능들을 훑어보고자 한다. 그 이후에는 Vim 의 심화편이라고 할 수 있는 매크로(macro), 창(window) 제어 - 보통 IDE 플러그인에서도 지원하는 - 등의 기능들을 알아볼 것이다. 

반응형

Designed by JB FACTORY