vim实用技巧

正在看vim实用技巧这本书,也在做一些笔记,直到看到了这个博客...

http://wiki.tankywoo.com/book/practical-vim.html#_2

下面是全文

第一章 .(dot)命令

. 命令可以重复上次的修改

Vim把进入插入模式到退出形成一次修改, i{insert something}<Esc>, 在插入模式中移动光标会重置修改状态

>G 增加从当前行到文档末尾的缩进层级

A 在当前行的结尾添加内容(等价$a), 类似还有:

  • C = c$
  • s = cl
  • S = ^c
  • I = ^i

查找:

  • f{char} 行内查找下一处指定字符出现的位置, 使用; 重复上次查找, 使用,回退
  • F{char} 行内查找上一个指定字符
  • /{pattern} 和 ?{pattern} 分别是文档中查找下/上一处匹配, 重复是n, 回退是N

第二章 普通模式(Normal Mode)

如果在插入模式使用了上下左右光标键,会产生一个新的撤销块 (P16)

构造一个可重复的撤销块 (配合 点.操作符使用)

这里要注意什么是一次修改u会撤销最后一次修改.

http://vimgolf.com/ 尽量用最少的按键次数实现一个操作, 一个有趣的网站

db反向删除, 从光标开始位置到单词开头的内容(不包括光标下的字符) dw正向删除, 从光标开始位置到下一个单词前(包括光标下的字符) daw 反向删除, 从光标位置开始到前一个单词后(包括光标下的字符)

简单的算数运算:

<C-a> 和 <C-x> 会把当前光标之上或之后的数值加1/减1 count<C-a> 会把数值加上 [count]

这个依然可以配合点操作符

cW 从当前光标删除一个单词.

能够重复,就别用次数

之前的如dw, 都可以配合上次数, 如2dwd2w

操作符 + 动作命令 = 操作

{d:操作符}{w:动作}删除单词. "w" 是词移动命令。实际上,"d" 命令后面可以跟任何 "动作" (motion) 命令,它会删除从当前位置到光标移动到的目标位置的全部内容. refer

常用操作符:

  • c: 修改
  • d: 删除
  • y: 复制到寄存器
  • g~: 反转大小写
  • gu: 转换为小写
  • gU: 转换为大写
  • >: 增加缩进
  • <: 减小缩进
  • =: 自动缩进

当操作符连续调用两次, 会作用于当前行. 如 dd>>gUgU或简写gUU

第三章 插入模式(Insert Mode)

