IDE

IdeaVim

남용2 2020. 1. 8. 11:01

ideavim은 IntelliJ IDEA, PyCharm, CLion, PhpStorm, WebStorm, RubyMine, AppCode, DataGrip, GoLand, Rider, Cursive, Android Studio에서 사용할 수 있는 vim plugin이다.

 

설치

최신 버전의 vim plugin을 설치하기 위해서는 IDE의 plugin manager를 사용하면 설치할 수 있다.

"Tools | Vim Emulator" 메뉴 항목을 통해 사용 여부를 선택할 수 있다.

 

vim와 IDE 간의 단축키 충돌은 Linux & Window인 경우 "File | Settings | Editor | Vim Emulation", "File | Settings | Keymap"을 통해 재설정하여 해결할 수 있다.

macOS인 경우 "Preferences | Editor | Vim Emulation", "Preferences | Keymap"을 통해 재설정하여 해결할 수 있다.

또한, ~/.ideavimrc 파일에 key-mapping 명령어를 사용해  해결할 수 있다.

 

Early Access Program

새로운 기능과 수정사항이 반영된 버전을 사용하고 싶다면 EAP(Early Access Program)를 해보자.

2가지 방법이 있다.

 

방법1

아래 화면의 상태 바에서 ideavim 아이콘을 클릭하고, EAP | Get Early Access... 선택한다. 

방법2

File | Settings | plugins 이동하고, 톱니바퀴 모양의 아이콘을 클릭한다.

Manage Plugin Repositories 선택하고, 

https://plugins.jetbrains.com/plugins/eap/ideavim을 추가한다.

다음은 위 내용을 실행한 화면이다.

공개되지 않은 기능 목록은 Changelog에서 볼 수 있다.

 

EAP와 pre-release를 구별하는 것이 중요하다.

 

 

Vim 기능

Supported:

  • Motion keys(커서 위치를 이동할 때 사용하는 키)
  • Deletion/changing
  • Insert mode commands
  • Marks
  • Registers
  • Undo/redo
  • Visual mode commands
  • Some Ex commands
  • Some :set options
  • Full Vim regexps for search and search/replace
  • Key mappings
  • Macros
  • Digraphs
  • Command line and search history
  • Window commands
  • Vim web help
  • Select mode

Emulated Vim plugins:

  • vim-surround
  • vim-multiple-cursors
  • vim-commentary

Not supported (yet):

  • Jump lists
  • Various less-used commands

Motion keys

<C-키> CTRL과 해당 키를 함께 누르는 것을 의미합니다.

highlight 된 검색 결과는 :noh 또는 :nohlsearch 를 입력하면 highlight 를 끌 수 있습니다.

ideavim vim 기능
왼쪽으로 이동
0 가능   현재 라인의 가장 왼쪽으로 커서 이동. HOME 키와 같다.
^ 가능   현재 라인의 첫 번째 글자로 커서 이동. 0 과 비슷하지만 인덴트(공백)를 무시하므로 더 유용하다.
F문자 가능   왼쪽으로 문자를 검색하여 해당 문자 위로 커서 이동.
T문자 가능   왼쪽으로 문자를 검색하여 해당 문자 뒤로 커서 이동.
; 가능   다음 검색 결과로 이동.
, 가능   이전 검색 결과로 이동.
b 가능   커서 왼쪽 단어의 첫 글자로 이동.
B 가능   커서 왼쪽 단어의 첫 글자로 이동. 단 특수문자도 단어의 일부로 친다.
ge 가능   커서 왼쪽 단어의 마지막 글자로 이동.
gE 가능   커서 왼쪽 단어의 마지막 글자로 이동. 단 특수문자도 단어의 일부로 친다.
오른쪽으로 이동
$ 가능   현재 라인의 가장 마지막으로 커서 이동. END 키와 같다.
f문자 가능   오른쪽으로 문자를 검색하여 해당 문자 위로 커서 이동.
t문자 가능   오른쪽으로 문자를 검색하여 해당 문자 앞으로 커서 이동.
; 가능   다음 검색 결과로 이동.
, 가능   이전 검색 결과로 이동.
W 가능   커서 오른쪽 단어의 첫 글자로 이동. 단 특수문자도 단어의 일부로 친다.
w 가능   커서 오른쪽 단어의 첫 글자로 이동.
E 가능   커서 오른쪽 단어의 마지막 글자로 이동. 단 특수문자도 단어의 일부로 친다.
e 가능   커서 오른쪽 단어의 첫 글자로 이동.
위쪽으로 이동
gg 가능   첫 번째 라인으로 이동.
<C-b> 가능   페이지 up.
<C-u> 가능   반 페이지 up.
H 가능   현재 화면에 보이는 첫 번째 라인으로 이동.
{ 가능   현재 커서가 위치한 문단의 시작 지점으로 이동.
( 가능   현재 커서가 위치한 문장의 시작 지점으로 이동.
M 가능   현재 화면의 중간 라인으로 이동.
아래쪽으로 이동
G 가능   마지막 라인으로 이동.
<C-f> 가능   페이지 down.
<C-d> 가능   반 페이지 down.
L 가능   현재 화면에 보이는 마지막 라인으로 이동.
} 가능   현재 커서가 위치한 문단의 마지막 지점으로 이동.
) 가능   현재 커서가 위치한 문장의 마지막 지점으로 이동.
M 가능   현재 화면의 중간 라인으로 이동.
특수 이동
숫자gg 가능   해당 라인 넘버로 이동.
:숫자 가능   해당 라인 넘버로 이동.
/정규식 가능   현재 파일 내 검색 후 커서를 옮겨준다.
?정규식 가능   현재 파일 내 검색 후 커서를 옮겨준다.(역방향)
* 가능   현재 커서가 있는 위치의 단어를 검색한다.
# 가능   현재 커서가 있는 위치의 단어를 검색한다.(역방향)
n 가능   다음 검색 결과로 커서 이동.
N 가능   이전 검색 결과로 커서 이동.
% 가능   현재 커서가 위치한 괄호((), {}, [] 등)의 짝으로 이동한다.
`문자     일종의 북마크 기능. 자세한 내용은 marks 문서를 참고.
'문자     일종의 북마크 기능. 자세한 내용은 marks 문서를 참고.
<C-e> 불가능   위로 스크롤.
<C-y> 불가능   아래로 스크롤.
zz 가능   현재 커서가 있는 위치를 화면 중간으로 스크롤 한다.
이동 예제
10<C-f> 가능   페이지 down을 10 회 한다.
100k 가능   100 줄 위로 간다.
7l 가능   7칸 오른쪽으로 간다.
{v} 가능   현재 문단 전체를 선택한다.
{v}y 가능   현재 문단 전체를 복사한다.
{v}d 가능   현재 문단 전체를 삭제한다.
3w 가능   오른쪽으로 3 단어 이동한다.
d3w 가능   오른쪽으로 3 단어를 삭제한다.
2ft 가능   오른쪽의 두 번째 t 로 이동한다.
d2ft 가능   오른쪽의 두 번째 t 까지 삭제한다.
y2ft 가능   오른쪽의 두 번째 t 까지 복사한다.
"ay2ft     오른쪽의 두 번째 t 까지 a 레지스터로 복사한다.
v2ft 가능   오른쪽의 두 번째 t 까지 선택한다.
dt' 가능   현재 커서 위치부터 ' 앞까지 삭제한다.
yt' 가능   현재 커서 위치부터 ' 앞까지 복사한다.
vt' 가능   현재 커서 위치부터 ' 앞까지 선택한다.
42gg 가능   44번 라인으로 이동한다.
d42gg 가능   현재 커서 위치부터 44번 라인까지 삭제한다.
%v%"by     현재 커서가 있는 문장을 감싸는 괄호 내 전체를 선택하고 b 레지스터에 복사한다.
검색 예제
/asdf 가능   문자열 asdf 를 검색한다.
/asdf/s 가능   문자열 asdf 를 검색하고, asdf 의 첫번째 문자 a 로 커서를 이동한다.(디폴트 값)
/asdf/e 가능   문자열 asdf 를 검색하고, asdf 의 마지막 문자 f 로 커서를 이동한다.
/asdf/e+2     문자열 asdf 를 검색하고, asdf 의 마지막 문자 f 이후 2 번째 위치로 커서를 이동.
2/asdf 불가능   문자열 asdf 를 검색한 결과 두 번째 asdf 로 커서를 이동한다.
2/asdf/e-3 불가능   문자열 asdf 를 검색한 결과 두 번째 asdf 의 마지막 문자 f 이전 3 번째 위치로 커서 이동.
/asdf/+7 가능   문자열 asdf 를 검색하고, 검색 결과의 7 줄 아래로 커서 이동.
/^\n\{3} 가능   빈 라인 3 줄을 찾는다.
/^[a-t] 가능   a 에서 t 사이의 알파벳으로 시작하는 라인을 찾는다.
/aaa\_s*bbb 가능   aaa 와 bbb 사이에 여러 줄의 공백 라인이 있어도 찾는다.
JUMP

', ', `, G, /, ?, n, N, %, (, ), [[, ]], {, }, :s, :tag, L, M, H

   

위의 이동 명령들 중 단순 좌우이동이 아닌 것은 모두 JUMP 라고 부릅니다. 즉, 다음 명령들이 점프에 속합니다.

:ju 가능   점프 히스토리
:jumps 가능   점프 히스토리
<C-o> 가능   점프 히스토리의 이전 점프로 이동한다.
<C-i> 가능   점프 히스토리의 다음 점프로 이동한다.

Insert mode commands

