[toc]
vim命令
vim编辑器
说明
Vim 是旧的 UNIX 编辑器 vi 的一个大大改进的版本。添加了许多新功能:多级撤消、语法高亮、命令行历史记录、在线帮助、拼写检查、文件名补全、块操作、脚本语言等。此外,还提供图形用户界面 (GUI)
vim模式及模式转换
vim模式
| 模式 | 说明 | 
|---|---|
| 命令模式 | 刚打开一个文件就是命令模式 | 
| 编辑模式 | 可以编辑内容 | 
| 末行模式(一般模式) | 可进行搜索、替换、切换文件等操作 | 
vim模式转换
命令模式 -> 编辑模式
| 操作 | 说明 | 
|---|---|
i | 在当前光标所在行的字符前面,转换为编辑模式 | 
I | 在当前光标所在行的行首,转换为编辑模式 | 
a | 在当前光标所在行的字符后面,转换为编辑模式 | 
A | 在当前光标所在行的行尾,转换为编辑模式 | 
o | 在当前光标所在行的下方,新建一行 | 
O | 在当前光标所在行的上方,新建一行 | 
编辑模式-->命令模式
直接按 esc 键即可
编辑模式-->末行模式
先按 esc 键,然后按 : 或 / 或 ?

vim打开/关闭文件方式
打开文件方式
| 操作 | 说明 | 示例 | 
|---|---|---|
vim | 打开文件,并定位于首行 | vim file 打开文件 file 并定位至首行 | 
vim + | 打开文件,并定位至最后一行 | vim + file 打开文件 file 并定位至最后一行 | 
vim +n | 打开文件,并定位至 n 行,n 代表数字 | vim +6 file 打开文件 file 并定位至第6行 | 
vim + /正则表达式 | 打开文件,定位至第一次被正则表达式匹配到的行的行首 | vim + /^9 file 打开文件 file 并定位至以9开头的行的行首 | 
关闭文件方式
末行模式关闭文件
| 操作 | 说明 | 
|---|---|
:q | 退出 | 
:wq | 退出并保存 | 
:q! | 不保存退出 | 
:w | 保存 | 
wq! | 强行保存退出 | 
编辑模式关闭文件
| 操作 | 说明 | 
|---|---|
ZZ | 保存并退出 | 
ZQ | 不保存退出 | 
vim文件内操作
移动光标
逐字符移动(也可以使用上下左右箭头)
说明
以下操作也可以使用上下左右箭头操作
5l就是向右移动5个字符
| 操作 | 说明 | 
|---|---|
h | 向左 | 
j | 向下 | 
k | 向上 | 
l | 向右 | 
以单词为单位移动
| 操作 | 说明 | 
|---|---|
w | 移至下一个词的词首 | 
e | 跳至当前或下一个单词的词尾 | 
b | 跳至当前或前一个单词的词首 | 
行内跳转
| 操作 | 说明 | 
|---|---|
0 | 绝对行首 | 
^ | 行首的第一个非空字符 | 
$ | 绝对行尾 | 
行间跳转
编辑模式跳转
| 操作 | 说明 | 
|---|---|
nG 或 ngg | 跳转至 n 行 | 
G | 跳转至最后一行 | 
gg | 跳转至第一行第一个字符 | 
末行模式跳转
| 操作 | 说明 | 
|---|---|
:n | 跳转至n行 | 
:$ | 跳转至最后一行 | 
翻屏
| 操作 | 说明 | 
|---|---|
Ctrl+f | 向下翻一屏 | 
Ctrl+b | 向上翻一屏 | 
Ctrl+d | 向下翻半屏 | 
Ctrl+u | 向上翻半屏 | 
删除	d
| 操作 | 说明 | 
|---|---|
x | 删除当前光标所在处的单个字符 | 
X | 删除当前光标所在处前面的单个字符 | 
nx | 删除光标所在处及向后的n个字符,n代表数字 | 
dd | 删除当前光标所在行 | 
ndd | 删除包括当前光标所在行的n行,n代表数字 | 
dw | 删除光标所在处到下一个词的词首 | 
de | 删除光标所在处到当前词的词尾 | 
db | 删除光标所在处到上一个单词的词首 | 
复制	yy
| 操作 | 说明 | 
|---|---|
yy | 复制当前光标所在行 | 
nyy | 复制当前光标所在行及后n行,n代表数字 | 
粘贴	p
| 操作 | 说明 | 
|---|---|
p(小写) | 粘贴至光标所在行的下一行 | 
P(大写)  | 粘贴至光标所在行的上一行 | 
修改	c
| 操作 | 说明 | 
|---|---|
cc | 删除光标所在行并进入编辑模式 | 
C | 删除光标所在处到本行结尾并进入编辑模式 | 
替换	r
| 操作 | 说明 | 
|---|---|
r | 编辑模式直接按r替换,一次只能替换一个 | 
R | 替换模式,可以替换多个 | 
撤销	u
| 操作 | 说明 | 
|---|---|
u | 撤销前一次的编辑操作,连续u命令可以撤销此前的n次编辑操作,n代表数字 | 
nu | 直接撤销最近n次编辑操作,n代表数字 | 
Ctrl+r | 撤销 撤销操作 | 
重复前一次操作
编辑模式按 . 键,会重复前一次的操作,比如替换、编辑、删除等
可视化操作
| 操作 | 说明 | 
|---|---|
v | 按字符选取 | 
V | 按矩形选取 | 
Ctrl+v | 批量操作,先选中要操作的区域,然后大写 I 编辑,接着按 esc 键,最后回车即可完成编辑 | 
查找(末行模式)
| 操作 | 说明 | 
|---|---|
/ | 从上而下 | 
? | 从下而上 | 
查找并替换(末行模式)
语法
s
	% 表示全文
	g 表示全部替换
