NORMAL MODE
- 使用vim时大多数的时间应该都处于这个模式,所以称为自然模式
the better you know vim,the less time you will spend in insert mode. - 光标移动
- 执行、重复、回退粒度尽量小
- 命令前使用次数指定命令执行多少次
PENDDING MODE
操作符+ 动作命令 = 操作 (:h operator)
能少码字的尽量不码字
INSERT MODE
在插入模式中可即时更正错误
插入模式下也可以进行粘贴操作
<C-r>{register}
( :h i_CTRL-R)其插入方式就如同这些文本是由键盘上一个个输进来的,所以会受textwidth
或者autoindent
影响,- 寄存器里粘贴很多行文本的话使用
<C-r><C-p>{register}
(:h i_CTRL-R_CTRL-P)或切换到普通模式操作 - 在插入模式中,输入
<C-r>=
就可以访问这一寄存器,大部分的 Vim 寄存器中保存的都是文本,表达式寄存器=
则是个另类,它执行一段 Vim 脚本,并返回其结果
插入模式–>普通模式
<Esc>
切换到普通模式,任何模式下都可以使用Esc返回到普通模式下!<C-[>
切换到普通模式 ( :h i_CTRL-[)<C-o>
切换到插入-普通模式 ( 临时切换到普通模式 :h i_CTRL-O),比如:<C-o>zz
可以滚动窗口,然后返回插入模式
用字符编码插入非常用字符
<C-v>{123}
以十进制字符编码插入字符<C-v>u{1234}
以十六进制字符编码插入字符<C-v>{nondigit}
按原义插入非数字字符 ( :h i_CTRL-V_digit)<C-k>{char1}{char2}
插入以二合字母{char1}{char2}表示的字符,:digraphs
可查组合列表 (:h digraphs-default :h digraph-table)- Print the ascii value of the character under the cursor in decimal,hexadecimal and octal(:h ga)
VISUAL MODE
- 选择高亮选区
v
激活面向字符的可视模式V
激活面向行的可视模式<C-v>
激活面向列块的可视模式gv
重选上次的高亮选区<Esc> / <C-[>
回到普通模式v / V /<C-v>
切换到普通模式(在对应的面向字符可视模式、面向行的可视模式或面向列块的可视模式中使用时)o
切换高亮选区的活动端
EX MODE
命令行模式
vim和emacs都有类似的命令行,vim–>vi–>ex–>ed,所以vim的命令行模式中执行的命令又被称做 Ex 命令(:h ex-cmd-index)
Ex命令不受光标位置的影响,可以运筹帷幄于千里之外!
:
执行命令命令,重复使用@:
,回退位置使用<C - o>
,u
回退修改Vim 为几乎所有功能都提供了相应的 Ex 命令,
下面是操作缓冲区文本的 Ex 命令::[range]delete [x]
删除指定范围内的行[到寄存器 x 中]:[range]yank [x]
复制指定范围的行[到寄存器 x 中]:[line]put [x]
在指定行后粘贴寄存器 x 中的内容:[range]copy {address}
把指定范围内的行拷贝到 {address} 所指定的行之下:[range]move {address}
把指定范围内的行移动到 {address} 所指定的行之下:[range]join
连接指定范围内的行:[range]normal {commands}
对指定范围内的每一行执行普通模式命令 {commands}:[range]substitute/{pattern}/{string}/[flags]
把指定范围内出现{pattern}的地方替换为{string}:[range]global/{pattern}/[cmd]
对指定范围内匹配{pattern}的所有行,在其上执行Ex 命令{cmd}
快捷键:
Ex命令一般前面是作用范围,
可以用行号、位置标记或是查找模式来指定范围的开始位置及结束位置:使用
:t
和:m
命令复制和移动行,复制距离较远的行时, :t 命令通常更加高效:copy
命令(及其简写形式:t
)让我们可以把一行或多行从文档的一部分复制到另一部分:t
命令的一些应用实例:
:6t.
把第 6 行复制到当前行下方:t6
把当前行复制到第 6 行下方:t.
为当前行创建一个副本(类似于普通模式下的 yyp, yyp 会使用寄存器,而 :t. 则不会):t$
把当前行复制到文本结尾:'<,'>t0
把高亮选中的行复制到文件开头
:move
命令则可以让我们把一行或多行移到文档的其他地方
在指定范围上执行普通模式命令
Ex 命令可以一次修改若干行,而 :normal 命令则让我们可以把具有强大表现力的 Vim 普通模式命令与具有大范围影响力的 Ex 命令结合在一起,这种结合真地是珠联璧合!有命令行的地方就有命令补全和历史记录
命令行窗口
命令行窗口就像是一个常规的 Vim 缓冲区,只不过它的每行内容都对应着命令历史中的一个条目,在按下
<CR>
键时,将会把当前行的内容当成Ex 命令加以执行. 当命令行窗口处于打开状态时,它会始终拥有焦点,除非关闭命令行窗口,否则我们无法切换到其他窗口。q:
打开Ex 命令历史的命令行窗口(:h cmdwin),q/
打开查找命令历史的命令行窗口<Ctrl-f>
从命令行模式切换到命令行窗口.
把当前单词插入到命令行
<C-r><C-w>
映射项会复制光标下的单词并把它插入到命令行中<C-r><C-w>
映射项会复制光标下的字串并把它插入到命令行中(:h c_CTRL-R_CTRL-W)*
命令等效于输入/\<<C-r><C-w>\><CR>
序列,应用场景: vimrc中:help <C-r><C-w>
可以查阅该光标下设置的文档
执行 Shell 中的程序
:!
{cmd} 在 shell 中执行 {cmd},这种语法适用于执行一次性命令;:shell
启动一个 shell (输入 exit 返回 Vim)- 在 Vim 的命令行中,符号
%
代表当前文件名( :h cmdline-special),从当前文件名中提取出诸如文件路径或扩展名之类的信息(:h filename-modifiers ) :read !{cmd}
把 {cmd} 命令的输出读入当前缓冲区中(:h read!):[range]write !{cmd}
在 shell 中执行 {cmd} ,以 [range] 作为 {cmd} 的标准输入( :h :write_c)( :h rename-files):write! sh
表示把缓冲区内容写到一个名为sh的文件,!
表示强制写入:[range]!{filter cmd}
表示由 [range ]所指定的行会传给{cmd} 作为标准输入,然后又会用 {cmd} 的输出覆盖 [range] 内原本的内容( :h :range!)- 用
!{motion}
操作符切换到命令行模式,并把指定 {motion} 所涵盖的范围预置在命令行上(:h !)