vim 学习路径

说起来已经很久很久都没有写博客了。从毕业到工作,这段时间感觉很忙很忙,失去了自己思考的时间,每天感觉像流水线上的机器,不停的写代码写代码,自己本身却没有多大的提升。

新手不要使用终端 vim。

之前断断续续的写过一些 vim 的相关文章,和断断续续的使用 vim。 之前一直想着把 vim 当作 IDE 使用。但是繁琐的配置和一些不敬如人意的地方,导致在使用过程中会逐步的放弃。

而最近两个月,我开始使用了 vim。使用 vim 来说,就像打字一样:在打字的时候我们大部分的时间是在思考内容,而手指敲击键盘只是一种肌肉记忆,可以准确的打出我们要的文字,而刚刚开始打字的时候,我们基本是看着键盘,一个符号一个符号的进行编辑,看一下键盘敲一个,而随着熟练度的上升,我们可以做到盲打,对于键位来说,基本是靠肌肉记忆,不会刻意的看键盘了。

不是把 vim 当作 IDE,而是把 IDE 的 keymap 设置 vim。 目前,大多数的 IDE 都会有 vim 的相关 keymap 设置,而我目前使用的工具主要是 Vscode 和 Goland。 这两款工具都对 vim 有良好的支持。

针对 vim 上手困难,首先的一个困难我觉得来自于它的模式,说实话,从我接触电脑来说,无模式感觉是一种正常的情况。打开 word,可以直接进行编辑,打开 IDE,可以直接进行编码,这种情况对与我来说那就是理所当然,就应该是这样。

而这些对于 vim 来看,有显示的那么反直觉,打开后无从下手,但是当你学会编辑,需要移动的时候,不停的在 normal 和 insert 两个模式换来换去。

这些对于刚刚入手 vim 来说,都将成为放弃的理由。

当你逐渐了解了 vim 的模式之后,剩下的就是 vim 的命令,或者说是快捷键。

首先就是移动,通过 g,h,j,k 四个键来进行光标移动,而不是我们习惯的方向键(虽然方向键也可以移动),熟练使用这四个键进行光标移动绝对是入门 vim 的重要点,刚刚开始的时候是在强迫自己使用这四个键来进行移动,下意识的练习才能使自己不断的掌握 vim 的基本操作。

除了光标的移动,那么剩下的最重要的功能就是编辑了。在编辑过程中,单单就插入来说就有多个快捷键,例如 iIaAoO 等,都可以从 normal 模式转化为 insert 模式,但是每个命令又有细微的差别,例如 a 可以理解为 append ,那么就是在光标都追加单词,而 i 可以记忆为 insert ,表示为光标前添加。

为了熟练的掌握这些命令,在刚刚开始使用的时候,嘴里或者心里都会默念一些 “口诀”

例如我修改引号内代码,就念 change inner " 手上对应的 ci⇧ '

但是还有一个问题,你需要知道这些快捷键,你才能在心中默念出相关“口诀”,vim的相关命令比较多,而且同一键在不同的情况下代表的含义是不一样的,比如上述提到的 i,可以是 insert,还可以是 inner

这些操作都不需要任何的插件,也不需要任何的设置,对于 vim 来说,这些操作都是一致的。

这里我贴出我的 vim 配置。分别是 vscode 和 goland 的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
{
    "vim.easymotion": true,
    "vim.incsearch": true,
    "vim.useSystemClipboard": true,
    "vim.useCtrlKeys": true,
    "vim.hlsearch": true,
    "vim.insertModeKeyBindings": [
        {
            "before": [
                "j",
                "j"
            ],
            "after": [
                "<Esc>"
            ]
        }
    ],
    "vim.normalModeKeyBindingsNonRecursive": [
        {
            "before": [
                "<leader>",
                "d"
            ],
            "after": [
                "d",
                "d"
            ]
        },
        {
            "before": [
                "<C-n>"
            ],
            "commands": [
                ":nohl"
            ]
        },
        {
            "before": [
                "K"
            ],
            "commands": [
                "lineBreakInsert"
            ],
            "silent": true
        },
        {
            "before": [
                "leader",
                "="
            ],
            "commands": [
                {
                    "command": "editor.action.formatDocument"
                }
            ]
        },
        {
            "before": [
                "leader",
                "g"
            ],
            "commands": [
                {
                    "command": "go.test.generate.function"
                }
            ]
        }
    ],
    "vim.leader": "<space>",
    "vim.handleKeys": {
        "<C-a>": false,
        "<C-f>": false
    },
    "editor.lineNumbers": "relative"
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"" Source your .vimrc
"source ~/.vimrc
let mapleader=" "
"" -- Suggested options --
" Show a few lines of context around the cursor. Note that this makes the
" text scroll if you mouse-click near the start or end of the window.
set scrolloff=5
set so=5
"set ideajoin
"set idearefactormode=keep
"set relativenumber
set nu
set showmode
set relativenumber

set clipboard+=unnamed
set clipboard+=ideaput
set virtualedit=onemore
"set cursorline
set keep-english-in-normal

" Do incremental searching.
set incsearch

" Don't use Ex mode, use Q for formatting.
map Q gq

set surround
set multiple-cursors
set commentary
set argtextobj
" set easymotion
set textobj-entire
set ReplaceWithRegister
set exchange

"" -- Map IDE actions to IdeaVim -- https://jb.gg/abva4t
"" Map \r to the Reformat Code action


"" Map <leader>d to start debug
"map <leader>d <Action>(Debug)

"" Map \b to toggle the breakpoint on the current line
"map \b <Action>(ToggleLineBreakpoint)

" map <leader>f <Plug>(easymotion-s)
" map <leader>e <Plug>(easymotion-f)

nmap <leader>d <Action>(Debug) " Debug 当前方法
map <leader>r <Action>(RenameElement) " 重命名变量
noremap <leader>c <Action>(Stop)
noremap <leader>z <Action>(ToggleDistractionFreeMode) " 禅模式

map <leader>s <Action>(SelectInProjectView)
map <leader>a <Action>(Annotate)
map <leader>h <Action>(Vcs.ShowTabbedFileHistory)
map <S-Space> <Action>(GotoNextError)

map <leader>b <Action>(ToggleLineBreakpoint) " 打断点
map <leader>o <Action>(FileStructurePopup)
" Editor
nmap <leader>= <Action>(ReformatCode)

" Find more examples here: https://jb.gg/share-ideavimrc
" 全局查找
noremap g/ <ESC>:action FindInPath<CR>

noremap / <ESC>:action Find<CR>
noremap <leader>g <ESC>:action Generate<CR>
set ideajoin