Vim学习笔记

VIM是一款神一样的编辑器,起初是Linux的标配编辑器,至于它的起源和好处我不想多讲,主要是我自己都搞不懂,我只是认为好东西肯定要花功夫之后你才会真正体会它的好,而我学它的原因只是因为我想像大神一样使用这等神一样的编辑器,好吧,最主要的是我想在Linux编辑一些东西。当然,多学一样东西,没什么坏处。

此笔记只是记录我平时用到的,一些高深的,可能就不写了,等以后真的用到了,再学习。

安装什么的咱就不说了,Linux的话,应该自带VIM了,如果没有的话,请自行搜索安装方法。如果是Windows的话,请下载安装gVim。如果是Mac的话,你肯定比我懂。

普通的编辑软件(比如记事本、EditPlus、Notepad++等)都没有模式,或者只有一种模式(编辑模式),而VIM不止一种,我这边自己定义为三种,Normal模式(正常模式)、Command模式(命令模式)、Edit 模式(编辑模式)。可能其他地方只分了两种,但是我说了这里是我自己这么归类而已,主要为了分清楚。

  • Normal模式(正常模式) 使用键盘的按键进行相关操作。
  • Command模式(命令模式) 通过输入冒号(英文的“:”),然后键入相关命令
  • Edit 模式(编辑模式) 进行编辑文本,与普通的一致。

我要记得就是正常模式的按键和命令模式的命令了。(纯手打,不复制粘贴)

另外,需要注意的是,如果您的配置文件更改过,可能会造成下面的一些快捷键失效,请检查自己的配置文件。

我再次声明下,这个这是给我自己学习记录使用的,可能有些错误之处,请参考大牛的文章。

正常模式

打开vim或者gVim就是处于正常模式了。如果不确定的话,多按几次Esc就会退回到正常模式。

以下的按键区分大小写,如果不愿意按大小写切换按键,可以按住Shift + 按键,即是大写。

  • [n]表示数字,比如3。
  • [c]表示一个字符,比如c。
  • [s]表示字符串,比如string。

h    光标向左移动一格,可带数字,比如3h,向左移动三格
j    光标向下移动一格 ,可带数字,比如3j,向下移动三格
k    光标向上移动一格 ,可带数字,比如3k,向上移动三格
l    光标向右移动一格 ,可带数字,比如3l,向右移动三格
Ctrl+F    向下翻一页
Ctrl+B    向上翻一页
gg    光标移动到第一行首字符
G    光标移动到最后一行首字符
[n]G    光标移动到第n行首字符
x    删除目前光标的字符
i    进入编辑模式,插入符在光标字符的前面
dd    删除当前行,并保存到剪贴板上(相当于剪切Ctrl+X)
[n]dd    删除当前行及下面的n-1行,共n行,并保存到剪贴板上,例如:3dd
y    复制当前行到剪贴板(相当于复制Ctrl+C)
[n]y    复制当前行开始共n行到剪贴板
p    粘贴剪贴板中到内容到光标下一行(相当于粘贴Ctrl+V)
[n]p    粘贴剪贴板中到内容到光标下一行n次
u    撤销(相当于Ctrl+Z)
Ctrl+R    恢复撤销的动作
w    光标移动到下一个单词的首字母上(中文的话以空格为单位),可加数字,比如3w,移动三次。
b    光标移动到上一个单词的首字母上(中文的话以空格为单位),可加数字,比如3b,移动三次。
e    光标移动到下一个单词的尾字母上(中文的话以空格为单位),可加数字,比如3e,移动三次。
ge    光标移动到上一个单词的尾字母上(中文的话以空格为单位),可加数字,比如3ge,移动三次。
$    移动光标到行尾,与键同效
^    移动光标到行首第一个非空白字符
0    移动光标到行首,与键同效
%    匹配与当前光标所指的括号对应的括号
[n]%    移动光标到文档的n%出,比如50%,表示中部
H    移动光标到顶部,Home
M    移动光标到中部,Middle
L    移动光标到底部,Last
Shift+ZZ    保存并关闭
/[s]    查找[s],需回车,按n表示下一个匹配的地方,N表示上一个匹配的地方,此处查找匹配大小写
*    查找当前光标单词
#    反方向查找当前光标单词

