vi:visual interface,可视窗口,历史悠久的文本编辑器

vim:vi improved,vi编辑器增强版,增加了颜色显示,光标坐标位置显示等功能

一、vim 打开文件

  • 语法:vim [OPTION]... FILE...

  • 用法:

1+#  file1           打开文件光标直接移动至第#行行首
2+/pattern file1     打开文件光标直接移动至匹配pattern行的行首
3-b file1            打开二进制文件
4-d file1 file2      比较两个文件
5-m file1            只读打开文件
6vim +20  /etc/passwd         定位20行
7vim +/"^mysql:" /etc/passwd  定位mysql开头的行
8vim -d /etc/passwd /etc/shadow   比较两个文件

vim编辑的文件路径如果该文件存在,文件被打开并显示内容 如果该文件不存在,当编辑后第一次存盘时创建它 但是目录一定要存在,vim不具备创建目录的功能

二、vim 模式编辑器

  • vim编辑器的三种模式:

    • 命令模式(Normal),默认模式,功能:光标移动,文本剪切、粘贴等
    • 插入模式(Insert),功能:修改文本
    • 扩展命令模式(extend command),功能:保存、退出等
  • Esc退出当前模式,返回命令模式

  • 模式转换:

1输入模式 --> 命令模式 
2	ESC
3
4命令模式 --> 末行模式(扩展命令模式下)
5	:
6末行模式 --> 命令模式
7	ESC
  • 命令模式进入插入模式
1i     在光标所在处输入
2I     在当前光标所在行的行首输入
3a     在光标所在处后面输入
4A     在当前光标所在行的行尾输入
5o     在当前光标所在行的下方新建一个新行
6O     在当前光标所在行的上方新建一个新行
  • 命令模式进入扩展命令模式,输入**:**
 1:q            退出
 2:q!           强制退出,放弃做出的修改
 3:w            保存
 4:wq           保存退出
 5:x            保存退出
 6:w file1      将当前内容保存至另一个文件,之后修改的还是之前编辑的文件
 7:r file2      读文件内容至当前文件
 8:!command     执行命令         
 9:r!command    读入命令执行结果
10将当前编辑的文件另存为当前目录下的文件file3
11命令:
12:w file3
13
14
152.读取/etc/fstab文件内容至当前文件
16命令::r /etc/fstab
17
183.在扩展命令模式下创建/app下的目录newdir,并用ls命令查看是否创建成功
19命令::!mkdir /app/newdir
20
214.在扩展命令模式下读入/etc/password文件中用户ftp的行内容
22命令::r!grep "^ftp\>" /etc/passwd

三、vim 命令模式详解

(一)光标跳转(移动大法)

  • 字符间跳转:
 1字符间跳转:
 2        h, j, k, l
 3        h: 左
 4        l: 右
 5        j: 下
 6        k: 上
 7单词间跳转:
 8    w/W:下一个word/WORD的开头
 9    e/E:当前或下一单词的词尾