在插入模式中更正错误,如果出错的位置在单词开头,删除整个单词再重新输入比退格键要快.

  • <C-h> 删除前一个字符(类似退格键)
  • <C-w> 删除前一个单词
  • <C-u> 删至行首

  • <C-[> 和<Esc> 类似,也是切换到普通模式

  • <C-o> 切换到 插入-普通模式, 是普通模式的一个特例, 进入此模式,执行一个普通模式命令后,会自动切换回插入模式.

zz 命令可以重绘窗口,使当前行在窗口居中.

使用<C-o>配合zz(即<C-o>zz)可以方便的在插入模式写代码时,让当前行从末尾移到屏幕中央.

K 查看光标下单词的手册页 J 把当前行和下一行连接在一起

@todo 寄存器 tip 15, P 28

在插入模式中, 使用<C-r>=可以使用寄存器做运算.

<i><C-r>=(40+60)*5 + 500/10<CR>

C-v{code}, 其中{code}是要插入的字符编码

# 输入A
<C-v>065

# 输入一个unicode,
# :h i_CTRL-V _digit
<C-v>u00bf

光标移到字符上,使用ga可以查看它的编码.

<C-k>{char1}{char2} 二合字母(digraph)可以打出一些特殊字符

# 字符 «
<C-k><<

@todo tip 19 P33, 虚拟替换模式

第四章 可视模式(Virtual Mode)

可视模式有三种:

  • 字符文本
  • 行文本
  • 块文本

viw高亮选择当前光标下的单词, 然后使用c修改所选内容, 这样会删掉单词并进入插入模式.

  • v: 激活面向字符的可视模式
  • V: 面向行
  • C-v: 面向列块
  • gv: 重选上次的高亮选区
  • o: 切换高亮选取的活动端

高亮选取的范围由两个端点界定, 其中一个固定, 一个岁光标移动. o可修改固定端点. (P37)

在可视模式下, dot(.)操作符一般对行操作有用.

可视模式一般使用一次性的操作, 如果是重复操作, 最好使用操作符命令.

可视模式配合一些动作命令也很强大:

  • Vr-: 将一行全部替换为减号
  • <C-v>jje 和 <C-v>jj$: P44 和 P45的例子

第五章 命令行模式

:进入命令行模式, 在命令行模式下执行的命令又称Ex命令. (源至ex行编辑器, vi先祖)

:h ex-cmd-index 查看完成的Ex命令列表

  • :[range]delete [x]: 删除指定范围的行 [到寄存器x中]
  • :[range]yank [x]: 复制指定范围的行 [到寄存器x中]
  • :[range]copy {address}: 把指定范围内的行拷贝到 {address} 所指定的行之下
  • :[range]move {address}: 把指定范围内的行移动到 {address} 所指定的行之下
  • :[range]normal {commands}: 对指定范围内的没一行执行普通模式命令 {commands}

很多Ex命令可以用[range]指定要操作的范围.可以在某一范围内的所有行执行操作.

:print 命令(简写:p)用于在命令行显示指定行的内容

比如:2p移动到第二行并显示内容; :2,5p显示第2~5行的内容; :.,$p显示当前行到最后一行的内容; %p显示所有内容

使用VG高亮选取后按:进入命令行模式, 会自动填充:'<,'>, 这个也是Ex命令

用模式指定范围, 用偏移对地址进行修正. TODO

[range]定义的范围语法可以是行号、位置标记、查找模式、偏移:

  • 1: 文件第一行
  • 0: 虚拟行, 文件第一行上方
  • $: 文件最后一行
  • .: 光标所在行
  • 'm: 包含位置标记m的行
  • '<: 高亮选取的起始行
  • '>: 高亮选取的结束行
  • %: 整个文件 (:1,$的简写)

复制, 使用:copy 或者 :co 或 :t. 如

  • :6t. 将第6行复制到当前行
  • :t6 将当前行复制到第6行下
  • :t. 同yyp
  • :t$ 将当前行复制到文件末尾
  • :'<,'>t0 将高亮选中的行复制到文件开头

快速跳会原来的位置 C-o

普通模式命令适合在本地操作; Ex命令适合远距离操作

:normal 配合 . 命令, 可以在多行完成相同的内容, 如:

A;<ESC> -> jVG -> :'<.'>normal . 从当前行到文件末尾, 每行最后加一个分号

更简单的方式: .,$normal A;

:%normal i//所有行加上注释

.命令无法重复由Vim命令行中做出的修改, 改为使用@:重复上次的Ex命令. 然后可以使用@@来重复操作

在Ex命令自动补全时, 键入<C-d>会显示可用的补全列表, 如:

:col<C-d>
colder       colorscheme

对于命令历史, q:打开Ex命令的历史记录窗口; q打开查找命令的历史记录窗口

在Ex命令窗口输入:!{command} 可以运行一次shell命令. 执行:shell可以启动一个交互的shell会话.

第六章 管理多个文件

我们所编辑的只是文件在内存中的映像, 也就是Vim的"缓冲区"

如果vim同时打开多个文件, 会把这些文件都加到缓存区, 但只有一个是激活的.

使用:ls可以查看缓冲区列表:

:ls
  1 %a   "a.txt"                        line 1
  2      "b.txt"                        line 0

使用:bnext可以切换到下一个缓冲区:

:ls
  1 #    "a.txt"                        line 1
  2 %a   "b.txt"                        line 1

其中%表示当前窗口中可见的缓冲区, a表示active, #表示轮转文件, 也就是切换过来的前一个缓冲区. <C-^>可以在两者间快速切换.

  • :bprev: 切换到前一个缓冲区
  • :bnext: 切换到下一个缓冲区
  • :bfirst: 切换到第一个缓冲区
  • :blast: 切换到最后一个缓冲区
  • :b N: 切换到第N个缓冲区

这里b表示buffer简写

如果缓冲区有修改, 则:ls会显示+:

:ls
  1 #    "a.txt"                        line 1
  2 %a + "b.txt"                        line 18

此时如果要切换缓冲区, 需要加!强制执行, 如:bnext!, 此时当前缓存冲会被标记为隐藏缓冲区(h):

:ls
  1 %a   "a.txt"                        line 1
  2 #h + "b.txt"                        line 18

:args类似:ls, 不过显示的比较简陋.

分割窗口:

  • <C-w>s: 水平分割
  • <C-w>v: 垂直分割

排列窗口:

  • <C-w>= 等高、等宽
  • <C-w>_ 最大化活动窗口高度
  • <C-w>| 最大化活动窗口宽度
原文地址:https://www.cnblogs.com/vactor/p/5055137.html