vim教程
- vim3种模式
- 命令模式
- 输入模式
- 编辑模式

2 vim配置文件
2.1 viminfo文件
- 参考
- ~/.viminfo 存在在用户目录下,由系统自动生成,记录 vim 的操作历史和状态信息,便于重启 Vim 进程后能恢复之前的各种历史操作行为。
- 通常不改变~/.viminfo文件
2.2 vimrc文件
~/.vimrc文件是用来配置vim功能选项的,在vim启动时会首先加载这个文件,完成配置。包括主题, 快捷键, 插件设置等等都可以在这里面设置。
2.3 vim/colors目录
~/.vim/colors目录是用来存放vim配色文件的,这些配色文件可以从网上下载。然后可以编辑vimrc文件,设置colorscheme 配色文件名
来使用
3 vim打开文件
vim filename
:新建或打开文件,光标在行首
vim + filename
:新建或打开文件,光标在行尾
vim +n filename
:新建或打开文件,光标在第n行
vim r filename
恢复上次异常的文件(有.swp文件,.swp文件会保存上一次修改了,但没有保存的数据)
vi +/pattern filename
:光标在第一次匹配的模式处,用于搜索定位文件中某个字段
4 命令模式和编辑模式
命令模式下只需要按快捷键就能执行,编辑模式下需要按回车才能生效
4.1 进入输入模式
快捷键 |
功能描述 |
i |
在光标处之前一个字符插入数据 |
a |
在光标处之后一个字符插入数据 |
I |
在光标所在行首插入数据 |
A |
在光标所在行尾插入数据 |
o |
在光标所在行下面新插入一行 |
O |
在光标所在行上面新插入一行 |
4.2 退出或保存文件
命令 |
功能 |
:wq |
保存并退出 Vim 编辑器 |
:wq! |
保存并强制退出 Vim 编辑器 |
:q |
不保存就退出 Vim 编辑器 |
:q! |
不保存,且强制退出 Vim 编辑器 |
:w |
保存但是不退出 Vim 编辑器 |
:w! |
强制保存文本 |
:w filename |
另存到 filename 文件 |
x! |
保存文本,并退出 Vim 编辑器,更通用的一个 vim 命令 |
ZZ |
直接退出 Vim 编辑器 |
4.3 删除
命令 |
功能 |
x |
删除单个字符;移动光标到待删除字符上,按x 删除 |
D |
删除光标位置到行尾的内容 |
dd |
删除单行;移动光标到待删除行上,按dd 删除 |
d$ |
删除光标之后到行尾内容 |
d^ |
删除行首(非空格行首)到光标之前内容 |
d0 |
删除行首(真正行首,包含空格行首)到光标之前内容 |
dw |
删除光标之后到当前单词尾 |
daw |
删除当前单词 |
ndd |
删除光标所在行后n行(包括光标行);如5dd 将删除光标后5行 |
:m,nd |
删除第m~n行内容;如:3,5d 表示删除第3-5行 |
dG |
删除光标行之后所有内容(包括光标行) |
:%d |
删除所有行 |
4.4 撤销
u
:撤销(Undo)
U
:撤销对整行的操作
Ctrl + r
:重做(Redo),即撤销的撤销。
4.5 复制、粘贴
命令 |
功能 |
yy |
复制光标所在行 |
nyy |
复制当前行和后n-1行 |
p(小写) |
在光标位置之后粘贴 |
P(大写) |
在光标位置之前粘贴 |
4.6 移动
命令 |
功能 |
gg |
移动到文件头(行首) |
G |
移动到文件尾(行首) |
0 或 ^ |
光标移到当前行行首 |
$ |
光标移到当前行行尾 |
n$ |
光标移动从当前行后n行行尾(包括当前行) |
nG |
光标移动到第n行行首 |
:n |
光标移动到第n行行首 |
w |
向前移动一个单词(单词以空格区分) |
b |
向后移动一个单词(单词以空格区分) |
5 查找替换
5.1 字符搜索
- 进入查找模式方法:命令模式下按
/
或者:/
进入查找模式
- 大小写敏感设置:
- 再执行查找前设置
:set ignorecase
,要恢复大小写敏感,则输入:set noignorecase
- 在关键字后输入
\c
(忽略大小写)或\C
(大小写敏感)
命令 |
功能 |
:/keyword |
正向查找关键字keyword,按n向前查找一个,按N向后查找一个 |
:?keyword |
反向查找关键字keyword,按n向前查找一个,按N向后查找一个 |
:/^keyword |
匹配行首keyword |
:/keyword$ |
匹配行尾keyword |
:/\<keyword |
匹配单词以keyword开头 |
:/keyword\> |
匹配单词以keyword结尾 |
:/keyword\c |
匹配单词,大小写不敏感 |
:/keyword\C |
匹配单词,大小写敏感 |
5.2 字符替换
参考资料
- 字符替换的语法::{作用范围}s/{目标}/{替换}/{替换标志}
- s
:表示替换的意思
- /
:用于分隔限定区域的
5.2.1 字符范围格式
- 空表示当前光标所在行,如
:s/new/New/g
%
:表示全文,如:%s/new/New/g
- 在Visual模式下选择区域后输入:,Vim即可自动补全为
:'<,'>
,如:'<,'>s/foo/bar/g
:m,n
:表示第m-n行,如:2,8s/New/NEW/g
5.2.2 替换标志
以下替换标志可以组合使用
1. 空表示只替换光标处开始匹配的第一个目标,如:s/new/New/
2. g
:全局替换
3. i
:大小写不敏感
4. I
:大小写敏感
5. c
:替换需要确认
6 可视化模式
6.1 进入可视化模式
命令 |
功能 |
v(小写) |
字符选择模式,移动光标选中经过的字符 |
V(大写) |
行选择模式,上下移动光标选中经过的行 |
crtl + v |
块选择模式,上下左右移动,选择经过的区块(矩形) |
6.2 可视化模式下支持的操作
命令 |
功能 |
d |
删除选中的部分文本 |
D |
删除选中部分所在的行,和 d 不同之处在于,即使选中文本中有些字符所在的行没有都选中,删除时也会一并删除 |
y |
将选中部分复制到剪贴板中 |
p(小写) |
将剪贴板中的内容粘贴到光标之后 |
P(大写) |
将剪贴板中的内容粘贴到光标之前 |
u(小写) |
将选中部分中的大写字符全部改为小写字符 |
U(大写) |
将选中部分中的小写字符全部改为大写字符 |
7 vim多窗口
7.1 垂直分屏、水平分屏
:sp
或:split
:水平分屏
:vs
或:vsp
或:vsplit
:垂直分屏
7.2 切换窗口
7.3 调节窗口大小
Ctrl + w + +
:窗口放大
Ctrl + w + -
:窗口缩小
7.4 退出窗口
除了正常使用:q
退出窗口外,还能使用命令一次退出多个窗口
- :on
:退出除当前窗口外所有窗口
8 vim设置
8.1 文件编码
- 查看文件编码格式:
:set encoding
:set enc
- 设置文件保存的编码格式:
set fileencoding=utf8
set fenc=utf8
8.2 启用鼠标
:set mouse=a
:开启鼠标模式
:set mouse=
:取消鼠标模式
8.3 行号
:set nu
或:set number
:显示行号
:set nonu
或:set nonumber
:不显示行号
8.4 tab方式
:set expandtab
:使用空格来替换Tab(开启后,默认8个空格)
:set noexpandtab
:取消使用空格代替Tab
:set tabstop=4
或:set ts=4
:设置所有的Tab或缩进为占用4列宽度
8.5 缩进
:set ai
或:set autoindent
:回车后自动缩进
8.6 搜索高亮
:set hlsearch
: 开启高亮
:set nohlsearch
:关闭高亮
8.7 高亮显示当前行
:set cursorline
:当前行下面显示下划线
:set nocursorline
:取消
8.8 设置高亮显示括号
set showmatch
:高亮显示匹配的括号 ([{和}])
8.9 设置语法高亮
8.10 显示状态栏
set laststatus=2
:显示状态栏(默认值为 1,表示无法显示状态栏,2 表示显示状态栏)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
:设置状态栏内容
- 语法格式如下:
|格式|功能|
|---|---|
| %F |完整文件路径名|
| %m |当前缓冲被修改标记|
| %m |当前缓冲只读标记|
| %h |帮助缓冲标记|
| %w |预览缓冲标记|
| %Y |文件类型|
| %b |ASCII值|
| %B |十六进制值|
| %l |行数|
| %v |列数|
| %p |当前行数占总行数的的百分比|
| %L |总行数|
| %{...} |评估表达式的值,并用值代替|
|
%{"[fenc=".(&fenc==""?&enc:&fenc).((exists("+bomb") && &bomb)?"+":"")."]"}
|显示文件编码|
| %{&ff} |显示文件类型|
8.11 折叠代码
set foldenable
:激活折叠(测试不使用这个,直接设置 set foldmethod=xxx
也激活了)
set nofen
:取消折叠
set foldmethod=xxx
或 set fdm=xxx
:可选以下 6 种方法,一般使用syntax
有6种方法来选定折叠:
manual
:手工定义折叠
indent
:更多的缩进表示更高级别的折叠
expr
:用表达式来定义折叠
syntax
:用语法高亮来定义折叠(通常使用这个)
diff
:对没有更改的文本进行折叠
marker
:对文中的标志折叠
zc |
关闭当前打开的折叠 |
zo |
打开当前的折叠 |
zm |
关闭所有折叠 |
zM |
关闭所有折叠及其嵌套的折叠 |
zr |
打开所有折叠 |
zR |
打开所有折叠及其嵌套的折叠 |
zd |
删除当前折叠 |
zE |
删除所有折叠 |
zj |
移动至下一个折叠 |
zk |
移动至上一个折叠 |
zn |
禁用折叠 |
zN |
启用折叠 |
9 vim配置文件.vimrc
"""""""""""""""""""""""""""""""""""
"""=>全局配置<="""
"""""""""""""""""""""""""""""""""""
"关闭vi兼容模式"
set nocompatible
"设置历史记录步数"
set history=1000
"开启相关插件"
"侦测文件类型"
filetype on
"载入文件类型插件"
filetype plugin on
"为特定文件类型载入相关缩进文件"
filetype indent on
"当文件在外部被修改时,自动更新该文件"
set autoread
"激活鼠标的使用"
set mouse=a
set selection=exclusive
set selectmode=mouse,key
"保存全局变量"
set viminfo+=!
"带有如下符号的单词不要被换行分割"
set iskeyword+=_,$,@,%,#,-
"通过使用: commands命令,告诉我们文件的哪一行被改变过"
set report=0
"被分割的窗口间显示空白,便于阅读"
set fillchars=vert:\ ,stl:\ ,stlnc:\
"""""""""""""""""""""""""""""""""
"""=>字体和颜色<="""
"""""""""""""""""""""""""""""""""
"自动开启语法高亮"
syntax enable
"设置字体"
"set guifont=dejaVu\ Sans\ MONO\ 10
set guifont=Courier_New:h10:cANSI
"设置颜色"
colorscheme desert
"高亮显示当前行"
set cursorline
hi cursorline guibg=#00ff00
hi CursorColumn guibg=#00ff00
"高亮显示普通txt文件(需要txt.vim脚本)"
au BufRead,BufNewFile * setfiletype txt
"""""""""""""""""""""""""""""""
"""=>代码折叠功能<="""
"""""""""""""""""""""""""""""""
"激活折叠功能"
set foldenable
"set nofen(这个是关闭折叠功能)"
"设置按照语法方式折叠(可简写set fdm=XX)"
"有6种折叠方法:
"manual 手工定义折叠"
"indent 更多的缩进表示更高级别的折叠"
"expr 用表达式来定义折叠"
"syntax 用语法高亮来定义折叠"
"diff 对没有更改的文本进行折叠"
"marker 对文中的标志进行折叠"
set foldmethod=manual
"set fdl=0(这个是不选用任何折叠方法)"
"设置折叠区域的宽度"
"如果不为0,则在屏幕左侧显示一个折叠标识列
"分别用“-”和“+”来表示打开和关闭的折叠
set foldcolumn=0
"设置折叠层数为3"
setlocal foldlevel=3
"设置为自动关闭折叠"
set foldclose=all
"用空格键来代替zo和zc快捷键实现开关折叠"
"zo O-pen a fold (打开折叠)
"zc C-lose a fold (关闭折叠)
"zf F-old creation (创建折叠)
"nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
"""""""""""""""""""""""""""""""""""
"""=>文字处理<="""
"""""""""""""""""""""""""""""""""""
"使用空格来替换Tab"
set expandtab
"设置所有的Tab和缩进为4个空格"
set tabstop=4
"设定<<和>>命令移动时的宽度为4"
set shiftwidth=4
"使得按退格键时可以一次删除4个空格"
set softtabstop=4
set smarttab
"缩进,自动缩进(继承前一行的缩进)"
"set autoindent 命令打开自动缩进,是下面配置的缩写
"可使用autoindent命令的简写,即“:set ai”和“:set noai”
"还可以使用“:set ai sw=4”在一个命令中打开缩进并设置缩进级别
set ai
set cindent
"智能缩进"
set si
"自动换行”
set wrap
"设置软宽度"
set sw=4
"行内替换"
set gdefault
""""""""""""""""""""""""""""""""""
"""=>Vim 界面<="""
""""""""""""""""""""""""""""""""""
"增强模式中的命令行自动完成操作"
set wildmenu
"显示标尺"
set ruler
"设置命令行的高度"
set cmdheight=1
"显示行数"
set nu
"不要图形按钮"
set go=
"在执行宏命令时,不进行显示重绘;在宏命令执行完成后,一次性重绘,以便提高性能"
set lz
"使回格键(backspace)正常处理indent, eol, start等"
set backspace=eol,start,indent
"允许空格键和光标键跨越行边界"
set whichwrap+=<,>,h,l
"设置魔术"
set magic
"关闭遇到错误时的声音提示"
"关闭错误信息响铃"
set noerrorbells
"关闭使用可视响铃代替呼叫"
set novisualbell
"高亮显示匹配的括号([{和}])"
set showmatch
"匹配括号高亮的时间(单位是十分之一秒)"
set mat=2
"光标移动到buffer的顶部和底部时保持3行距离"
set scrolloff=3
"搜索逐字符高亮"
set hlsearch
set incsearch
"搜索时不区分大小写"
"还可以使用简写(“:set ic”和“:set noic”)"
set ignorecase
"用浅色高亮显示当前行"
autocmd InsertLeave * se nocul
autocmd InsertEnter * se cul
"输入的命令显示出来,看的清楚"
set showcmd
""""""""""""""""""""""""""""""""""""
"""=>编码设置<="""
""""""""""""""""""""""""""""""""""""
"设置编码"
set encoding=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"设置文件编码"
set fileencodings=utf-8
"设置终端编码"
set termencoding=utf-8
"设置语言编码"
set langmenu=zh_CN.UTF-8
set helplang=cn
"""""""""""""""""""""""""""""
"""=>其他设置<="""
"""""""""""""""""""""""""""""
"开启新行时使用智能自动缩进"
set smartindent
set cin
set showmatch
"在处理未保存或只读文件的时候,弹出确认"
set confirm
"隐藏工具栏"
set guioptions-=T
"隐藏菜单栏"
set guioptions-=m
"置空错误铃声的终端代码"
set vb t_vb=
"显示状态栏(默认值为1,表示无法显示状态栏)"
set laststatus=2
"状态行显示的内容"
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
"粘贴不换行问题的解决方法"
set pastetoggle=<F9>
"设置背景颜色"
set background=dark
"文件类型自动检测,代码智能补全"
set completeopt=longest,preview,menu
"共享剪切板"
set clipboard+=unnamed
"从不备份"
set nobackup
set noswapfile
"自动保存"
set autowrite
"显示中文帮助"
if version >= 603
set helplang=cn
set encoding=utf-8
endif
"设置高亮相关项"
highlight Search ctermbg=black ctermfg=white guifg=white guibg=black
""""""""""""""""""""""""""""""""
"""=>在shell脚本开头自动增加解释器以及作者等版权信息<="""
""""""""""""""""""""""""""""""""
"新建.py,.cc,.sh,.java文件,自动插入文件头"
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
"定义函数SetTitle,自动插入文件头"
func SetTitle()
if expand ("%:e") == 'sh'
call setline(1, "#!/bin/bash")
call setline(2, "#Author:shuhaiwen")
call setline(3, "#Blog:https://shuhaiwen.github.io/")
call setline(4, "#Time:".strftime("%F %T"))
call setline(5, "#Name:".expand("%"))
call setline(6, "#Version:V1.0")
call setline(7, "#Description:This is a production script.")
endif
endfunc