10    ge: 反向
11    b/B:当前或前一个单词的词首
12    #COMMAND: 执行#次单词跳转
13    word指的是已非空白字符分割的单词
14    WORD值的是空白字符分割的单词
15    
16  
17当前页跳转:
18H     页首行首
19M     页中间行行首
20L     页底行首
21行首行尾跳转:
22^     跳转至行首的第一个非空白字符
230     跳转至行首
24$     跳转至行尾
25g_    移动到行尾非空白字符
26行间移动:
27#G   跳转至由#指定行;
28G    最后一行;
291G, gg   第一行;
30
31
32
33光标定位:
34F/f {char}   反向/正向查找一个字符    同行搜索   使用;继续查找下一个用,查找上一个
35t {char}     查找前一个字符   同行搜索
36dt{char}   //删除到 字符char 之前
37df{char}   //删除到字符char位置
38/{char}   //查找   查找到多个 按 n 正向跳转, N反向 跳转 
 1句间移动:
 2	)
 3	(
 4段落间移动:
 5	}
 6	{
 7翻屏操作:
 8	Ctrl+f: 向文件尾部翻一屏;
 9	Ctrl+b: 向文件首部翻一屏;
10	Ctrl+d: 向文件尾部翻半屏;
11	Ctrl+u:向文件首部翻半屏;
12字符编辑:
13	x    删除光标处的字符;
14	#x   删除光标处起始的#个字符;
15	xp   交换光标所在处的字符及其后面字符的位置
16	~    =转换大小写
17	J    删除当前行后的换行符	
18替换命令(r, replace)
19	r     替换光标所在处的字符
20	R     切换成REPLACE模式
21删除命令:
22	d: 删除命令,可结合光标跳转字符,实现范围删除;
23	d$
24	d^
25	d0
26	dw=diw daw删除单词和后面的空格  i代表inner a=around 环绕只有后面
27	2dw 删除2个单词
28	de
29	db
30	#COMMAND
31        dd 删除光标所在的行;
32        #dd 多行删除;
33        D     从当前光标位置一直删除到行尾,留空行,等同于d$
34复制命令(y, yank):
35	y: 复制,工作行为相似于d命令;
36	y$
37	y0
38	y^
39	ye
40	yw
41	yb
42        #COMMAND
43        yy:复制行
44        #yy: 复制多行;
45粘贴命令(p, put, paste):
46	p:缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面;
47	P:缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面;
48改变命令 c,删除后切换成插入模式
49c$     删除到行尾,并切换成插入模式
50c^     删除到非空行首,并切换成插入模式
51c0     删除到行首,并切换成插入模式
52cw     删除到下个单词词首,并切换成插入模式
53ce     删除到本单词或下个单词词尾,并切换成插入模式
54cb     删除到本单词或上个单词的词首,并切换成插入模式
55cc     删除当前行,并切换成插入模式
56#cc    删除多行,并切换成插入模式
57C      删除当前光标到行尾,并切换成插入模式
58# 按i  然后输入 hello world  就会 出现#次hello world     //#代表数字
59#按o  然后输入重复#行    //#代表数字
60u         撤销最近的更改
61#u        
62U          撤消光标落在这行后所有此行的更改
63Ctrl-r     重做最后的“撤消”更改
64.          
65n.         重复前一个操作n次

四、vim 扩展命令模式详解

(一)地址定界

 1(1) 地址定界
 2		:start_pos,end_pos
 3		#: 具体第#行,例如2表示第2行;
 4		#,#: 从左侧#表示行起始,到右侧#表示行结尾;
 5		#,+#: 从左侧#表示的行起始,加上右侧#表示的行数;
 6		.: 当前行
 7		$: 最后一行
 8		.,$-1
 9		%:全文, 相当于1,$
10		/pat1/,/pat2/  从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束;
11		#,/pat/
12		/pat/,$
13	
14	使用方式:后跟一个编辑命令如:
15	1,3d 
16	.,8y 
17	4,+5w 
18	8,$r	

(二)查找

1/PATTERN:从当前光标所在处向文件尾部查找;
2?PATTERN:从当前光标所在处向文件首部查找;
3n:与命令同方向;
4N:与命令反方向;

(三)查找并替换 s

 1 替换(substitute)
 2
 3[range地址定界]s[ubstitute]/{pattern}/{string}[flags]
 4
 5s/going/rolling/g         当前行所有going替换成rolling
 6% s/going/rolling/g       %匹配所有行
 7
 8s: 在末行模式下完成查找替换操作
 9s/要查找的内容/替换为的内容/修饰符
10	要查找的内容:可使用模式
11	替换为的内容:不能使用模式,但可以使用\1, \2, ...等后向引用符号;
12	还可以使用“&”引用前面查找时查找到的整个内容;
13	修饰符:
14		i: 忽略大小写
15		g: 全局替换;默认情况下,每一行只替换第一次出现;
16		c 每次替换前询问
17		n 匹配次数
18		查找替换中的分隔符/可替换为其它字符,例如
19		s@@@
20		s###	
21  
22  
231,6 s/going//n    //会报告匹配到几个

vim 可视化模式 v

 1v  字符
 2V 行
 3ctrl+v  列
 4gv  重选上次高亮区域
 5o   切换选区边界
 6
 7选中的文字可被删除,复制,变更,过滤,搜索,替换等
 8
 9
10viw    选中当前单词
11vaw   
12vi(    选中 ()内的内容
13vi[    选中[] 内的内容
14vi"    
15
16v#iw    选中#次 单词 空格也算1次 
17
18开发常用:
19    vi{    选中{ 内的内容   然后 >> 缩进

vim 多文件模式

多文件操作概念

buffer,window,tab(标签页)

buffer:缓冲区,vim打开一个文件后会加载文件内容到缓冲区,之后修改是针对内存的缓冲区,并不会直接保存到文件。

buffer

  • 打开:vim FILE1 FILE2 FILE3 ...

  • 操作:

 1:next 下一个    等价 :bn :bnext
 2:prev 前一个    等价    :bp :bpre
 3:first 第一个   等价    :bf :bfirst
 4:last 最后一个   等价   :bl	 :blast
 5:ls  查看缓冲区列表	
 6:buffer number  等价 :b number  如    :b 1 
 7:ball      编辑所有,按 :b number 切换工作区		
 8:b buffer_name 加上tab 补全来跳转
 9:wall 保存所有
10:qall 退出所有
11:badd  filename    可以绝对路径
12:bd   number|filename  删除指定缓冲区文件
13:E      打开文件目录列表  然后按  :bd  删除此缓冲区切回到原来的缓冲区,或者:bn 切缓冲区保留当前的  
14:bufdo  set number  批量操作缓冲区文件。
15:e  filename  打开文件加入缓冲区

vim 多窗口(window)

一个缓冲区可以分隔成多个窗口,每个窗口也可以打开不同缓冲区

 1窗口分隔模式:
 2	vim -o|-O FILE1 FILE2 ...
 3		-o: 水平分割
 4		-O: 垂直分割
 5		在窗口间切换:
 6		        Ctrl+w,
 7			Ctrl+w  H/J/K/L //上下左右尖头也可以 
 8
 9		单文件窗口分割:
10		Ctrl+w,s          split, 水平分割
11		Ctrl+w,v          vertical, 垂直分割	
12		ctrl+w  c/q       close ,退出 ,关闭退出当前窗口	
13		:sp filename     上下分割,打开新的文件
14		:vsp  filename   左右分割,打开新的文件 :vs也可以
15		ctrl+w,q         取消相邻窗口
16		ctrl+w,o         取消全部窗口

多文件之tab(标签页)

可以一个标签页开发html,另外一个标签页开发python

1:tabnew filename  打开新的标签页
2gt切换窗口
3:tabn 下一个标签页
4:tabp 上一个标签页

vim 寄存器

1dd,yy 这些复制,删除命令 是把内容放到无名寄存器的 
2
3"ayiw 复制一个单词到寄存器a中,"bdd删除当前行到寄存器b中 , 双引号别忘记加上
4
5:registers 查看寄存器中的内容
6:reg a    查看寄存器a中的内容
7
8vim复制到剪切板 https://www.cnblogs.com/callmelord/p/11579646.html

vim 代码补全

1ctrl+n ctrl+p 补全单词
2ctrl+x ctrl+f 补全文件名
3ctrl+x ctrl+o 补全代码,需要开启文件类型检查,安装插件

vim更换配色

1:colorscheme 显示当前的主题配色
2:colorsceme <ctrl+d> 可以显示所有的配色
3:colorscheme 配色名   #就可以修改配色
4可以下载多个配色到.vim/colors并且随时更换

vim配置文件

在扩展命令模式下的修改仅对当前vim进程有效,永久有效需要修改配置文件,对系统全局有效的配置文件为/etc/vimrc,对当前用户有效的配置文件为~/.vimrc

 1:set number 或者 :set nu       显示行号  
 2:set nonumber 或者 :set nonu   取消显示行号
 3:set showmatch 或者 :set sm        括号成对匹配 
 4:set noshowmatch 或者 :set nosm    取消括号成对匹配
 5:set ai             启用自动缩进
 6:set noai           禁用自动缩进
 7:set hlsearch       启用高亮搜索
 8:set nohlsearch     禁用高亮搜索
 9:syntax on          启用语法高亮
10:syntax off         禁用语法高亮
11:set ic             忽略字符的大小写
12:set noic           不忽略字符的大小写
13文件格式
14:set fileformat=dos      启用windows格式
15:set fileformat=unix     启用unix格式
16:set textwidth=65      设置文本宽度
17:set wrapmargin=15     设置页边距

vim 帮助

1:help option-list     选项列表
2:help topic           按照关键词搜索帮助文档
3vimtutor              vim指导手册

其他常用开发命令

缩进

1>> 缩进 
2<< 反缩进 
3V选中 >>    缩进选中的行  按 .重复命令
4也可以末行模式
5:m,n>     // m到n行缩进
6:m>m-n+1  // m到n行缩进

转换

1~  大小写转换
2g~w   单词大小写转换
3g~$   到行尾大小写转换
4g~~   整行大小写转换
5guw   单词转小写   
6gUw   单词转大写

批量替换

1 ctrl+v   
2 按c 批量修改  修改后再esc

vim映射

1:map -  x    // - 就能删除字符
2:map <space> viw  //通过空格选中一个单词
3:map <c-d> dd  //通过ctrl+d删除一行    
4用nmap/vmap/imap定义只在 normal/visual/insert模式分别有效
5:vmap \  U  在visual模式下按\ 转大写
6insert模式ctrl+d  实现删除一行
7imap <c-d> <Esc>ddi
8一般规则统一:使用非递归映射,no  recursice   简写nore ,特殊情况特殊处理
9nnoremap/vnoremap/inoremap  防止冲突

vim插件

插件管理

插件的用途就是可以很方便的管理 vim 的各种插件,快速安装配置以及清除,网上现在的帖子多数都是使用的 Vundle 这个插件,不过个人觉得这个管理工具在插件安装多了的时候不是很流畅,更喜好使用 vim-plug 这个插件,两个插件都是很清除的安装文档,这里是介绍 vim-plug 。

ctrl+h/j/k/l 移动

安装 vim-plug插件

在 Linux 下非常简单,直接通过 curl 下载即可(也可以手动下载,见官方文档)

1curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
2    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
3    
4    
5PlugInstall //按装插件
6PlugClean   //去掉vimrc 的对应的插件代码, 执行 即可删除该插件

vim-startify 插件 (启动界面)

1修改启动界面[mhinz](https://github.com/mhinz)/vim-startify
2Plug 'mhinz/vim-startify'
3帮助文档
4:h startify
5:h startify-faq
6按vim 就可以使用

Yggdroot/indentLine 增加代码缩进线

1增加代码缩进线
2Plug 'Yggdroot/indentLine'

状态栏美化vim-airline

1状态栏美化 : Vim状态栏插件,包括显示行号,列号,文件类型,文件名,以及Git状态
2Plugin 'vim-airline/vim-airline'
3Plugin 'vim-airline/vim-airline-themes'

配色方案插件morhetz/gruvbox

 1Plug 'morhetz/gruvbox'    "我正在使用的
 2"需要配置
 3colorscheme gruvbox
 4se t_Co=256  "主题无效解决
 5set background=dark
 6
 7
 8cp ~/.vim/plugged/gruvbox/colors/gruvbox.vim  ./.vim/colors
 9----------------------------------------------------------
10其他插件
11vim-hybrid
12vim-colors-solarized

文件目录scrooloose/nerdtree

 1Plug 'scrooloose/nerdtree'
 2
 3"目录管理 nerdtre  可以和 查找文件ctrlp.vim 一起配合使用
 4" autocmd vimenter * NERDTree "自动打开  不建议
 5" 目录开关
 6" 按,g 打开关闭目录览
 7nnoremap <leader>g :NERDTreeToggle<cr>
 8" 查找文件位置  按 ,d  到目录栏
 9nnoremap <leader>d :NERDTreeFind<cr>
10let NERDTreeShowHidden=1
11"忽略文件显示
12let NERDTreeIgnore=['\.pyc$','\~$','\.swp','\.git$','\.svn$','\.DS_Store$','\.pyo$','\.idea']
13
14i和s可以水平分割或纵向分割窗口打开文件,前面加g类似go的功能
15t 在标签页中打开
16T 在后台标签页中打开
17p 到上层目录
18P 到根目录
19K 到同目录第一个节点
20J 到同目录最后一个节点
21m 显示文件系统菜单(添加、删除、移动操作)
22? 帮助
23q 关闭

搜索文件ctrlpvim/ctrlp.vim

1Plug 'ctrlpvim/ctrlp.vim'
2
3
4"搜索文件 ctrlp.vim
5" 使用ctrl+p 查找文件
6let g:ctrlp_map='<c-p>'  "使用ctrl+p 就能搜文件了

文件位置移动 easymotion/vim-easymotion

1Plug 'easymotion/vim-easymotion'
2"vim 是  / 加n 一个一个跳转  ,不太方便
3"定位 vim-easymotion
4" ss 进入搜索 按key 跳到位置 其他下一个n,上一个N和vim 一样
5nmap ss <Plug>(easymotion-sn)

编辑成双成对 tpope/vim-surround

1ys  iw "   单词加双引号
2cs " '   双引号改单引号
3cs ( ]    小括号换] 
4ds '   删除成对单引号

模糊搜索内容和文件 junegunn/fzf.vim 很强大

 1https://www.jianshu.com/p/bb91582317ed
 2
 3Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
 4Plug 'junegunn/fzf.vim'
 5
 6:Ag [PATTERN]  //搜索内容
 7实现Ag 命令需要安装 the_silver_searcher
 8安装 the_silver_searcher
 9brew install the_silver_searcher
10
11:Files [PATH]  //模糊搜索
12
13:Buffers用于在存在于buffer中的文件间切换
14:Buffers 回车  
15
16Lines <keyword>用于在存在于buffer里的文件中寻找含有某个关键词的行
17:Lines maozhongyu 

批量替换插件brooth/far.vim

1https://github.com/brooth/far.vim
2
3Plug 'brooth/far.vim'
4
5:Far foo bar **/*.py   批量替换 foo 为bar  
6:Fardo

vim-go 插件

1Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
2
3ctrl+x ctrl+o 代码自动补全
4ctrl+] 跳到函数 ctrl+o 跳回来  ctrl+i ? 
5
6go代码重构 百度
7:GoFmt    格式化 
8:GoImports 导入
9:GoRun  运行

python-mode

 1Plug 'python-mode/python-mode', { 'for': 'python', 'branch': 'develop' }
 2
 3
 4let g:pymode_python = 'python3'
 5let g:pymode_trim_whitespaces = 1
 6let g:pymode_doc=1
 7let g:pymode_doc_bind = 'K'
 8let g:pymode_rope_goto_definition_bind = "<C-[>"  " 跳转到定义 
 9let g:pymode_lint = 1
10let g:pymode_lint_checkers = ['pyflakes', 'pep8', 'mccabe', 'pylint']
11let g:pymode_options_max_line_length = 120
12
13
14ctrl+ro 整理导入的包模块顺序
15:PymodeLintAuto 整理导入的包模块顺序
16ctrl+[  跳转到定义 

vim tagbar(更愉快的浏览代码)

 1" 代码大纲
 2https://github.com/majutsushi/tagbar
 3https://ctags.io/
 4https://docs.ctags.io/en/latest/osx.html
 5
 6先安装依赖
 7brew tap universal-ctags/universal-ctags
 8brew install --HEAD universal-ctags
 9
10
11" 按,t 打开 ,相当于 ide中的structure
12nnoremap <leader>t :TagbarToggle<CR>
13
14Plug 'majutsushi/tagbar'

代码高亮插件(快速浏览代码)

1Plug 'lfv89/vim-interestingwords'
2
3使用: 到指定单词按 <leader>k
4<leader>k //高亮单词
5n , N 移动高亮单词
6<leader>K // 清楚高亮

代码补全插件

 1shougo/deoplete.nvim
 2
 3if has('nvim')
 4  Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
 5else
 6  Plug 'Shougo/deoplete.nvim'
 7  Plug 'roxma/nvim-yarp'
 8  Plug 'roxma/vim-hug-neovim-rpc'
 9endif
10let g:deoplete#enable_at_startup = 1
11set completeopt-=preview " 去掉预览
12
13ctrl+x+o 补全代码
14
15" python 补全
16https://github.com/deoplete-plugins/deoplete-jedi
17" go 补全
18https://github.com/deoplete-plugins/deoplete-go

代码格式化

1https://github.com/sbdchd/neoformat
2
3Plug 'sbdchd/neoformat'
4
5静态代码检测
6golint

注视插件

1tpope/vim-commentary
2
3gc 注视和取消注视
 1生成php tags
 2wget "https://github.com/shawncplus/phpcomplete.vim/raw/master/misc/ctags-5.8_better_php_parser.tar.gz" -O ctags-5.8_better_php_parser.tar.gz
 3 tar xvf ctags-5.8_better_php_parser.tar.gz
 4 cd ctags
 5  autoreconf -fi
 6 ./configure
 7 make
 8  sudo make install
 9  
10  cd /path/to/your/projects/root
11ctags -R --fields=+laimS --languages=php    //会生成一个tags 的文件
12.vimrc追加
13set tags+=/Users/maozhongyu/code/new_chaoduoke/tags

Vim 8安装

1git clone https://github.com/vim/vim.git
2cd vim
3./configure  --enable-pythoninterp=yes
4make  
5make install
6cp src/vim  /usr/bin 
7version --version
8version --version | grep python  有+python 或者python3就行了

ideavim 无法连续移动解决

1//各种storm ide 执行
2defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false
3//恢复
4$ defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool true
5
6//vscode 执行
7defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
8defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool true

插入模式小技巧

1ctrl+h 删除上一个字符
2ctrl+w 删除上一个单词
3ctrl+u 删除当前行
4gi 快速跳转到最后一次编辑的地方进入插入模式

vim 插入模式下复制内容

1:set paste  再粘贴
2完毕后:set nopaste

其他内容

训练, 行尾按 I 到行首插入

1行首按A 到行尾插入
2替换命令 %s/xxx/ssss/g   
3ctrl+c 代替esc (有些插件会中断) 或ctrl+[
4gi 快速跳回上一次编辑的地方
5单词跳转 w,e,b   W,E,B 练习

F/f {char} 反向/正向查找一个字符 同行搜索 使用;继续查找下一个 用,查找上一个

行首行尾跳转: ^ 跳转至行首的第一个非空白字符 0 跳转至行首 $ 跳转至行尾

当前页跳转: H 页首行首 M 页中间行行首 L 页底行首

x删除字符

normal模式r可以替换一个字符,s替换一个字符并进入插入模式

c编辑进入插入模式训练

cw,caw 编辑一个单词

统计次数: %s /搜索词//n

1% s/\<work_name\>/replace_word_name/g

相邻字符对调xp

查找vim插件

https://vimawesome.com

安装macvim

 1brew unlink vim
 2brew install macvim
 3我采用dmg包安装
 4https://github.com/macvim-dev/macvim/releases 
 5mkdir ~/bin
 6export PATH=~/bin:$PATH
 7ln -s /Applications/MacVim.app/Contents/bin/* ~/bin/
 8
 9
10gvim 启动macvim
11
12
13:setfiletype php