07 Vim 기본 - Visual Mode(블록 씌우기)

Vim Visual Mode 

Vim 에서 블록을 씌우고 싶을 때 사용하는 것이 Visual Mode 이다. Visual Mode 를 활용하면 다음 스크린샷과 같이, 텍스트에 블록을 씌울 수 있다. 

Vim Visual Mode 에 접근하는 다양한 방법들

이렇게 Visual Mode 로 블록을 씌운 뒤 특정 명령어를 통해 해당 문자열들을 컨트롤 할 수 있다. 

블록을 씌운 뒤 해당 부분을 복사, 지우기, 대체하기 등 다양한 동작을 수행할 수 있는데, 이후에 배울 명령어들과 조합하면 사실상 수행할 수 있는 동작은 수백가지(어쩌면 수천가지)에 이를 수도 있겠다.

 

Vim Visual Mode 는 다른 동작들과 조합되어 사용되는 경우가 많기에, 이 포스팅에서 소개한 Visual Mode 의 사용법은 한정적인 것임을 인지하고, 추후에 Vim Visual Mode 와 함께 다양한 조합을 따로 다뤄보도록 하겠다.

 

Vim Visual Mode 진입하기

Normal Mode 에서 Vim Visual Mode 모드에 진입하는 방법은 다음과 같이 크게 3가지가 있다.

v - 문자 단위 Vim Visual Mode 진입

  • v 키 누른 뒤, 커서 이동 명령으로 블록 범위 지정

Normal Mode 에서 Vim Visual Mode 모드에 진입하는 첫번째 방법이다. 이 방법으로 문자단위의 블록을 씌울 수 있다. 다만 인지해야할 것이 하나 있는데, visual 모드로 진입한 이후의 동작은 대부분 Normal Mode 와 비슷하다. 블록을 씌울 수 있고, 해당 블록에 대해 특정 명령어를 수행할 수 있다.

 

일단 블록을 씌워보도록 하자. v키를 누른 뒤, 이동 명령을 활용하여 블록을 이동시킬 수 있다. 

vim visual mode, v 키를 활용한 기본 visual mode 로의 진입 - v 키 누른 이후 커서 이동 명령을 활용하여 블록 범위를 지정할 수 있다.

모션과의 조합으로 visual mode 진입

먼저 인지할 것은, v명령은 앞선 포스팅 [The Vim Way] 05 Vim 기본조작 - Normal Mode 오퍼레이터(모션 지정 명령)에 대한 이해에서 다룬 '오퍼레이터(모션 지정형 명령)'으로도 사용할 수 있다는 점이다. 바로 위에서 블록 범위를 컨트롤 하는데 활용한 이동명령 또한 일종의 모션이었음을 기억하자. 다음 스크린샷처럼, v + {모션}명령으로 블록을 다양하게 선택할 수 있다. 물론 블록이 설정된 이후에 visual mode 인 상태로 커서 이동은 여전히 유효하다. 

v + {모션} 을 활용하여 Visual Mode 로 진입하는 다양한 모습

 

V - 줄 단위 Vim Visual Line Mode 진입

  • V(shift + v) 키 누른 뒤, 커서 이동 명령으로 블록 범위 지정

vim visual mode, V 키를 활용한 visual line 모드로 진입 - 이후 기본 이동 명령을 활용하여 블록 범위를 지정할 수 있다.

블록을 라인 단위로 설정한다. 특별한 점은, Visual Line 모드를 시작한 위치부터 커서가 위치한 부분까지 '줄 단위'로 영역이 설정된다는 점이다. 보통 j, k와의 조합으로 많이 사용하게 된다.

^v - Visual Block Mode 진입

^v(Ctrl+ v) 명령으로 Visual Block Mode 에 진입할 수 있다. 이는 다음 스크린샷과 같이, 대상을 조금 특이하게(?) 지정할 수 있다. 마치 GUI 환경에서 대상을 드래그로 지정하는 것과 비슷한 느낌이다. 일단 스크린샷을 보자.

vim visual block mode - 사각형 단위로 문서를 선택할 수 있는 기능

Visual Block Mode 는 위와 같이 텍스트에디터(위 스크린샷은 VSCode)나 IDE 에 따라 Multi Cursort 에 대응되는 기능이다. 따라서, IDE 나 텍스트에디터에 따라서 그 동작이 조금씩 다를 수도 있다. 아래 스크린샷처럼 실제 vim 의 visual mode 에서는 블록을 씌운 뒤 변경 명령(s)을 내렸을 때 마치 첫 번째 줄만 수정되는 것처럼 보이다가 esc로 빠져나오면 블록으로 지정한 전체 범위에 대하여 변경이 적용되어있음을 확인할 수 있다.

실제 vim 에서 visual block mode 가 동작하는 방식