以下为我不是很常用到的一些快捷键

a    进入编辑模式,插入符在光标字符的后面
o    进入编辑模式,插入符在光标字符的另起一行开头
O    进入编辑模式,插入符在光标字符的另起上一行一行开头
J    删除当前行的换行符,下一行移到本行末尾
f[c]    在当前行,移动光标到以后的字符[c]上。
F[c]     在当前行,移动光标到前面的字符[c]上。
t[c]    在当前行,移动光标到以后的字符[c]前一个字符上。
T[c]    在当前行,移动光标到前面的字符[c]前一个字符上。
Ctrl+G    查看当前行在文档中的位置,例如40%
Ctrl+U    向下翻半页
Ctrl+D    向上翻半页
zz    把当前行至于屏幕中央
zt    把当前行至于屏幕顶部
zb    把当前行至于屏幕底部
?[s]    反方向查找[s],需回车,按n表示下一个匹配的地方,N表示上一个匹配的地方,此处查找匹配大小写
F1    查看帮助文档,Ctrl+]和Ctrl+O,分别是跳转到链接的内容和返回。
``    此次光标位置和上次光标位置来回切换
Ctrl+O    跳转到前一次光标位置
Ctrl+I    跳转到后一次光标位置
m[c]    标记当前光标位置为[c],比如ma
`[c]    跳转到标记为[c]的光标位置
'[c]    跳转到标记为[c]的行首

这里看起来命令很少,但是由于这些命令都可以自由组合,且有些命令支持数字,即多次操作,故组合之后会超多。用到熟练确实很难,但是也同样能够事半功倍。

命令模式

当在正常模式下(可多按几次Esc就会退回到正常模式)输入冒号“:”(英文状态下),即在最下面可以显示你的输入的,此模式为命令模式。然后输入相关指令再敲回车即可,以下的命令中最后都要敲回车。

VIM正常模式

:q    关闭不保存
:q!    强制关闭并不保存
:w    保存但不退出
:w!    强制保存
:wq    保存并关闭
:wq!    强制保存并关闭
:help    查看帮助文档,Ctrl+]和Ctrl+O,分别是跳转到链接的内容和返回。
:e ..\_vimrc    打开上级目录中的_vimrc文件中

以下是一些不常用到的命令

:set ignorecase        忽略大小写
:set noignorecase    匹配大小写
:set hlsearch        高亮显示搜索结果
:set nohlsearch        关闭高亮显示搜索结果
:nohlsearch        关闭此次高亮
:set incsearch        开启即打即找搜索功能
:set noincsearch    关闭即打即找搜索功能
:set wrapscan        开启到达底部从头搜索功能
:set nowrapscan    关闭到达底部从头搜索功能

上面的命令如果是在命令行中运行的话,那么就只针对这次的效果,为了以后每次都是这样的效果,可以对设置保存在vim启动文件中,Linux的话是在~/.vimrc,Windows是在$Vim/_vimrc。

以下配置文件是我从网上http://www.ruchee.com上搜集到的,针对自己的情况进行了稍作修改。可以参看下。

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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
" ----------------- Author: Ruchee
" ----------------- Email: admin@ruchee.com
" ----------------- WebSite: http://www.ruchee.com
" ----------------- Change: Laycher
" ----------------- WebSite: http://www.laycher.com
" ----------------- Date: 2013-01-11
" ----------------- For Windows
 
" Ctrl + H --光标移当前行行首 [插入模式]
" Ctrl + J --光标移下一行行首 [插入模式]
" Ctrl + K --光标移上一行行尾 [插入模式]
" Ctrl + L --光标移当前行行尾 [插入模式]
" Ctrl + C --单源文件编译 [已配置 C/C++]
" Ctrl + R --单源文件运行 [已配置 C/C++ Ruby Bash]
" Ctrl + ] --转到函数定义
" Ctrl + T --返回调用函数
" Ctrl + E --一步加载语法模板和作者、时间信息
" ESC + H --Normal模式下开启Devhelp查询功能
 
" --关键字补全
" --整行补全
" --全能补全
" Tab键 --插入模式下语法结构补全 [snipMate插件]
" Shift + Insert --向Vim中粘贴从别处复制的内容
 
" u [小写] --单步复原 [非插入模式]
" U [大写] --整行复原 [非插入模式]
 
" jj --保存文件并留在插入模式 [插入模式]
" kk -n返回Normal模式 [插入模式]
" nt --打开NERDTree [非插入模式]
" tl --打开TagList [非插入模式]
 
" za --打开或关闭当前折叠
" zM --关闭所有折叠
" zR --打开所有折叠
 
" :se ft=cpp --手动选择语法高亮 [:set filetype=cpp 或 :set syntax=cpp 亦可]
 
" :%!xxd --转储二进制文件,以十六进制形式显示
" :%!xxd -r --还原二进制文件
 
" ---------- 主要插件详细用法说明 ---------------------
 
" :Tlist --呼出变量和函数列表 [TagList插件]
" :LoadTemplate --呼出语法模板 [Load_Template插件]
" :AuthorInfoDetect --添加作者、时间等信息 [NERD_commenter && authorinfo插件]
 
" ---------- snipMate [全局可用的补全关键字] ----------
"
" cprt --插入版权信息 [助记:copyright]
" date --插入当前时间
" fiok --插入文件的最后修改时间 [助记:file ok]
" desc --插入文件描述 [助记:description]
" 更多关键字可自行查看vimfiles/snippets下的各个文件 [Linux下为~/.vim/snippets]
 
" ---------- a.vim [自动切换C/C++同名头文件] ----------
"
" :A --切换同名头文件并独占整个屏幕
" :AS --切换同名头文件并垂直分屏,头文件在上
" :AV --切换同名头文件并水平分割,头文件在左
 
" ---------- mark.vim [追踪高亮指定关键字] ------------
"
" \m --normal模式下,在想要高亮的单词上面敲击\m即可高亮或取消高亮该单词
" :Mark --取消所有高亮
" :Mark abc --指定高亮单词 abc 或取消高亮 abc
 
" ---------- NERDTree [智能文件浏览器] ----------------
"
" :NERDTree --启动NERDTree插件
" o [小写] --切换当前文件或目录的打开、关闭状态
" u --打开上层目录
" p [小写] --返回上层目录
" P [大写] --返回根目录
" K --转到当前目录第一个节点
" J --转到当前目录最后的节点
" m --显示文件系统菜单 [增、删、移]
" ? --弹出帮助菜单
" q --退出该插件
 
colorscheme desert " 着色模式:灰色背景
set guifont=YaHei_Consolas_Hybrid:h11:cGB2312 " 字体 && 字号
"set go=e " 显示立体标签页
set autoindent " 自动对齐
set backspace=2 " 设置退格键可用
set cindent shiftwidth=4 " 自动缩进4空格
set autoindent " 自动对齐
set ai! " 设置自动缩进
set smartindent " 智能自动缩进
set shiftwidth=2 " 换行时行间交错使用2空格
set cindent shiftwidth=2 " 自动缩进2空格
set nu! " 显示行号
set ignorecase "忽略大小写
"set showmatch " 显示括号配对情况
set mouse=a " 启用鼠标
set ruler " 右下角显示光标位置的状态行
set incsearch " 开启实时搜索功能
set hlsearch " 开启高亮显示结果
set nowrapscan " 搜索到文件两端时不重新搜索
set nocompatible " 关闭兼容模式
set vb t_vb= " 关闭提示音
set hidden " 允许在有未保存的修改时切换缓冲区
set autochdir " 设定文件浏览器目录为当前目录
set foldmethod=syntax " 选择代码折叠类型
set foldlevel=100 " 禁止自动折叠
set laststatus=2 " 开启状态栏信息
set cmdheight=1 " 命令行的高度,默认为1,这里设为2
"set showmatch " 显示括号配对情况
"set cursorline " 突出显示当前行
"set nowrap " 设置不自动换行
"set writebackup " 设置无备份文件
set nobackup
set list " 显示Tab符,使用一高亮竖线代替
set listchars=tab:\¦\ ,
set tabstop=2 " 设置Tab键的宽度 [等同的空格个数]
set expandtab " 将Tab自动转化成空格 [需要输入真正的Tab键时,使用 Ctrl+V + Tab]
 
syntax enable " 打开语法高亮
syntax on " 开启文件类型侦测
filetype indent on " 针对不同的文件类型采用不同的缩进格式
filetype plugin on " 针对不同的文件类型加载对应的插件
filetype plugin indent on " 启用自动补全
 
if has("gui_running")
"au GUIEnter * simalt ~x " 窗口启动时自动最大化
"winpos 20 20 " 指定窗口出现的位置,坐标原点在屏幕左上角
"set lines=20 columns=90 " 指定窗口大小,lines为高度,columns为宽度
"set guioptions-=m " 隐藏菜单栏
"set guioptions-=T " 隐藏工具栏
"set guioptions-=L " 隐藏左侧滚动条
"set guioptions-=r " 隐藏右侧滚动条
"set guioptions-=b " 隐藏底部滚动条
"set showtabline=0 " 隐藏Tab栏
endif
 
"set backup
"set backupext=.bak
"set patchmode=.orig " 保存原始文件为 文件名.orig
" set writebackup " 设置无备份文件
set nobackup
set autochdir " 设定文件浏览器目录为当前目录
"set nowrap " 设置不自动换行
set foldmethod=syntax " 选择代码折叠类型
set foldlevel=100 " 禁止自动折叠
 
set laststatus=2 " 开启状态栏信息
set cmdheight=1 " 命令行的高度,默认为1,这里设为2
" 每行超过80个的字符用下划线标示
" au BufRead,BufNewFile *.s,*.asm,*.h,*.c,*.cpp,*.cc,*.java,*.cs,*.erl,*.hs,*.sh,*.lua,*.pl,*.pm,*.php,*.py,*.rb,*.erb,*.vim,*.js,*.css,*.xml,*.html,*.xhtml 2match Underlined /.\%81v/
" 记住上次光标的位置
au BufReadPost * if line("'\"") >1 && line("'\"") <= line("$") ¦ exe "normal! g`\"" ¦ en
" 打开上次的文件单引号加0,上上次单引号加1
 