示例
| 操作 | 说明 | 
|---|---|
1,3s/A/B | 将1-3行的 A 替换为 B | 
1,$s/A/B | 将1-末尾行的 A 替换为 B | 
%s/A/B | 在每一行中,只替换第一个出现的 A 为 B | 
%s/A/B/g | 在每一行中,替换所有出现的 A 为 B,而不仅仅是第一个 | 
vim编辑多个文件
语法
vim file1 file2 file3 ...
| 操作 | 说明 | 
|---|---|
:next | 切换至下一个文件 | 
:prev | 切换至上一个文件 | 
:last | 切换至最后一个文件 | 
:first | 切换至第一个文件 | 
配置选项
基本配置
| 配置 | 说明 | 
|---|---|
set nu | 显示行号 (number) | 
set rnu | 显示相对行号(relativenumber) | 
set cul | 高亮当前行 (cursorline) | 
set ai | 自动缩进 (autoindent) | 
set si | 智能缩进 (smartindent) | 
set ts=4 | 一个 tab 显示为 4 个空格 (tabstop) | 
set sw=4 | 缩进时使用 4 个空格 (shiftwidth) | 
set et | 将 tab 转换为空格 (expandtab) | 
set hls | 搜索时高亮匹配项 (hlsearch) | 
set is | 搜索时逐字符高亮 (incsearch) | 
set ic | 搜索时忽略大小写 (ignorecase) | 
set scs | 当搜索包含大写字母时,区分大小写 (smartcase) | 
外观
| 配置 | 说明 | 
|---|---|
set bg=dark | 设定背景色为暗色系(light 为浅色系)(background) | 
syn on | 开启语法高亮 (syntax on) | 
set sc | 显示命令输入 (showcmd) | 
set sm | 高亮匹配的括号 (showmatch) | 
文件操作
| 配置 | 说明 | 
|---|---|
set backup | 保存文件时备份旧文件 (backup) | 
set ufo | 开启撤销文件 (undofile) | 
set undodir=~/.vim/undodir | 设置撤销文件保存位置 (undodir) | 
set backupdir=~/.vim/backupdir | 设置备份文件保存位置 (backupdir) | 
其他配置
| 配置 | 说明 | 
|---|---|
set cb=unnamedplus | 使用系统剪贴板 (clipboard) | 
set wrap | 自动换行 (wrap) | 
set mouse=a | 启用鼠标支持 (mouse) | 
set so=8 | 光标移动时,上下留 8 行缓冲区 (scrolloff) | 
set ch=2 | 命令行高度设置为 2 行 (cmdheight) | 
set wmnu | 命令行补全增强 (wildmenu) | 
set lz | 在宏执行或脚本执行时不重绘屏幕,提高效率 (lazyredraw) | 
set sb | 水平分割窗口时,新窗口放在下方 (splitbelow) | 
set sr | 垂直分割窗口时,新窗口放在右侧 (splitright) | 
set tgc | 终端使用 24 位色彩 (termguicolors) | 
快捷键映射
| 配置 | 说明 | 
|---|---|
nnoremap <C-s> :w<CR> | Ctrl+s 保存文件 | 
vnoremap <C-c> "+y | Ctrl+c 复制到系统剪贴板 | 
nnoremap <C-v> "+p | Ctrl+v 从系统剪贴板粘贴 | 
vim高级用法
使用 F1 键执行文件
说明
当编写完shell脚本或者python脚本后,想要运行 测试一般的方法是保存退出脚本然后再运行
使用如下配置就可以不退出vim编辑执行脚本
编辑 ~/.vimrc 并写入以下内容
cat >> ~/.vimrc << EOF
"""""""""""""""""""""""""""""""""""""""""""""""""""
"Programming makes the world better
"""""""""""""""""""""""""""""""""""""""""""""""""""
map <F1> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec '!g++ % -o %<'
exec '!time ./%<'
elseif &filetype == 'cpp'
exec '!g++ % -o %<'
exec '!time ./%<'
elseif &filetype == 'python'
exec '!time python %'
elseif &filetype == 'sh'
:!time bash %
endif
endfunc
EOF
编辑测试脚本
cat >> test.sh << EOF
# !/usr/bin/env bash
awk 'BEGIN{print 10+10}
EOF
在末行模式下按 F1 键,就会执行脚本并输出