<C-키> CTRL과 해당 키를 함께 누르는 것을 의미합니다.

ideavim vim 기능
기본
<C-h> 가능   커서 앞의 한 글자를 삭제한다. <BS>(백스페이스)와 같다.
<C-w> 가능   커서 앞의 한 단어를 삭제한다.
<C-u> 가능   커서 앞의 모든 문자를 삭제한다.
<C-j> 불가능   <NL>. <Enter>와 같다고 생각하면 된다.
<C-m> 불가능   <CR>. <Enter>와 같다고 생각하면 된다.
<C-t> 불가능   현재 편집중인 라인을 오른쪽으로 한 단계 들여쓰기 한다.
<C-d> 불가능   현재 편집중인 라인을 왼쪽으로 한 단계 들여쓰기 한다.
0<C-d>     현재 편집중인 라인의 인덴트를 전부 삭제한다.
^<C-d>     0<C-d>와 같지만, <Enter>로 다음 라인으로 갔을 때, 인덴트가 유지된다.
<C-e> 불가능   커서 바로 아랫줄의 문자를 입력한다.
<C-y> 불가능   커서 바로 윗줄의 문자를 입력한다.
<C-k> 불가능   입력한 다음 1~2 개의 키를 입력하면 특수 문자를 입력할 수 있다.
<C-v> 불가능   특수 문자를 입력할 수 있다.
<C-q> 불가능   <C-v>와 같다.
<C-i> 가능   <Tab>키를 입력.
붙여넣기
<C-r> 가능   입력한 다음 레지스터 문자(0-9a-z"%#*+:.-=)를 입력하면 해당 레지스터에 담긴 값을 붙여넣을 수 있다.
<C-r><C-r> 불가능   <C-r>과 같지만, 레지스터에 담긴 값을 문자열로 붙여넣는다.
<C-r><C-o>     <C-r><C-r>과 같지만, 인덴트를 적용하지 않는다(앞의 공백 무시).
<C-r><C-p>     <C-r><C-r>과 같지만, 인덴트를 적용한다.
<C-r>=     = 레지스터의 특수한 기능 때문에 여러가지 표현식을 입력하고 평가 결과를 붙여넣을 수 있다.
<C-a>  가능   바로 전 INSERT 모드에서 입력한 문자열을 그대로 입력.
<C-2> 가능    바로 전 INSERT 모드에서 입력한 문자열을 그대로 입력한 다음, NORMAL 모드로 전환. 
자동완성, CTRL-x 모드
<C-n> 불가능   키워드 자동완성(다음).
<C-p> 불가능   키워드 자동완성(이전).
<C-x> 불가능   <C-x>모드로 들어간다.
<C-x><C-f>     파일명 자동 완성. bash의 <TAB> 파일명 자동완성과 비슷하다.
<C-x><C-l>     line 자동 완성. 단어 자동완성과 같은 느낌으로 한 줄을 완성한다.
<C-x><C-e> 불가능   아래로 한 줄씩 스크롤한다.
<C-x><C-y> 불가능   위로 한 줄씩 스크롤한다.
<C-x><C-k>     dictionary 자동 완성. 설정 필요.
<C-x><C-v>     Vim command line 명령어 자동완성.
<C-x><C-o>     omni completion. 프로그래밍 언어 별 키워드, 기본 함수 등의 자동 완성. VIM7 부터 추가.

register

register는 문자열을 저장하는 공간이다.

register 보는 방법은 :reg 또는 :registers를 입력한다.

:reg 명령어 실행에서 보이는 ^J는 줄바꿈, ^I는 탭을 의미한다.

 

register 사용 방법

NORMAL, VISUAL, INSERT 모드에서 사용 가능하다.

NORMAL, VISUAL 모드에서 사용하는 방법과 INSERT 모드에서 사용하는 방법이 다르다.

  • NORMAL, VISUAL 모드에서 사용하는 방법

복사/삭제액션 -> 예) p 명령어시 붙여넣기를 실행한다.

"레지스터기호 복사/삭제액션 -> 예) "2p 명령어시 "2 레지스터의 내용을 붙여넣기한다.

  • INSERT 모드에서 사용하는 방법

<C-r> 레지스터기호 -> 예) <Ctrl+r>2 명령어시 "2레시지스터의 내용을 붙여넣기한다.

 

register 목록

레지스터 타입 ideavim 테스트
설명
"" unnamed O 마지막으로 삭제했거나 복사한 문자열이 들어간다.
"0 - "9 numbered O "" 레지스터의 히스토리. 숫자가 클 수록 오래된 값들이다.
"a - "z named O 자동 입력이 없고 사용자가 자유롭게 사용할 수 있는 레지스터.
"A - "Z named X 자동 입력이 없고 사용자가 자유롭게 사용할 수 있는 레지스터.
"- small delete O 한 줄 미만의 삭제가 이루어진 경우 "- 레지스터에 입력된다.
"*, "+ selection and drop O gui 클립보드 레지스터. (다른 프로그램의 ⌘C)
". read-only X 가장 최근에 입력된 문자열이 입력되는 레지스터.
": read-only O 가장 최근에 입력한 command line 명령어가 입력되는 레지스터.
"% read-only X 현재 편집중인 파일의 이름이 입력되어 있는 레지스터.
"/ last search pattern O 가장 최근의 검색어가 입력되는 레지스터.
"= expression register X 가장 최근에 사용한 expression 이 입력되는 레지스터.
"_ black hole X 블랙홀 레지스터! /dev/null 같은 역할을 합니다.

register 사용 예제 (기초)

  • NORMAL 모드
ideavim 테스트 설명
yy O 현재 라인을 "" 레지스터와 "0 레지스터에 입력한다. 기존 "0 레지스터의 값은 "1 로 밀려난다.
dd O 현재 라인을 삭제하고 "" 레지스터와 "0 레지스터에 입력한다. 기존 "0 레지스터의 값은 "1 로 밀려난다.
"+yy O 현재 라인을 클립보드("+ 레지스터)에 입력한다.
"+p O 클립보드("+레지스터)의 내용을 붙여넣기한다.
"2p O "2 레지스터의 내용을 붙여넣기한다.
"%p X "% 레지스터의 내용(현재 편집중인 파일의 이름)을 붙여넣기한다.
:let @+='test' X "+ 레지스터에 test 라는 문자열을 입력한다.
:let @a=@+ X "a 레지스터에 "+ 레지스터의 값을 입력한다.
:@: O 가장 최근에 사용한 command line 명령어를 다시 실행한다.
  • INSERT 모드
ideavim 테스트
설명
<C-r>+ O 클립보드("+레지스터)의 내용을 붙여넣기한다.
<C-r>2 O "2 레지스터의 내용을 붙여넣기한다.
<C-r>% X "% 레지스터의 내용(현재 편집중인 파일명)을 붙여넣기한다.
<C-r>=7*8 X expression 레지스터를 사용해, 56을 입력한다.
<C-r>=@a X expression 레지스터를 사용해, "a레지스터의 값을 입력한다.
  • VISUAL 모드
ideavim 테스트 설명
"+y O 선택한 영역을 클립보드("+ 레지스터)에 입력한다.
"cy O 선택한 영역을 "c 레지스터에 입력한다.

register 사용 예제 (응용)

  • NORMAL 모드
ideavim 테스트 설명
vi}"7y O 현재 커서가 위치하고 있는 { } 영역 내의 모든 문자열을 7 레지스터에 입력한다.
ggVG"by O 현재 파일 전체를 b 레지스터에 입력한다.
%v%y O 현재 커서가 있는 코드를 감싼가장 가까운 괄호 내 모든 문자열을 "" 레지스터에 입력한다.
:let @+=expand('%:p') X "+ 레지스터에 현재 파일의 경로를 입력한다.
:let @a=@b.@c.'123' X "b, "c 레지스터와 '123' 이란 문자열을 concat 하여 "a 레지스터에 입력한다.
:let @a=substitute(@a,'d','a','g') X "a 레지스터의 문자열 중 모든 d 를 a 로 replace 한다.
  • INSERT 모드
ideavim 테스트
설명
<C-r>=@a.@b X "a와 "b레지스터의 값을 concat 하여 입력한다.
<C-r>=@a.'123'.@b X "a, 문자열 'test', "b레지스터의 값을 concat 하여 입력한다.
<C-r>=system('cat filename') X filename파일 내용을 붙여넣는다.

macro

vim에는 사용자의 키 입력을 기록해서 반복해주는 기능인 macro가 있다.

macro는 레지스터에 기록된다.

macro 사용법

ideavim 테스트 설명
q레지스터기호 O 기록 시작.
q O 기록 종료.
@레지스터기호 X 매크로 호출.
@@ X 가장 최근에 호출한 매크로 호출.

mark

mark는 커서 위치를 기억하는 일종의 북마크 기능이다.

mark는 .viminfo에 기록되기 때문에 vim을 종료한 후에 다시 실행해도 마크를 사용할 수 있다.

 

mark 목록

