vim使用教程

vim使用教程

本文先概述什么是vim以及为什么要学习vim,然后介绍vim的基础操作(包括normal模式、编辑模式、命令模式、可视化模式这4个模式,以及3个模式下的一些基础命令),最后介绍如何通过插件使你的vim赏心悦目。


vim简介

  1. 什么是vim?

vim是Linux/Unix下的文本编辑器,类似于记事本,是vi的改进版本,纯键盘友好。

  1. 为什么要学习vim?

后端免不了和服务器打交道,而服务器往往需要24 x 7 x 365,所以稳定的Linux服务器成了首选。在Linux服务器上没有记事本,只有vim文本编辑器;且服务器往往不配备鼠标,所以纯键盘友好的vim编辑器是最佳选择。简单来说,不会基础的vim操作,在Linux服务器上寸步难行。

  1. 命令帮助

:help commandName


vim的4个模式及基本命令

  1. normal模式

normal模式是vim的默认模式,也就是通过vim filename命令打开文件时最初始的模式,只可以浏览,不可用编辑。如图:
normal模式

在编辑模式/命令模式下,想要退回到normal模式,只需要按escctrl+[即可。

常用命令有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 移动
w #word,移动到下一个单词开头
b #backward,移动到上一个单词开头
0 #移动到行首
$ #移动到行尾
gg #移动到文件开头
G # 【移动到文件结尾】!!!
ctrl + u #向上翻页
ctrl + f #向下翻页
zz #将当前行置到屏幕中间

# 删除
x #删除某个字符
dd #删除行

# 修改
r #replace,r后接字符,可以快速将光标处字符替换为r后的字符
s #substitute,删除光标处字符,并进入插入模式
C #删除整行,并进入插入模式

# 查找
/ #查找/后的字符,按n可以向后匹配

u #undo,回退
  1. 编辑模式

在normal模式下通过如下命令进入编辑模式:

1
2
3
4
5
6
7
gi  #快速回到上次编辑位置
i #insert,在光标后插入
a #append,在光标前插入
o #open a line below,在光标下一行插入
I #在当前行末尾插入
A #在当前行开头插入
O #OPEN A LINE ABOVE,在光标上一行插入

编辑模式下的常用vim命令:

1
2
3
4
# 删除
ctrl + h #删除上一个字符
ctrl + w #删除上一个单词
ctrl + h #删除上一行
  1. 命令模式

在normal模式/编辑模式下通过命令:进入,键入命令即可:

  • wq:write quit,保存退出

  • set nu:set number,设置行号
    set nu

  • sp:split,水平分屏。如需退出,使用:q即可。如需切换屏幕,使用ctrl + ww即可。
    sp

  • vs:virtical split,垂直分屏。如需退出,使用:q即可。如需切换屏幕,使用ctrl + ww即可。
    vs

  • %s/str1/str2/g:全局替换,将字符串str1替换为str2

  • syntax on:开启语法高亮

  1. 可视化模式

为了方便选取文本,vim引入类可视化(visual)模式,该模式下可以进行全局操作块状选择。在normal模式下通过执行命令:

1
2
3
4
5
v         #行内选择字符
V #选中一行
ctrl + v #Visual Block,块状选择
d #delete,删除
y #yank,复制

vim配置文件~/.vimrc

vim配置文件是用户目录(~)下的隐藏文件(.),通过命令vim ~/.vimrc即可打开,可以对vim进行一系列持久化的配置。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
"vim注释采用单个引号
set backspace=2 "可随时用退格键删除
set nu "设置行号,nu(mber)
set cursorline "光标所在行高亮
set ruler "在状态栏显示光标的当前位置
set showmode "在底部显示,当前处于命令模式/插入模式
set showcmd "命令模式下,在底部显示当前键入的命令
set showmatch "光标遇到圆括号、方括号、大括号时,自动高亮显示匹配的另一个括号
set incsearch "输入模式搜索时,每输入一个字符,就自动跳到第一个匹配的结果
set hlsearch "高亮(high light)搜索
set foldmethod=indent "设置折叠方式
set wrap "自动拆行,太长的行分为几行显示
set visualbell "出错时发出视觉提示,一般是屏幕闪烁

vim插件

可以通过VimAwesome查找需要的插件。

  1. vim插件管理器:vim-plug

快捷地安装和管理其他vim插件。详情请访问:vim-plug项目地址
安装:通过curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim命令即可安装。
使用:
①在~/.vimrc文件中添加如下代码:

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
call plug#begin('~/.vim/plugged')

"通过Plug 'github-user/github-projName'即可快速安装

"vim-startify启动界面插件
Plug 'mhinz/vim-startify'
"vim-airline状态栏美化插件
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
"vim代码缩进线
Plug 'yggdroot/indentline'
"vim文件目录树
Plug 'scrooloose/nerdtree'
"python-mode
Plug 'python-mode/python-mode'

"solarized主题
Plug 'altercation/vim-colors-solarized'

call plug#end()

"colorscheme必须写在call plug#end()后面,否则报错找不到字体solarized
syntax enable
set background=dark
colorscheme solarized

②通过:PlugInstall安装插件

vim-plug

③通过:source ~/.vimrc命令重新加载配置文件

报错了也不要紧……原理我不太清楚,好像vim是不需要source配置文件的……

  1. vim启动界面插件:vim-startify

输入vim命令时显示一个较美观的界面,同时展示最近打开的文件。详情请访问:vim-startify项目地址
vim-startify

  1. vim状态栏美化:vim-airline

详情请访问:vim-airline项目地址

  1. vim代码缩进线:indentline

详情请访问:indentline项目地址

  1. solarized字体

详情访问:vim-colors-solarized项目地址
首先在~/.vimrc中添加Plug 'altercation/vim-colors-solarized',然后执行:source ~/.vimrc,接着通过:PlugInstall安装插件。
安装完成后,在~/.vimrccall plug#end()后面添加如下代码完成持久化:

1
2
3
4
" colorscheme必须写在call plug#end()后面,否则报错找不到字体solarized
syntax enable
set background=dark
colorscheme solarized
  1. Go语言开发环境

~/.vimrc中添加如下代码,然后执行:PluginInstall即可。

coc.nvim项目地址
首先需要将mac下的vim升级为vim8

  1. ~/.vimrc文件中添加如下配置,然后通过:PlugIntall安装:
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
call plug#begin('~/.vim/plugged')

"Go语言开发环境
Plug 'fatih/vim-go'
"自动补全插件
Plug 'neoclide/coc.nvim'

call plug#end()

" if hidden is not set, TextEdit might fail.
set hidden

" Some servers have issues with backup files, see #649
set nobackup
set nowritebackup

" Better display for messages
set cmdheight=2

" You will have bad experience for diagnostic messages when it's default 4000.
set updatetime=300

" don't give |ins-completion-menu| messages.
set shortmess+=c

" always show signcolumns
set signcolumn=yes

" Use tab for trigger completion with characters ahead and navigate.
" Use command ':verbose imap <tab>' to make sure tab is not mapped by other plugin.
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction

" Use <c-space> to trigger completion.
inoremap <silent><expr> <c-space> coc#refresh()

" Use <cr> to confirm completion, `<C-g>u` means break undo chain at current position.
" Coc only does snippet and additional edit on confirm.
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
" Or use `complete_info` if your vim support it, like:
" inoremap <expr> <cr> complete_info()["selected"] != "-1" ? "\<C-y>" : "\<C-g>u\<CR>"

" Use `[g` and `]g` to navigate diagnostics
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

" Remap keys for gotos
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

" Use K to show documentation in preview window
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction

" Highlight symbol under cursor on CursorHold
autocmd CursorHold * silent call CocActionAsync('highlight')

" Remap for rename current word
nmap <leader>rn <Plug>(coc-rename)

" Remap for format selected region
xmap <leader>f <Plug>(coc-format-selected)
nmap <leader>f <Plug>(coc-format-selected)

augroup mygroup
autocmd!
" Setup formatexpr specified filetype(s).
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
" Update signature help on jump placeholder
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end

" Remap for do codeAction of selected region, ex: `<leader>aap` for current paragraph
xmap <leader>a <Plug>(coc-codeaction-selected)
nmap <leader>a <Plug>(coc-codeaction-selected)

" Remap for do codeAction of current line
nmap <leader>ac <Plug>(coc-codeaction)
" Fix autofix problem of current line
nmap <leader>qf <Plug>(coc-fix-current)

" Create mappings for function text object, requires document symbols feature of languageserver.
xmap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap if <Plug>(coc-funcobj-i)
omap af <Plug>(coc-funcobj-a)

" Use <TAB> for select selections ranges, needs server support, like: coc-tsserver, coc-python
nmap <silent> <TAB> <Plug>(coc-range-select)
xmap <silent> <TAB> <Plug>(coc-range-select)

" Use `:Format` to format current buffer
command! -nargs=0 Format :call CocAction('format')

" Use `:Fold` to fold current buffer
command! -nargs=? Fold :call CocAction('fold', <f-args>)

" use `:OR` for organize import of current buffer
command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')

" Add status line support, for integration with other plugin, checkout `:h coc-status`
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}