再次按回车,会回到脚本当中,这样就可以不退出脚本,直接执行脚本进行测试了

Linux脚本自动添加脚本头
编辑 ~/.vimrc 并写入以下内容
- centos7
 - centos6
 
function HappyPython()
call setline(1, "#!/usr/bin/env python")
call append(1, "#-*- coding:utf8 -*-")
normal G
normal o
endf
autocmd bufnewfile *.py call HappyPython()
function HappyShell()
call setline(1, "#!/usr/bin/env bash")
call append(1, "export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin")
normal G
normal o
endf
autocmd bufnewfile *.sh call HappyShell()
function HappyPython()
call setline(1, "#!/usr/bin/env python")
call append(1, "#-*- coding:utf8 -*-")
normal G
normal o
endf
autocmd bufnewfile *.py call HappyPython()
function HappyShell()
call setline(1, "#!/usr/bin/env bash")
call append(1, "export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin")
normal G
normal o
endf
autocmd bufnewfile *.sh call HappyShell()
编辑 .py 文件就会自动添加如下内容
#!/usr/bin/env python
#-*- coding:utf8 -*-
编辑 .sh 文件就会自动添加如下内容
#!/usr/bin/env bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
设置自动配置 set paste
说明
vim在粘贴的时候,如果遇到粘贴的格式不正确,则需要手  动执行命令 :set paste ,可以使用以下配置设置自动配置
cat >> ~/.vimrc << EOF
let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
function! XTermPasteBegin()
	  set pastetoggle=<Esc>[201~
	    set paste
	      return ""
      endfunction
EOF

