ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • IdeaVim
    IDE 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를 보라.

    참고

     

     

     

     

     

    'IDE' 카테고리의 다른 글

    Code Folding(Collapse)  (0) 2020.01.10
    jetbrains 제품  (0) 2020.01.10
    IDEA - GitHub 로그인  (0) 2019.12.27
Designed by Tistory.