" Using CocList
" Show all diagnostics
nnoremap <silent> <space>a :<C-u>CocList diagnostics<cr>
" Manage extensions
nnoremap <silent> <space>e :<C-u>CocList extensions<cr>
" Show commands
nnoremap <silent> <space>c :<C-u>CocList commands<cr>
" Find symbol of current document
nnoremap <silent> <space>o :<C-u>CocList outline<cr>
" Search workspace symbols
nnoremap <silent> <space>s :<C-u>CocList -I symbols<cr>
" Do default action for next item.
nnoremap <silent> <space>j :<C-u>CocNext<CR>
" Do default action for previous item.
nnoremap <silent> <space>k :<C-u>CocPrev<CR>
" Resume latest coc list
nnoremap <silent> <space>p :<C-u>CocListResume<CR>
  1. 执行:CocInfo可以查看coc.nvim对应信息,则说明安装成功。
  2. 执行:GoInstallBinaries,通过vim-go安装补全工具:gopls
  3. 执行:CocConfig,配置Golanguageserver
1
2
3
4
5
6
7
8
9
{
"languageserver": {
"golang": {
"command": "gopls",
"rootPatterns": ["go.mod", ".vim/", ".git/", ".hg/"],
"filetypes": ["go"]
}
}
}
-------------本文结束感谢您的阅读-------------

本文标题:vim使用教程

文章作者:DragonBaby308

发布时间:2019年05月23日 - 11:52

最后更新:2020年01月15日 - 21:14

原始链接:http://www.dragonbaby308.com/vim-tutorials/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%