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插件
安装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