Linux: vim
- TAGS: Linux
vi和vim简介
在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode或其它编码的纯文 字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具
文本编辑种类:
- 全屏编辑器:nano(字符工具), gedit(图形化工具),vi,vim
- 行编辑器:sed
vi :Visual editor,文本编辑器,是 Linux 必备工具之一,功能强大,学习曲线较陡峭,学习难度大
vim :VIsual editor iMproved ,和 vi使用方法一致,但功能更为强大,不 是必备软件 官网:./www.vim.html
其他相关编辑器:
- gvim 一个Vim编辑器的图形版本 vim 小抄
- neovim 支持异步特性(vim8也支持)。不会让插件运行阻碍vim使用。
初识vim
vim 命令格式
vim [OPTION]... FILE...
常用选项
+# 打开文件后,让光标处于第#行的行首,+默认行尾
+/PATTERN 让光标处于第一个被PATTERN匹配到的行行首
-b file 二进制方式打开文件
-d file1 file2… 比较多个文件,相当于 vimdiff
-m file 只读打开文件
-e file 直接进入ex模式,相当于执行ex file
-y file Easy mode (like "evim", modeless),直接可以操作文件,ctrl+o:wq|q! 保存和不保存退出
说明:
- 如果该文件存在,文件被打开并显示内容
- 如果该文件不存在,当编辑后第一次存盘时创建它
vim + /etc/init.d/functions 光标自动尾行行首 vim +5 /etc/init.d/functions 光标在第 5 行行首 vim +/dev /etc/fstab 光标在配置的第一个 dev 行行首
三种主要模式和转换
vim 是 一个模式编辑器,击键行为是依赖于 vim的 的“模式”
三种常见模式:
- 普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本。命令行模式 非编辑操作,退出
- 插入(Insert)或编辑模式:用于修改文本
- 扩展命令(extended command )或命令(末)行模式:保存,退出等
模式转换
- 命令模式 –> 插入模式
i insert, 在光标所在处输入 I 在当前光标所在行的行首输入 a append, 在光标所在处后面输入 A 在当前光标所在行的行尾输入 o 在当前光标所在行的下方打开一个新行;如果没有启动缩进法则,则光标在行首 O 在当前光标所在行的上方打开一个新行 # 插入模式快捷键 ctrl+h 删除上一个字符 ctrl+w 删除前面一个单词 ctrl+u 删除整行
- 插入模式 —
ESC–—> 命令模式 - 命令模式 -—
:-—> 扩展命令模式 - 扩展命令模式 -—
ESC, 回车 -—> 命令模式
快速切换insert和normal模式
- 使用
ctrl+c代替Esc(但是可能会中断某些插件)或者用ctrl+[代替Esc进行normal模式 gi快速跳转到最后编辑的地方并进入插入模式
硬件:键盘
HHKB 或 Poker2这种迷你键盘 CapsLock改成常用的ctrl
扩展命令模式
按 : 进入Ex模式 ,创建一个命令提示符 : 处于底部的屏幕左侧
扩展命令模式基本命令
w 写(存)磁盘文件 wq 写入并退出 x 写入并退出 X 加密 q 退出 q! 不存盘退出,即使更改都将丢失 r filename 读文件内容到当前文件中 w filename 将当前文件内容写入另一个文件 !command 执行命令 r!command 读入命令的输出 :e filename -> 打开一个文件名为filename的文件 (open file to edit) :e! filename -> 强制打开一个文件,所有未保存的东西会丢失 (force open, drop dirty buffer) :saveas filename -> 另存为 filename (save file as filename)
范例
# 执行外部命令 :!ls r! echo % # 将命令的输出写入文件中。%代表当前文件名 r! echo %:p # 插入文件绝对路径 :help read :help filename-modifiers
补全功能
当输入 : 命令时,按 CTRL-D 可以查看可能的补全结果。
按 <TAB> 可以使用一个补全。
范例:使用 CTRL-D 和 可以进行命令行补全
1. 请确保 Vim 不是在以兼容模式运行: :set nocp 2. 查看一下当前目录下已经存在哪些文件,输入: :!ls 或者 :!dir 3. 现在输入一个目录的起始部分,例如输入: :e 4. 接着按 CTRL-D 键,Vim 会显示以 e 开始的命令的列表。 5. 然后按 <TAB> 键,Vim 会补全命令为 :edit 。 6. 现在添加一个空格,以及一个已有文件的文件名的起始部分,例如: :edit FIL 7. 接着按 <TAB> 键,Vim 会补全文件名(如果它是惟一匹配的)。
地址定界
格式:
:start_pos,end_pos CMD
在按下 : 键时,vim会切换到命令行模式。这个模式和shell下的命令行有些
类似,我们可以输入一条命令,然后按执行它。在任意时刻,我们都可以按键从
命令行模式切换回变通模式。
地址定界格式
# #具体第#行,例如2表示第2行 #,# #从左侧#表示起始行,到右侧#表示结尾行 #,+# #从左侧#表示的起始行,加上右侧#表示的行数,范例:2,+3 表示2到5行 . #当前行 $ #最后一行 .,$-1 #当前行到倒数第二行 % #全文, 相当于1,$ /pattern/ #从当前行向下查找,直到匹配pattern的第一行,即:正则表达式 /pat1/,/pat2/ #从第一次被pat1模式匹配到的行开始,一直到第一次被pat2匹配到的行结束 #,/pat/ #从指定行开始,一直找到第一个匹配patttern的行结束 /pat/,$ #向下找到第一个匹配patttern的行到整个文件的结尾的所有行
如
:3,+7 : 从第3 行开始向后加 7 行,共 8 行
:.,$-1 : 当前到倒数第二行
:1,$ 全文
:/first/,$ 从光标开始被匹配的行开始,到最后一行结束
地址定界后跟一个编辑命令
c 删除插入 d #删除 y #复制 w file #将范围内的行另存至指定文件中 r file #在指定位置插入指定文件中的所有内容
范例:
:# r /PATH/FROM/SOMEFIL 在第#行后插入读取到的文件内容
查找并替换
格式
:[range]s[ubstitute]/要查找的内容/替换为的内容/修饰符
说明:
- range表示范围。如10,20表示第10到20行,%表示全部
- 要查找的内容:可使用基末正则表达式模式
- 替换为的内容:不能使用模式,但可以使用\1, \2,…等后向引用符号;还
可以使用
&引用前面查找时查找到的整个内容 - 修饰符:
i : 忽略大小写 c(confirm) : 表示确认,可以确认或者拒绝修改 g(global) : 全局替换,默认情况下,每一行只替换第一次出现 gc : 全局替换,每次替换前询问 n(number) : 报告匹配到的次数而不替换,可以用来查询匹配次数
4.查找替换中的分隔符/可替换为其它字符,如:#,@ 范例:
s@/etc@/var@g s#/boot#/#i
# 制表符替换为4个空格 :%s/\t/ /g #
示例:
#1. 查找全文把所有 this 的小写 t 替换成 大写 T this is a new line this is a new line . this is another new line :%s/\<this\>/This/g # 精确匹配this这个单词进行替换 #2. 从倒数第 4 行到最后一行,不分大小写地把所有的 this 替换成大写的 THIS This is a new line This is a new line . this is another new line this is a new line . this is another new line :$-4,$s/this/THIS/ig #3. 后向引用,将全文中所有以 t 开头的单词替换成以大写 T 开头的单词。 :%s@\<t\([[:alpha:]]\+\)\>@T\1@g #4. 直接引用,将所有以小写 t 开头的单词,在该单词后紧跟 er 字符 :%s@\<t[[:alpha:]]\+\>@&er@g #5. 将文件中行首是 # 井号的替换为无 :%s@^#@@ #6. 复制/etc/grub2.cfg文件至/tmp目录中,用查找替换命令删除/tmp/grub2.cfg文件中以空白字符开头的行的行首的空白字符; :%s@^[[:space:]]\+@@ #7. 复制/etc/rc.d/init.d/functions文件至/tmp目录中,用查找替换命令为/tmp/functions文件的每个以空白字符开头的行的行首加上#; :%s@^[[:space:]]@#&@g 不用匹配多次,g 可以单行匹配多次。考虑的不周全,这样一来某一行只有一个空白字符也会加 # 井号了 #如果我们期望这一行一定是一个有用字符而不仅仅是空白行,可以用下面的匹配 :%s@^[[:space:]]\+[^[:space:]]@#&@g #8. 为/tmp/grub2.cfg文件的前三行的行首加上#号; :1,3s/^/#/ #9. 将/etc/yum.repos.d/CentOS-Base.repo文件中所有的enabled=0替换为enabled=1,所有gpgcheck=0替换为gpgcheck=1; :%s@\(enabled\|gpgcheck\)=0@\1=1@g
:%s@.*172.17.19.161@#&@g
normal模式下按J删除此行末尾的换行符,从而合并两行
:e!重新读进上次保存的此文件内容
:ab myname william_djj
以后再编辑时键入myname,然后空格或回车myname串就会被william_djj代替
相关命令:
:[range]copy {address} //指定范围内的行拷贝到指定行下,copy的命令简写:t
:[range]move {address} //指定范围内的行移动到指定行下
:[range]substitute/{pattern}/[string]/{flags} //指定范围内出现{pattern}的地方替换为{string}
:[range]global/{pattern}/[cmd] //指定范围内匹配{pattern}的所有行,在其上执行Ex命令{cmd}
:[range]normal {commands} //指定范围内的每一行执行变通模式命令vi
[range]相关命令
1 : 文件的第一行
$ : 文件的最后一行
0 : 虚拟行,位于文件第一行上方
. : 光标所在行
'm : 包含位置标记m的行
'< : 高亮选区的起始行
'> : 高亮选区内的结束行
% : 整个文件 (1,$ 相当于%)
练习:
复制某一行或某一段到指定行的下方
:[range]copy {address}
:3,5copy 5 //3到5行的内容复制到第5行之后。
- 替换
:1,2 s/T/t/大写T替换成小写t 将选定区域,移动到末尾
Vjj :'<,'>m$选中区域替换
# 选中区域`替换成= :'<,'>s@`@=@g
快速导航使用过的命令
使用 : 后按Ctrl + f。可以看到历史命令,之后就可以像普通模式中一样使用hjkl等按键了。
定制vim的工作特性
扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存 配置文件:
/etc/vimrc #全局 ~/.vimrc #个人
cat <<\EOF > ~/.vimrc
set ts=4
set expandtab
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/env bash")
call setline(2,"#")
call setline(3,"#********************************************************************")
call setline(4,"#Author: jasperhsu")
call setline(5,"#QQ: 277147964")
call setline(6,"#Date: ".strftime("%Y-%m-%d"))
call setline(7,"#FileName: ".expand("%"))
call setline(8,"#URL: https://jaspervincent.github.io")
call setline(9,"#Description: This is a script")
call setline(10,"#Copyright (C): ".strftime("%Y")." CC BY-NC 4.0")
call setline(11,"#License: MIT")
call setline(12,"#********************************************************************")
call setline(13,"")
endif
endfunc
autocmd BufNewFile * normal G
EOF
行号
显示:set number,简写 set nu 取消显示:set nonumber, 简写 set nonu
相对行号:set relativenumber
- 使用:移动到当前下面第2行 2j;移动到当前上面第10行 10k
忽略字符的大小写
启用:set ignorecase,简写 set ic 不忽略:set noic
方法2 如果您想要仅在一次查找时忽略字母大小写,您可以使用 \c 操作:扩展命令行模式,输入命令“:/string\c ”,将会查找string字符串
自动缩进
启用:set autoindent,简写 set ai 禁用:set noai "set smartindent"智能缩进
复制保留格式
启用:set paste 禁用:set nopaste
复制保留格式 :set paste 进入paste模式以后,可以在插入模式下粘贴内容,不会有任何变形 但这样还是比较麻烦的,每次要粘贴的话,先set paste,然后粘贴,然后再set nopaste。 有没有更方便的呢?你可能想到了,使用键盘映射呀,对。我们可以这样设置:: :map <F10> :set paste<CR> :map <F11> :set nopaste<CR> 这样在粘贴前按F10键启动paste模式,粘贴后按F11取消paste模式即可。 其实,paste有一个切换paste开关的选项,这就是pastetoggle。通过它可以绑定快捷键来激活/取消 paste模式。比如:: :set pastetoggle=<F11> 这样减少了一个快捷键的占用,使用起来也更方便一些。 #注意复制保留格式后,再做TAB制表符转空格。
显示Tab和换行符 ^I 和$显示
启用:set list 禁用:set nolist
改变字符显示
set listchars=tab:->,eol:[ " 制表符换成-> 换行符换成[
高亮搜索
启用:set hlsearch 或set hls 禁用:set nohlsearch #'hls' 'hlsearch' 高亮显示所有的匹配短语
增量搜索高亮
set incsearch # include search #'is' 'incsearch' 查找短语时显示部分匹配
括号匹配高亮
set showmatch, set sm 括号匹配高亮 set nosm 取消
设置 hlsearch,incsearch,showmatch,请输入: :set hls is sm
语法高亮
启用:syntax on 禁用:syntax off
文件格式
启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix
用空格代替
启用:set expandtab 默认为8个空格代替Tab 简写:set et
禁用:set noexpandtab
注意:与set paste一起使用时,写在其后面。
Tab用指定空格的个数代替
启用:set tabstop=# 指定#个空格代替Tab 简写:set ts=4
设置tab键缩进4个字符
[root@centos7-01 ~]# vim /etc/vimrc " add at 2017 set ts=4 et sw=4 "set shiftwidth=4 tabstop=4 expandtab
说明:
set expandtab "表示空白变成空格,简写 set et set tabstop=4 "指显示出来是多少个空格的长度,默认 8,简写 set ts=4 set softtabstop=4 set shiftwidth=4 "表示每一级缩进的长度
设置文本宽度
set textwidth=65 (vim only)
set wrapmargin=15
设置光标所在行的标识线
启用:set cursorline,简写 set cul
禁用:set nocursorline
加密
启用: set key=password
禁用: set key=
其它
filetype plugin on "文件类型 set undofile " 所有的操作会记录在unofile中,方便使用 u 和 ctrl + r 。会在当前目录创建一个 .同名文件.un~ 文件 set undodir=~/.vim/undodir " 存储undofile的目录,不会污染项目目录下文件。提前创建好目录 set history=500 " 记录最近指定次数的操作,在退出vim后再进来仍可以 u 撤消之前的操作 set ruler " 右下角显示光标状态行 set nohls " 关闭匹配的高亮显示 set incsearch " 设置快速搜索 set foldenable " 开启代码折叠 "set fdm=manual " 手动折叠 set foldmethod=syntax " 自动语法折叠 set modeline " 自动载入模式行 set cursorline " 突出显示当前行 set mouse= "nomarl模式中,可以用鼠标操作,如复制文本
了解更多
set 帮助
:help option-list
:set or :set all
加密 (encryption)
vim可以给文件加密码
vim -x 文件名 (filename) ->输入2次密码,保存后文件每次都会要密码才能进 入 (encrypt the file with password)
vim处理加密文件的时候,并不会作密码验证,也就是说,当你打开文件的时候, vim不管你输入的密码是否正确,直接用密码对本文进行解密。如果密码错误, 你看到的就会是乱码,而不会提醒你密码错误(这样增加了安全性,没有地方可 以得知密码是否正确)当然了,如果用一个够快的机器作穷举破解,vim还是可 以揭开的
换行方式
在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结 尾处,你要快速回到新的一行的开头,需要打印针头在纸面上飞快地掠过,常常 会在纸面上留下污点。解决这个问题的办法就是,用两个字符:一个字符 <Retrun> 来移到 第一列,另一个字符 <Line feed> 来新增一行。
计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生 了不同的意见。UNIX人认为在到达一行的结尾时新增一行 <Line feed>(LF),而 Mac人则认同 <Return>(CR)的解决办法,MS则坚持古老的<Return><Line feed>(CRLF)的方法。这就意味着如果你将一个文件从一个系统转移到另一个系 统,就面临着回车换行的问题。而Vim编辑器则会自动的认出这种文件格式方面 的区别,并做出相应处理。
1.fileformats选项
:set fileformats=unix,dos 可以改变文件的格式 (change format) :set ff=unix -> 设定文件成unix格式 (set file in unix format) :set ff=dos -> 设定文件成dos格式 (set file in dos format) :set ff? -> 检查当前文件格式 (check the format of current file) 如果改变格式,直接:w存档就会存成新的格式了。 :set endofline 在默认情况下,Vim认为文件是由行组成的,并且文件最后一行是以<EOL>为结束符的。如果你想设置文件以<EOL>结束符结尾 :set noendofline 不以<EOL>结束符来结尾
2.所以:换行符问题\r \n
方法1: :%s/^M//g 然后,回车即可替换。注,其中”^M”的输入,分别是“Ctrl+v”、“Ctrl+M”键生成的 方法2: :set fileformat=unix :w 方法3:使用sed 工具 sed ’s/^M//’ filename > tmp_filename 方法4: tr -d ‘\r’ 既然window下的回车符多了‘\r’,那么当然通过删除‘\r’ ,也可以实现: 方法5:(最常用的方法) 在终端下敲命令: dos2unix filename 直接转换成unix格式,就OK了 #unix2dos win.txt 将Linux的文本格式转换成Windows的文本格式
3.显示换行
使用以下命令进入,那么就可以清楚的看到以“$”表示的换行符和以“^I”表示的制表符。
:set list # vi下显示回车换行符等特殊符号 :set nolist # 令退出<list mode>: cat -E filename
4.删除换行
:%s/\n//g # 删除换行符 :%s/\r//g # 删除DOS文件中的回车符“^M” :%s/\r/\r/g # 转换DOS回车符“^M”为真正的换行符
可以用以下命令删除行尾的空格以及DOS回车符。它没有使用 / 字符作为替换
命令各个参数间的分隔符,而是使用了 # 字符。命令还使用了 ? 正则表达
式,用来匹配它前面出现的字符0次或1次。
:%s#\s*\r\?$## :%s/^\n\{3}// # 删除三行空行 :%s/\n\n/\r/g # 将连续的两个空行替换成一个空行
5.自动换行
在默认情况下,Vim是不会自动换行的,也就是说我们需要自己决定回车的位置。 但是我们也可以通过指定textwidth选项,让Vim自动在指定位置换行。
:set textwidth=29 # 指定在30列时自动换行。由于在遇到空格时才会自动换行,所以换行的精确位置可能会小于你指定的列宽 :set wrapmargin=10 # 从右面算起当达到10个字符的空格时要换行
在指定了文本宽度的情况下,当我们将一行中的前几个文字删掉时,Vim并不会 将后面行中的文本移动上来,而是形成了一些长短不一的段落,这样看起来不是 很好。可以有几种方法处理这个问题:
a方法: 在可视化模式下选中这些文本,用gp命令来格式化选中的段落。
b方法:使用gqmotion命令来完成格式。例如命令模式下,gq4j格式化光标至下 面的4行,gq} 格式化光标下整个段落,gqip格式化当前段落,gqgq 格式化一行, 简记为gqq
注意:选项textwidth优先于wrapmargin。如果要使wrapmargin选项生效,必须 将textwidth设置为0(这也是默认值)。
6.合并行
命令J使两行合并为一行,同时用空格分隔这两行。
通过设置joinspace选项,可以控制合并两行时的分隔符(如果一行是以标点符号来结尾)。 :set nojoinspaces,用J命令合并两行时会用一个空格来分隔; :set joinspaces,用J命令合并两行时会用两个空格来分隔。 gJ命令 不希望用空格来分隔合并的行 ???:join命令,将几行合并为一行并使用空格来分隔各行。如果不希望加入空格,那么可以使用:join!命令。
自动备份 (backup)
vim可以帮你自动备份文件(储存的时候,之前的文件备份出来)
:set backup -> 开启备份,内建设定备份文件的名字是 源文件名加一个 ‘~’ (enable backup default filename+~) :set backupext=.bak -> 设定备份文件名为源文件名.bak (change backup as filename.bak) 自动备份有个问题就是,如果你多次储存一个文件,那么这个你的备份文件会被不断覆盖,你只能有最后一次存文件之前的那个备份。没关系,vim还提 供了patchmode,这个会把你第一次的原始文件备份下来,不会改动 :set patchmode=.orig -> 保存原始文件为 文件名.orig (keep orignal file as filename.orig)
命令模式
命令模式,又称为Normal模式,功能强大,只是此模式输入指令并在屏幕上显示, 所以需要记忆大量的快捷按键才能更好的使用
退出VIM
ZZ 保存退出
ZQ 不保存退出
光标跳转
字符间跳转:
常用操作:
h: 左 L: 右 j: 下 k: 上 #COMMAND:跳转由#指定的个数的字符。# 号代表你所输入的个数,如,3h 光标向左移动 3 位、3j 光标向下移动 3 位 、3k、3l;
其它操作:
f[x] : 移动光标至当前行下一个出现字符x的位置,大写意思相反。 #推荐使用 结合文本操作,完成复杂的操作,df[char] 如dfa dFa cfa ; : 分号,向后重复上一次的f命令 #推荐使用 , : 逗号,向前重复上一次的f命令 #推荐使用 t[x] : 移动光标至当前行下一个出现字符x的位置前面一个字符。大写意思相反。 ` : 反引号,跳至最后修改的行
单词间跳转:
常用操作:
w/W : 正向移到到下一个单词word/WORD的词首 b/B : 反向移动到当前单词或上一个单词word/WORD的词首 e/E : 正向移动到当前单词或下一个单词word/WORD的词尾 #CMMAND : 跳转指定个数的字符;,#w、#e、#b; 注意:小写的w b e 指以非空白符分割的单词,大写的W E B 指以空白符分割的单词
其它操作:
ge : 反向移动到上一个单词的结尾
% : 如果光标当前位置是括号(、)、[、]、{、},按 % 会将光标移动到配对的括号上。 vim-matchit 插件可以在函数、括号之间跳转
* : 标记当前光标单词,跳至下一个出现该单词的地方。关闭高亮用 :set nohls
g*查找包含当前单词字符串的所有单词(*只查找与当前单词精确匹配的单词),
# : 与*类似,但是从下往上搜索
当前页跳转:
H:页首 M:页中间行 L:页底 # Head Middle Lower zt:将光标所在当前行移到屏幕顶端 zz:将光标所在当前行移到屏幕中间 zb:将光标所在当前行移到屏幕底端
行首行尾跳转:
^ : 跳转至行首第一个非空白字符; 0 : 数字0跳转至绝对行首; $ : 跳转至绝对行尾 g_: 移动到行尾非空白字符
行间移动:
#G 或者扩展命令模式下 :# 跳转至由第#行 G 最后一行 1G, gg 第一行 4gg, :4 第4行 输入 CTRL-G 显示当前编辑文件中当前光标所在行位置以及文件状态信息
配对括号的查找
光标放在当前标记下(、)、[、]、{、},按 % 查找配对的标记,再按可跳回配对标记
跳转到文件和变量声明
# :help editing.txt gf: 打开当前光标下的文件 # :help tagsrch.txt CTRL-]:跳到类型定义 CTRL-t:跳回 # :help pattern.txt gd # 跳转到函数声明 go to declaration # help motion.txt ctrl + o # 回到原来位置 CTRL-I 则带您到较新的位置。可跳到下一个文件搜索的新搜索位置,可多次操作
句间移动:
) : 光标移至句尾 ( : 光标移至句首
段落间移动:
} 下一段 { 上一段
命令模式翻屏操作
Ctrl+f : 向文件尾部翻一屏
Ctrl+b : 向文件首部翻一屏
Ctrl+d : 向文件尾部翻半屏
Ctrl+u : 向文件首部翻半屏
ctrl+e : 向下一行
ctrl+y : 向上一行
Enter : 按行向后
:set scrolloff=5 翻页是留空5行,方便视野查看。默认0
书签
m<name>: 为当前光标所在位置制作一个名字为a的书签,ma,mb,mc... `<name>: 跳至书签a, `a,`b,`c..... '<name>:跳转到书签行的开头 :marks 查看当前文件的书签,输入 “:<num>” 可跳转. # 注意退出文件后可以使用,仅限这个文件配置过书签。想要在不同文件内实现书签跳转,需要把书签名大写 :delm{marks} <name> :删除多个书签用空格分开 :delm! -> 删除全部书签 (delete all marks)
删除:x字符编辑
x 删除光标处的字符 #x 删除光标处起始的#个字符 xp 交换光标所在处的字符及其后面字符的位置 大X : 删除前一个字符 ~ 转换大小写 J 删除当前行后的换行符
删除:d删除命令(delete)
d : 删除命令,可结合光标跳转字符,实现范围删除 d^ : 删除到行首 d$ : 删除到行尾 dw : 删除到下#个单词词首 de : 删除到当前或后一个单词的词尾 db : 删除到当前或前一个单词的词首; #dCOMMAND : # 号表示个数 dd : 删除光标所在处的行; #dd : 删除光标所在的行起始的共#行;{ D : 删除至本行末尾,等同于d$
注意 : 删除内容不会被直接清空,放置缓存区域,但只能接着操作且操作最近一次缓存
高级用法
dt) : 从当前光标处一直删除到这行的)前。 dfa: 删除当前光标到a的字符串。dFa 反相删除 d/word: 从光标处删除至第1个word处
修改:r替换命令(replace)
r 只替换光标所在处的一个字符
R 切换成REPLACE模式(在末行出现-- REPLACE -- 提示)不断替换后面的字符,按ESC回到命令模式
修改:s替换多个字符(substitute)
s : 删除当前字符,并进入插入模式 #s : 删除当前到后面#个字符,并进入插入模式 S : 删除整行,并进入插入模式
修改:c改变命令(change)
c: 删除后切换成插入模式 c^ : 删除当前光标至 行首,并换为输入模式 c0 : 删除当前光标至 行首,并换为输入模式 c$ : 删除当前光标至 行尾,并换为输入模式 cw : 删除当前光标至 下#个单词词首,并换为输入模式 ce : 删除到当前或后一个单词的词尾,并换为输入模式 cb : 删除到当前或前一个单词的词首;,并换为输入模式 #COMMAND : # 号表示个数 ,COMMAND 表示 c^、c0等 C:删除当前光标到行尾,并切换成插入模式,相当于c$ c"": 删除双引号之前的内容
高级用法:
c/word:从光标处修改至第1个word处,并进入编辑模式 cc : 删除光标所在的行,并转换为编辑模式,自动进缩进 推荐 #cc : 删除光标所在的#行,并转换为编辑模式
查找
/或者?PATTERN:从当前光标所在处向文件尾部或者前部查找
n或者N:跳转到下一个或上一个匹配
*或者# : 进行当前单词的前向和后向匹配
CTRL-O 带您跳转回较旧的位置。可跳到上一个文件搜索的旧搜索位置,可多次操作
CTRL-I 则带您到较新的位置。可跳到下一个文件搜索的新搜索位置,可多次操作
Ignore Case,忽略大小写 `:set ic`
如果您想要仅在一次查找时忽略字母大小写,您可以使用 \c
操作:扩展命令行模式,输入命令“/string\c ”,将会查找string字符串
复制命令(yank)
c已经被占用了,所以复制了了y(yank)
y : 复制,工作行为相似于d命令; y$ : 复制到行末 y^ : 复制到行首 y0 : 复制到行首 yw : 复制到下#个单词词首 ye : 复制到当前或后一个单词的词尾 yb : 复制到当前或前一个单词的词首; #COMMAND : # 号表示个数 yy : 复制一行 #yy : 复制#行 Y:复制整行 可结合 p 粘贴使用,如 y$ --> p ,yy --> p
粘贴命令(paste)
小p : 缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至光标所在的后方 大P : 缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至光标所在的前方 ]小p : 将剪切板中的文本放入合适的缩进处 可以与d配合达到剪贴。 insert模式下粘贴:ctlr+v或者cmd+v 。注意 粘贴内容autoindent自动缩进问题,使用:set paste 和 :set nopaste解决,
撤消更改
u 撤销最近的更改,相当于windows中ctrl+z #u 撤销之前多次更改 大U 撤消光标落在这行后所有此行的更改 Ctrl - r 重做最后的“撤消”更改,相当于windows中crtl+y . 重复前一个操作 dot command #. 重复前一个操作#次 :e! 文档还原到最原始状态
~/.vimrc
set undofile " 所有的操作会记录在unofile中,方便使用 u 和 ctrl + r 。会在当前目录创建一个`.同名文件.un~`文件 set undodir=~/.vim/undodir " 存储undofile的目录,不会污染项目目录下文件。提前创建好目录 set history=500 " 记录最近指定次数的操作,在退出vim后再进来仍可以 u 撤消之前的操作
其它的操作:
字母大小写转换:
~ #转换大小写 g~iw #改变当前单词的大小写 gU #大写 gu #小写 gUiw #使当前单词全为大写 guiw #使当前单词全为小写
例如
- 光标停留在字母的位置按~键,可以看到字母自动切换大小写;
- 普通模式下按 v 选中文件,再按gU或gu切换字母大小写
缩进:
>> : 往前缩进一个制表符 << : 往后缩进
如:
4>>让光标往下的4行缩进1个制表符 ctrl+v 向下选中行,> 所在的行缩进4个制表符
字符ascii码 16进制 8进制
ga
高级用法
<start position><command><end position>
常见Command:y 复制、d 删除、gU 变大写、gu 变小写
范例:
0y$ 命令 0 → 先到行头 y → 从这里开始拷贝 $ → 拷贝到本行最后一个字符
范例:粘贴“wang”100次
100iwang [ESC]
- di" 光标在” “引号之间,则删除” “引号之间的内容
- yi( 光标在()之间,则复制()之间的内容
- vi[ 光标在[]之间,则选中[]之间的内容
- dtx 删除字符直到遇见光标之后的第一个 x 字符
- ytx 复制字符直到遇见光标之后的第一个 x 字符
可视化模式
vim具有3种不同的可视模式,分别用于操作字符文本、行文本或块文本。
可视模式允许我们选中一个文本区域并在其上操作。尽管看起来很熟悉,但对于 选中的文本,vim的视角去有异于其他文本编辑器。
在末行有”– VISUAL – “指示,表示在可视化模式
允许选择的文本块
- v 面向字符,– VISUAL –
- V 面向整行,– VISUAL LINE –
- ctrl-v 面向块/列,– VISUAL BLOCK –
可视化键可用于与移动键结合使用 w ) } 箭头等
突出显示的文字可被删除,复制,变更,过滤,搜索,替换等
其它操作:
gv : 重选上次的高亮选区
o : 切换高亮选区的活动端,是前端还是后端
小o : 移动到另外一个标记区块的末端
大U : 所选区块转换为大写
大O : 移动到区块另外一个角落
aw : 标记一个单词
ab : 包括括号和()的区域
aB : 包括花括号和{}的区域
ib : 括号()内的区域
iB : 花括号{}内的区域
范例:在文件光标位置到行尾,所有行首插入#
输入ctrl+v 进入可视化模式 输入 G 跳到最后1行,选中每一行的第一个字符 输入 I 切换至插入模式 输入 # 按 ESC 键
多行行首加#
ctrl+v 光标选区域 输入0 输入大i 输入# 按 ESC 键
把两行的所有单词变成小写,按V然后按j或k选中这两行,按gu即可
多行加单词 1ctrl+v 光标选区域 按shift+i 输入内容,最后按2下ESC
多行加注释
:[range]normal {commands} //指定范围内的每一行执行变通模式命令vi
[range]相关命令
1 : 文件的第一行
$ : 文件的最后一行
0 : 虚拟行,位于文件第一行上方
. : 光标所在行
'm : 包含位置标记m的行
'< : 高亮选区的起始行
'> : 高亮选区内的结束行
% : 整个文件 (1,$ 相当于%)
V选行
'<,'>normal 0i#
命令:
> : 右移 < : 左移 d : 删除 ~ : 改变大小写 结合编辑命令:d,c,y
范例:
可视模式下的多行缩进
:set shiftwidth=4 softtabstop=4 expandtab //将制表符转换成 4 个空格 V //选择整行 j //跳转到下行 > //缩进 gv //重复上次所选内容 //缩进
- 可视模式下编写表格:
步骤
- ctrl +v 开启列块模式
- 3j 向下先3行选定,列块
r| 按将空格替换为|
- yy p 复制一行
Vr- 整行替换为-
范例:多行尾插入
C-v 开启块模式 $ 选中到每行行尾 A 插入内容 ESC gv // 重复上次所选内容
范例:批量替换内容
############# ############# ############# ve 选中要修改的区域 r + space 将#号换成空格 R 进行Replace 模式 输入内容 ############# #this test # #############
多文件操作
概念:Buffer Window Tab
- Buffer是指打开的一个文件的内存缓存区
- 窗口是Buffer可视化的分割区域
- Tab可以组织窗口为一个工作区
Buffer缓存区
vim打开一个文件后会加载文件内容到缓冲区,之后的修改都是对内存中的缓冲
区,并不会直接保存文件,直到我们执行 :w(write) 的时候都会把修改内容写
入到文件里。打开多个文件时有多个buffer。
# 查看 :ls 列出所有的缓冲区,然后可以使用:b N 跳转到缓冲区编号N的缓冲区 :n 编辑下一个文件 # Buffer切换 :bN 跳转到指定编号的缓冲区:b3 :bpre 或者:bp 跳转到上一个缓冲区 :bnext 或者:bn 跳转到下一个缓冲区 :bfirst 跳转到第一个缓冲区 :blast 跳转到最后一个缓冲区 :b buffer_name加上tab补全来跳转 # Buffer操作 :e filename : 在新的缓冲区打开一个文件,支持TAB补全。或者vim file1 file2 多个文件调入缓冲 :bd1 删除编号为1的缓冲区 :sp filename : 在新的缓冲区打开一个文件并划分
vim FILE1 FILE2 FILE3 …
:next 下一个 :prev 前一个 :first 第一个 :last 最后一个 :wall 保存所有 :qall 不保存退出所有 :wqall保存退出所有 :set autowrite -> 设定自动保存,当你编辑下一个文件的时候,目前正在编辑的文件如果改动,将会自动保存 (automatic write the buffer when you switch to next buffer) :set noautowrite -> 关闭自动保存 (turn autowrite off)
演示:
[root@node01 ~]# echo 01 >file1 [root@node01 ~]# echo 02 >file2 [root@node01 ~]# echo 03 >file3 [root@node01 ~]# vim file1 file2 file3 01 复制第一行 yy,并粘贴到file2文件中 :next 02 01
Window 窗口
窗口是可视化的分割区域。一个缓冲区可以分割成多个窗口,每个窗口也可以打 开不能缓冲区。
多文件分割
vim -o|-O FILE1 FILE2 ... -o: 水平或上下分割 -O: 垂直或左右分割(vim only) 在窗口间切换:Ctrl+w, Arrow j向下切换, k向上切换
单文件窗口分割
窗口分割
Ctrl+w,s:split, 水平分割,上下分屏。或者:sp。:sp(split) filename 上下分割,并打开一个新的文件。 Ctrl+w,v:vertical, 垂直分割,左右分屏,或者:vs。:vs(vsplit) filename 左右分割,并打开一个新的文件。 :vnew 打开一个新窗口并开始编辑一个未命名新文件(ctrl+w+v) :close 关闭当前窗口 :only 关闭除当前窗口以外的所有窗口 ctrl+w,q:取消相邻窗口 ctrl+w,o:取消全部窗口 :wqall 退出 Ctrl+w c 关闭分屏 关闭当前窗口 Ctrl+w,方向键 : 窗口间切换
切换窗口
切换窗口的命令都是使用ctrl +w(window)作为前缀
<C-w>w 在窗口循环切换。如<C-w><C-w><C-w><C-w> <C-w>h 切换到左边的窗口 <C-w>j 切换到右边的窗口 <C-w>k 切换到上边的窗口 <C-w>l 切换到下边的窗口 #移动 <C-w>L 左边窗口移动到右边 <C-w>H 右边窗口移动到左边
重排窗口
重排窗口可以改变窗口的大小 :h window-resize 查看文档
<C-w>= 使所有窗口有一样的高度 <C-w>_ 最大化活动窗口的高度 <C-w>| 最大化活动窗口的宽度 [N]<C-w>_ 把活动窗口的高度设为[N]行 [N]<C-w>| 把活动窗口的宽度设为[N]列 <C-w>+ -/+ -> 增减分屏的大小 (change split size) <C-w>> 向右扩展 <C-w>< 向左扩展
小结:
:sp 垂直方向窗口切分 Ctrl + w w 光标切换至其它窗口 :q 退出窗口 :vsp 水平方向窗口切分 :vsp 文件, 在新窗口打开文件 Ctrl + w w 交换2个窗口 Ctrl + w s 垂直方向窗口切分的快捷键 :e 文件,在当前窗口打开其它文件 :sp 文件,新开窗口打开文件 ctrl+w r 旋转窗口位置 ctrl+w h/j/k/l 上下左右移动光标至对应窗口 :resize num 垂直方向改变大小。如:resize +5 :resize -5 :vertical resize 水平方向改变大小。如:vertical resize +10 或者 :vertical resize -10
Tab(标签页)将窗口分组
Tab是可以容纳一系列窗口的容器(:h tabpage)。vim的tab和其它编辑器不太一 样,可以想象成Linux的虚拟桌面。比如一个tab全用来编辑python文件,一个 tab全是html文件。相比窗口,tab一般用的比较少,tab太多管理起来也比较麻 烦。
Tab(标签页)操作
:table[dit] {filename} 在新标签页中打开文件
<C-w>T 把当前窗口移动到一个新标签页
:tabc[lose] 关闭当前标签页及其中的所有窗口
:tabo[nly] 只保留活动标签页,关闭所有其它标签页
Tab(标签页)切换操作
:tabn[ext] {N} 切换到编号为N的标签页。普通模式命令{N}gt
:tabn[ext] 切换到下一个标签页。普通模式命令gt
:tabp[revious] 切换到上一个标签页。普通模式命令gT
vim的text object文件对象
前面我们已经多次使用了文件对象,这里专门介绍一下。可以操作文件对象是 vim中一个很方便的特性。可以通过它方便的操作一个单词、句子、段落或者括 号中的内容。
text object文本对象,vim文本也有对象概念,比如一个单词、句子、段落、 tag、块(如括号、方括号、引号),通过操作文本对象来修改比只操作单个字符 高效。
文件对象操作格式
[number]<operator>[text object or motion] <数字> <操作符> <文本对象或移动命令>
number: 数字用于在文本对象或移动操作上进行多次执行。
比如说, 向后 3个单词, 向前 2 个段落. 数字是可选的, 可以出现命令 (command)的前面,也可以放在命令的后面.
如果是 motion 和下面所提到的 operator 都有数字修饰,那么效果是两个数 字相乘. 比如, 2d3w 是删除 6 个单词。
operator: 操作符,
比如, change, delete (删除), yank (复制). 操作符也是可选的. 但是如果 没有操作符的话, 那么就只剩一个移动命令,而非一个编辑命令了.
见 :h operator, motion.txt。
Vim 默认提供的 operator 有:
d delete 删除 y yank 复制 c change 修改 = format 格式化 gU uppercase 变为大写 gu lowercase 变为小写 g~ toggle case 变换大小写 v visual 高亮显示 gq wrap format 换行格式化 = format,缩进对齐 < 向左缩进 > 向右缩进 ~, !, gq, gw, g?, zf, g@ 更多:h operator
text object 或者 motion 可以是一个文本对象
比如, 一个单词, 一个句子,一个段落, 或者是一个移动, 比如, 向下移动一 行, 向后翻一页, 到一行末尾.
:h text-objects: Text object selection 文本对象的选择。motion.txt 文本对象操作涉及到范围和操作,范围主要是主要是 i(inner ) 和a(around), 文本对象有 w (word), s (sentence), p (paragraph), 和各种引号和括号。 当然通过插件还能增强 text object 的功能。类型 缩写 1.word w 2.WORD W 单词 3.sencence s 句子 4.paragraph p 段落 5.tag t 标签 6.block b 7.Block B 块 8.symbol block "'`([{<
举几个例子:
- iw: inner word, 键入 viw 首先 v 键入选择模式,然后 iw 选中当前单词。
- aw: a word, 它会选中当前单词,同时包含当前单词之后的空格。比如 daw 可以删除当前单词和空格。如果省略了范围,是从当前光标删除到下一个单词开头。
text object: 文本对象的作用范围
{i|a}{TEXT-OBJECT_ID}
i 表示 inner 选中
a 表示 around,它不但会选中当前单词,还会包含当前单词之后的空格。、
TEXT-OBJECT_ID 表示文本对象的缩写
选择文本对象时使用 i 或者 a 加上文本对象的缩写就可以选择文本对象
iw …inner word
aw …a word
iW …inner WORD
aW …a WORD
is …inner sentence
as …a sentence
ip …inner paragraph
ap …a paragraph
it …inner tag
at …a tag
ab …a block
ib …inner block
aB …a Block
iB …inner Block
i[ or i] …inner block
a[ or a] …a block
i( or i) …inner block
a( or a) …a block
i< or i> …inner block
a< or a> …a block
i{ or i} …inner block
a{ or a} …a block
i" …inner block
a" …a block
i` …inner block
a` …a block
更多:h text-objects
:h motion: intro.txt --> 4. Notation --> {motion}
{motion} A command that moves the cursor. These are explained in
|motion.txt|. Examples:
w to start of next word
b to begin of current word
4j four lines down
/The<CR> to next occurrence of "The"
motion:其实就是跳转指令,像是常用的 G, gg , w, f{char} … 等都
可以配合 operator。基本使用方法為 {operator}{motion} ,语意就是做这个
operator 动作到 motion 所到的地方
以 d operator 做举例的话 (其他 operator 以此类推): dG: 刪除 从游标到档案的尾部 dgg: 刪除从游标到档案的头部 dw: 刪除 从游标到下一个字 dfz: 删除 从游标底下到达此行 z 这个字母 (如果此行无 z 则不动作) # dw 删除一个单词 # gf 进入到文件
一个编辑命令(editing command) 等于一个操作符加上一个文本对象或者移动, 比如, 删除一个单词, 改变一个句子, 复制一个段落.
an editing command = an operator + a text object/motion
普通文本对象
Vim 为普通文本文件提供了三种类型的文本对象: 词(word), 句子(sentence), 段落(paragraph).
词
- aw - a word (包含在周围的空格)
- iw - inner word (不包括周围的空格)
Lorem ipsum dolor sit amet... 光标在ipsum字符中,输入操作命令 daw Lorem dolor sit amet...
w 看起来与 aw 效果差不多. 区别在于光标位置. 比如, 如果用 dw 来删
除一个词, 光标必须在词的开头. 如果在除了开头的其他位置使用 dw, 只能
删除部分单词. 但是, daw 允许光标在一个词的任何位置删除整个单词.
w & aw
如果你已经懂得了 word 的 w 与 aw 的区别, 下面句子与段落就已经掌握了, 道理是一样的, 只是将 w 换成了 s 与 p.
句子
- as – a sentence
- is – inner sentence
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
cis 光标在第 1 名任意位置,输入cis,删除第一句并进入插入模式
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
注意, "inner" 文本对象不包含尾部的空格.
段落
- ap – a paragraph
- ip – inner paragraph
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. dap Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
移动命令 vs 文本对象命令
- 一个使用移动的命令,比如
cw是从光标处开始生效. - 一个使用文本对象的命令,比如
ciw无论光标在何处,Vim都将在整个文本 对象上生效。是一个移动命令还是一个文本对象命令,区别在于是否有 a (around) 或者 i (inner) 这样的限制。对于每个类型的文本对象都是如此。
尽管使用文本对象的方式需要多输入一个字符,但是这可以节省你的时间将光标 移动到 "正确" 的位置。
范例
This is a [word] This is a [光标位置word ] viw 选中括号中的单词。 i表示iner vaw 选中括号中内容包括空格。a表示around环绕 # 标签 vit 选中tag内的 注意:光标在哪个tag所在行以这个tag为准 vat 选中包含tag # "string" 引号内 vi" 选中引号内的内容。如果一行有多个引号,以第一个匹配的引号作为标记,到下一个引号之间。如:aaf"aaa" xxx "bbb" va" 包括引号的内容 vi{ 选中括号内的 va{ 选中括号内的,包含括号 光标位置This is a [word] This is a [word ] 3daw 删除光标后3个单词This is a This is a [光标位置word] This is a [word ] cw 修改单词,并进入插入模式 yiw复制一个单词 ciw 删除当前单词并插入 ci( 删除当前括号内的内容并插入 gUiw : 使当前单词全为大写 guiw : 使当前单词全为小写
范例: 操作括号中的内容
i( or i) 1 * ([2 + 3]) #i( 括号中内容,不包含括号本身。如vi( ci( a( or a) 1 * [(2 + 3)] #a( 包含括号本身。如va( ca( i< or i> The <[tag]> a< or i> The [<tag>] i{ or i} some {[ code block ]} #i{ 花括号中内容,不包含括号本身。如ci{删除括号中内容,并进入插入模式 a{ or a} some [{ code block }] i{ or i} some [[ code block ]] #i[ 中括号中内容,不包含括号本身。如ci[删除括号中内容,并进入插入模式 a{ or a} some [[ code block ]] i" The "[best]" #i" 双引号中的内容,不包含双引号本身。如vi"选中后可再使用x删除,或者ci"一步到位 a" The[ "best"] i` The `[best]` a` The[ `best`]
有些插件扩展了文本对象,如vim-go可以使用 f 表示一个函数。
vim的寄存器(register)
vim 里操作的是寄存器而不是系统剪贴板,这和其它编辑器不同。
vim 中的寄存器,分为有名寄存器和无名寄存器
默认情况下操作的数据,数据被提取到无名寄存器暂存,从无名寄存器粘贴。
提取的操作: y yank, yy, x, dd 粘贴的操作: p, P
在 .vimrc 里面的配置 set clipboard=unnamed,其实就是将系统剪切板的数
据放入无名寄存器
- 在vim中粘贴后
- 在浏览器粘贴,对比
寄存器的使用方式,通过在操作寄存器之前使用英文的引号 " 键来触发,在
引号后跟上寄存器的名称,一般可使用 a-z 的小写宇母。
举例:
复制过程:
- 光标移动至行首,按键ve,来选中要复制的内容
- 按键:英文的引号("),触发寄存器声明
- 按键:z,标记使用寄存器名称为z
- 按键:y,将选中的内容提取至z寄存器
粘贴过程:
- 光标移动至想粘贴的地方
- 按键:英文的引号("),触发寄存器声明
- 按键:z,标记使用寄存器名称为z
- 按键:p,粘贴z寄存器内容至光标处
总结:寄存器可以方便日常的复制粘贴操作,多个寄存器的设置可以简化重复的 工作,当录制宏的时候
格式:
"{寄存器} 放在数字和命令之间 不指定默认用无名寄存器
""表示无名寄存器,缺省使用。"" p其实就等同p
# 查看寄存器中的内容
:reg {寄存器}
范例:
:reg 查看所有寄存器内容 #1 x 删除放入无名寄存器中 p 从无名寄存器取出粘贴当前光标后 #2 3"tyy 表示复制3行到t寄存器中 ,末行显示 3 lines yanked into "t "tp 表示将t寄存器内容粘贴 #3 "ayiw 复制一个单词到寄存器a中, "bdd 删除当前行到寄存器b中 :reg b 查看b寄存器中内容
其它常见寄存器:
除了a-z,还有一些其它常见寄存器
"0 ~ "9:数字(numbered)寄存器。缓存最近操作内容,复制与删除有别,"0寄存器缓存最近一次复制的内容, "1-"9缓存最近9次删除内容
复制专用:"0 使用y复制文本同时会被拷到复制寄存器0中
"*, "+, "~:选择及拖拽(selection and drop)寄存器。存取GUI选择文本,可用于与外部应用交互
"*是在系统剪切板中表示选择的内容;"+是在系统剪切板中表示选择后 Ctrl+c复制的内容系统剪贴板:
"+复制到系统剪贴板,这样就可以往vim以外的地址粘贴了。可 以使用:echo has('clipboard')验证,输出为1表示支持。:set clipboard=unnamed可以让你直接复制粘贴系统剪贴板内容
"%当前文件名".上次插入的文本
范例:从vim拷贝到系统剪切板
我们只需要在*visual模式*下执行 ="+y= ,通过这命令copy后就可以去浏览器 Ctrl+v啦 如果从浏览器Ctrl+c后,要粘贴到vim中,则需要 ="+p=
标记和宏(macro)
- 宏可以看成是一系列命令的集合
- 我们可以使用宏“录制”一系列操作,然后用于“回放”
- 宏可以非常方便地把一系列命令用在多行文本上。
vim提供了不止一种方式用于重复之前所做的修改。已经尝过的 . 命令,用它
来重复小的修改确实有效,但当我们想重复更大规模的发动时,vim的宏就派上
用场了。
我们可以用宏把任意数目的按键操作录制到寄存器中,用于之后的回放
宏录制步骤:
- 在normal模式下按q进入宏录制
- 按下字母记录宏名称
- 执行操作
- 按q退出宏录制
重放宏: @宏名称
宏其它操作
q{A-Z} -> 将指令插入之前的寄存器 (append typed char into register{a-z})
"<reg>p #打印录制的操作,即输出指定寄存器中的内容 "<reg>y # @<reg> #重放宏 @@ #重复上次的指令 (repeat previours :@{a-z})
注意: 设定好宏后,同样可在其它文件中适用。
标记:
- m[标记名称]
- ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
'a跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
范例:批量在开头添加内容
# 文本内容 abc eeee ddd fff #录制: 每行开头加空格,结尾加 ; qa # 可以在状态栏看到 recording @q 1. 按 0 i 光标移动到行首,并进入insert模式 2. 按 i 进入 insert 模式,插入空格 3. escape insert 退出insert模式 4. 按 A 到行尾进入insert模式 5. input ; 行尾输入; 6. ECS 退出当前模式并进入普通模式 6. 按 j 下一行 7. 按 0 到行首 按 q 结束录制 :reg a # 查看寄存器中的内容 #重放宏 3@a # 重放3次宏 # 结果 abc; eeee; ddd; fff;
范例:录制逐行回放 与 可视区回放
# 录制:与上例类似,在每行首插入 " 引号,行尾加 " 引号 qa #录制宏记录到a寄存器。左下状态显示recording @a I"<Esc> A"<Esc> #先I在行首插入"双绰号 ,再按esc返回普通(normal)模式,再按A在行尾插入"双绰号 ,再按esc返回普通(normal)模式 q #结束宏录制。左下状态recording @a已经消失,表明录制完了 # 回放: j #移动到下一行 @a #回放宏 j@@ #回放同样的宏 #上面回放时一行行回放不方便,可以使用V可视化进行行选 VG #选中当前行到最后一行 :'<,''>normal @a #:冒号进入命令行模式,在所有行执行normal命令回放宏 #也可以使用normal直接在行两边加引号 VG #选中当前行到最后一行 :'<,''>normal I" # 行首加引号 :ctrl+p # 显示上一条操作命令,并修改为下面内容 :'<,''>normal A" # 行尾加引号
范例:批量把文件内容复制到当前文档中
qq #开始录制 jmm #下一行做,m标记 k$bgf #回到上一行行尾,b去前一个字符,gf进入到文件中 ggyG # 复制全文 ctrl+o #回到上个位置 Vp #粘贴 `mq #移动到m标记位置并结束录制
vim补全
vim中有很多种补全的方式
<C-n> 普通关键字 <C-x><C-n> 当前缓冲区关键字 <C-x><C-i> 包含文件关键字 <C-x><C-]> 标签文件关键字 <C-x><C-k> 字典查找 <C-x><C-l> 整行补全 <C-x><C-f> 文件名补全 <C-x><C-o> 全能(Omni)补全
常见的三种补全类型
- ctrl+n和ctrl+p补全单词
- ctrl+x ctrl+f补全文件名
- ctrl+x ctrl+o 补全代码,需要开启文件类型检查,安装插件
范例:补全单词
class Duck: def __init__(self, name): self.name = name self.print('hhe') self.pa('a') self.p输入ctrl+n补全,使用ctrl+n下一个或者ctrl+p上一个进行选择 #ctrl+n 搜索当前文件中的关键词,以前缀匹配的方式进行补全
范例:路径补全
范例:代码补全
:filetype on #开启文件类型 使用:set filetype就能识别文件类型 安装插件后就可以使用,ctrl+x ctrl+o 补全代码
vim更换配色
:colorscheme显示当前的主题配色,默认是default:colorscheme <ctrl+d>可以显示所有配色:colorscheme 配色名修改 vim 配色
可以从网上下载配色
https://github.com/flazz/vim-colorschemes
https://github.com/w0ng/vim-hybrid
git clone https://github.com/w0ng/vim-hybrid.git mkdir ~/.vim/colors cp vim-hybrid/colors/hybrid.vim ~/.vim/colors/ #使用 :colorscheme hybrid
想要持久化配置需要写到vimrc中
编辑二进制文件
#以二进制方式打开文件 vim -b binaryfile #扩展命令模式下,利用xxd命令转换为可读的十六进制 :%!xxd #切换至插入模式下,编辑二进制文件 #切换至扩展命令模式下,利用xxd命令转换回二进制 :%!xxd -r #保存退出
vim -b datafile :set display=uhex -> 这样会以uhex显示。用来显示一些无法显示的字符(控制字符之类)(display in uhex play non-display char) :%!xxd -> 更改当前文件显示为2进位 (change display to binary) :%!xxd -r -> 更改二进位为text格式 (convert back to text
练习
- 在vim中设置tab缩进为4个字符
- 复制/etc/rc.d/init.d/functions文件至/tmp目录,替换/tmp/functions文 件中的/etc/sysconfig/init为/var/log
- 删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行 的行首的#号
帮助
vimcdoc 中文文档插件 set helplang= <Ctrl+d> 查看可用语言 set helplang=en 设置英文文档 要启动该帮助系统,请选择如下三种方 法之一: - 按下 <HELP> 键 (如果键盘上有的话) - 按下 <F1> 键 (如果键盘上有的话) - 输入 :help <回车> 请阅读帮助窗口中的文字以了解帮助是如何工作的。 输入 CTRL-W CTRL-W 可以使您在窗口之间跳转。 输入 :q <回车> 可以关闭帮助窗口。 要启动该帮助系统,请选择如下三种方法之一: - 按下 <HELP> 键 (如果键盘上有的话) - 按下 <F1> 键 (如果键盘上有的话) - 输入 :help <回车> 请阅读帮助窗口中的文字以了解帮助是如何工作的。 输入 CTRL-W CTRL-W 可以使您在窗口之间跳转。 输入 :q <回车> 可以关闭帮助窗口。 例如: :help :help s # 查看s替换的用法 :help user-manual 用户手册 Use :q to exit help vimtutor
可视化模式
字符串替 :3,15 s#"#'#g #将3到15行的"换成' :%s/\%u3000//g 删除中文空格 生成帮助标签 :helptags ~/.vim/doc :set shiftwidth=4 tabstop=4 expandtab tabstop 表示一个 tab 显示出来是多少个空格的长度,默认 8。 shiftwidth 表示每一级缩进的长度 expandtab 表示空白变成空格 关闭自动注释 :set fo-=r 恢复 :set fo=r 开启/关闭自动缩进 设置 set pastetoggle 即可开启/关闭自动缩进 也可以设置成快捷键:set pastetoggle=<F9>
代码折叠
原生支持
- V 选中代码块 # 这里以java代码为例
- 创建并折叠代码:按z f 其中f表示fold 创建可折叠代码块。可嵌套折叠
- 打开代码需求收集:z o 其中o表示open
- 折叠代码块:z c(close)
- 删除折叠代码块: z d(delete)
视图:可用在代码折叠时记录视图,退出 vim 再加载视图又能看到保存的折叠状态代码
- 创建视图: :mkview
- 加载视图: :loadview
自动加载视图:
autocmd BufWrite * mkview autocmd BufWinLeave * mkview autocmd BufRead * silent loadview
tab窗口标签
vim a.txt :tabedit b.txt # 在上方可以看到2个tab标签 :ls 查看所有buffer :tabprevious 回到上一个buffer,来实现不同buffer的切换 :tabnext 下一个buffer :tabe c.txt # :tabe是tabedit的简写 :tabp # :tabprevious 的简写 :tabn # :tabnext 的简写 gt # go to 快捷键,功能和:tabnext一样 gT # 到上一个标签 编号gt #直到指定标签,编号是从1开始。如,0gt :tabm 编号 # 当前窗口移动到编号位置,编号从0开始 :tabclose #关闭tab窗口
swp 交换文件
意外退出或正在编辑,产生 .文件名.swp 文件。
再打开文件就会触发交换文件的恢复模式:
- r 恢复文件
默认swp文件每隔 40 秒或每编辑 200 个字符就进行一次 swp 文件的保存
设置交换文件策略 vim ~/.vimrc
set updatetime=23000 " 刷新交换文件的时间间隔,单位毫秒 set updatecount=400 " 编辑满多个字符刷新交换文件
vim 其它操作
数值加减:
- 数值加1:按ctrl+a,光标所在列向右找到的数值。
10Ctrl+a数值加10次 - 数值减1:按ctrl+x,光标所在列向右找到的数值,
自增序号:
- ctrl+v 选中需要的数字,按 g ctrl+a 生成自增序号
vim 行的字典排序,即自然排序:
- 指定行号使用sort排序。如
:6,19sort对第6行到19行进行排序
vim配置
vimrc提供了一种持久化配置的方式,让我们自己定义配置。
编写vim配置文件
在linux下新建一个隐藏文件 vim ~/.vimrc
windows系统 vim $MYVIMRC 通过环境变量编辑配置文件
配置内容
- 常用设置。如
:set nu设置行号,colorscheme hybrid设置主题 - 常用的vim映射,如
noremap <leader>w :w<cr>实现保存文件操作 - 自定义的vimscript函数(vim 高手)和插件的配置
常用设置
#安装 plug 管理插件 curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim cat <<\EOF>> ~/.vimrc " General setting " ---------------- set encoding=utf-8 " 默认字符编码 syntax on " 语法高亮 set ttimeout set ttimeoutlen=10 " 设置键码超时时间为 10ms,改善响应速度 set clipboard=unnamedplus " 方案1: 使用系统剪贴板 "set clipboard=unnamed " 如果方案1不工作,尝试这个. 使用 * 寄存器(X11 主要选择) set history=1000 " 记录最近指定次数的操作,在退出vim后再进来仍可以 u 撤消之前的操作 set mouse= " nomarl模式中,可以用鼠标操作,如复制文本 set cursorline " 突出显示当前行 " 复制粘贴 "set paste " 复制保留格式,粘贴内容,不会有任何变形。 这样会一直处于 paste 模式 set pastetoggle=<F2> " 搜索优化 set hlsearch " 高亮搜索,高亮显示所有的匹配短语 set incsearch " 查找短语时显示部分匹配 set hlsearch " 突出显示上次搜索的所有匹配项 set incsearch " 启用增量搜索(输入时获得反馈) set ignorecase " 搜索时忽略大小写 set smartcase " 如果有大写字母则区分大小写 set wrapscan " 搜索到文件末尾时回到开头 " 缩进和编辑 set noautoindent set nosmartindent "set autoindent " 自动缩进 "set smartindent " 智能缩进 set ruler " 右下角显示光标状态行 set showcmd " 在屏幕最后一行显示命令 set nostartofline " 在行间行动时保持光标在同一列 set errorbells " 错误时响铃 set visualbell " 然后使用闪光灯代替蜂鸣声 set wildmenu " 执行命令时启用Tab键补全和建议 set wildmode=list:longest,full " 如何完成匹配字符串的设置 set nomodeline " vim 读取模式行来执行当前文件的命令 set modelines=0 " 检查文件顶部/底部的行数。0=关闭 set formatoptions-=t formatoptions-=o formatoptions+=crqjnl1 set confirm " 退出有更改的文件时要求确认 set joinspaces " 将多行合并为一行时,在标点符号后插入两个空格 " 全局默认缩进设置 set tabstop=4 " 制表符显示为 4 个空格宽度; 简写:set ts=4 set shiftwidth=4 " 自动缩进使用 4 个空格; 简写:set sw=4 set softtabstop=4 set expandtab " 用空格代替tab键。简写:set et " 文件类型特定的缩进设置 augroup filetype_indent autocmd! " 2 空格缩进的文件类型 autocmd FileType yaml,html,htmldjango,javascript,typescript,css,scss,json setlocal ts=2 sw=2 sts=2 expandtab " 4 空格缩进的文件类型 autocmd FileType python,java,c,cpp setlocal ts=4 sw=4 sts=4 expandtab " 保持制表符的文件类型 autocmd FileType make setlocal ts=4 sw=4 sts=4 noexpandtab " setlocal 只对当前缓冲区生效,不影响其他文件 " augroup 避免自动命令重复加载 augroup END " 备份和撤销文件设置 "set undofile " 所有的操作会记录在unofile中,方便使用 u 和 ctrl + r 。会在当前目录创建一个 .同名文件.un~ 文件 "set undodir=~/.vim/undodir " 存储undofile的目录,不会污染项目目录下文件。提前创建好目录 " set backupdir=~/.vim/backupdir " set directory=~/.vim/swapdir " 创建目录(需要手动执行或在vimrc外创建) " mkdir -p ~/.vim/undodir ~/.vim/backupdir ~/.vim/swapdir " 状态行 " 默认情况下,laststatus=1(只在有多个窗口时显示状态行)或 laststatus=2(总是显示状态行) set laststatus=2 set statusline=%f " 文件名 set statusline+=\ %h%m%r%w " 标志 set statusline+=\ [%{&ff}/%Y] " 文件格式/类型 set statusline+=\ [%{strlen(&fenc)?&fenc:&enc}] " 编码 set statusline+=\ [L=%l/%L,C=%v] " 行/列信息 set statusline+=\ [%p%%] " 百分比 " 状态行各组件说明 "set statusline=%f%h%m%r%w[%{&ff}/%Y][L=%l/%L,C=%v][%p%%] " %F 当前文件的完整路径 " %h 帮助文件标志 ([help]) " %m 修改标志 ([+]) " %r 只读标志 ([RO]) " %w 预览窗口标志 ([Preview]) " [%{&ff}] 文件格式 ([unix/dos/mac]) " %y 文件类型 (VIM) " [%04l] 当前行号(4位数字,前导零) " [%L] 文件总行数 " [%04v] 当前列号(4位数字,前导零) " [%p%%] 文件位置百分比 "下面两行是超过80个字符底色变红 " 方法1:匹配第81个字符开始为红色 highlight OverLength ctermbg=red ctermfg=white guibg=#592929 match OverLength /\%81v.\+/ " 方法2:直接设置颜色列 " set colorcolumn=81 " highlight ColorColumn ctermbg=red guibg=#592929 " Leader 键 " ---------------- let mapleader="," " 使用kj快速进入Normal模式 inoremap <silent> kj <Esc> inoremap <C-[> <Esc> " 插件 " ---------------- "call plug#begin('~/.vim/plugged') " 安装插件只需要把github地址放到这里重启后执行 :PlugInstall 就好了 "Plug 'Yggdroot/indentLine' "call plug#end() " 文件类型检测(放在最后) filetype plugin indent on EOF
其他
" Add config set nu syntax on set ruler set foldenable set foldmethod=manual set background=dark set helplang=cn set encoding=utf8 set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set autoread set completeopt=preview,menu set nobackup set cursorline set magic set nocompatible set autoindent set cindent set tabstop=4 set softtabstop=4 set shiftwidth=4 set noexpandtab set ignorecase set langmenu=zh_CN.UTF-8 set showcmd set incsearch filetype off " git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'VundleVim/Vundle.vim' Plugin 'davidhalter/jedi-vim', { 'commit': '1773837a11f311bd04755c70de363b5000c9cd15' } Bundle 'tomasr/molokai' call vundle#end() " required filetype plugin indent on " required colorscheme molokai let g:molokai_original = 1 set statusline=%F%m%r%h%w[%L][%{&ff}]%y[%p%%][%04l,%04v] " | | | | | | | | | | | " " | | | | | | | | | | +--当前列数 " " | | | | | | | | | +-- 当前行数 " " | | | | | | | | +--当前光标位置百分比 " " | | | | | | | +-- 使用的语法高亮器 " " | | | | | | +-- 文件格式 " " | | | | | +-- 文件总行数 " " | | | | +-- 预览标志 " " | | | +-- 帮助文件标志 " " | | +-- 只读标志 " " | +-- 已修改标志 " " +-- 当前文件绝对路径 "下面两行是超过80个字符底色变红 highlight OverLength ctermbg=red ctermfg=white guibg=#592929 match OverLength /\%100v.\+/ au BufNewFile,BufRead /usr/local/nginx/conf setf nginx
vim映射
充分利用 leader 键,避免自定义了太多使用 Ctrl 键的快捷键和其它工具冲突。
vim映射比较复杂,源于vim有多种模式
- 设置一下 leader键
let mapleader = ","常用的逗号或空格 - 比如用
inoremap <leader>w <Esc>:w<cr>在插入模式下保存
范例
# vim ~/.vimrc " leader 键 let mapleader="," " inoremap 表示非递归的映射 leader 按w 使用Esc进入normal模式执行:w进行保存,<cr>表示回车 inoremap <leader>w <Esc>:w<cr> " 使用kj快速进入Normal模式 inoremap kj <Esc> " 生效方式:退出再编辑文件 或 保存后执行:source ~/.vimrc # 使用 在insert插入模式下,使用,w就可以保存文件了。
范例:
noremap <C-l> <C-w>l
" json 格式化 在comand模式下使用:FormatJSON 使用Python命令格式化文件。禁用所有修改:e!
com! FormatJSON %!python3 -m json.tool
vim插件
通过插件可以无限扩充vim的功能
vim脚本
vim有自己的脚本语言Vimscript。vim脚本是一种简单的脚本语言。可以通过
vimscript实现更多vim的控制,开发自己的插件。
研究一下关于写go语言的最小配置,vim-go教程vim-go-tutorial
vim映射
vim映射就是把一个操作映射到另一个操作上。可以将不满意的按键设置,或者 映射一些方便的快捷键。
基本映射
基本映射指的是normal模式下的映射,当然还有其它模式的映射。
- 使用map就可以实现映射。如
:map - x减号映射成x,然后按-减号就 会删除字符
范例
:map <space> viw # 按空格的时候选中整个单词 :map <c-d> dd # 使用ctrl+d执行dd删除一行 :umap - # 删除-号的映射
模式映射
vim常用模式normal/visual/insert都可以定义映射
- 用nmap/vmap/imap定义映射只在normal/visual/insert分别有效
范例
:vmap \ U # 把在visual模式下选中的文本大小(u/U转换大小写) :imap <c-d> <Esc>ddi # 在insert模式下,用ctrl+d 删除一行并进入插入模式
递归与非递归映射
*map 系统命令有递归的风险
- 如果安装了插件,插件映射了同一个按键的不同行为,有冲突就会有一个失效。
- 解决方案就是非递归映射
非递归映射中这些命令不会递归解释。
- 使用
*map对应的非递归映射nnoremap/vnoremap/inoremap - 任何时候都应该使用非递归映射,防止冲突
参考:笨方法学vimscript https://github.com/wmzy/learnvimscriptthehardway-cn
范例:快速分割窗口
# vim ~/.vimrc " window contrl prefix nnoremap [Window] <Nop> nmap s [Window] " 使用 sv, sg快速在normal模式下分割窗口 nnoremap <silent> [Window]v :<C-u>split<CR> nnoremap <silent> [Window]g :<C-u>vsplit<CR> " leader 键 let g:mapleader="," " 插入模式下使用 leader-w 快速保存文件 inoremap <leader>w <Esc>:w<cr> " 使用kj快速进入Normal模式 inoremap kj <Esc> " 在插件模式下任意直接切换到新一行 inoremap <C-j> <C-o>o inoremap <C-l> <C-o>A " 使用 leader-e 快速退出窗口(但是不会关闭 buffer) noremap <leader>e :q<cr> " 使用 leader-b 快速关闭当前 buffer noremap <leader>b :bd<cr>
范例:窗口快速跳转
# vim ~/.vimrc " use ctrl+h/j/k/l switch window快速切换窗口 noremap <C-h> <C-w>h noremap <C-j> <C-w>j noremap <C-k> <C-w>k " 切换 buffer nnoremap <silent> [b :bprevious<CR> nnoremap <silent> [n :bnext<CR>
范例:
vim插件
vim插件是使用vimscript或者其它语言编写的vim功能扩展,有插件之后几乎可 以无限扩充其功能。
安装插件原始的方式是直接clone插件代码,如今vim有很多插件管理器。
- 常见的插件管理器有vim-plug, vundle, pathogen, dein.vim, volt等
- 综合性能、易用性、文档等方面,这里推荐使用vim-plug
vundle 插件管理器
官方地址:https://github.com/VundleVim/Vundle.Vim
安装
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
使用, 在 ~/.vimrc 添加配置
set nocompatible " be iMproved, required filetype off " required " git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " 安装插件只需要把github地址放到这里重启后执行 :PlugInstall 就好了 " Plugin 'VundleVim/Vundle.vim' " Plugin 'davidhalter/jedi-vim', { 'commit': '1773837a11f311bd04755c70de363b5000c9cd15' } " "Bundle 'tomasr/molokai' call vundle#end() " required filetype plugin indent on " required
vim-plug插件管理器
官方地址:https://github.com/junegunn/vim-plug
学习一个新东西最好的方式是看官方文档示例,按照官方教程我们就可以很容易 地了解使用了。
安装
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
使用, 在 ~/.vimrc 添加配置
# vim ~/.vimrc " 插件设置,这里使用了vim-plug call plug#begin('~/.vim/plugged') " 安装插件只需要把github地址放到这里重启后执行 :PlugInstall 就好了 call plug#end()
查找插件并安装第一个插件
查找插件方式:使用google搜索想要的插件,或者https://vimawesome.com网 站上找
一些常用的插件
- vim-startify 开屏插件 https://github.com/mhinz/vim-startify
- nerdtree 文件管理插件 https://github.com/preservim/nerdtree
vim-startify插件
# 1.修改.vimrc文件,增加插件名称 vim ~/.vimrc " 插件设置,这里使用了vim-plug call plug#begin('~/.vim/plugged') " 安装插件只需要把github地址放到这里重启后执行 :PlugInstall 就好了 Plug 'mhinz/vim-startify' call plug#end() # 2.重新启动vim或者source ~/.vimrc,执行 :PlugInstall
使用插件
vim # 打开后可以看到插件效果。按序号可以打开对应文件,或者光标位置回车也可以打开文件
美化插件
更改vim外观
vim-airline状态栏美化插件
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes'
indentline代码缩进线条插件
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'Yggdroot/indentLine'
vim配色方案
- vim-hybird配色 https://github.com/w0ng/vim-hybrid
- solarized 配色 https://github.com/altercation/vim-colors-solarized
- gruvbox 配色 https://github.com/morhetz/gruvbox
vim-hybrid
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'w0ng/vim-hybrid' Plug 'altercation/vim-colors-solarized' Plug 'morhetz/gruvbox'
- 使用=:colorscheme <ctrl+d>= 可以显示所有配色
- 使用=:colorscheme 配色名= 就可以 修改配色
# 持久化 ~/.vimrc set background=dark # 背景色 colorscheme hybrid
solarized 配色
gruvbox 配色
yaml文件
yaml结构显示
Plug 'Einenlum/yaml-revealer'
目录和搜索插件
- 文件目录树 nerdtree https://github.com/preservim/nerdtree
- 模糊搜索插件 ctrlp https://github.com/ctrlpvim/ctrlp.vim
nerdtree文件管理插件
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'preservim/nerdtree'
使用=:NERDTree=
# 持久化 ~/.vimrc let mapleader=',' " 插件相关配置 " ,v 找到文件位置,光标指到NERDTree目录栏文件位置 nnoremap <leader>v :NERDTreeFind<CR> " ,g 切换到NERDTree nnoremap <leader>g :NERDTreeToggle<CR> " 显示隐藏文件 let NERDTreeShowHidden=1 " 忽略文件 let NERDTreeIgnore = [ \'\.git$','\.hg$','\.pyc$','\.pyo$','\.swp$', \ '\.DS_Store$', '.\sass-cache$', '__pycache__$', '\.egg-info$', '\.ropeproject$', \ ]
如果想打开vim自动启动NERDTree可以在 ~/.vimrc= 中添加 autocmd
vimenter * NERDTree ,这里不推荐,占用空间。
ctrlp 模糊搜索插件
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'ctrlpvim/ctrlp.vim'
使用
# 持久化 ~/.vimrc " ctrl+p 搜索当前目录下的文件。 可以和NERDTree ,v一起使用找到文件位置 let g:ctrlp_map = '<c-p>' " 插件相关配置 " ctrlp 在~/.agigonre添加一行node_modules set wildignore+=*/tmp/*,*.so,*.swp,*.zip let g:ctrlp_custom_ignore = { \ 'dir': '\v[\/]\.(git|hg|svn)$', \ 'file': '\v\.(exe|soldll|swp|pyc|pyo)$', \ } let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""' if executable('ag') set grepprg=ag\ --nogroup\ --nocolor let g:ctrlp_user_command = 'ag %s -l --nocolor -f-g ""' else let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files . -co --exclude-standard', 'find %s -type f'] endif
请在=项目/=根目录下打开vim,可以模糊搜索
快速定位插件
基础的移动命令
- 如w/e基于单词移动,gg/G文件首尾,0/$行首,f{char}查寻字符
- ctrl+f ctrl+u前后翻屏
- 快速跳到任意位置就需要插件实现
任意位置插件
- easymotion任意位置插件 https://github.com/easymotion/vim-easymotion
easymotion任意位置插件
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行 :PlugInstall 安装
Plug 'easymotion/vim-easymotion'
使用
# 持久化 ~/.vimrc " 插件相关配置 " 打开s2快速定位功能。nmap递归映射 nmap ss <Plug>(easymotion-s2)
在文件里按=ss=打开快速定位,输入搜索的2个字符,再根据输出标红的字符跳到想到的位置。
成对编辑插件
- vim-surround 成对编辑插件 https://github.com/tpope/vim-surround
vim-surround 成对编辑插件
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'tpope/vim-surround'
使用
# normal模式下增加、删除、修改成对内容 ds (delete a surrounding) cs (change a surrounding) ys (you add a surrounding)
范例
#1.添加 # name单词两边"name",光标在name单词上 ys+iw" # name中"nam"e,光标停在n字符上 ys+fm" ysw" 单词加绰号。 #2.修改 # "name"变'name' cs+"' # (name)变[name] cs+(] cs`" 替换`为“ #3.删除 # 'name'变name ds+'
模糊搜索与替换插件
模糊搜索
- Ag.vim
- fzf.vim https://github.com/junegunn/fzf.vim
fzf.vim 模糊搜索插件
fzf是一个强大的命令行模糊搜索工具,fzf.vim集成到了vim里
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
" 安装fzf后执行 ln -s /root/.fzf/bin/* /usr/bin/
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
使用
:Files [PATH] 模糊搜索目录 :Ag [PATTERN] 模糊搜索字符串
使用 :Files /root 搜索目录下文件,再输入文件名
使用 :Ag duck 模糊搜索文件中字符串,ctrl+k 上移 ctrl+j下移
far.vim 搜索替换插件
- far.vim 搜索替换插件 https://github.com/brooth/far.vim
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'brooth/far.vim'
使用
:Far foo bar **/*.py # 进入预览,将foo 替换成bar。 **表示上级目录 *.py表示所有.py后缀文件 :Fardo # 确认修改 :q退出预览窗口
语言插件
IDE一代又一代,经典的编辑器却长久不衰。
- 除了java,很多人用vim编写shell/php/golang/python/ruby
- 前端很多人用vscode,sublime/Atom有末落之势
- 很多后台和运维工程师使得vim,微信后台和阿里飞天系统很多代码出自在服 务器上使用vim的工程师
vim-go 插件
- vim-go golang语言插件 https://github.com/fatih/vim-go
代码补全、重构、跳转、自动格式化、自动导入等功能,基本可以满足golang日 常开发。
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
使用
官方教程:https://github.com/fatih/vim-go/wiki
ctrl+xo 补全 ctrl+n ctrl+p 上下选择 ctrl+] 跳转 ctrl+o 跳回 ctrl+i 向前跳 :GoFmt 代码格式化 :GoRename 代码重构。 如光标停在url字符,:GoRename回车提示输出新名称,关联代码重构完成 :GoImports 自动导入包 :GoRun 自动运行go代码
python-mode插件
python插件使用比较多的是jedi-vim和python-mode
- python-mode https://github.com/python-mode/python-mode
支持代码补全、重构、跳转、自动格式化等功能。
使用=vim –version|grep python=查看对python支持
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
" 安装过程会安装子模块
Plug 'python-mode/python-mode', { 'for': 'python', 'branch': 'develop' }
配置
# 持久化 ~/.vimrc " 插件相关配置 " python-mode let g:pymode_python = 'python3' let g:pymode_trim_whitespaces = 1 #删除无用空白符 let g:pymode_doc = 1 let g:pymode_doc_bind = 'K' let g:pymode_rope_goto_definition_bind = '<C-]>' #跳转定义的按键绑定变成ctrl+] let g:pymode_lint = 1 # 开启检查 let g:pymode_lint_checks = ['pyflakes', 'pep8', 'mccabe', 'pylint'] let g:pymode_options_max_line_length = 120 # 最找行长度120
使用
ctrl+] 跳转到定义 ctrl+xo 补全 ctrl+n ctrl+p 上下选择 ctrl+cro 整理包导入顺序 :PymodeLintAuto
代码大纲插件
tagbar 代码大纲插件
- tagbar 代码大纲插件 https://github.com/majutsushi/tagbar
安装ctags,生成tag文件
# 1. 安装ctags # 安装依赖 yum install \ gcc make \ pkgconfig autoconf automake \ python3-docutils \ libseccomp-devel \ jansson-devel \ libyaml-devel \ libxml2-devel git clone https://github.com/universal-ctags/ctags.git cd ctags ./autogen.sh ./configure --prefix=/usr/local # defaults to /usr/local make make install # may require extra privileges depending on where to install
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'preservim/tagbar'
配置
# 持久化 ~/.vimrc " 插件相关配置 " tagbar let mapleader="," " <leader>t 开启/关闭tagbar nnoremap <leader>t ::TagbarToggle<CR>
使用
:TagbarToggle # 右侧显示当前编程语言的类名和函数名 # vim 缓冲区buffer # 查看 :ls 列出所有的缓冲区,然后可以使用:b N 跳转到缓冲区编号N的缓冲区 # Buffer切换 :b buffer_name加上tab补全来跳转
范例:编程快速查看代码常用操作
#编程快速查看代码常用操作 :sp 分屏 ctrl+p 使用ctrlp模糊搜索插件搜索文件 <leader>v 切换到NERDTree文件目录中查看文件位置 ctrl+wp 窗口向前切换 <leader>t 开启tagbar
vim-interestingwords高亮单词插件
- vim-interestingwords高亮单词插件 https://github.com/lfv89/vim-interestingwords
高亮感兴趣的单词,浏览代码很有用。如变量在哪个地方被使用到。
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'lfv89/vim-interestingwords'
使用
<Leader>k/K #高亮/取消高亮单词 n/N 上下切换
vim代码补全插件
deoplete.nvim 异步补全插件
- deoplete.nvim 异步补全插件 https://github.com/shougo/deoplete.nvim
一个强大的neovim/vim8异步补全插件。支持多编程语言,支持模糊匹配,但需 要安装对应编程语言的扩展。
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
if has('nvim') Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } else Plug 'Shougo/deoplete.nvim' Plug 'roxma/nvim-yarp' Plug 'roxma/vim-hug-neovim-rpc' endif
报错解决
#`:pythonx import [pynvim|neovim]` command to work pip3 install --user pynvim
配置
# 持久化 ~/.vimrc " 插件相关配置 " deoplete.nvim let g:deoplete#enable_at_startup = 1 " 关闭预览 set completeopt-=preview
使用
ctrl+xo #补全
python补全支持 deoplete-jedi
golang补全支持 deoplete-go
coc.vim补全插件
一个强大的neovim/vim8补全插件。LSP协议支持。
- coc.vim补全插件 https://github.com/neoclide/coc.vim
vim代码格式化与静态检查插件
能让工具做的就不用让人费心。静态检查是为了让编写的代码更加规范。 golint/pylint/eslint等。
- Neoformat 格式化插件 https://github.com/sbdchd/neoformat
- vim-autoformat 格式化插件
Neoformat 格式化插件
需要安装对应语言的格式化的库。如 python autopep8,js的prettier,go的gofmt等
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'sbdchd/neoformat'
编程语言对应库安装
# python pip3 install autopep8
使用
:Neoformat #代码格式化
静态检查lint
- neomake 静态检查插件
- ale 静态检查插件 https://github.com/w0rp/ale
ale 静态检查插件
需要安装对应语言的格式化的库。如 eslint/pylint/golint等。
vim8/neovim 支持异步检查,不会影响vim编辑,推荐使用。
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'w0rp/ale'
编程语言对应库安装
# python pip3 install pylint
配置
# 持久化 ~/.vimrc " 插件相关配置 " 自定义检查功能,忽略某些检查错误,请参考官方文档
使用:会自动检查
快速注释代码插件
vim-commentary注释插件
- vim-commentary注释插件 https://github.com/tpope/vim-commentary
比较轻量。记住常用的命令=gc=注释和取消注释。插件会根据不同的文件类型使
用不同的注释, python(#) golang(//)
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'tpope/vim-commentary'
使用:
gc # 注释和取消注释
vim和git联合插件
Fugitive vim和git联合插件
- Fugitive vim和git联合插件 https://github.com/tpope/vim-fugitive
在vim中使用git。可以使用 Gedit, Gdiif, Gblame, Gcommit 等,但也可以使
用tmux新开一个窗口来使用git命令。
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'tpope/vim-fugitive'
使用:
:Gedit :Gdiif #查看代码发动 :Gblame #查看每一行代码的提交者 :Gcommit
vim-gitgutter vim和git联合插件
- vim-gitgutter vim和git联合插件 https://github.com/airblade/vim-gitgutter
在vim中显示文件变动。显示哪些行是新增修改删除的。
将下面增加到=~/.vimrc=中,重新启动vim或者=source ~/.vimrc=,执行=:PlugInstall=安装
Plug 'airblade/vim-gitgutter'
配置
# 持久化 ~/.vimrc " 插件相关配置 " vim-gitgutter set updatetime = 100 "更新间隔 100ms
使用:左边有=+增加 ~修改=提示
gv.vim vim和git联合插件
- gv.vim vim和git联合插件 https://github.com/junegunn/gv.vim
在vim中查看提交记录,底层调用tig命令。使用 :GV 调用可以浏览代码提交
变更
将下面增加到 ~/.vimrc 中,重新启动vim或者 source ~/.vimrc ,执行
:PlugInstall 安装
Plug 'tpope/vim-fugitive' Plug 'junegunn/gv.vim'
使用:
:GV # git提交浏览 。选择可看每个提交详情。
翻译
https://github.com/voldikss/vim-translator
if dein#tap('vim-translator') " Disploy transitation in a window nmap <silent> <Leader>t <Plug>TranslateW vmap <silent> <Leader>t <Plug>TranslateWV endif
新vim-neovim
neovim 安装
一个新的vim版本,支持异步特性(vim8也支持)。不会让插件运行阻碍vim使用。
neovim的设计可以嵌入到很GUI里,加上好看的外壳。
可以在本地使用neovim,服务器上还是使用原始vim。
安装
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage chmod u+x nvim-linux-x86_64.appimage ./nvim-linux-x86_64.appimage # 配置环境 ./nvim-linux-x86_64.appimage --appimage-extract ./squashfs-root/AppRun --version # Optional: exposing nvim globally mv squashfs-root / && ln -s /squashfs-root/AppRun /usr/bin/nvim nvim
插件
插件管理工具
- vim-plug
- lazyvim
- Dein
lazyvim
LazyVim: https://github.com/LazyVim/LazyVim
- 自动下载更新插件
- 解决插件之间的依赖问题
- 打包了很多常用的插件,安装lazyvim可直接使用
git clone https://github.com/LazyVim/starter ~/.config/nvim #重启nvim, lazyvim会自动安装打包好的插件 nvim
解决字体问题:
wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/0xProto.zip unzip -d downfonts 0xProto.zip cd downfonts # 编程的话,只需安装带mono后缀的字体就行了,mono字体每个字符的宽度都是相同的 #为所有用户安装(系统级安装) sudo mkdir -p /usr/share/fonts/custom sudo cp *.ttf /usr/share/fonts/custom/ sudo chmod 644 /usr/share/fonts/custom/*.ttf #更新系统字体缓存 sudo fc-cache -fv fc-list | grep -i "0xProto" #验证安装 #更改终端字体,根据不同的终端,在设置页面里找到字体选择刚安装的mono字体样式即可 nvim . #测试一下 #为当前用户安装字体 mkdir -p ~/.fonts cp /path/to/your/a.ttf ~/.fonts/ fc-cache -fv
使用
Neo-tree插件:
- H: 显示或关闭隐藏文件
其他插件
- ctrl+/: 打开或关闭命令行窗口
- shift+l: 向右切换tab
- shift+h: 向左切换tab
- ctrl+l: 光标移动到右窗口
- ctrl+h: 光标移动到左窗口
- 空格+b+d: 关闭vim中的buffer
- s 输入字符:搜索字符串,按高亮字母跳转到指定位置。由leap.nvim插件提供
- 2下空格:打开文件。由fzf相关插件提供
- ]+e 或[+e 跳转到错误位置
vim自带
gd 跳转到函数定义
ctrl+o 跳回
>> 增加缩进
<< 减少缩进
gc 注释代码
w/b 按单词向后/向前跳转
f+字符 跳转到指定字符,f下一个
dw 删除光标到单词尾部内容
diw 删除整个单词,而不用关心光标在单词中的位置。同理ciw, viw, vi(, di(, ci(, vi", di"
u/ctrl+r 撤销/重做
lsp-代码补全
Extras: https://www.lazyvim.org/extras
#打开lazyvim扩展界面,输入 :LazyExtras # 使用x来打开或关闭扩展 #使用j或k移动到要安装的扩展,按x启动。如lang.python gg #回到页面的顶部,查看要安装的插件 :qa #退出nvim,再打开看看效果
python的lsp用的pyright, https://www.lazyvim.org/extras/lang/python
安装pyright
sudo apt update && sudo apt install nodejs npm sudo npm install -g pyright
nvim a.py print() #参数提示、自动补全都有了
开箱即用
如果已经熟悉了vim配置,可以从网上直接使用一些开源配置
- https://github.com/Spacevim/Spacevim
- https://github.com/PegasusWang/vim-config
- 其他开源配置。不推荐新手直接使用,越复杂的配置上手成本越高
vim游戏
vimgolf:天梯游戏 https://www.vimgolf.com