vim visual block 모드는 위처럼 좌우 폭이 정형화된 데이터를 다룰 때 굉장히 유용하다. 그러나, 명확히 한계도 존재하는데, 서로 다른 폭을 지정하는 데에는 적절하지 않다는 것이다. 가령 아래 스크린샷과 같은 데이터 구조를 예로 들 수 있다. 모든 변수의 타입을 일괄적으로 int 로 변경하고 싶다고 하자. (그런 언어가 없을 수도 있지만) 좌우 폭이 정형화되어있지 않기 때문에 뭔가 어색한 결과가 도출된다.

vim visual block mode 의 한계

이런 경우 IDE 에서 자체적으로 제공하는 multi cursor 기능과 vim 기능을 조합하여 사용하는 것도 굉장히 도움이 된다. (조사해본 것은 아니지만, 기본 Vim 플러그인으로도 multi cursor 기능이 있지 않을까 짐작해본다.) 다음은 VSCode 에서의 Multi Cursor 와 Vim 을 조합하여 사용하는 예시이다.

vim 의 기능과 IDE(또는 텍스트에디터)의 Multi Cursor 기능을 조합하여 사용하기

대부분의 메이저 IDE, 텍스트에디터에서는 멀티커서 기능을 지원하므로, 각 에디터의 MultiCursor 단축키를 익혀두는 것은 Vim 사용법을 익히는 것과는 별도로 유용할 수 있겠다.

 

사실 Visual Block 모드로의 단축키가 ctrl + v라는 점은 윈도우 사용자에게 치명적이다. vim 을 사용하더라도 붙여넣기 기능을 사용하는 경우가 흔하기 때문이다.(ctrl+ a도 자주 사용) 그렇기에 필자는 윈도우에서는 보통 ctrl+ v를 그냥 일반적인 붙여넣기 기능으로 사용한다.

gv - 이전 블록 영역 재선택하기

  • g v - 이전 블록 영역을 재선택할 수 있다.

블록을 씌운 뒤 escape 로 빠져나온 뒤, 이전에 선택했던 영역을 바로 다시 선택해야 하는 경우가 있다. vim 은 이전에 선택했던 영역을 그대로 기억하고 있는데, 이 기억을 기반으로 gv 명령을 통해 이전 선택 영역을 다시 선택할 수 있다.

 

어쨌든 Visual Mode 로 진입하는 3가지 모드와 함께, 이 방법으로도 Visual Mode 에 진입할 수 있기에 여기에 소개한다.

이전 선택 영역을 바로 다시 선택하여 Visual Mode 에 진입할 수 있는 gv 명령어

Vim Visual Mode 에서의 모드 전환

Visual to Non-Visual

  • esc 키로 현재 블록을 취소하고 Visual Mode 에서 Normal Mode 로 전환할 수 있다.
  • 특정 명령을 수행하면 블록 영역에 대해 해당 명령을 수행한 뒤, Normal Mode 또는 Insert Mode 로 전환된다.

당연한 얘기지만 굳이 Vim Visual Mode 를 빠져나가는 방법에 대한 이야기를 한번 하고 가는 이유는 다음과 같다. Visual Mode 는 어떤 명령을 수행하기 전에, 적용 대상에 블록 범위를 씌우는 동작이고, 이는 Visual Mode 가 다른 명령과 조합되어 사용되는 '보조적인 수단'으로서의 모드임을 의미한다. 따라서, 해당 명령이 적용되면, 더 이상 Visual Mode  를 유지하지 않고, Normal Mode 로 빠져나가게 된다.

 

가령 다음 스크린샷과 같이, Visual Mode 로 진입하여 블록을 씌운 뒤 d키를 누르면 해당 부분이 삭제되고 Normal Mode 로 전환된 것을 확인할 수 있다.

visual mode 에서 특정 동작을 수행 한 뒤, vim mode 가 변경되는 모습

또한 visual mode 에서 s키를 누른다는 것은 s의 의미와 완벽히 동일하다. 다만, 적용 대상이 블록 지정 대상이라는 것만이 다를 뿐이다. 

vim visual mode 에서는 어떤 명령어를 사용하느냐에 따라 진입되는 mode 가 다르다.

Visual to Visual

Visual Mode 는 위에서 살펴본 것처럼 총 3가지이다. 기본 Visual Mode 에 더해 특수한 Visual Mode 인 Visual Line Mode와 Visual Block Mode가 그것이다. Visual Mode 간에는 서로 전환이 가능하다. Visual Mode 를 시작한 커서의 위치를 기억하고 있기 때문에, 현재 커서의 위치까지의 각 Visual Mode 의 동작원리를 기반으로 블록이 다시 세팅된다. 말이 어렵다. 다음 스크린샷을 보자.

