站内链接:

Introduction

帮助文档: help ex, help :, 其他
ex: 对行编辑器 ed 的支持, 另见ex 与 ed的说明.

Format

[Range] Operator [object]

Range

  • 当前行: 不指定任何 range 时, 一般只当前行
  • 具体范围行号: {starg}, {end}
  • 相对行号: {address}+n, {address}-n
  • .: 当前行
  • 0: 文件第一行的上方, 虚拟行
  • %: 所有行
  • ‘m: 位置标记 m 所在的行
  • pattern: 使用模式指定范围, 例如/<html>/, /<\html>/表示该标签内的文本
  • visual: 利用', <, >来表示当前选择的文本范围

Operator

帮助文档: help :put, help :d, help :yank

所有选区范围的操作,非常像可视模式选定范围之后的操作,只不过更快捷而已.

Register

[range] Operator {register}

  • delete/d: 删除, 例如: 1,2d
  • yank/y: 拷贝, 例如拷贝前面几行到寄存器 a 中: 1,2y a, 之后在 ex 中获取 a 内容: <C-R>a
  • put: 输出到指定的位置, 例如输出寄存器 a 内容到第 3 行: 3put “a
  • print/p: 输出寄存器的信息到当前 Ex

Address

[range] Operator {address}

  • copy/co: 拷贝指定的信息到指定的地址, 例如: 1,3co 8
  • move/mo: 移动
  • join: 连接多行内容

Command

format: [range] Operator {Command}
见: help multi-repeat 文档说明

  • Cmd: 例如: %normal A; 表示在文件的所有行末尾增加’;’字符
  • [range] global/{pattern}/[cmd]; 匹配并执行普通命令
  • [range] substitute/{pattern}/{string}/[flags]: 替换, 例子:%s/bamboo/donkey/g

Example

1
2
3
4
5
6
'<,'>,:        高亮选区所选定的范围,之后添加命令即可,和gv联用非常棒
.,.+3表示2,5,如果当前行为第二行

# 匹配非空字符, 将匹配的字符串放到后续的替换组, 正则表达式中的分组
%s/"""\([^$]\)/""" \1/g ; """X --> """ X
%s/\([^ ]\)"""/\1 """/g ; X""" --> X """

ex 命令高级用法

对匹配的文本执行需要的 ex 命令,其命令格式为:g/{pattern}/v/{pattern1}/{cmd},注意,在递归使用时, 不能给出 range, 仅仅用于全文本, 仅仅最后一个匹配时才会执行 cmd 命令。

  • [range] g[lobal]/{pattern}/{cmd}: 在 range 范围的文本内, 对匹配的文本进行 cmd 命令
  • [range] g[lobal]!/{pattern}/{cmd}: 在 range 范围的文本内, 对不匹配的文本进行 cmd 命令
  • [range] v[global]/{pattern}/{cmd}: 在 range 范围的文本内, 对不匹配的文本进行 cmd 命令

如果希望在命令行执行非 ex 命令,则需要使用:normal 来实现, 格式: g/pat/normal {commands}

Example

复制光标字符

1
2
3
4
5
6
" 在Ex模式下:
" 单词
<C-r><C-w>

" 字符串,这个经常忘记
<C-r><C-a>

历史记录

设置历史记录: set history=32

获取上一条 ex 命令:UP 键

命令行窗口: 一个常规的 vim 缓冲区,每一行内容都是 vim 的 ex 记录, 命令

1
2
3
4
q:                   " 普通模式下输入获取ex历史记录
q/ " 普通模式下输入获取查找命令历史记录
<C-f> " 命令行模式切换到命令行窗口
" 操作:对历史命令进行更改,之后执行修改的历史命令

3.3 自动补全

  • Tab 键两次
  • CTRL + B 获取所有补全项

shell 命令

说明:在 vim 中执行 shell 命令

1
2
3
4
! {cmd}                  " 执行cmd命令
read !{cmd} " 执行cmd命令,并将stdout插入当前光标所在位置
[range]write !{cmd} " 执行cmd命令,【range】所在范围的字符串作为stdin
[range]!{filter} " 使用外部程序{filter}过滤【range】,例如grep命令