跳转至

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 vim多窗口

7.1 垂直分屏、水平分屏

  • :sp:split:水平分屏
  • :vs:vsp:vsplit:垂直分屏

7.2 切换窗口

  • Ctrl + w + w

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 设置语法高亮

  • syntax on

8.10 显示状态栏

  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} |显示文件类型|

8.11 折叠代码

  • 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 启用折叠

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