" 设置编码
set fenc=utf-8
set encoding=utf-8
set fileencodings=utf-8,gbk,cp936,latin-1
" 解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
" 解决consle输出乱码
language messages zh_CN.utf-8
 
" For Haskell
:let hs_highlight_delimiters=1 " 高亮定界符
:let hs_highlight_boolean=1 " 把True和False识别为关键字
:let hs_highlight_types=1 " 把基本类型的名字识别为关键字
:let hs_highlight_more_types=1 " 把更多常用类型识别为关键字
:let hs_highlight_debug=1 " 高亮调试函数的名字
:let hs_allow_hash_operator=1 " 阻止把#高亮为错误
 
" ======= 引号 && 括号自动匹配 ======= "
 
:inoremap ( ()i
 
:inoremap ) =ClosePair(')')
 
:inoremap { {}i
 
:inoremap } =ClosePair('}')
 
:inoremap [ []i
 
:inoremap ] =ClosePair(']')
 
":inoremap < <>i
 
":inoremap > =ClosePair('>')
 
:inoremap " ""i
 
:inoremap ' ''i
 
:inoremap ` ``i
 
function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\"
else
return a:char
endif
endf
 
" ESC + H Normal模式下开启Devhelp查询功能
function! DevHelpCurrentWord()
let word = expand("")
exe "!devhelp -s " . word . " &"
endfunction
nmap h :call DevHelpCurrentWord()
 
" MiniBufExplorer 多个文件切换 可使用鼠标双击相应文件名进行切换
let g:miniBufExplMapWindowNavVim=1
let g:miniBufExplMapWindowNavArrows=1
let g:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplModSelTarget=1
 
" :Tlist 调用TagList
let Tlist_Show_One_File=1 " 只显示当前文件的tags
let Tlist_Exit_OnlyWindow=1 " 如果Taglist窗口是最后一个窗口则退出Vim
let Tlist_Use_Right_Window=1 " 在右侧窗口中显示
let Tlist_File_Fold_Auto_Close=1 " 自动折叠
 
" TxtBrowser 高亮TXT文本文件
au BufRead,BufNewFile *.txt setlocal ft=txt
 
" :LoadTemplate 根据文件类型自动加载模板
let g:template_path='~/.vim/template/'
 
" snipMate Tab智能补全
let g:snips_author='Laycher'
 
" :AuthorInfoDetect 自动添加作者、时间等信息,本质是NERD_commenter && authorinfo的结合
let g:vimrc_author='Laycher'
let g:vimrc_email='i@laycher.com'
let g:vimrc_homepage='http://www.laycher.com'
 
" Ctrl + H 将光标移到当前行的行首
imap I
 
" Ctrl + J 将光标移到下一行的行首
imap jI
 
" Ctrl + K 将光标移到上一行的末尾
imap kA
 
" Ctrl + L 将光标移到当前行的行尾
imap A
 
" Ctrl + E 一步加载语法模板和作者、时间信息
map :LoadTemplate:AuthorInfoDetectGi
imap :LoadTemplate:AuthorInfoDetectGi
vmap :LoadTemplate:AuthorInfoDetectGi
 
" Ctrl + S 保存当前文件并留在插入模式 [插入模式]
map :w
imap :wa
vmap :w
" imap :wli
 
" kk 返回Normal模式,不执行保存 [插入模式]
imap kk l
 
" nt 打开NERDTree窗口,在左侧栏显示 [非插入模式]
map nt :NERDTree
 
" tl 打开Taglist窗口,在右侧栏显示 [非插入模式]
map tl :Tlist
 
" ======= 编译 && 运行 ======= "
 
" 编译源文件
func! CompileCode()
exec "w"
if &filetype == "c"
exec "!clang -std=c99 % elseif &filetype == "cpp"
exec "!clang++ -std=c++98 % elseif &filetype == "java"
exec "!javac %<.java"
elseif &filetype == "haskell"
exec "!ghc --make % elseif &filetype == "lua"
exec "!lua %<.lua"
elseif &filetype == "perl"
exec "!perl %<.pl"
elseif &filetype == "python"
exec "!python %<.py"
elseif &filetype == "ruby"
exec "!ruby %<.rb"
elseif &filetype == "sh"
exec "!bash %<.sh"
endif
endfunc
 
" 运行可执行文件
func! RunCode()
exec "w"
if &filetype == "c" ¦¦ &filetype == "cpp"
exec "! ./%<"
elseif &filetype == "java"
exec "!java %<"
elseif &filetype == "lua"
exec "!lua %<.lua"
elseif &filetype == "perl"
exec "!perl %<.pl"
elseif &filetype == "python"
exec "!python %<.py"
elseif &filetype == "ruby"
exec "!ruby %<.rb"
elseif &filetype == "sh"
exec "!bash %<.sh"
endif
endfunc
 
" Ctrl + C 一键保存、编译
" map :call CompileCode()
" imap :call CompileCode()
" vmap :call CompileCode()
 
" Ctrl + R 一键保存、运行
" map :call RunCode()
" imap :call RunCode()
" vmap :call RunCode()
 
" ======= VimWiki ======= "
 
" 设置编码
let g:vimwiki_w32_dir_enc = 'utf-8'
 
" 使用鼠标映射
let g:vimwiki_use_mouse = 1
 
" 不要将驼峰式词组作为 Wiki 词条
let g:vimwiki_camel_case = 0
 
" 声明可以在wiki里面使用的HTML标签
let g:vimwiki_valid_html_tags='b,i,s,u,sub,sup,kbd,br,hr,div,del,code,red,center,left,right,h2,h4,h5,h6,pre,script,style'
 
let g:vimwiki_list = [{
\ 'path': '~/mysite/wiki',
\ 'path_html': '~/mysite/html/',
\ 'html_header': '~/mysite/template/header.html',
\ 'html_footer': '~/mysite/template/footer.html',
\ 'auto_export': 1,
\ 'nested_syntaxes': {'Clang': 'c', 'C++': 'cpp', 'Lisp': 'lisp', 'Ruby': 'ruby', 'SQL': 'sql', 'Bash': 'sh', 'Vim': 'vim', 'Make': 'make', 'CMake': 'cmake', 'JS': 'javascript', 'CSS': 'css', 'HTML': 'html', 'XML': 'xml'},}]
 
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
"设置鼠标运行模式为WINDOWS模式
behave mswin

VIM相关网站:

VIM整理的相关文档打包(点此下载

>> 若为原创,转载请注明: 转载自Laycher's Blog

>> 本文链接地址: Vim学习笔记(2013-08-04)

>> 订阅本站: http://feed.feedsky.com/laycher