마크 ideavim 테스트 설명
' O 가장 최근에 점프한 라인.
` O 가장 최근에 점프한 위치.
a - z O

로컬 마크. 파일마다 a 부터 z 까지의 로컬 마크를 가질 수 있다.

예) 'a

A - Z O 글로벌 마크. test 라는 파일에 A 마크를 지정하면 A 마크를 호출하여 어디에서도 test 파일로 점프할 수 있다.
" O 현재 편집중인 파일에서 다른 파일로 점프하거나 했을 경우, 커서가 마지막으로 위치한 곳.
0 - 9 O 종료한 파일 히스토리. 마지막으로 편집한 여러 파일이 기록에 남게 된다.
^ O

가장 최근에 INSERT 모드였던 위치.

예) '^

. O 마지막으로 편집한 위치.
< O 가장 최근에 VISUAL 모드로 선택한 첫 글자의 위치.
> O 가장 최근에 VISUAL 모드로 선택한 마지막 글자의 위치.
( O 현재 문장의 시작지점.
) O 현재 문장의 종료지점.
{ O 현재 문단의 시작지점.
} O 현재 문단의 종료지점.

mark 목록 확인하는 방법

:marks 명령어는 모든 마크의 정보를 출력한다.

 

mark 지정 방법

m 마크아이디

mark로 이동하는 방법

ideavim 테스트 설명
` 마크아이디 O 커서를 a 마크로 이동.
' 마크아이디 O 커서를 a 마크가 있는 라인으로 이동(해당 라인의 가장 왼쪽으로 이동합니다).
]`  X 다음 마크로 이동.
]' X 다음 마크가 있는 라인으로 이동.
[` X 이전 마크로 이동.
[' X 이전 마크가 있는 라인으로 이동.

mark를 삭제하는 방법

ideavim 테스트 설명
:delm 마크아이디 O 마크아이디의  mark 삭제
:delmarks 마크아이디 O 마크아이디의  mark 삭제
:delm! O 소문자 마크아이디 전체 삭제
:delmarks! O 소문자 마크아이디 전체 삭제

mark 사용 예제 (기본)

ideavim 테스트 설명
ma O 현재 커서 위치를 마크 a 에 기억시킨다.
mA O 현재 커서 위치와 파일을 마크 A 에 기억시킨다.
`a O 현재 커서 위치를 a 마크로 이동.
'a O 현재 커서 위치를 a 마크가 있는 라인으로 이동.
`A O A 마크를 지정한 파일을 열고 마크 위치로 이동.
'A O A 마크를 지정한 파일을 열고 마크가 있는 라인으로 이동.
`. O 마지막으로 편집한 파일의 마지막으로 편집한 위치로 돌아간다.
:marks O 모든 마크의 리스트를 확인한다.
:marks abc X 마크 a,b,c 의 리스트를 확인한다.
:delm a O a 마크를 삭제한다.
:delm a-d O a,b,c,d 마크를 삭제한다.
:delm abdh O a,b,d,h 마크를 삭제한다.
:delm! O a 부터 z 까지 소문자 마크를 모두 삭제한다.

mark 사용 예제 (응용)

ideavim 테스트 설명
v`a O 현재 커서부터 a 마크까지 선택한다.
y'a O 현재 커서부터 a 마크가 있는 라인의 첫 글자까지 복사한다.
d`a O 현재 커서부터 a 마크까지 삭제한다.
`<v`> O 마지막으로 선택한 영역을 다시 선택한다.
이 기능은 NORMAL 모드에서 gv로도 가능하다.
`1:cd   히스토리의 1번 파일 마크로 이동한 다음, 작업 경로(:pwd로 확인 가능)도 변경한다.
'b'' O b 마크로 점프한 다음, 점프 직전의 위치로 돌아간다.
:'a,'b d O a 마크가 있는 라인부터 b 마크가 있는 라인까지 삭제한다.
:'a,'b y O a 마크가 있는 라인부터 b 마크가 있는 라인까지 복사한다.
:'a,'b s/test/pass/g O a 마크부터 b 마크 사이의 모든 test 문자열을 pass로 replace 한다.
zf'a X 현재 커서가 있는 위치부터 a 마크가 있는 라인까지 보이지 않도록 fold 한다.

명령어

ideavim 테스트 설명
:tabonly O 해당 탭을 제외한 모든 탭을 닫는다.
:shell O 내장 터미널을 실행한다.

전체 목록

/*
 * IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
 * Copyright (C) 2003-2019 The IdeaVim authors
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
 */

/**
 * IdeaVim command index.
 *
 *
 * 1. Insert mode
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 *
 * |i_CTRL-@|             {@link com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertExitAction}
 * |i_CTRL-A|             {@link com.maddyhome.idea.vim.action.change.insert.InsertPreviousInsertAction}
 * |i_CTRL-C|             {@link com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction}
 * |i_CTRL-D|             {@link com.maddyhome.idea.vim.action.change.shift.ShiftLeftLinesAction}
 * |i_CTRL-E|             {@link com.maddyhome.idea.vim.action.change.insert.InsertCharacterBelowCursorAction}
 * |i_CTRL-G_j|           TO BE IMPLEMENTED
 * |i_CTRL-G_k|           TO BE IMPLEMENTED
 * |i_CTRL-G_u|           TO BE IMPLEMENTED
 * |i_<BS>|               {@link com.maddyhome.idea.vim.action.editor.VimEditorBackSpace}
 * |i_digraph|            IdeaVim enter digraph
 * |i_CTRL-H|             IntelliJ editor backspace
 * |i_<Tab>|              {@link com.maddyhome.idea.vim.action.editor.VimEditorTab}
 * |i_CTRL-I|             IntelliJ editor tab
 * |i_<NL>|               {@link com.maddyhome.idea.vim.action.change.insert.InsertEnterAction}
 * |i_CTRL-J|             TO BE IMPLEMENTED
 * |i_CTRL-K|             IdeaVim enter digraph
 * |i_CTRL-L|             TO BE IMPLEMENTED
 * |i_<CR>|               {@link com.maddyhome.idea.vim.action.change.insert.InsertEnterAction}
 * |i_CTRL-M|             {@link com.maddyhome.idea.vim.action.change.insert.InsertEnterAction}
 * |i_CTRL-N|             {@link com.maddyhome.idea.vim.action.window.LookupDownAction}
 * |i_CTRL-O|             {@link com.maddyhome.idea.vim.action.change.insert.InsertSingleCommandAction}
 * |i_CTRL-P|             {@link com.maddyhome.idea.vim.action.window.LookupUpAction}
 * |i_CTRL-Q|             TO BE IMPLEMENTED
 * |i_CTRL-R|             {@link com.maddyhome.idea.vim.action.change.insert.InsertRegisterAction}
 * |i_CTRL-R_CTRL-R|      TO BE IMPLEMENTED
 * |i_CTRL-R_CTRL-O|      TO BE IMPLEMENTED
 * |i_CTRL-R_CTRL-P|      TO BE IMPLEMENTED
 * |i_CTRL-T|             {@link com.maddyhome.idea.vim.action.change.shift.ShiftRightLinesAction}
 * |i_CTRL-U|             {@link com.maddyhome.idea.vim.action.change.insert.InsertDeleteInsertedTextAction}
 * |i_CTRL-V|             TO BE IMPLEMENTED
 * |i_CTRL-V_digit|       TO BE IMPLEMENTED
 * |i_CTRL-W|             {@link com.maddyhome.idea.vim.action.change.insert.InsertDeletePreviousWordAction}
 * |i_CTRL-X|             TO BE IMPLEMENTED
 * |i_CTRL-Y|             {@link com.maddyhome.idea.vim.action.change.insert.InsertCharacterAboveCursorAction}
 * |i_CTRL-Z|             TO BE IMPLEMENTED
 * |i_<Esc>|              {@link com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction}
 * |i_CTRL-[|             {@link com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction}
 * |i_CTRL-\_CTRL-N|      {@link com.maddyhome.idea.vim.action.change.insert.InsertExitModeAction}
 * |i_CTRL-\_CTRL-G|      TO BE IMPLEMENTED
 * |i_CTRL-]}             TO BE IMPLEMENTED
 * |i_CTRL-^|             TO BE IMPLEMENTED
 * |i_CTRL-_|             TO BE IMPLEMENTED
 * |i_0_CTRL-D|           TO BE IMPLEMENTED
 * |i_^_CTRL-D|           TO BE IMPLEMENTED
 * |i_<Del>|              {@link com.maddyhome.idea.vim.action.editor.VimEditorDelete}
 * |i_<Left>|             {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLeftInsertModeAction}
 * |i_<S-Left>|           {@link com.maddyhome.idea.vim.action.motion.text.MotionWordLeftInsertAction}
 * |i_<C-Left>|           {@link com.maddyhome.idea.vim.action.motion.text.MotionWordLeftInsertAction}
 * |i_<Right>|            {@link com.maddyhome.idea.vim.action.motion.leftright.MotionRightInsertAction}
 * |i_<S-Right>|          {@link com.maddyhome.idea.vim.action.motion.text.MotionWordRightInsertAction}
 * |i_<C-Right>|          {@link com.maddyhome.idea.vim.action.motion.text.MotionWordRightInsertAction}
 * |i_<Up>|               {@link com.maddyhome.idea.vim.action.editor.VimEditorUp}
 * |i_<S-Up>|             {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpInsertModeAction}
 * |i_<Down>|             {@link com.maddyhome.idea.vim.action.editor.VimEditorDown}
 * |i_<S-Down>|           {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownInsertModeAction}
 * |i_<Home>|             {@link com.maddyhome.idea.vim.action.motion.leftright.MotionFirstColumnInsertModeAction}
 * |i_<C-Home>|           {@link com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstInsertAction}
 * |i_<End>|              {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLastColumnInsertAction}
 * |i_<C-End>|            {@link com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastEndInsertAction}
 * |i_<Insert>|           {@link com.maddyhome.idea.vim.action.change.insert.InsertInsertAction}
 * |i_<PageUp>|           {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpInsertModeAction}
 * |i_<PageDown>|         {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownInsertModeAction}
 * |i_<F1>|               IntelliJ help
 * |i_<Insert>|           IntelliJ editor toggle insert/replace
 * |i_CTRL-X_index|       TO BE IMPLEMENTED
 *
 *
 * 2. Normal mode
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 *
 * |CTRL-A|               {@link com.maddyhome.idea.vim.action.change.change.number.ChangeNumberIncAction}
 * |CTRL-B|               {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpAction}
 * |CTRL-C|               TO BE IMPLEMENTED
 * |CTRL-D|               {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfPageDownAction}
 * |CTRL-E|               {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLineDownAction}
 * |CTRL-F|               {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownAction}
 * |CTRL-G|               {@link com.maddyhome.idea.vim.action.file.FileGetFileInfoAction}
 * |<BS>|                 {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLeftWrapAction}
 * |CTRL-H|               {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLeftWrapAction}
 * |<Tab>|                TO BE IMPLEMENTED
 * |CTRL-I|               {@link com.maddyhome.idea.vim.action.motion.mark.MotionJumpNextAction}
 * |<NL>|                 {@link com.maddyhome.idea.vim.action.motion.updown.MotionDownNotLineWiseAction}
 * |CTRL-J|               TO BE IMPLEMENTED
 * |CTRL-L|               not applicable
 * |<CR>|                 {@link com.maddyhome.idea.vim.action.motion.updown.EnterNormalAction}
 * |CTRL-M|               {@link com.maddyhome.idea.vim.action.motion.updown.MotionDownFirstNonSpaceAction}
 * |CTRL-N|               {@link com.maddyhome.idea.vim.action.motion.updown.MotionDownCtrlNAction}
 * |CTRL-O|               {@link com.maddyhome.idea.vim.action.motion.mark.MotionJumpPreviousAction}
 * |CTRL-P|               {@link com.maddyhome.idea.vim.action.motion.updown.MotionUpCtrlPAction}
 * |CTRL-R|               {@link com.maddyhome.idea.vim.action.change.RedoAction}
 * |CTRL-T|               TO BE IMPLEMENTED
 * |CTRL-U|               {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollHalfPageUpAction}
 * |CTRL-V|               {@link com.maddyhome.idea.vim.action.motion.visual.VisualToggleBlockModeAction}
 * |CTRL-W|               see window commands
 * |CTRL-X|               {@link com.maddyhome.idea.vim.action.change.change.number.ChangeNumberDecAction}
 * |CTRL-Y|               {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLineUpAction}
 * |CTRL-Z|               TO BE IMPLEMENTED
 * |CTRL-]|               {@link com.maddyhome.idea.vim.action.motion.search.GotoDeclarationAction}
 * |CTRL-6|               {@link com.maddyhome.idea.vim.action.file.FilePreviousAction}
 * |CTRL-\CTRL-N|         {@link com.maddyhome.idea.vim.action.ResetModeAction}
 * |<Space>|              {@link com.maddyhome.idea.vim.action.motion.leftright.MotionRightWrapAction}
 * |!|                    {@link com.maddyhome.idea.vim.action.change.change.FilterMotionAction}
 * |!!|                   translated to !_
 * |quote|                {@link com.maddyhome.idea.vim.action.copy.SelectRegisterAction}
 * |#|                    {@link com.maddyhome.idea.vim.action.motion.search.SearchWholeWordBackwardAction}
 * |$|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLastColumnAction}
 * |%|                    {@link com.maddyhome.idea.vim.action.motion.updown.MotionPercentOrMatchAction}
 * |&|                    {@link com.maddyhome.idea.vim.action.change.change.ChangeLastSearchReplaceAction}
 * |'|                    {@link com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineAction}
 * |''|                   ?
 * ...
 * |(|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionSentencePreviousStartAction}
 * |)|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionSentenceNextStartAction}
 * |star|                 {@link com.maddyhome.idea.vim.action.motion.search.SearchWholeWordForwardAction}
 * |+|                    {@link com.maddyhome.idea.vim.action.motion.updown.MotionDownFirstNonSpaceAction}
 * |,|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLastMatchCharReverseAction}
 * |-|                    {@link com.maddyhome.idea.vim.action.motion.updown.MotionUpFirstNonSpaceAction}
 * |.|                    {@link com.maddyhome.idea.vim.action.change.RepeatChangeAction}
 * |/|                    {@link com.maddyhome.idea.vim.action.motion.search.SearchEntryFwdAction}
 * |:|                    {@link com.maddyhome.idea.vim.action.ExEntryAction}
 * |;|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLastMatchCharAction}
 * |<|                    {@link com.maddyhome.idea.vim.action.change.shift.ShiftLeftMotionAction}
 * |<<|                   translated to <_
 * |=|                    {@link com.maddyhome.idea.vim.action.change.shift.AutoIndentMotionAction}
 * |==|                   translated to =_
 * |>|                    {@link com.maddyhome.idea.vim.action.change.shift.ShiftRightMotionAction}
 * |>>|                   translated to >_
 * |?|                    {@link com.maddyhome.idea.vim.action.motion.search.SearchEntryRevAction}
 * |@|                    {@link com.maddyhome.idea.vim.action.macro.PlaybackRegisterAction}
 * |A|                    {@link com.maddyhome.idea.vim.action.change.insert.InsertAfterLineEndAction}
 * |B|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionBigWordLeftAction}
 * |C|                    {@link com.maddyhome.idea.vim.action.change.change.ChangeEndOfLineAction}
 * |D|                    {@link com.maddyhome.idea.vim.action.change.delete.DeleteEndOfLineAction}
 * |E|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionBigWordEndRightAction}
 * |F|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLeftMatchCharAction}
 * |G|                    {@link com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastAction}
 * |H|                    {@link com.maddyhome.idea.vim.action.motion.screen.MotionFirstScreenLineAction}
 * |I|                    {@link com.maddyhome.idea.vim.action.change.insert.InsertBeforeFirstNonBlankAction}
 * |J|                    {@link com.maddyhome.idea.vim.action.change.delete.DeleteJoinLinesSpacesAction}
 * |K|                    {@link com.maddyhome.idea.vim.action.editor.VimQuickJavaDoc}
 * |L|                    {@link com.maddyhome.idea.vim.action.motion.screen.MotionLastScreenLineAction}
 * |M|                    {@link com.maddyhome.idea.vim.action.motion.screen.MotionMiddleScreenLineAction}
 * |N|                    {@link com.maddyhome.idea.vim.action.motion.search.SearchAgainPreviousAction}
 * |O|                    {@link com.maddyhome.idea.vim.action.change.insert.InsertNewLineAboveAction}
 * |P|                    {@link com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorAction}
 * |Q|                    TO BE IMPLEMENTED
 * |R|                    {@link com.maddyhome.idea.vim.action.change.change.ChangeReplaceAction}
 * |S|                    {@link com.maddyhome.idea.vim.action.change.change.ChangeLineAction}
 * |T|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLeftTillMatchCharAction}
 * |U|                    ?
 * |V|                    {@link com.maddyhome.idea.vim.action.motion.visual.VisualToggleLineModeAction}
 * |W|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionBigWordRightAction}
 * |X|                    {@link com.maddyhome.idea.vim.action.change.delete.DeleteCharacterLeftAction}
 * |Y|                    {@link com.maddyhome.idea.vim.action.copy.YankLineAction}
 * |ZZ|                   {@link com.maddyhome.idea.vim.action.file.FileSaveCloseAction}
 * |ZQ|                   {@link com.maddyhome.idea.vim.action.file.FileSaveCloseAction}
 * |[|                    see bracket commands
 * |]|                    see bracket commands
 * |^|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionFirstNonSpaceAction}
 * |_|                    {@link com.maddyhome.idea.vim.action.motion.updown.MotionDownLess1FirstNonSpaceAction}
 * |`|                    {@link com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkAction}
 * |``|                   ?
 * ...
 * |0|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionFirstColumnAction}
 * |a|                    {@link com.maddyhome.idea.vim.action.change.insert.InsertAfterCursorAction}
 * |b|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionWordLeftAction}
 * |c|                    {@link com.maddyhome.idea.vim.action.change.change.ChangeMotionAction}
 * |cc|                   translated to c_
 * |d|                    {@link com.maddyhome.idea.vim.action.change.delete.DeleteMotionAction}
 * |dd|                   translated to d_
 * |do|                   TO BE IMPLEMENTED
 * |dp|                   TO BE IMPLEMENTED
 * |e|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionWordEndRightAction}
 * |f|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionRightMatchCharAction}
 * |g|                    see commands starting with 'g'
 * |h|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLeftAction}
 * |i|                    {@link com.maddyhome.idea.vim.action.change.insert.InsertBeforeCursorAction}
 * |j|                    {@link com.maddyhome.idea.vim.action.motion.updown.MotionDownAction}
 * |k|                    {@link com.maddyhome.idea.vim.action.motion.updown.MotionUpAction}
 * |l|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionRightAction}
 * |m|                    {@link com.maddyhome.idea.vim.action.motion.mark.MotionMarkAction}
 * |n|                    {@link com.maddyhome.idea.vim.action.motion.search.SearchAgainNextAction}
 * |o|                    {@link com.maddyhome.idea.vim.action.change.insert.InsertNewLineBelowAction}
 * |p|                    {@link com.maddyhome.idea.vim.action.copy.PutTextAfterCursorAction}
 * |q|                    {@link com.maddyhome.idea.vim.action.macro.ToggleRecordingAction}
 * |r|                    {@link com.maddyhome.idea.vim.action.change.change.ChangeCharacterAction}
 * |s|                    {@link com.maddyhome.idea.vim.action.change.change.ChangeCharactersAction}
 * |t|                    {@link com.maddyhome.idea.vim.action.motion.leftright.MotionRightTillMatchCharAction}
 * |u|                    {@link com.maddyhome.idea.vim.action.change.UndoAction}
 * |v|                    {@link com.maddyhome.idea.vim.action.motion.visual.VisualToggleCharacterModeAction}
 * |w|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionWordRightAction}
 * |x|                    {@link com.maddyhome.idea.vim.action.change.delete.DeleteCharacterRightAction}
 * |y|                    {@link com.maddyhome.idea.vim.action.copy.YankMotionAction}
 * |yy|                   translated to y_
 * |z|                    see commands starting with 'z'
 * |{|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionParagraphPreviousAction}
 * |bar|                  {@link com.maddyhome.idea.vim.action.motion.leftright.MotionColumnAction}
 * |}|                    {@link com.maddyhome.idea.vim.action.motion.text.MotionParagraphNextAction}
 * |~|                    {@link com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleCharacterAction}
 * |<C-End>|              {@link com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineLastEndAction}
 * |<C-Home>|             {@link com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstAction}
 * |<C-Left>|             {@link com.maddyhome.idea.vim.action.motion.text.MotionWordLeftAction}
 * |<C-Right>|            {@link com.maddyhome.idea.vim.action.motion.text.MotionWordRightAction}
 * |<C-Down>|             {@link com.maddyhome.idea.vim.action.motion.scroll.CtrlDownAction}
 * |<C-Up>|               {@link com.maddyhome.idea.vim.action.motion.scroll.CtrlUpAction}
 * |<Del>|                {@link com.maddyhome.idea.vim.action.change.delete.DeleteCharacterAction}
 * |<Down>|               {@link com.maddyhome.idea.vim.action.motion.updown.MotionArrowDownAction}
 * |<End>|                {@link com.maddyhome.idea.vim.action.motion.leftright.MotionEndAction}
 * |<F1>|                 IntelliJ help
 * |<Home>|               {@link com.maddyhome.idea.vim.action.motion.leftright.MotionHomeAction}
 * |<Insert>|             {@link com.maddyhome.idea.vim.action.change.insert.InsertBeforeCursorAction}
 * |<Left>|               {@link com.maddyhome.idea.vim.action.motion.leftright.MotionArrowLeftAction}
 * |<PageDown>|           {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageDownAction}
 * |<PageUp>|             {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollPageUpAction}
 * |<Right>|              {@link com.maddyhome.idea.vim.action.motion.leftright.MotionArrowRightAction}
 * |<S-Down>|             {@link com.maddyhome.idea.vim.action.motion.updown.MotionShiftDownAction}
 * |<S-Left>|             {@link com.maddyhome.idea.vim.action.motion.leftright.MotionShiftLeftAction}
 * |<S-Right>|            {@link com.maddyhome.idea.vim.action.motion.leftright.MotionShiftRightAction}
 * |<S-Up>|               {@link com.maddyhome.idea.vim.action.motion.updown.MotionShiftUpAction}
 * |<S-Home>|             {@link com.maddyhome.idea.vim.action.motion.leftright.MotionShiftHomeAction}
 * |<S-End>|              {@link com.maddyhome.idea.vim.action.motion.leftright.MotionShiftEndAction}
 * |<Up>|                 {@link com.maddyhome.idea.vim.action.motion.updown.MotionArrowUpAction}
 *
 *
 * 2.1. Text objects
 *
 * Text object commands are listed in the visual mode section.
 *
 *
 * 2.2. Window commands
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 *
 * |CTRL-W_+|             TO BE IMPLEMENTED
 * |CTRL-W_-|             TO BE IMPLEMENTED
 * |CTRL-W_<|             TO BE IMPLEMENTED
 * |CTRL-W_=|             TO BE IMPLEMENTED
 * |CTRL-W_>|             TO BE IMPLEMENTED
 * |CTRL-W_H|             TO BE IMPLEMENTED
 * |CTRL-W_J|             TO BE IMPLEMENTED
 * |CTRL-W_K|             TO BE IMPLEMENTED
 * |CTRL-W_L|             TO BE IMPLEMENTED
 * |CTRL-W_P|             TO BE IMPLEMENTED
 * |CTRL-W_R|             TO BE IMPLEMENTED
 * |CTRL-W_S|             {@link com.maddyhome.idea.vim.action.window.HorizontalSplitAction}
 * |CTRL-W_T|             TO BE IMPLEMENTED
 * |CTRL-W_W|             {@link com.maddyhome.idea.vim.action.window.WindowPrevAction}
 * |CTRL-W_]|             TO BE IMPLEMENTED
 * |CTRL-W_^|             TO BE IMPLEMENTED
 * |CTRL-W__|             TO BE IMPLEMENTED
 * |CTRL-W_b|             TO BE IMPLEMENTED
 * |CTRL-W_c|             {@link com.maddyhome.idea.vim.action.window.CloseWindowAction}
 * |CTRL-W_d|             TO BE IMPLEMENTED
 * |CTRL-W_f|             TO BE IMPLEMENTED
 * |CTRL-W-F|             TO BE IMPLEMENTED
 * |CTRL-W-g]|            TO BE IMPLEMENTED
 * |CTRL-W-g}|            TO BE IMPLEMENTED
 * |CTRL-W-gf|            TO BE IMPLEMENTED
 * |CTRL-W-gF|            TO BE IMPLEMENTED
 * |CTRL-W_h|             {@link com.maddyhome.idea.vim.action.window.WindowLeftAction}
 * |CTRL-W_i|             TO BE IMPLEMENTED
 * |CTRL-W_j|             {@link com.maddyhome.idea.vim.action.window.WindowDownAction}
 * |CTRL-W_k|             {@link com.maddyhome.idea.vim.action.window.WindowUpAction}
 * |CTRL-W_l|             {@link com.maddyhome.idea.vim.action.window.WindowRightAction}
 * |CTRL-W_n|             TO BE IMPLEMENTED
 * |CTRL-W_o|             {@link com.maddyhome.idea.vim.action.window.WindowOnlyAction}
 * |CTRL-W_p|             TO BE IMPLEMENTED
 * |CTRL-W_q|             TO BE IMPLEMENTED
 * |CTRL-W_r|             TO BE IMPLEMENTED
 * |CTRL-W_s|             {@link com.maddyhome.idea.vim.action.window.HorizontalSplitAction}
 * |CTRL-W_t|             TO BE IMPLEMENTED
 * |CTRL-W_v|             {@link com.maddyhome.idea.vim.action.window.VerticalSplitAction}
 * |CTRL-W_w|             {@link com.maddyhome.idea.vim.action.window.WindowNextAction}
 * |CTRL-W_x|             TO BE IMPLEMENTED
 * |CTRL-W_z|             TO BE IMPLEMENTED
 * |CTRL-W_bar|           TO BE IMPLEMENTED
 * |CTRL-W_}|             TO BE IMPLEMENTED
 * |CTRL-W_<Down>|        {@link com.maddyhome.idea.vim.action.window.WindowDownAction}
 * |CTRL-W_<Up>|          {@link com.maddyhome.idea.vim.action.window.WindowUpAction}
 * |CTRL-W_<Left>|        {@link com.maddyhome.idea.vim.action.window.WindowLeftAction}
 * |CTRL-W_<Right>|       {@link com.maddyhome.idea.vim.action.window.WindowRightAction}
 * |CTRL-W_CTRL-H|        {@link com.maddyhome.idea.vim.action.window.WindowLeftAction}
 * |CTRL-W_CTRL-J|        {@link com.maddyhome.idea.vim.action.window.WindowDownAction}
 * |CTRL-W_CTRL-K|        {@link com.maddyhome.idea.vim.action.window.WindowUpAction}
 * |CTRL-W_CTRL-L|        {@link com.maddyhome.idea.vim.action.window.WindowRightAction}
 *
 *
 * 2.3. Square bracket commands
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 * |[_CTRL-D|             TO BE IMPLEMENTED
 * |[_CTRL-I|             TO BE IMPLEMENTED
 * |[#|                   TO BE IMPLEMENTED
 * |['|                   TO BE IMPLEMENTED
 * |[(|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedParenOpenAction}
 * |[star|                TO BE IMPLEMENTED
 * |[`|                   TO BE IMPLEMENTED
 * |[/|                   TO BE IMPLEMENTED
 * |[D|                   TO BE IMPLEMENTED
 * |[I|                   TO BE IMPLEMENTED
 * |[M|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionMethodPreviousEndAction}
 * |[P|                   {@link com.maddyhome.idea.vim.action.copy.PutVisualTextNoIndentAction}
 * |[P|                   {@link com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorNoIndentAction}
 * |[[|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionSectionBackwardStartAction}
 * |[]|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionSectionBackwardEndAction}
 * |[c|                   TO BE IMPLEMENTED
 * |[d|                   TO BE IMPLEMENTED
 * |[f|                   TO BE IMPLEMENTED
 * |[i|                   TO BE IMPLEMENTED
 * |[m|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionMethodPreviousStartAction}
 * |[p|                   {@link com.maddyhome.idea.vim.action.copy.PutVisualTextNoIndentAction}
 * |[p|                   {@link com.maddyhome.idea.vim.action.copy.PutTextAfterCursorNoIndentAction}
 * |[s|                   TO BE IMPLEMENTED
 * |[z|                   TO BE IMPLEMENTED
 * |[{|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedBraceOpenAction}
 * |]_CTRL-D|             TO BE IMPLEMENTED
 * |]_CTRL-I|             TO BE IMPLEMENTED
 * |]#|                   TO BE IMPLEMENTED
 * |]'|                   TO BE IMPLEMENTED
 * |])|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedParenCloseAction}
 * |]star|                TO BE IMPLEMENTED
 * |]`|                   TO BE IMPLEMENTED
 * |]/|                   TO BE IMPLEMENTED
 * |]D|                   TO BE IMPLEMENTED
 * |]I|                   TO BE IMPLEMENTED
 * |]M|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionMethodNextEndAction}
 * |]P|                   {@link com.maddyhome.idea.vim.action.copy.PutVisualTextNoIndentAction}
 * |]P|                   {@link com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorNoIndentAction}
 * |][|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionSectionForwardStartAction}
 * |]]|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionSectionForwardEndAction}
 * |]c|                   TO BE IMPLEMENTED
 * |]d|                   TO BE IMPLEMENTED
 * |]f|                   TO BE IMPLEMENTED
 * |]i|                   TO BE IMPLEMENTED
 * |]m|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionMethodNextStartAction}
 * |]p|                   {@link com.maddyhome.idea.vim.action.copy.PutVisualTextNoIndentAction}
 * |]p|                   {@link com.maddyhome.idea.vim.action.copy.PutTextAfterCursorNoIndentAction}
 * |]s|                   TO BE IMPLEMENTED
 * |]z|                   TO BE IMPLEMENTED
 * |]}|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionUnmatchedBraceCloseAction}
 *
 *
 * 2.4. Commands starting with 'g'
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 *
 * |g_CTRL-A|             not applicable
 * |g_CTRL-G|             {@link com.maddyhome.idea.vim.action.file.FileGetLocationInfoAction}
 * |g_CTRL-H|             {@link com.maddyhome.idea.vim.action.motion.select.SelectEnableBlockModeAction}
 * |g_CTRL-]|             TO BE IMPLEMENTED
 * |g#|                   {@link com.maddyhome.idea.vim.action.motion.search.SearchWordBackwardAction}
 * |g$|                   {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLastScreenColumnAction}
 * |g&|                   {@link com.maddyhome.idea.vim.action.change.change.ChangeLastGlobalSearchReplaceAction}
 * |v_g'|                 {@link com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineNoSaveJumpAction}
 * |g'|                   {@link com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkLineNoSaveJumpAction}
 * |g`|                   {@link com.maddyhome.idea.vim.action.motion.mark.MotionGotoMarkNoSaveJumpAction}
 * |gstar|                {@link com.maddyhome.idea.vim.action.motion.search.SearchWordForwardAction}
 * |g+|                   TO BE IMPLEMENTED
 * |g,|                   TO BE IMPLEMENTED
 * |g-|                   TO BE IMPLEMENTED
 * |g0|                   {@link com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenColumnAction}
 * |g8|                   {@link com.maddyhome.idea.vim.action.file.FileGetHexAction}
 * |g;|                   TO BE IMPLEMENTED
 * |g<|                   TO BE IMPLEMENTED
 * |g?|                   TO BE IMPLEMENTED
 * |g?g?|                 TO BE IMPLEMENTED
 * |gD|                   {@link com.maddyhome.idea.vim.action.motion.search.GotoDeclarationAction}
 * |gE|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionBigWordEndLeftAction}
 * |gF|                   TO BE IMPLEMENTED
 * |gH|                   {@link com.maddyhome.idea.vim.action.motion.select.SelectEnableLineModeAction}
 * |gI|                   {@link com.maddyhome.idea.vim.action.change.insert.InsertLineStartAction}
 * |gJ|                   {@link com.maddyhome.idea.vim.action.change.delete.DeleteJoinLinesAction}
 * |gN|                   {@link com.maddyhome.idea.vim.action.motion.gn.VisualSelectPreviousSearch}
 * |gN|                   {@link com.maddyhome.idea.vim.action.motion.gn.GnPreviousTextObject}
 * |gP|                   {@link com.maddyhome.idea.vim.action.copy.PutTextBeforeCursorActionMoveCursor}
 * |gQ|                   TO BE IMPLEMENTED
 * |gR|                   TO BE IMPLEMENTED
 * |gT|                   {@link com.maddyhome.idea.vim.action.motion.tabs.MotionPreviousTabAction}
 * |gU|                   {@link com.maddyhome.idea.vim.action.change.change.ChangeCaseUpperMotionAction}
 * |gV|                   TO BE IMPLEMENTED
 * |g]|                   TO BE IMPLEMENTED
 * |g^|                   {@link com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenNonSpaceAction}
 * |g_|                   {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLastNonSpaceAction}
 * |ga|                   {@link com.maddyhome.idea.vim.action.file.FileGetAsciiAction}
 * |gd|                   {@link com.maddyhome.idea.vim.action.motion.search.GotoDeclarationAction}
 * |ge|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionWordEndLeftAction}
 * |gf|                   TO BE IMPLEMENTED
 * |gg|                   {@link com.maddyhome.idea.vim.action.motion.updown.MotionGotoLineFirstAction}
 * |gh|                   {@link com.maddyhome.idea.vim.action.motion.select.SelectEnableCharacterModeAction}
 * |gi|                   {@link com.maddyhome.idea.vim.action.change.insert.InsertAtPreviousInsertAction}
 * |gj|                   TO BE IMPLEMENTED
 * |gk|                   {@link com.maddyhome.idea.vim.action.motion.updown.MotionUpNotLineWiseAction}
 * |gn|                   {@link com.maddyhome.idea.vim.action.motion.gn.VisualSelectNextSearch}
 * |gn|                   {@link com.maddyhome.idea.vim.action.motion.gn.GnNextTextObject}
 * |gm|                   {@link com.maddyhome.idea.vim.action.motion.leftright.MotionMiddleColumnAction}
 * |go|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionNthCharacterAction}
 * |gp|                   {@link com.maddyhome.idea.vim.action.copy.PutVisualTextMoveCursorAction}
 * |gp|                   {@link com.maddyhome.idea.vim.action.copy.PutTextAfterCursorActionMoveCursor}
 * |gq|                   {@link com.maddyhome.idea.vim.action.change.change.ReformatCodeMotionAction}
 * |gr|                   TO BE IMPLEMENTED
 * |gs|                   TO BE IMPLEMENTED
 * |gt|                   {@link com.maddyhome.idea.vim.action.motion.tabs.MotionNextTabAction}
 * |gu|                   {@link com.maddyhome.idea.vim.action.change.change.ChangeCaseLowerMotionAction}
 * |gv|                   {@link com.maddyhome.idea.vim.action.motion.visual.VisualSelectPreviousAction}
 * |gw|                   TO BE IMPLEMENTED
 * |g@|                   {@link com.maddyhome.idea.vim.action.change.OperatorAction}
 * |g~|                   {@link com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleMotionAction}
 * |g<Down>|              TO BE IMPLEMENTED
 * |g<End>|               {@link com.maddyhome.idea.vim.action.motion.leftright.MotionLastScreenColumnAction}
 * |g<Home>|              {@link com.maddyhome.idea.vim.action.motion.leftright.MotionFirstScreenColumnAction}
 * |g<Up>|                {@link com.maddyhome.idea.vim.action.motion.updown.MotionUpNotLineWiseAction}
 *
 *
 * 2.5. Commands starting with 'z'
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 * |z<CR>|                {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLineStartAction}
 * |z+|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLinePageStartAction}
 * |z-|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLineStartAction}
 * |z.|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollMiddleScreenLineStartAction}
 * |z=|                   TO BE IMPLEMENTED
 * |zA|                   TO BE IMPLEMENTED
 * |zC|                   {@link com.maddyhome.idea.vim.action.fold.VimCollapseRegionRecursively}
 * |zD|                   TO BE IMPLEMENTED
 * |zE|                   TO BE IMPLEMENTED
 * |zF|                   TO BE IMPLEMENTED
 * |zG|                   TO BE IMPLEMENTED
 * |zH|                   TO BE IMPLEMENTED
 * |zL|                   TO BE IMPLEMENTED
 * |zM|                   {@link com.maddyhome.idea.vim.action.fold.VimCollapseAllRegions}
 * |zN|                   TO BE IMPLEMENTED
 * |zO|                   {@link com.maddyhome.idea.vim.action.fold.VimExpandRegionRecursively}
 * |zR|                   {@link com.maddyhome.idea.vim.action.fold.VimExpandAllRegions}
 * |zW|                   TO BE IMPLEMENTED
 * |zX|                   TO BE IMPLEMENTED
 * |z^|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLinePageStartAction}
 * |za|                   TO BE IMPLEMENTED
 * |zb|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenLineAction}
 * |zc|                   {@link com.maddyhome.idea.vim.action.fold.VimCollapseRegion}
 * |zd|                   not applicable
 * |ze|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollLastScreenColumnAction}
 * |zf|                   not applicable
 * |zg|                   TO BE IMPLEMENTED
 * |zh|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnRightAction}
 * |zi|                   TO BE IMPLEMENTED
 * |zj|                   TO BE IMPLEMENTED
 * |zk|                   TO BE IMPLEMENTED
 * |zl|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnLeftAction}
 * |zm|                   TO BE IMPLEMENTED
 * |zn|                   TO BE IMPLEMENTED
 * |zo|                   {@link com.maddyhome.idea.vim.action.fold.VimExpandRegion}
 * |zr|                   TO BE IMPLEMENTED
 * |zs|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenColumnAction}
 * |zt|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLineAction}
 * |zv|                   TO BE IMPLEMENTED
 * |zw|                   TO BE IMPLEMENTED
 * |zx|                   TO BE IMPLEMENTED
 * |zz|                   {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollMiddleScreenLineAction}
 * |z<Left>|              {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnRightAction}
 * |z<Right>|             {@link com.maddyhome.idea.vim.action.motion.scroll.MotionScrollColumnLeftAction}
 *
 *
 * 3. Visual mode
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 *
 * |v_CTRL-\_CTRL-N|      {@link com.maddyhome.idea.vim.action.motion.visual.VisualExitModeAction}
 * |v_CTRL-\_CTRL-G|      TO BE IMPLEMENTED
 * |v_CTRL-A|             {@link com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberIncAction}
 * |v_CTRL-C|             {@link com.maddyhome.idea.vim.action.motion.visual.VisualExitModeAction}
 * |v_CTRL-G|             {@link com.maddyhome.idea.vim.action.motion.select.SelectToggleVisualMode}
 * |v_<BS>|               NVO mapping
 * |v_CTRL-H|             NVO mapping
 * |v_CTRL-O|             TO BE IMPLEMENTED
 * |v_CTRL-V|             NVO mapping
 * |v_<Esc>|              {@link com.maddyhome.idea.vim.action.motion.visual.VisualExitModeAction}
 * |v_CTRL-X|             {@link com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberDecAction}
 * |v_CTRL-]|             TO BE IMPLEMENTED
 * |v_!|                  {@link com.maddyhome.idea.vim.action.change.change.FilterVisualLinesAction}
 * |v_:|                  NVO mapping
 * |v_<|                  {@link com.maddyhome.idea.vim.action.change.shift.ShiftLeftVisualAction}
 * |v_=|                  {@link com.maddyhome.idea.vim.action.change.change.AutoIndentLinesVisualAction}
 * |v_>|                  {@link com.maddyhome.idea.vim.action.change.shift.ShiftRightVisualAction}
 * |v_b_A|                {@link com.maddyhome.idea.vim.action.change.insert.VisualBlockAppendAction}
 * |v_C|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesEndAction}
 * |v_D|                  {@link com.maddyhome.idea.vim.action.change.delete.DeleteVisualLinesEndAction}
 * |v_b_I|                {@link com.maddyhome.idea.vim.action.change.insert.VisualBlockInsertAction}
 * |v_J|                  {@link com.maddyhome.idea.vim.action.change.delete.DeleteJoinVisualLinesSpacesAction}
 * |v_K|                  TO BE IMPLEMENTED
 * |v_O|                  {@link com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsBlockAction}
 * |v_P|                  {@link com.maddyhome.idea.vim.action.copy.PutVisualTextAction}
 * |v_R|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesAction}
 * |v_S|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeVisualLinesAction}
 * |v_U|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeCaseUpperVisualAction}
 * |v_V|                  NV mapping
 * |v_X|                  {@link com.maddyhome.idea.vim.action.change.delete.DeleteVisualLinesAction}
 * |v_Y|                  {@link com.maddyhome.idea.vim.action.copy.YankVisualLinesAction}
 * |v_aquote|             {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockDoubleQuoteAction}
 * |v_a'|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockSingleQuoteAction}
 * |v_a(|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockParenAction}
 * |v_a)|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockParenAction}
 * |v_a<|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockAngleAction}
 * |v_a>|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockAngleAction}
 * |v_aB|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBraceAction}
 * |v_aW|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBigWordAction}
 * |v_a[|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBracketAction}
 * |v_a]|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBracketAction}
 * |v_a`|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBackQuoteAction}
 * |v_ab|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockParenAction}
 * |v_ap|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterParagraphAction}
 * |v_as|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterSentenceAction}
 * |v_at|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockTagAction}
 * |v_aw|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterWordAction}
 * |v_a{|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBraceAction}
 * |v_a}|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionOuterBlockBraceAction}
 * |v_c|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeVisualAction}
 * |v_d|                  {@link com.maddyhome.idea.vim.action.change.delete.DeleteVisualAction}
 * |v_gCTRL-A|            {@link com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberAvalancheIncAction}
 * |v_gCTRL-X|            {@link com.maddyhome.idea.vim.action.change.change.number.ChangeVisualNumberAvalancheDecAction}
 * |v_gJ|                 {@link com.maddyhome.idea.vim.action.change.delete.DeleteJoinVisualLinesAction}
 * |v_gq|                 {@link com.maddyhome.idea.vim.action.change.change.ReformatCodeVisualAction}
 * |v_gv|                 {@link com.maddyhome.idea.vim.action.motion.visual.VisualSwapSelectionsAction}
 * |v_g`|                 {@link com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkNoSaveJumpAction}
 * |v_iquote|             {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockDoubleQuoteAction}
 * |v_i'|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockSingleQuoteAction}
 * |v_i(|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockParenAction}
 * |v_i)|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockParenAction}
 * |v_i<|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockAngleAction}
 * |v_i>|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockAngleAction}
 * |v_iB|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBraceAction}
 * |v_iW|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBigWordAction}
 * |v_i[|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBracketAction}
 * |v_i]|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBracketAction}
 * |v_i`|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBackQuoteAction}
 * |v_ib|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockParenAction}
 * |v_ip|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerParagraphAction}
 * |v_is|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerSentenceAction}
 * |v_it|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockTagAction}
 * |v_iw|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerWordAction}
 * |v_i{|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBraceAction}
 * |v_i}|                 {@link com.maddyhome.idea.vim.action.motion.object.MotionInnerBlockBraceAction}
 * |v_o|                  {@link com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsAction}
 * |v_p|                  {@link com.maddyhome.idea.vim.action.copy.PutVisualTextAction}
 * |v_r|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeVisualCharacterAction}
 * |v_s|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeVisualAction}
 * |v_u|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeCaseLowerVisualAction}
 * |v_v|                  NV mapping
 * |v_x|                  {@link com.maddyhome.idea.vim.action.change.delete.DeleteVisualAction}
 * |v_y|                  {@link com.maddyhome.idea.vim.action.copy.YankVisualAction}
 * |v_~|                  {@link com.maddyhome.idea.vim.action.change.change.ChangeCaseToggleVisualAction}
 * |v_`|                  {@link com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkAction}
 * |v_'|                  {@link com.maddyhome.idea.vim.action.motion.mark.MotionGotoFileMarkLineAction}
 *
 *
 * 4. Select mode
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 * |<BS>|                 {@link com.maddyhome.idea.vim.action.motion.select.SelectDeleteAction}
 * |<CR>|                 {@link com.maddyhome.idea.vim.action.motion.select.SelectEnterAction}
 * |<DEL>|                {@link com.maddyhome.idea.vim.action.motion.select.SelectDeleteAction}
 * |<ESC>|                {@link com.maddyhome.idea.vim.action.motion.select.SelectEscapeAction}
 * |<C-G>|                {@link com.maddyhome.idea.vim.action.motion.select.SelectToggleVisualMode}
 * |<S-Down>|             {@link com.maddyhome.idea.vim.action.motion.updown.MotionShiftDownAction}
 * |<S-Left>|             {@link com.maddyhome.idea.vim.action.motion.leftright.MotionShiftLeftAction}
 * |<S-Right>|            {@link com.maddyhome.idea.vim.action.motion.leftright.MotionShiftRightAction}
 * |<S-Up>|               {@link com.maddyhome.idea.vim.action.motion.updown.MotionShiftUpAction}
 * |<Down>|               {@link com.maddyhome.idea.vim.action.motion.updown.MotionArrowDownAction}
 * |<Left>|               {@link com.maddyhome.idea.vim.action.motion.select.motion.SelectMotionLeftAction}
 * |<Right>|              {@link com.maddyhome.idea.vim.action.motion.select.motion.SelectMotionRightAction}
 * |<Up>|                 {@link com.maddyhome.idea.vim.action.motion.updown.MotionArrowUpAction}
 *
 * 5. Command line editing
 *
 * tag                    action
 * -------------------------------------------------------------------------------------------------------------------
 *
 * |c_CTRL-A|             TO BE IMPLEMENTED
 * |c_CTRL-B|             {@link javax.swing.text.DefaultEditorKit#beginLineAction}
 * |c_CTRL-C|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.CancelEntryAction}
 * |c_CTRL-D|             TO BE IMPLEMENTED
 * |c_CTRL-E|             {@link javax.swing.text.DefaultEditorKit#endLineAction}
 * |c_CTRL-G|             TO BE IMPLEMENTED
 * |c_CTRL-H|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.DeletePreviousCharAction}
 * |c_CTRL-I|             TO BE IMPLEMENTED
 * |c_CTRL-J|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.CompleteEntryAction}
 * |c_CTRL-K|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.StartDigraphAction}
 * |c_CTRL-L|             TO BE IMPLEMENTED
 * |c_CTRL-M|             {@link com.maddyhome.idea.vim.action.ex.ProcessExEntryAction}
 * |c_CTRL-N|             TO BE IMPLEMENTED
 * |c_CTRL-P|             TO BE IMPLEMENTED
 * |c_CTRL-Q|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.StartDigraphAction}
 * |c_CTRL-R|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.InsertRegisterAction}
 * |c_CTRL-R_CTRL-A|      TO BE IMPLEMENTED
 * |c_CTRL-R_CTRL-F|      TO BE IMPLEMENTED
 * |c_CTRL-R_CTRL-L|      TO BE IMPLEMENTED
 * |c_CTRL-R_CTRL-O|      TO BE IMPLEMENTED
 * |c_CTRL-R_CTRL-P|      TO BE IMPLEMENTED
 * |c_CTRL-R_CTRL-R|      TO BE IMPLEMENTED
 * |c_CTRL-R_CTRL-W|      TO BE IMPLEMENTED
 * |c_CTRL-T|             TO BE IMPLEMENTED
 * |c_CTRL-U|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.DeleteToCursorAction}
 * |c_CTRL-V|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.StartDigraphAction}
 * |c_CTRL-W|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.DeletePreviousWordAction}
 * |c_CTRL-Y|             TO BE IMPLEMENTED
 * |c_CTRL-\_e|           TO BE IMPLEMENTED
 * |c_CTRL-\_CTRL-G|      TO BE IMPLEMENTED
 * |c_CTRL-\_CTRL-N|      TO BE IMPLEMENTED
 * |c_CTRL-_|             not applicable
 * |c_CTRL-^|             not applicable
 * |c_CTRL-]|             TO BE IMPLEMENTED
 * |c_CTRL-[|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.EscapeCharAction}
 * |c_<BS>|               {@link com.maddyhome.idea.vim.ui.ExEditorKit.DeletePreviousCharAction}
 * |c_<CR>|               {@link com.maddyhome.idea.vim.ui.ExEditorKit.CompleteEntryAction}
 * |c_<C-Left>|           {@link javax.swing.text.DefaultEditorKit#previousWordAction}
 * |c_<C-Right>|          {@link javax.swing.text.DefaultEditorKit#nextWordAction}
 * |c_<Del>|              {@link javax.swing.text.DefaultEditorKit#deleteNextCharAction}
 * |c_<Down>|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.HistoryDownFilterAction}
 * |c_<End>|              {@link javax.swing.text.DefaultEditorKit#endLineAction}
 * |c_<Esc>|              {@link com.maddyhome.idea.vim.ui.ExEditorKit.EscapeCharAction}
 * |c_<Home>|             {@link javax.swing.text.DefaultEditorKit#beginLineAction}
 * |c_<Insert>|           {@link com.maddyhome.idea.vim.ui.ExEditorKit.ToggleInsertReplaceAction}
 * |c_<Left>|             {@link javax.swing.text.DefaultEditorKit#backwardAction}
 * |c_<LeftMouse>|        not applicable
 * |c_<MiddleMouse>|      TO BE IMPLEMENTED
 * |c_<NL>|               {@link com.maddyhome.idea.vim.ui.ExEditorKit.CompleteEntryAction}
 * |c_<PageUp>|           {@link com.maddyhome.idea.vim.ui.ExEditorKit.HistoryUpAction}
 * |c_<PageDown>|         {@link com.maddyhome.idea.vim.ui.ExEditorKit.HistoryDownAction}
 * |c_<Right>|            {@link javax.swing.text.DefaultEditorKit#forwardAction}
 * |c_<S-Down>|           {@link com.maddyhome.idea.vim.ui.ExEditorKit.HistoryDownAction}
 * |c_<S-Left>|           {@link javax.swing.text.DefaultEditorKit#previousWordAction}
 * |c_<S-Right>|          {@link javax.swing.text.DefaultEditorKit#nextWordAction}
 * |c_<S-Tab>|            TO BE IMPLEMENTED
 * |c_<S-Up>|             {@link com.maddyhome.idea.vim.ui.ExEditorKit.HistoryUpAction}
 * |c_<Tab>|              TO BE IMPLEMENTED
 * |c_<Up>|               {@link com.maddyhome.idea.vim.ui.ExEditorKit.HistoryUpFilterAction}
 * |c_digraph|            {char1} <BS> {char2} {@link com.maddyhome.idea.vim.ui.ExEditorKit.StartDigraphAction}
 * |c_wildchar|           TO BE IMPLEMENTED
 * |'cedit'|              TO BE IMPLEMENTED
 *
 *
 * 6. Ex commands
 *
 * tag                    handler
 * -------------------------------------------------------------------------------------------------------------------
 *
 * |:map|                 {@link com.maddyhome.idea.vim.ex.handler.MapHandler}
 * |:nmap|                ...
 * |:vmap|                ...
 * |:omap|                ...
 * |:imap|                ...
 * |:cmap|                ...
 * |:noremap|             ...
 * |:nnoremap|            ...
 * |:vnoremap|            ...
 * |:onoremap|            ...
 * |:inoremap|            ...
 * |:cnoremap|            ...
 * |:shell|               {@link com.maddyhome.idea.vim.ex.handler.ShellHandler}
 * |:sort|                {@link com.maddyhome.idea.vim.ex.handler.SortHandler}
 * |:source|              {@link com.maddyhome.idea.vim.ex.handler.SourceHandler}
 * |:qall|                {@link com.maddyhome.idea.vim.ex.handler.ExitHandler}
 * |:quitall|             {@link com.maddyhome.idea.vim.ex.handler.ExitHandler}
 * |:quitall|             {@link com.maddyhome.idea.vim.ex.handler.ExitHandler}
 * |:wqall|               {@link com.maddyhome.idea.vim.ex.handler.ExitHandler}
 * |:xall|                {@link com.maddyhome.idea.vim.ex.handler.ExitHandler}
 * |:command|             {@link com.maddyhome.idea.vim.ex.handler.CmdHandler}
 * |:delcommand|          {@link com.maddyhome.idea.vim.ex.handler.DelCmdHandler}
 * |:comclear|            {@link com.maddyhome.idea.vim.ex.handler.CmdClearHandler}
 * ...
 *
 * The list of supported Ex commands is incomplete.
 *
 *
 * A. Misc commands
 *
 * tag                    handler
 * -------------------------------------------------------------------------------------------------------------------
 * |]b|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionCamelEndLeftAction}
 * |]w|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionCamelEndRightAction}
 * |[b|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionCamelLeftAction}
 * |[w|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionCamelRightAction}
 * |g(|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionSentencePreviousEndAction}
 * |g)|                   {@link com.maddyhome.idea.vim.action.motion.text.MotionSentenceNextEndAction}
 *
 *
 * See also :help index.
 *
 * @author vlan
 */
package com.maddyhome.idea.vim;

파일

  • ~/.ideavimrc

ideavim용 rc 파일이다.

~/.ideavimrc 파일에서 ~/.vimrc 파일을 다음과 같이 읽을 수 있다.

source ~/.vimrc

ideavim은 간단한 패턴 매칭을 통해 ~/.ideavimrc 파일을 분석한다. VimL 파일의 분석은 VIM-669를 보라.

user.home JVM 옵션을 덮어쓰면 ideavim이 .ideavimrc 파일을 찾는데 영향을 줄 것이다.

예를 들어, -Duser.home=/my/alternate/home인 경우 ideavim은 ~/.ideavimrc 대신 /my/alternate/home/.ideavimrc를 찾을 것이다.

대안으로, XDG를 사용해 초기 명령어를 설정할 수 있다. $XDG_CONFIG_HOME$/ideavim/ideavimrc 파일에 설정정보를 추가하자.

Emulated Vim Plugins

ideavim extension은 오리지널 vim plugin의 일부를 흉내낸다. 

ideavim extension을 사용하기 위해서는 ~/.ideavimrc 파일에 다음 명령어를 통해 활성화해야 한다.

set <extension-name>

사용 가능한 extension:

  • easymotion

IdeaVim-EasyMotion AceJump plugin을 설치한다.

set easymotion 명령어를 추가한다.

vim-easymotion을 흉내낸다.

모든 명령어를 지원한다. 

지원되는 명령어 목록은 vim-easymotion에서 확인하자.

  • surround

set surround 명령어를 추가한다.

vim-surround가 원조이다.

ys, cs, ds, S 명령어를 지원한다.

  • multiple-cursors

set multiple-cursors 명령어를 추가한다.

vim-multiple-cursors가 원조이다.

<A-n>, <A-x>, <A-p>, g<A-n> 명령어를 지원한다.

  • commentary

set commentary 명령어를 추가한다.

commentary.vim가 원조이다.

gcc, gc + motion, v_gc 명령어를 지원한다.

IDE에서 변경

  • Undo/Redo

Intellij 플랫폼에서 ideavim plugin은 undo/redo 기능을 지원한다.

u와 <C-R> 명령어는 원조 vim과 다르다. undo/redo에 대한 vim 호환성은 향후 릴리즈에서 개선된다.

 

  • Escape

다이얼로그 창에서 <Esc> 사용은 여러운 문제가 남아있다. 최신의 다이얼로그 창에 대해 vim emulator는 <Esc>가 작동하지 않고, insert mode로 만든다. 대신 <C-c> 또는 <C-[> 명령어를 사용해야 한다. 일부 다이얼로그 창에서 normal mode는 기본으로 변환된다. 다이얼로그 창에서 vim emulator 사용은 개선할 부분이다.

 

IDE 액션 실행

ideavim은 2개의 명령어를 추가했다. 이는 Ex 명령어 또는 :map 명령어로 임의의 IDE 액션을 나열하고 실행한다.

  • :actionlist [pattern]

이름 또는 keymap 패턴으로 IDE 액션을 찾는다.(예, :actionlist extract, :actionlist <C-D>)

  • :action {name}

name 액션을 실행한다.

 

예를 들어, 다음은 \r이 Reformat Code 액션과 연결되어 있다.

:map \r :action ReformatCode<CR>

기여

CONTRIBUTING.md를 보라.

참고