跳转至

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 撤销

  1. u: 撤销(Undo)
  2. U: 撤销对整行的操作
  3. 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 字符范围格式

  1. 空表示当前光标所在行,如 :s/new/New/g
  2. %:表示全文,如 :%s/new/New/g
  3. 在 Visual 模式下选择区域后输入:,Vim 即可自动补全为 :'<,'>,如 :'<,'>s/foo/bar/g
  4. :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 文件处理

  1. vi -r file:打开文件时恢复数据
  2. vi file 后根据选项 D/E/R 操作
  3. 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 显示状态栏

  1. set laststatus=2 :显示状态栏(默认值为 1,表示无法显示状态栏,2 表示显示状态栏)
  2. set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} :设置状态栏内容
  3. 语法格式如下:
格式 功能
%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=xxxset 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 添加多行注释

选择指定行的方式有很多:可以进入可视模式选的指定行,也可以通过搜索定位,也可以指定直接具体行号。
  1. v 键进入可视模式。
  2. 上下移动选择指定行。
  3. 输入 :s/^/# 替换。(如果想要跳过空行,使用 :/s/./#&,其中&表示匹配的内容。)

输入前

11111111111
22222222222
33333333333
44444444444
55555555555
66666666666

选的 2~4 行执行后

11111111111
#22222222222
#33333333333
#44444444444
55555555555
66666666666

11.2 移除多行注释

  1. v 键进入可视模式。
  2. 上下移动选择指定行。
  3. 输入 :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