vim¶
1 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 .swap 文件处理¶
vi -r file
:打开文件时恢复数据vi file
后根据选项 D/E/R 操作vi file
后直接编辑文件,然后再:recover
恢复数据 这几种方式恢复数据不会删除. swap 文件,需要手动删除,或者上面说的 D 选项删除。
8 vim 多窗口¶
8.1 垂直分屏、水平分屏¶
:sp
或:split
:水平分屏:vs
或:vsp
或:vsplit
:垂直分屏
8.2 切换窗口¶
Ctrl + w + w
8.3 调节窗口大小¶
Ctrl + w + +
:窗口放大Ctrl + w + -
:窗口缩小
8.4 退出窗口¶
除了正常使用 :q
退出窗口外,还能使用命令一次退出多个窗口
- :on
:退出除当前窗口外所有窗口
9 vim 设置¶
9.1 文件编码¶
- 查看文件编码格式:
:set encoding
:set enc
:fenc 是 fileencoding 缩写- 设置文件保存的编码格式:
set fileencoding=utf8
set fenc=utf8
9.2 文件格式¶
- 查看文件格式:
:set fileformat
:set ff
:ff 是 fileformat 缩写- 设置文件格式:
:set ff=unix
:设置成 unix 格式, 换行符\n
:set ff=dos
:设置成 windows 上的 dos 格式,换行符\r\n
- 示例不同格式内容差别
### 文件内容
$ cat 1.log
123
ll
### dos格式
$ cat -vE 1.log
^M$
123^M$
ll^M$
### unix格式
$ cat -vE 1.log
$
123$
ll$
9.3 启用鼠标¶
:set mouse=a
:开启鼠标模式:set mouse=
:取消鼠标模式
9.4 行号¶
:set nu
或:set number
:显示行号:set nonu
或:set nonumber
:不显示行号
9.5 tab 方式¶
:set expandtab
: 使用空格来替换 Tab(开启后,默认 8 个空格):set noexpandtab
: 取消使用空格代替 Tab:set tabstop=4
或:set ts=4
: 设置所有的 Tab 或缩进为占用 4 列宽度
9.6 缩进¶
:set ai
或:set autoindent
: 回车后自动缩进
9.7 搜索高亮¶
:set hlsearch
: 开启高亮:set nohlsearch
:关闭高亮
9.8 高亮显示当前行¶
:set cursorline
:当前行下面显示下划线:set nocursorline
:取消
9.9 设置高亮显示括号¶
set showmatch
:高亮显示匹配的括号([{和}])
9.10 设置语法高亮¶
syntax on
9.11 显示状态栏¶
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} | 显示文件类型 |
9.12 折叠代码¶
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 |
启用折叠 |
10 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
11 高级命令¶
11.1 添加多行注释¶
选择指定行的方式有很多:可以进入可视模式选的指定行,也可以通过搜索定位,也可以指定直接具体行号。
- 按
v
键进入可视模式。 - 上下移动选择指定行。
- 输入
:s/^/#
替换。(如果想要跳过空行,使用:/s/./#&
,其中&表示匹配的内容。)
输入前
11111111111
22222222222
33333333333
44444444444
55555555555
66666666666
选的 2~4 行执行后
11111111111
#22222222222
#33333333333
#44444444444
55555555555
66666666666
11.2 移除多行注释¶
- 按
v
键进入可视模式。 - 上下移动选择指定行。
- 输入
:s/^#/
替换。(其中#
表示要删除的符号 )
输入前
11111111111
#22222222222
#33333333333
#44444444444
55555555555
66666666666
执行后
11111111111
22222222222
33333333333
44444444444
55555555555
66666666666
11.3 tab 和空格互转¶
对于已保存的文件,可以使用下面的方法进行空格和 TAB 的替换: TAB 替换为空格:
:set ts=4
:set expandtab
:%retab!
**空格替换为 TAB: **
:set ts=4
:set noexpandtab
:%retab!
其中:
1. ts 可按需求设置,表示一个 tab 代表多个个空格。
2. % 表示当前文件。
3. ! 表示是用于处理非空白字符之后的 TAB,即所有的 TAB,若不加!,则只处理行首的 TAB。
4. :%retab!
还可以写成:retab%!
或:retab!%
,但!
不能在 retab 前,即不能是:%!retab
。
12 问题汇总¶
12.1 删除键失效¶
执行 echo "set backspace=2" >> ~/.vimrc
。