visual mode 간의 전환

Visual Mode 에서 명령 수행하기

Visual Mode 에서 수행할 수 있는 명령은 크게 다음과 같다. 

  • 지정한 영역 삭제하기
  • 지정한 영역 삭제하고 입력 시작하기 (Insert Mode로 진입)
  • 지정한 영역 복사하기

지정한 영역 삭제하기

Visual Mode 에서 허용되는 삭제 명령은 다음과 같다.

  • D - Visual Block Mode 에서는현재 커서의 오른쪽 영역만 삭제 
  • d, D, x, X - 모두 동일한 동작을 기대할 수 있다.(= 한 가지만 기억하고 사용해도 충분하다.)

이 삭제 명령들이 3가지 Visual Mode에서 각각 어떻게 작동하는지는 직접 확인해보도록 하자.  

지정한 영역 삭제하고 입력 시작하기

  • C - Visual Block Mode 에서는현재 커서의 오른쪽 영역만 삭제하고 Insert Mode 로 진입
  • s, S, c, C - 모두 동일한 동작을 기대할 수 있다.(= 한 가지만 기억하고 사용해도 충분하다.)

필자가 자주 사용하는 삭제 명령어는 c 이다. (사실, 이 외에 다른 삭제 후 입력 커맨드는 덜 유용하다.)

지정한 영역 복사하기

  • y

y 는 앞선 포스팅에서 살펴보았던 것처럼, 오퍼레이터(모션 지정형 명령)이다. 그렇기에 모션을 지정하여 복사할 수도 있지만, 필자는 아무래도 복사되는 영역이 가시적으로 보이는 것을 선호하기 때문에 visual mode 로 복사할 영역을 지정한 후 y 키를 눌러 복사하는 경우가 많다.

 

앞서 Multi Cursor 를 언급한 것처럼, Visual Block 모드에서 복사하여 붙여넣기의 동작은 IDE 마다 그리고 순정 Vim 에서의 동작과 다를 수 있음에 유의한다.

 

또한 주의할 점은, 앞선 포스팅에서 언급했던 것처럼, Vim 에서 클립보드에는 직접 복사한 영역 외에도, 최근에 삭제된 내용이 들어간다는 점을 기억하자. 

시작커서 현재커서 전환

  • o 키로 visual mode 를 시작한 커서의 위치와 현재 커서의 위치를 변경할 수 있다.

Vim Visual Mode 에서는 Visual Mode 를 시작한 커서의 위치를 기억하고 있다고 했다. o 키를 눌러 시작 커서와 현재 커서를 서로 전환할 수 있다. 문장으로 보면 이게 왜 필요한지 감이 잘 안 올 수 있겠다. 이를 활용하면 블록 영역을 더욱 스마트하게 확장할 수 있다. 다음처럼 "goats", "sheep" 이 선택되어있는 상태에서 "pigs" 까지 선택하고 싶을 수가 있다. 물론 다시 블록을 푸는 방법도 있겠지만, 현재 블록을 유지한 채로 시작커서와 현재커서를 전환하여 시작커서 위치에서 블록을 확장시켰다.

visual mode 에서 o 키를 활용하여 시작 커서 위치와 현재 커서 위치를 변경했다. 이제 변경된 커서 위치로부터 블록 영역이 확장된다.

이번 예제는 그다지 유용하지 않았을 수 있지만, 아주 긴 줄을 Visual Line Mode 로 선택해두었다고 상상해보자. 블록 영역은 스크롤을 해야할 정도로 길다고 상상해보자. 그런데 처음 줄보다 몇줄 더 선택하고 싶어질 수 있다. 아래와 같이 시작 커서와 현재 커서를 전환하여 보다 스마트하게 블록 영역을 확장할 수 있다.

visual mode 에서 o 키를 활용하여 시작, 끝 영역을 전환할 수 있고, 블록의 시작 부분에서도 블록 영역 확장을 할 수 있다.


이상으로 Vim 에서 문서의 일부에 블록을 씌울 수 있는 모드인 Vim Visual Mode 에 관해서 알아보았다. 사실 Visual Block Mode 는 차치하고서라도, 일반 visual mode 와 visual line mode 는 정말 자주 사용하는 모드이므로 꼭 익혀두도록 하자. 여기까지 차근차근 연습해왔다면, 배웠던 기능들을 조합하여 점점 이렇게 저렇게 응용할 수 있는 방법들이 떠오르기 시작할 것이다. 이제 앞으로 남은 몇 가지 추가 기능들만 숙지하면, 진정한 Vim Way 를 걷게 될 능력을 갖추게 되는 것이다. 

 

다음 포스팅에서는, 지정한 대상으로 커서를 이동하는 방법을 알아본다.

반응형

Designed by JB FACTORY