12 Vim 기본 - undo(되돌리기), redo(재실행)
- vim
- 2021. 12. 5.
Vim 에서 되돌리기(undo)와 재실행(redo)
Vim 에서는 '되돌리기' 동작을 Normal Mode 의 `u` 키로 수행할 수 있다. `u`를 입력하는 순간 직전에 수행했던 명령들이 되돌려진다. 다음 스크린샷은 되돌리기 및 재실행 동작이 어떻게 수행되는지를 보여준다.
먼저 숫자 100을 200으로 바꾼 뒤, `+=` 연산자를 `-=` 으로 변경하고, sum 변수명을 total 로 변경하는 과정을 진행한 뒤, 되돌리기(`u`)와 재실행(`ctrl + r`)을 수행한 장면이다.
Vim 되돌리기와 명령블록
Vim 에서 되돌리기를 할 때에는 '명령 블록' 단위로 되돌리기가 수행된다는 점이 중요하다. 우리가 일반 에디터에서 Ctrl + z 로 되돌리기를 하던 것과는 그 느낌이 다르다. 이 명령블록을 이해하지 않고 Vim 을 사용하다보면, 의도치 않는 부분까지 되돌아가버리는 상황들을 자주 맞닥뜨리게 될 것이다. 다음은 명령블록을 잘못 이해한 예시이다. java의 main 함수를 작성한다고 가정했다.
자 이제, Normal Mode 에서 `u` 를 눌러보도록 한다.
여기서 우리가 확인할 수 있는 사실은 다음과 같다.
Vim 에서 Insert 모드에 진입하여 문자열을 타이핑하고, Esc 를 눌러 나오는 순간까지가 하나의 '명령블록'이 된다. Vim 에서는 이 명령블록 단위로 작업 내역을 기록하고 있기 때문에 이 점을 잘 이해하고 활용해야한다.
[심화] 명령블록 생성을 위한 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` 명령어를 수행할 때마다 우리가 구분한 블록만큼 되돌려지는 모습을 확인할 수 있다.
이렇게 Vim 에서 제공하는 '기본 조작' 기능을 총 12개의 포스팅을 통해서 알아보았다. 지금까지 알아본 기능들만 잘 조합하여 익혀놓는 것만으로도 더욱 즐거운 코딩이 가능할 것이라고 기대해본다. 다음 테마는 'Vim Cheat Sheet' 를 살펴보면서 그동안 포스팅했던 Vim 의 기본 기능들을 정리하고, 미처 소개하지 못한 기능들을 훑어보고자 한다. 그 이후에는 Vim 의 심화편이라고 할 수 있는 매크로(macro), 창(window) 제어 - 보통 IDE 플러그인에서도 지원하는 - 등의 기능들을 알아볼 것이다.
'vim' 카테고리의 다른 글
14 Vim 심화 - Macro (매크로) (2) | 2021.12.18 |
---|---|
13 Vim 기본 - 기본편 요약, 치트시트, 커리큘럼 (5) | 2021.12.06 |
11 Vim 기본 - 명령 n번 반복하기 (0) | 2021.12.05 |
10 Vim 기본 - 이전 명령 재실행(마이크로 매크로) (1) | 2021.11.19 |
09 Vim 기본 - 문자열 찾기 (0) | 2021.11.19 |