vim会记住我们的操作,并使最常用的操作触手可及,所以可以很方便地重复执行它们;
当vim让一个操作或移动可以很方便地重复时,它总是会提供某种方式,让我们在不小心做过头时能回退回来;
vim会把我们离开插入模式之前的全部按键操作都记录下来,因此整个cwcopy会被当成一个修改。
“.范式”:用一次按键移动,另一次按键执行。
大多数普通模式命令可以在执行时指定次数,可以利用这个功能来做简单的算术运算。
很多普通模式命令都可以带一个次数前缀,这样vim就会尝试把该命令执行指定的次数,而不是只执行一次。
执行、重复、回退;
操作符 + 动作命令(motion) = 操作
操作符的作用范围由动作命令决定。
命令 | 用途 |
---|---|
c | 修改 |
d | 删除 |
y | 复制到寄存器 |
g~ | 反转大小写 |
gu | 转换为大写 |
> | 增加缩进 |
< | 减小缩进 |
= | 自动缩进 |
! | 使用外部程序过滤{motion}所跨越的行 |
当一个操作符命令被连续调用两次时,它会作用于当前行:
符号%代表当前文件名
四种模式切换
光标移动:
上下左右hjkl
面向单词的动作命令:w(word)、b(back)、e(end跳到下个单词的末尾)、ge(调到前一个单词的末尾)
单词跳转wWbB(w:单词间跳转;W:子串间跳转,子串是以空格来区分的)
f {char}:对字符进行查找,使用;结合使用,使用,进行回退。
句跳转()
段跳转{}
[[、]]:跳转到上或下个函数
跳到当前行开头home和结尾end
^跳到当前行非空字符前和结尾$调到文档开头gg和结尾G
数字G:跳到对应数字行号
数字|:调到对应数字的列好
翻页:
和 、 和 翻半页:
和 ,Up 和 Down 移动光标到屏幕的顶部、中间和底部:用 H(High)、M(Middle)和 L(Low)
把当前行“滚动”到屏幕的顶部、中部或底部。Vim 里的对应按键是 zt、zz 和 zb
滚动屏幕而不移动光标。需要的按键是
和
进入插入模式的方式:iIaAoO
剪切:d组合/c组合、撤销:uU、保存:S、
退出:q(quit)、ZZ/wq:存盘退出、:w(writ):存盘
重复.
删除:x(删除当前光标所在的位置)、X(删除光标前面的字符)
粘贴:p(put)
文本复制:y(yank)
文本修改:d(delete)/c(cut)
多文件打开
:e[dit]:能以文件路径打开任何文件
缩进层级:>G
增加从当前行到文档末尾出的缩进层级
;:重复上次命令
s:把两个操作合并为一个,它先删除光标下的字符,然后进入插入模式。
替换:: s/target/replacement
转为大写:gU
一般以i(inside)开头的文本对象会选择分隔符内部的文本,而以a(around、all)开头的文本对象会选择包括分隔符在内的整个文本。
分隔符文本对象
范围文本对象:
一般来说,d{motion} 命令和aw、as和ap配合起来使用比较好,而c{motion}命令和iw及类似的文本对象一起用效果会更好。
文本对象 | 选择范围 |
---|---|
iw | 当前单词 |
aw | 当前单词及一个空格 |
iW | 当前字串 |
aW | 当前字串及一个空格 |
is | 当前句子 |
as | 当前句子及一个空格 |
ip | 当前段落 |
ap | 当前段落及一个空行 |
搜索:/?(向上下查找:-=)
*:查找当前光标下的单词
寻找字符:f(find)/t(till)、F/T
f{char}:让vim查找下一处指定字符出现的位置,如果找到了,就直接把光标移动到那里。
fa:查找光标后面最靠近光标的a;然后使用;符号可以重复之前的操作。
可以使用:h xxx 来查看每个命令的说明文档。
安装插件管理器
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
.vimrc文件配置
call plug#begin()
" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
Plug 'junegunn/vim-easy-align'
call plug#end()
命令操作
Command | Description |
---|---|
PlugInstall [name …] [#threads] | Install plugins |
PlugUpdate [name …] [#threads] | Install or update plugins |
PlugClean[!] | Remove unlisted plugins (bang version will clean without prompt) |
PlugUpgrade | Upgrade vim-plug itself |
PlugStatus | Check the status of plugins |
PlugDiff | Examine changes from the previous update and the pending changes |
PlugSnapshot[!] [output path] | Generate script for restoring the current snapshot of the plugins |
vim包管理器的安装和使用?
插件的查找、安装和使用?
vim的运行支持文件
qa:
map sr :set splitright:vsplit
map sl :set nosplitright:vsplit
map su :set nosplitbelow:split
map sd :set splitbelow:split
:e(edit) PATH
将/etc/default/keyboard
中的XKBOPTIONS
设置为caps:swapecape
,结果如下:
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="cn"
XKBVARIANT=""
XKBOPTIONS="caps:swapescape"
BACKSPACE="guess"
执行配置:sudo dpkg-reconfigure keyboard-configuration
接下来会出来一个让你选择键盘类型的界面,一般一路确认就可以了,可以看一下信息,比方说我的键盘是pc105,所以我选择105的选项。
减少无关的移动
a命令是在当前光标之后添加内容,A命令则是在当前行的结尾添加内容。不管光标当前处于什么位置,输入A都会进入插入模式,并把光标移到行尾。换句话说,它把$a封装成了一个按键操作。
vim会把我们离开插入模式之前的全部按键操作都记录下来。
在每行后面添加;符号:
$:将光标移动到行尾
a:在光标之后添加内容
;
A:封装$a
A;
k:向下移动一行
k.:在下一行重复上一次的动作
复合命令
复合命令 | 等效的长命令 |
---|---|
C | c$ |
I | ^i |
A | $a |
o | A |
O | jo |
使修改可重复(充分发挥.命令的最大威力) - 在一个字符前后各添加一个空格
var foo = "method+alkdj+ladkl+kdlakdjf+dkal"
f+:将光标移动到第一个+符号
s␣+␣:删除光标下的字符,进入插入模式,先输入␣+␣,然后退出插入模式
;
.
使移动可重复
f+命令跳到下一个+号所在的位置。
;命令会重复查找上次f命令所查找的字符;
执行、重复、回退
目的 | 操作 | 重复 | 回退 |
---|---|---|---|
做出一个修改 | {edit} | . | u |
在行内查找下一指定字符 | f{char}/t{char} | ; | , |
在行内查找上一指定字符 | F{char}/T{char} | ; | , |
在文档中查找下一处匹配项 | /pattern | n | N |
在文档中查找上一处匹配项 | ?pattern | n | N |
执行替换 | : s/target/replacement | & | u |
执行一系列修改,宏 | qx{changes}q | @x | u |
把撤销单元切成快
在vim中,我们自己可以控制撤销命令的粒度。从进入插入模式开始,直到返回普通模式为止,在此期间输入或删除的任何内容都被当成一次修改。因此,只要控制好对
键的使用,就可使撤销命令作用于单词、句子或段落。
用次数做简单的算术运算
程序员通常只花一小部分时间编写代码,绝大多数时间用来思考、阅读,以及在代码中穿梭浏览,而且当确实需要修改时,谁说一定要切换到插入模式才行?我们可以重新调整已有代码的格式,复制它们,移动其位置,或是删除它们。在普通模式中,我们有众多的工具可以利用。
v:
V:进入可视行模式
ctrl + v:可视列模式
在所有模式中删除的组合键
按键操作 | 用途 |
---|---|
删除前一个字符(同退格键) | |
删除前一个单词 | |
删至行首 |
切换回普通模式
按键操作 | 用途 |
---|---|
切换到普通模式 | |
切换到普通模式 | |
切换到插入-普通模式 |
插入-普通模式
能让我们执行一次普通模式命令。在执行一个普通模式命令,执行后,马上又返回到插入模式。
表达式寄存器
=访问寄存器:该命令会在屏幕下方显示一个提示符,可以在其后输入要执行的表达式,输入表达式后敲一下,vim就会把执行的结果插入文档的当前位置了。
可视模式允许选中一块文本区域并在其上进行操作
vim有三种不同的可视模式,分别用于操作字符文本、行文本和块文本。
一般情况下,当使用可视模式时,选区的一端固定在一个特定字符上,另一端可以自由移动;当使用l、w及f{char}这类动作命令时,会移动高亮区域的活动端,使选区变大或缩小。
在普通模式下激活可视模式:
命令 | 用途 |
---|---|
v | 激活面向字符的可视模式 |
V | 激活面向行的可视模式 |
激活面向块的可视模式 | |
gv | 重选上次的高亮选区 |
vi}:vim进入可视模式,并选中花括号{}括起来的所有字符。
在指定范围上执行普通模式命令:normal
对几十行后都添加一个分号:
A;
jVG
:'<,>'normal .:对高亮选区中的每一行,对其执行普通模式下的.命令。
:%normal A; :符号%代表整个文件范围,因此:%normal A; 告诉vim在文件每行的结尾都添加一个分号。
:%normal i# :可以把整个python文件注释掉
用
运行shell命令::!
可以调用外部程序,适用于执行一次性命令
:shell 命令用来启动一个交互的shell会话,exit退出会话返回vim
命令 | 用途 |
---|---|
:shell | 启动一个shell(输入exit返回vim) |
:!{cmd} | 在shell中执行{cmd} |
:read !{cmd} | 在shell中执行{cmd},并把其标准输出插入光标下方 |
:[range]wirte !{cmd} | 在shell中执行{cmd},以[range]作为其标准输入 |
:[range]!{filter} | 使用外部程序{filter}过滤指定的[range] |
:ls:列出所有被载入内存中的缓冲区的列表,
用:bn[ext]命令可以切换到列表中的下一个缓冲区。
:bnext!:叹号会强制vim切换缓冲区,即使当前缓冲区中有未保存的修改,也会继续切换。:ls命令中查看,被标记为a,表示为活动缓冲区(active);被标记为h,表示为隐藏缓冲区(hidden)。
在退出时处理隐藏缓冲区:
:bprev命令可以切换到列表中的上一个缓冲区。
:buffer N命令直接凭编号跳转到一个缓冲区;
:buffer {bufname}:{bufname}只需包含文件路径中足以唯一标识此缓冲区的字符即可,如果输入的字符串匹配不止一个缓冲区列表中的条目,就可以用Tab补全的方式在这些条目中选择。
%符号知名哪个缓冲区在当前窗口中可见;
# 符号则代表轮换文件;
可以在当前文件和轮换文件间快速切换;
:args:把缓冲区列表中的文件分组
argdo:在列表中的每个文件上执行Ex命令
删除缓冲区
用参数列表将缓冲区分组
:args:参数列表记录了在启动时作为参数传递给vim的文件列表。
:args filename1 filename:可以在列表列里增加文件
通配符(:args **/*.js **/*.css)
用反引号结构指定文件
:args `cat .chapters`:vim 会在shell中执行反撇号括起来的命令,然后把cat命令的输出作为:args命令的参数。
多窗口
Ex 命令 | 普通模式命令 | 用途 |
---|---|---|
:clo[se] | c | 关闭活动窗口 |
:on[ly] | o | 只保留活动窗口,关闭其他所有窗口 |
用标签页将窗口分组
标签页是可以容纳一系列窗口的容器。
:find:
命令允许通过文件名打开一个文件,但无需输入该文件的完整路径。要想利用此功能,首先要配置“path”选项。
:set path+=xx/**
配置号路径之后,只需给出文件名就可以打开指定目录中的文件了;也可以用键自动补全文件名。
基于单词移动
命令 | 光标动作 |
---|---|
w | 正向移动到下一单词的开头 |
b | 反向移动到当前单词/上一单词的开头 |
e | 正向移动到当前单词/下一单词的结尾 |
ge | 反向移动到上一单词的结尾 |
查找字符f {char}
命令 | 用途 |
---|---|
f{char} | 正向移动到下一个{char}所在之处 |
F{char} | 反向移动到上一个{char}所在之处 |
t{char} | 正向移动到下一个{char}所在之处的前一个字符上 |
T{char} | 反向移动到上一个{char}所在之处的前一个字符上 |
; | 重复上次的字符查找命令 |
, | 反转方向查找上次的字符查找命令 |
用查找动作操作文本
1.用选择模式:
v:进入可视模式
/ge
:选择光标到指定内容前 h:往回移一个字符
d:删除内容
2.普通模式
d/ge
任何改变当前窗口中活动文件的命令,都可以被称为跳转命令。
vim会把执行跳转命令之前和之后的光标位置,记录到跳转列表中。
可以说大范围的动作命令可能会被当成跳转,但小范围的动作命令只能算移动。
:jump:查看跳转列表的内容
用
跳转动作:
命令 | 用途 |
---|---|
[count]G | 跳转到指定的行号 |
/pattern | 跳转到下一个/上一个模式出现之处 |
% | 跳转到匹配的括号所在之处 |
(/) | 跳转到上一句/下一句的开头 |
{/} | 跳转到上一段/下一段的开头 |
H/M/L | 跳到屏幕最上方/正中间/最下方 |
gf | 跳转到光标下的文件名 |
跳转到光标下关键字的定义之处 | |
'{mark}/`{mark} | 跳转到一个位置标记 |
:change :改变列表change list
vim为每次修改都记录了行号与列号,可以用g;和g,命令反向或正向遍历改变列表。
;和,分别用来正向及反向重复f{char}命令。
`.标记总是指向上次修改的位置;
`^标记则会记录上次退出插入模式时光标所在的位置;如果先退出插入模式,接着又在文档中四处移动,然后又想快速回到退出的地方继续编辑时,用gi命令就行了。
跳转到光标下的文件gf(go to file)
是一组用于保存文本的简单容器;
它们既可像剪贴板那样,剪切、复制和粘贴文本,也可以记录一系列按键操作,把它们录制成宏。
vim的删除、复制与粘贴命令都会用到众多寄存器中的某一个。可以通过给命令加"{register}"前缀的方式指定要用的寄存器。若不指明,vim将缺省使用无名寄存器。
vim提供了一组以26个英文字母命令的有名寄存器。
使用无名寄存器:
专用寄存器("0)
"0p
复制专用寄存器,仅当使用y{motion}命令时才会被赋值。
有名寄存器("a-"Z)
用小写字母引用有名寄存器,会覆盖该寄存器的原有内容,而换用大写字母的话,会将新内容添加到该寄存器的原有内容之后。
黑洞寄存器
黑洞寄存器是个有去无回的地方,可用下划线引用它。
如果运行"_d{motion}命令,vim将删除该文本且不保存任何副本。
用于只想删除文本却不想覆盖无名寄存器中的内容时。
系统剪贴板("+)
如果在外部程序中用剪切或复制命令获取了文本,就可以通过"+p命令(或在插入模式下用、+)将其粘贴到vim内部。相反地,如果在vim的复制或删除命令之前加入"+,相应的文本就被捕获至系统剪贴板。
在可视模式下使用寄存器
在可视模式下使用p命令时,vim 将用指定的寄存器内容来替换高亮选区中的文本。
可以用宏把任意数目的按键操作录制到寄存器,用于之后的回放。
在一组目标上执行宏有两种方式:以串行方式回放或者以并行方式多次运行。
在录制宏时,要确保每条命令都可被重复执行。
在录制宏的过程中,禁止使用鼠标。
qa:录制宏并将其内容保存至寄存器a中,直到再次按下q键停下为止
:reg a:查看寄存器a中的内容
用@{register}命令执行指定寄存器的内容,也可以用@@来重复最近调用过的宏
以并行方式执行宏:以可视模式选取文本,然后执行命令:‘<,’>normal @
给宏追加命令
在输入qa时,vim将开始录制接下来的按键操作,并将它们保存到寄存器a中,这会覆盖该寄存器原有的内容。如果输入的是qA,vim也会录制按键操作,但会把他们附加到寄存器a原有的内容之后。
编辑宏的内容:
按G键,跳转到当前文档的结尾,使用:put命令粘贴宏的内容
编辑完之后,再依次:
0
"ay$:复制命令到寄存器a中
dd
或者运行"add,该缺点是多了一个拖尾字符^J,即换行符。
调整查找模式的大小写敏感性
正则匹配
模式 | 说明 |
---|---|
#\([0-9a-fA-F]\{6}|[0-9a-fA-F]\{3}\) | 使用magic搜索模式时,必须转义(、)、|以及{字符,赋予它们特殊的含义 |
`\v#([0-9a-fA-F]{6} | [0-9a-fA-F]{3})` |
`\v#(x{6} | \x{3})` |
界定单词的边界
如果只想在当前光标位置至文档结尾的范围内查找,而不想绕回文档继续查找的话,可以关闭"wrapscan"
/键为正向扫描,?键会进行反向查找
在普通模式下使用gn时,光标会跳到下一处匹配,进入可视模式并选中匹配的文本。如果光标已经位于匹配上,gn就会选中当前的匹配;
gN进入面向字符的可视模式,并选中上一处匹配。
高亮功能:(:set hls
将光标偏移到查找匹配的结尾
/lang/e
auage
n
.
n.
在缺省情况下,substitute命令仅仅作用于当前行,而且只会修改第一处匹配。因此,为了在整个文件的范
围内修改每一处匹配,必须指定范围,并使用标志位g。
: s/going/rolling/g:将当前行上的所有going都替换成rolling:%s/going/rolling/g:将整个文本中所有的going都替换成rolling
:%s/content/copy/gc:引入标志位c后,vim会对每处匹配结果都提示“替换为copy?”,可以按y键完成这次修改,或者按n键跳过这一次修改。
substitute命令允许先查找一段文本,再用另一段文本将其替换掉:
:[range]s[ubstitute]/{pattern}/{string}/[flags]
手动控制每一次替换操作
:%s/content/copy/gc
引入标志位c后,vim会对每处匹配结果都提示“替换为copy?”,可以按y键完成这次修改,或者按n键跳过这一次修改。
答案 | 用途 |
---|---|
y | 替换此处匹配 |
n | 忽略此处匹配 |
q | 退出替换过程 |
l | “last” - 替换此处匹配后退出 |
a | “all” - 替换此处与之后所有的匹配 |
向上滚动屏幕 | |
向下滚动屏幕 |
:global 命令允许在某个指定模式的所有匹配行上运行Ex命令。
在缺省情况下,:global 命令的作用范围是整个文件(%)
:global 命令在指定 [range] 内的文本行上执行时通常分为两轮。第一轮,vim在所有[pattern]的匹配上做上标记。第二轮,再在所有已标记的文本行上执行 [cmd]。
查看帮助:
:h :g
: [range] global[!] /{pattern}/ [cmd]
[pattern]域与查找历史相互关联。这意味着如果将该域留空的话,vim会自动使用当前的查找模式。
[cmd]可以是除 :global命令之外的任何Ex命令。如果不指定任何[cmd],vim将缺省使用 :print
可以用 :global! 或者 :vglobal (v表示invert) 反向[0] :global 命令的行为[0]