40、文本编辑命令全解析

文本编辑命令全解析

在文本编辑的世界里,熟练掌握各类命令能够极大地提升效率。下面为大家详细介绍一系列实用的编辑命令,涵盖搜索、插入、编辑、保存等多个方面。

搜索相关命令
命令 功能
N 反向重复搜索
/ 向前重复上一次搜索
? 向后重复上一次搜索
* 向前搜索光标下的单词,只匹配精确单词(Vim)
# 向后搜索光标下的单词,只匹配精确单词(Vim)
g* 向后搜索光标下的单词,当该单词嵌入更长单词中时也匹配(Vim)
g# 向后搜索光标下的单词,当该单词嵌入更长单词中时也匹配(Vim)
% 查找当前括号、大括号或方括号的匹配项
f x 将光标向前移动到当前行的 x 字符处
F x 将光标向后移动到当前行的 x 字符处
t x 将光标向前移动到当前行 x 字符前的字符处
T x 将光标向后移动到当前行 x 字符后的字符处
, 反转最后一次 f、F、t 或 T 命令的搜索方向
; 重复最后一次 f、F、t 或 T 命令
行号操作命令
  • CTRL - G :显示当前行号。
  • gg :移动到文件的第一行(Vim)。
  • num G :移动到第 num 行。
  • G :移动到文件的最后一行。
  • : num :移动到第 num 行。
标记命令
命令 功能
m x 在当前位置放置标记 x
` x (反引号)将光标移动到标记 x 处
‘x (单引号)移动到包含标记 x 的行的起始位置
`` (双反引号)返回到最近一次跳转前的位置
’‘ (双单引号)类似上一个,但返回到行的起始位置
’“ (单引号加双引号)移动到上次编辑文件时的位置(Vim)
`[, ‘] (反引号加方括号)移动到上一次文本操作的开始/结束位置(Vim)
’, ‘] (单引号加方括号)类似上一个,但返回到操作发生的行的起始位置(Vim)
`. (反引号加点)移动到文件的最后一次更改处(Vim)
’. (单引号加点)类似上一个,但返回到行的起始位置
‘0 (单引号加零)上次退出 Vim 时的位置
:marks 列出活动标记(Vim)
插入操作命令
命令 功能
a 在光标后追加
A 追加到行尾
c 开始更改操作
C 更改到行尾
gI 在行首插入(Vim)
i 在光标前插入
I 在行首插入
o 在光标下方打开一行
O 在光标上方打开一行
R 开始覆盖文本
s 替换一个字符
S 替换整行
ESC 终止插入模式

在插入模式下,还有以下常用命令:
| 命令 | 功能 |
| — | — |
| BACKSPACE | 删除前一个字符 |
| DELETE | 删除当前字符 |
| TAB | 插入一个制表符 |
| CTRL - A | 重复最后一次插入(Vim) |
| CTRL - D | 将行向左移动到上一个缩进宽度(Vim) |
| CTRL - E | 插入光标正下方的字符(Vim) |
| CTRL - H | 删除前一个字符(与退格键相同) |
| CTRL - I | 插入一个制表符 |
| CTRL - K | 开始插入多键字符 |
| CTRL - N | 插入光标左侧模式的下一个补全项(Vim) |
| CTRL - P | 插入光标左侧模式的上一个补全项(Vim) |
| CTRL - T | 将行向右移动到下一个缩进宽度(Vim) |
| CTRL - U | 删除当前行 |
| CTRL - V | 逐字插入下一个字符 |
| CTRL - W | 删除前一个单词 |
| CTRL - Y | 插入光标正上方的字符(Vim) |
| CTRL - [ | (ESC)终止插入模式 |

编辑操作命令
更改和删除文本
命令 功能
cw 更改单词
cc 更改行
c$ 从当前位置更改到行尾
C 同 c$
dd 删除当前行
num dd 删除 num 行
d$ 从当前位置删除到行尾
D 同 d$
dw 删除一个单词
d} 删除到下一个段落
d^ 删除到行首
d/ pat 删除到模式的第一次出现处
dn 删除到模式的下一次出现处
df x 删除到当前行的 x 字符(包括 x)
dt x 删除到当前行的 x 字符(不包括 x)
dL 删除到屏幕上的最后一行
dG 删除到文件末尾
gqap 将当前段落重新格式化为文本宽度(Vim)
g~w 切换单词大小写(Vim)
guw 将单词更改为小写(Vim)
gUw 将单词更改为大写(Vim)
p 在光标后插入最后一次删除或复制的文本
gp 同 p,但将光标留在插入文本的末尾(Vim)
gP 同 P,但将光标留在插入文本的末尾(Vim)
]p 同 p,但匹配当前缩进(Vim)
[p 同 P,但匹配当前缩进(Vim)
P 在光标前插入最后一次删除或复制的文本
r x 用 x 替换字符
R text 从光标处开始用新文本替换(覆盖),ESC 结束替换模式
s 替换字符
4s 替换四个字符
S 替换整行
u 撤销上一次更改
CTRL - R 重做上一次更改(Vim)
U 恢复当前行
x 删除当前光标位置的字符
X 向前删除一个字符
5X 删除前五个字符
. 重复上一次更改
~ 反转大小写并将光标向右移动
CTRL - A 增加光标下的数字(Vim)
CTRL - X 减少光标下的数字(Vim)
复制和移动
  • 寄存器名称为字母 a - z,大写名称将文本追加到相应的寄存器。
  • Y :复制当前行。
  • yy :复制当前行。
  • ” x yy :将当前行复制到寄存器 x。
  • ye :复制到单词末尾的文本。
  • yw :类似 ye,但包括单词后的空格。
  • y$ :复制行的其余部分。
  • ” x dd :将当前行删除到寄存器 x。
  • ” x d :删除到寄存器 x。
  • ” x p :放置寄存器 x 的内容。
  • y]] :复制到下一个节标题。
  • J :将当前行与下一行连接。
  • gJ :同 J,但不插入空格(Vim)。
  • :j :同 J。
  • :j! :同 gJ。
保存和退出命令
命令 功能
ZZ 退出编辑器,仅在有更改时保存文件
:x 同 ZZ
:wq 保存文件并退出
:w 保存文件
:w file 保存副本到文件
: n, m w file 将第 n 行到第 m 行写入新文件
: n, m w >> file 将第 n 行到第 m 行追加到现有文件
:w! 保存文件(覆盖保护)
:w! file 用当前文本覆盖文件
:w %. new 将名为 file 的当前缓冲区保存为 file.new
:q 退出编辑器(如果有更改则失败)
:q! 退出编辑器(丢弃编辑内容)
Q 退出编辑器并调用 ex
:vi 在 Q 命令后返回编辑器
% 在编辑命令中替换为当前文件名
# 在编辑命令中替换为备用文件名
多文件操作命令
命令 功能
:e file 编辑另一个文件;当前文件成为备用文件
:e! 返回上次写入时的当前文件版本
:e + file 从文件末尾开始编辑
:e +num file 在第 num 行打开文件
:e # 打开备用文件的上一个位置
:ta tag 在标签位置编辑文件
:n 编辑文件列表中的下一个文件
:n! 强制编辑下一个文件
:n files 指定新的文件列表
:rewind 编辑文件列表中的第一个文件
CTRL - G 显示当前文件和行号
:args 显示要编辑的文件列表
:prev 编辑文件列表中的上一个文件
窗口命令(Vim)
命令 功能
:new 打开一个新窗口
:new file 在新窗口中打开文件
:sp [file] 分割当前窗口。如果有文件参数,则在新窗口中编辑该文件
:sv [file] 同 :sp,但使新窗口为只读
:sn [file] 在新窗口中编辑文件列表中的下一个文件
:vsp [file] 类似 :sp,但垂直分割而不是水平分割
:clo 关闭当前窗口
:hid 隐藏当前窗口,除非它是唯一可见的窗口
:on 使当前窗口成为唯一可见的窗口
:res num 将窗口调整为 num 行
:wa 将所有更改的缓冲区写入其文件
:qa 关闭所有缓冲区并退出
^W s 同 :sp
^W n 同 :new
^W ^ 用备用(先前编辑)文件打开新窗口
^W c 同 :clo
^W o 同 :only
^W j, ^W k 将光标移动到下一个/上一个窗口
^W p 将光标移动到上一个窗口
^W h, ^W l 将光标移动到屏幕左侧/右侧的窗口
^W t, ^W b 将光标移动到屏幕顶部/底部的窗口
^W K, ^W B 将当前窗口移动到屏幕顶部/底部
^W H, ^W L 将当前窗口移动到屏幕最左侧/右侧
^W r, ^W R 向下/向上旋转窗口
^W +, ^W - 增加/减小当前窗口大小
^W = 使所有窗口高度相同
与系统交互命令
命令 功能
:r file 在光标后读取文件内容
:r !command 在当前行后读取命令的输出
: num r !command 类似上一个,但将输出放置在第 num 行之后(0 表示文件顶部)
:!command 运行命令,然后返回
!motion command 将 motion 覆盖的文本发送到 Unix 命令;用输出替换
: n, m !command 将第 n 行到第 m 行发送到命令;用输出替换
num!!command 将 num 行发送到 Unix 命令;用输出替换
:!! 重复上一次系统命令
:sh 创建子shell;用 EOF 返回编辑器
CTRL - Z 暂停编辑器,用 fg 恢复
:so file 从文件中读取并执行 ex 命令
宏命令
命令 功能
:ab in out 在插入模式下使用 in 作为 out 的缩写
:unab in 移除 in 的缩写
:ab 列出缩写
:map string sequence 将字符 string 映射为命令序列。使用 #1、#2 等表示功能键
:unmap string 移除字符 string 的映射
:map 列出已映射的字符字符串
:map! string sequence 将字符 string 映射到输入模式序列
:unmap! string 移除输入模式映射(可能需要用 CTRL - V 引用字符)
:map! 列出为输入模式映射的字符字符串
q x 将键入的字符记录到由字母 x 指定的寄存器中。如果字母为大写,则追加到寄存器(Vim)
q 停止记录(Vim)
@ x 执行由字母 x 指定的寄存器中的内容。使用 @@ 重复最后一个 @ 命令

在 vi 中,以下字符在命令模式下未使用,可以映射为用户定义的命令:
- 字母 :g、K、q、V 和 v
- 控制键 :^A、^K、^O、^W、^X、^ 和 ^\
- 符号
、*、\、= 和 #

需要注意的是,= 在设置 Lisp 模式时由 vi 使用,不同版本的 vi 可能会使用其中一些字符,所以在使用前请进行测试。Vim 不使用 ^K、^ 或 \。

其他杂项命令
命令 功能
< 将后续移动命令描述的文本向左移动一个缩进宽度(Vim)
> 将后续移动命令描述的文本向右移动一个缩进宽度(Vim)
<< 将行向左移动一个缩进宽度(默认是八个空格)
>> 将行向右移动一个缩进宽度(默认是八个空格)
>} 向右移动到段落末尾
<% 向左移动直到匹配的括号、大括号或方括号(光标必须在匹配符号上)
== 以 C 风格缩进行,或使用 equalprg 选项指定的程序(Vim)
g 在 Vim 中开始许多多字符命令
K 在手册页(或 keywordprg 中定义的程序)中查找光标下的单词(Vim)
^O 返回上一次跳转(Vim)
^Q 同 ^V(Vim)(在某些终端上,恢复数据流)
^T 返回标签堆栈中的上一个位置(Solaris vi、Vim、nvi、elvis 和 vile)
^] 对光标下的文本进行标签查找
^\ 进入 ex 行编辑模式
^^ (按下 Ctrl 键的同时按下插入符号键)返回先前编辑的文件
vi 配置
:set 命令

:set 命令允许你指定更改编辑环境特性的选项。选项可以放在 ~/.exrc 文件中,也可以在 vi 会话期间设置。如果命令放在 .exrc 中,则不需要输入冒号:
- :set x :启用布尔选项 x;显示其他选项的值。
- :set no x :禁用选项 x。
- :set x = value :为选项 x 赋值。
- :set :显示已更改的选项。
- :set all :显示所有选项。
- :set x ? :显示选项 x 的值。

示例 .exrc 文件

在 ex 脚本文件中,注释以双引号字符开头。以下是一个自定义 .exrc 文件的示例:

set nowrapscan                    " Searches don't wrap at end of file
set wrapmargin=7                  " Wrap text at 7 columns from right margin
set sections=SeAhBhChDh nomesg    " Set troff macros, disallow message
map q :w^M:n^M                    " Alias to move to next file
map v dwElp                       " Move a word
ab ORA O'Reilly Media, Inc.       " Input shortcut

需要注意的是,q 别名对于 Vim 不是必需的,因为 Vim 有 :wn 命令。v 别名会隐藏 Vim 命令 v,该命令用于进入逐字符可视模式操作。

ex 基础

ex 行编辑器是屏幕编辑器 vi 的基础。ex 中的命令作用于当前行或文件中的一系列行。大多数情况下,你在 vi 中使用 ex。在 vi 中,ex 命令以冒号开头,并通过按 ENTER 键执行。你也可以像调用 vi 一样从命令行单独调用 ex(可以通过这种方式执行 ex 脚本)。或者你可以使用 vi 命令 Q 退出 vi 编辑器并进入 ex。

ex 命令语法

要从 vi 中输入 ex 命令,请键入:

:[address] command [options]

初始的 : 表示这是一个 ex 命令。当你输入命令时,它会在状态行上回显。通过按 ENTER 键执行命令。地址是命令作用的行号或行范围。选项和地址将在后面描述。ex 命令将在后面的“ex 命令字母汇总”部分进行描述。

你可以通过以下几种方式退出 ex:
- :x :退出(保存更改并退出)。
- :q! :不保存更改直接退出。
- :vi :切换到当前文件的 vi 编辑器。

地址

如果没有给出地址,则当前行是命令的对象。如果地址指定了一系列行,则格式为:

x,y

其中 x 和 y 是第一个和最后一个被寻址的行(x 必须在缓冲区中先于 y)。x 和 y 可以是行号或符号。使用 ; 而不是 , 会在解释 y 之前将当前行设置为 x。符号 1,$ 表示文件中的所有行,% 也表示所有行。

地址符号
符号 含义
1,$ 文件中的所有行
x, y 从第 x 行到第 y 行
x ; y 从第 x 行到第 y 行,将当前行重置为 x
0 文件顶部
. 当前行
num 绝对行号 num
$ 最后一行
% 所有行;同 1,$
x - n x 之前的 n 行
x + n x 之后的 n 行
-[num] 前一或 num 行
+[num] 后一或 num 行
‘x (单引号)标记为 x 的行
’‘ (双单引号)上一个标记
/pattern/ 向前查找匹配模式的行
?pattern? 向后查找匹配模式的行
选项
  • ! :表示命令的变体形式,覆盖正常行为。! 必须紧跟在命令之后。
  • count :命令要重复的次数。与 vi 命令不同,count 不能在命令之前,因为 ex 命令前的数字被视为行地址。例如,d3 从当前行开始删除三行;3d 删除第 3 行。
  • file :受命令影响的文件名。% 代表当前文件;# 代表上一个文件。
ex 命令字母汇总

ex 命令可以通过指定任何唯一的缩写来输入。在以下参考条目中,完整名称作为参考条目的标题,最短可能的缩写显示在下面的语法行中。示例假设从 vi 中输入,因此包含 : 提示符。

abbreviate
ab [string text]

定义当输入 string 时将其转换为 text。如果未指定 string 和 text,则列出所有当前缩写。

:ab ora O'Reilly Media, Inc.
:ab id Name:^MRank:^MPhone:

注意:^M 在你键入 ^V 后再按 ENTER 时出现。

append
[address] a[!]
text
.

在指定地址处追加新文本,如果未指定地址,则在当前地址处追加。添加 ! 以切换输入期间使用的自动缩进设置。即,如果自动缩进已启用,! 将禁用它。输入命令后输入新文本。通过输入仅包含一个句点的行来终止新文本的输入。

:a                     Begin appending to current line
Append this line
and this line too.
.                      Terminate input of text to append
args
ar
args file ...

打印参数列表的成员(命令行上指定的文件),当前参数用方括号 ([ ]) 打印。第二种语法适用于 Vim,它允许你重置要编辑的文件列表。

bdelete
[num] bd[!] [num]

卸载缓冲区 num 并将其从缓冲区列表中移除。添加 ! 以强制移除未保存的缓冲区。缓冲区也可以通过文件名指定。如果未指定缓冲区,则移除当前缓冲区(Vim)。

buffer
[num] b[!] [num]

开始编辑缓冲区列表中的缓冲区 num。添加 ! 以强制从一个未保存的缓冲区切换。缓冲区也可以通过文件名指定。如果未指定缓冲区,则继续编辑当前缓冲区(Vim)。

buffers
buffers[!]

打印缓冲区列表的成员。某些缓冲区(例如已删除的缓冲区)将不会列出。添加 ! 以显示未列出的缓冲区。ls 是此命令的另一个缩写(Vim)。

cd
cd dir
chdir dir

将编辑器内的当前目录更改为 dir。

center
[address] ce [width]

将指定宽度内的行居中。如果未指定宽度,则使用 textwidth(Vim)。

change
[address] c[!]
text
.

用 text 替换指定的行。添加 ! 以在输入 text 期间切换自动缩进设置。通过输入仅包含一个句点的行来终止输入。

close
clo[!]

关闭当前窗口,除非它是最后一个窗口。如果窗口中的缓冲区未在其他窗口中打开,则将其从内存中卸载。此命令不会关闭有未保存更改的缓冲区,但你可以添加 ! 以隐藏它(Vim)。

copy
[address] co destination

将 address 中包含的行复制到指定的目标地址。命令 t(“to”的缩写)是 copy 的同义词。

:1,10 co 50     Copy first 10 lines to just after line 50
delete
[address] d [register] [count]

删除 address 中包含的行。如果指定了 register,则将文本保存或追加到命名的寄存器。寄存器名称是小写字母 a - z。大写名称将文本追加到相应的寄存器。如果指定了 count,则删除那么多行。

:/Part I/,/Part II/-1d  Delete to line above “Part II”
:/main/+d               Delete line below “main”
:.,$d x                 Delete from this line to last line into register x
edit
e[!] [+num] [filename]

开始编辑 filename。如果未给出文件名,则使用当前文件的副本重新开始。添加 ! 以即使当前文件自上次更改后尚未保存也编辑新文件。使用 +num 参数,从第 num 行开始编辑。或者,num 可以是一个模式,形式为 /pattern。

:e file             Edit file in current editing buffer
:e +/^Index #       Edit alternate file at pattern match
:e!                 Start over again on current file
file
f [filename]

将当前缓冲区的文件名更改为 filename。下次写入缓冲区时,它将写入文件 filename。更改名称后,缓冲区的“未编辑”标志将被设置,以表明你不是在编辑现有文件。如果新文件名与磁盘上已存在的文件相同,则需要使用 :w! 来覆盖现有文件。指定文件名时,% 字符可用于表示当前文件名。# 可用于表示备用文件名。如果未指定文件名,则打印缓冲区的当前名称和状态。

:f %.new
fold
address fo

折叠指定地址的行。折叠将屏幕上的几行合并为一行,以后可以展开。它不会影响文件的文本(Vim)。

foldclose
[address] foldc[!]

关闭指定地址的折叠,如果未指定地址,则在当前地址处关闭。添加 ! 以关闭多级折叠(Vim)。

foldopen
[address] foldo[!]

打开指定地址的折叠,如果未指定地址,则在当前地址处打开。添加 ! 以打开多级折叠(Vim)。

global
[address] g[!]/pattern/[commands]

对包含模式的所有行执行命令,如果指定了地址,则对该范围内的所有行执行。如果未指定命令,则打印所有此类行。添加 ! 以对不包含模式的所有行执行命令。另请参阅 v,在本列表后面。

:g/Unix/p               Print all lines containing “Unix”
:g/Name:/s/tom/Tom/     Change “tom” to “Tom” on all lines containing “Name:”
hide
hid

关闭当前窗口,除非它是最后一个窗口,但不将缓冲区从内存中移除。此命令可安全用于未保存的缓冲区(Vim)。

insert
[address] i[!]
text
.

在指定地址之前的行插入文本,如果未指定地址,则在当前地址处插入。添加 ! 以在输入文本期间切换自动缩进设置。通过输入仅包含一个句点的行来终止新文本的输入。

join
[address] j[!] [count]

将指定范围内的文本放在一行上,调整空格以在句点 (.) 后提供两个空格字符,在 ) 前不提供空格字符,其他情况下提供一个空格字符。添加 ! 以防止空格调整。

:1,5j!                Join first five lines, preserving whitespace
jumps
ju

打印与 CTRL - I 和 CTRL - O 命令一起使用的跳转列表。跳转列表是大多数跳过多行的移动命令的记录。它记录每次跳转前光标的位置(Vim)。

k
[address] k char

与 mark 相同;请参阅本列表后面的 mark。

left
[address] le [count]

将指定地址的行左对齐,如果未指定地址,则将当前行左对齐。将行缩进 count 个空格(Vim)。

list
[address] l [count]

打印指定的行,使制表符显示为 ^I,行尾显示为 $。l 类似于 :set list 的临时版本。

map
map[!] [string commands]

将名为 string 的键盘宏定义为指定的命令序列。string 通常是单个字符或序列 #num,后者表示键盘上的功能键。使用 ! 为输入模式创建宏。如果没有参数,则列出当前定义的宏。

:map K dwwP            Transpose two words
:map q :w^M:n^M        Write current file; go to next
:map! + ^[bi(^[ea)     Enclose previous word in parentheses

需要注意的是,Vim 有 K 和 q 命令,示例别名会隐藏这些命令。

mark
[address] ma char

用 char(单个小写字母)标记指定的行。与 k 相同。稍后可以使用 ‘x(单引号加 x,其中 x 与 char 相同)返回到该行。Vim 还使用大写和数字字符作为标记。小写字母的工作方式与 vi 中相同。大写字母与文件名关联,可以在多个文件之间使用。然而,编号标记保存在一个特殊的 viminfo 文件中,不能使用此命令设置。

marks
marks [chars]

打印由 chars 指定的标记列表,如果未指定 chars,则打印所有当前标记(Vim)。

:marks abc     Print marks a, b, and c
mkexrc
mk[!] file

创建一个 .exrc 文件,其中包含已更改的 ex 选项和键映射的 set 命令。这将保存当前的选项设置,允许你稍后恢复它们(Vim)。

move
[address] m destination

将指定地址的行移动到目标地址。

:.,/Note/m /END/    Move text block to after line containing “END”
new
[count] new

创建一个高度为 count 行的新窗口,其中包含一个空缓冲区(Vim)。

next
n[!] [[+num] filelist]

编辑命令行参数列表中的下一个文件。使用 args 列出这些文件。如果提供了 filelist,则用 filelist 替换当前参数列表并开始编辑第一个文件。使用 +num 参数,从第 num 行开始编辑。或者,num 可以是一个模式,形式为 /pattern。

:n chap*            Start editing all “chapter” files
nohlsearch
noh

暂时停止使用 hlsearch 选项时对所有搜索匹配项的高亮显示。下一次搜索时将恢复高亮显示(Vim)。

number
[address] nu [count]

打印指定地址的每行,并在前面加上其缓冲区行号。使用 # 作为 number 的替代缩写。count 指定从地址开始要显示的行数。

only
on [!]

使当前窗口成为屏幕上唯一的窗口。打开有修改缓冲区的窗口不会从屏幕上移除(隐藏),除非你也使用 ! 字符(Vim)。

open
[address] o [/pattern/]

在指定地址的行进入开放模式(vi),或者在匹配模式的行进入。使用 Q 退出开放模式。开放模式允许你使用常规的 vi 命令,但一次只能处理一行。它在慢速拨号线路(或非常远的 Internet ssh 连接)上可能很有用。

preserve
pre

保存当前编辑器缓冲区,就好像系统即将崩溃一样。

previous
prev[!]

编辑命令行参数列表中的上一个文件(Vim)。

print
[address] p [count]

打印指定地址的行。count 指定从地址开始要打印的行数。P 是另一个缩写。

:100;+5p                Show line 100 and the next 5 lines
put
[address] pu [char]

将由 char 指定的命名寄存器中先前删除或复制的行放置到指定地址的行。如果未指定 char,则恢复最后一次删除或复制的文本。

qall
qa[!]

关闭所有窗口并终止当前编辑会话。使用 ! 以丢弃自上次保存以来所做的更改(Vim)。

quit
q[!]

终止当前编辑会话。使用 ! 以丢弃自上次保存以来所做的更改。如果编辑会话包括参数列表中从未访问过的其他文件,则可以通过键入 q! 或键入 q 两次来退出。Vim 仅在屏幕上还有其他打开的窗口时才关闭编辑窗口。

read
[address] r filename

将 filename 的文本复制到指定地址的行之后。如果未指定 filename,则使用当前文件名。

:0r $HOME/data        Read file in at top of current file
[address] r !command

将 shell 命令的输出读取到指定地址的行之后。

:$r !spell %        Place results of spellchecking at end of file
recover
rec [file]

从系统保存区域恢复文件。

redo
red

恢复最后一次撤销的更改。与 CTRL - R 相同(Vim)。

resize
res [[±]num]

将当前窗口调整为 num 行高。如果指定了 + 或 -,则将当前窗口高度增加或减少 num 行(Vim)。

rewind
rew[!]

倒回参数列表并开始编辑列表中的第一个文件。添加 ! 以即使当前文件自上次更改后尚未保存也倒回。

right
[address] ri [width]

将指定地址的行右对齐,如果未指定地址,则将当前行右对齐到列 width。如果未指定 width,则使用 textwidth 选项(Vim)。

sbnext
[count] sbn [count]

分割当前窗口并开始编辑缓冲区列表中的第 count 个下一个缓冲区。如果未指定 count,则编辑缓冲区列表中的下一个缓冲区(Vim)。

sbuffer
[num] sb [num]

分割当前窗口并在新窗口中开始编辑缓冲区列表中的缓冲区 num。要编辑的缓冲区也可以通过文件名指定。如果未指定缓冲区,则在新窗口中打开当前缓冲区(Vim)。

set
se parameter1 parameter2 ...

为每个参数设置一个选项的值,或者如果没有提供参数,则打印所有已从默认值更改的选项。对于布尔选项,每个参数可以表述为 option 或 nooption;其他选项可以使用 option = value 的语法进行赋值。指定 all 以列出当前设置。set option? 形式显示 option 的值。请参阅附录 B 中列出的 set 选项表。

:set nows wm=10
:set all
shell
sh

创建一个新的 shell。当 shell 终止时恢复编辑。

snext
[count] sn [[+num] filelist]

分割当前窗口并开始编辑命令行参数列表中的下一个文件。如果提供了 count,则编辑第 count 个下一个文件。如果提供了 filelist,则用 filelist 替换当前参数列表并开始编辑第一个文件。使用 +n 参数,从第 num 行开始编辑。或者,num 可以是一个模式,形式为 /pattern(Vim)。

source
so file

从文件中读取(源)并执行 ex 命令。

:so $HOME/.exrc
split
[count] sp [+num] [filename]

分割当前窗口并在新窗口中加载 filename,如果未指定文件,则在两个窗口中加载相同的缓冲区。使新窗口高度为 count 行,如果未指定 count,则将窗口平均分割。使用 +n 参数,从第 num 行开始编辑。num 也可以是一个模式,形式为 /pattern(Vim)。

sprevious
[count] spr [+num]

分割当前窗口并在新窗口中开始编辑命令行参数列表中的上一个文件。如果指定了 count,则编辑第 count 个上一个文件。使用 +num 参数,从第 num 行开始编辑。num 也可以是一个模式,形式为 /pattern(Vim)。

stop
st

暂停编辑会话。与 CTRL - Z 相同。使用 shell fg 命令恢复会话。

substitute
[address] s [/pattern/replacement/] [options] [count]

将指定行上每个模式的第一个实例替换为替换项。如果省略模式和替换项,则重复上一次替换。count 指定从地址开始要进行替换的行数。(在 Solaris vi 中,完整拼写出命令名称不起作用。)

选项
- c :在每次更改前提示确认。
- g :在每行上替换所有模式实例(全局)。
- p :打印最后一次进行替换的行。

:1,10s/yes/no/g              Substitute on first 10 lines
:%s/[Hh]ello/Hi/gc           Confirm global substitutions
:s/Fortran/\U&/ 3            Uppercase “Fortran” on next three lines
:g/^[0-9][0-9]*/s//Line &:/  For every line beginning with one or more digits, add “Line” and a colon
suspend
su

暂停编辑会话。与 CTRL - Z 相同。使用 shell fg 命令恢复会话。

sview
[count] sv [+num] [filename]

与 split 命令相同,但为新缓冲区设置只读选项(Vim)。

t
[address] t destination

将 address 中包含的行复制到指定的目标地址。t 等同于 copy。

:%t$               Copy the file and add it to the end
tag
[address] ta tag

在标签文件中定位与 tag 匹配的文件和行,并从那里开始编辑。

Run ctags, then switch to the file containing myfunction:
:!ctags *.c
:tag myfunction
tags
tags

打印标签堆栈中的标签列表(Vim)。

unabbreviate
una word

从缩写列表中移除 word。

undo
u

反转上一次编辑命令所做的更改。在 vi 中,撤销命令会撤销自身,重新执行你撤销的操作。Vim 支持多级撤销。在 Vim 中使用 redo 来重做已撤销的更改。

unhide
[count] unh

分割屏幕,为缓冲区列表中的每个活动缓冲区显示一个窗口。如果指定了 count,则将窗口数量限制为 count(Vim)。

unmap
unm[!] string

从键盘宏列表中移除 string。使用 ! 移除输入模式的宏。

v
[address] v/pattern/[command]

对不包含模式的所有行执行命令。如果未指定命令,则打印所有此类行。v 等同于 g!。请参阅本列表前面的 global。

:v/#include/d        Delete all lines except “#include” lines
version
ve

打印编辑器的当前版本号和最后更改日期。

view
vie[[+num] filename]

与 edit 相同,但将文件设置为只读。在 ex 模式下执行时,返回正常或可视模式(Vim)。

visual
[address] vi [type] [count]

在指定地址的行进入可视模式(vi)。使用 Q 返回 ex 模式。type 可以是 -、^ 或 .(请参阅本部分后面的 z 命令)。count 指定初始窗口大小。

vi [+num] file

在可视模式(vi)下开始编辑文件,可选地从第 num 行开始。或者,num 可以是一个模式,形式为 /pattern(Vim)。

vsplit
[count] vs [+num] [filename]

与 split 命令相同,但垂直分割屏幕。count 参数可用于指定新窗口的宽度(Vim)。

wall
wa[!]

将所有更改的带文件名的缓冲区写入文件。添加 ! 以强制写入任何标记为只读的缓冲区(Vim)。

wnext
[count] wn[!] [[+num] filename]

写入当前缓冲区并打开参数列表中的下一个文件,或者如果指定了 count,则打开第 count 个下一个文件。如果指定了 filename,则接下来编辑它。使用 +num 参数,从第 num 行开始编辑。num 也可以是一个模式,形式为 /pattern(Vim)。

wq
wq[!]

一次性写入并退出文件。文件总是被写入。! 标志强制编辑器覆盖文件的任何当前内容。

wqall
wqa[!]

写入所有更改的缓冲区并退出编辑器。添加 ! 以强制写入任何标记为只读的缓冲区。xall 是此命令的另一个别名(Vim)。

write
[address] w[!] [[>>] file]

将指定地址的行写入文件,如果未指定地址,则写入缓冲区的全部内容。如果也省略了文件,则将缓冲区的内容保存到当前文件名。如果使用 >> file,则将行追加到指定文件的末尾。添加 ! 以强制编辑器覆盖文件的任何当前内容。

:1,10w name_list              Copy first 10 lines to file name_list
:50w >> name_list             Now append line 50
[address] w !command

将指定地址的行写入命令。

:1,66w !pr -h myfile | lp        Print first page of file
X
X

提示输入加密密钥。这可能比 :set key 更可取,因为键入密钥时不会在控制台回显。要移除加密密钥,只需将 key 选项重置为空值(Vim)。

xit
x

如果文件自上次写入后有更改,则保存文件,然后退出。

yank
[address] y [char] [count]

将指定地址的行放置到名为 char 的寄存器中。寄存器名称是小写字母 a - z。大写名称将文本追加到相应的寄存器。如果未指定 char,则将行放置到通用寄存器中。count 指定从地址开始要复制的行数。

:101,200 ya a        Copy lines 100–200 to register “a”
z
[address] z [type] [count]

打印以指定地址的行为顶部的文本窗口。count 指定要显示的行数。

类型
- + :将指定行置于窗口顶部(默认)。
- - :将指定行置于窗口底部。
- . :将指定行置于窗口中心。
- ^ :打印上一个窗口。
- = :将指定行置于窗口中心,并将当前行留在该行。

&
[address] & [options] [count]

重复上一次替换(s)命令。count 指定从地址开始要进行替换的行数。选项与 substitute 命令相同。

:s/Overdue/Paid/        Substitute once on current line
:g/Status/&             Redo substitution on all “Status” lines
@
[address] @ [char]

执行由 char 指定的寄存器中的内容。如果给出了地址,则先将光标移动到指定地址。如果 char 是 @,则重复最后一个 @ 命令。

=
[address] =

打印由地址指示的行的行号。默认是最后一行的行号。

!
[address] !command

在 shell 中执行 Unix 命令。如果指定了地址,则将地址中包含的行用作命令的标准输入,并将这些行替换为输出和错误输出。(这称为通过命令过滤文本。)

:!ls                List files in the current directory
:11,20!sort -f      Sort lines 11–20 of current file
< >
[address] < [count]
  or
[address] > [count]

将指定地址的行向左(<)或向右(>)移动。移动行时,仅添加或删除前导空格和制表符。count 指定从地址开始要移动的行数。shiftwidth 选项控制移动的列数。重复 < 或 > 会增加移动量。例如,:>>> 的移动量是 :> 的三倍。

~
[address] ~ [count]

将最后使用的正则表达式(即使来自搜索,而不是来自 s 命令)替换为最近一次 s(替换)命令中的替换模式。这相当晦涩;有关详细信息,请参阅第 6 章。

address
address

打印指定地址的行。

ENTER

在 ex 中(不是从 vi 中的 : 提示符),按 ENTER 键打印文件中的下一行。

通过掌握这些丰富的编辑命令,你可以在文本编辑的过程中更加得心应手,提高工作和学习效率。希望以上内容对你有所帮助,在实际操作中不断练习,你将逐渐成为文本编辑的高手。

文本编辑命令全解析(续)

命令使用示例与流程

为了更好地理解和运用上述编辑命令,下面给出一些具体的使用示例和操作流程。

文本替换流程

当需要对文本进行替换操作时,可按照以下步骤进行:
1. 确定替换范围 :明确要替换的文本所在的行范围,例如要替换第 10 行到第 20 行的内容,可使用地址 10,20
2. 指定替换模式和替换内容 :使用 s 命令,如 :10,20s/old/new/g ,其中 old 是要被替换的模式, new 是替换后的内容, g 表示全局替换,即替换每行中所有匹配的模式。
3. 确认替换 :如果需要在每次替换前进行确认,可添加 c 选项,如 :10,20s/old/new/gc ,此时系统会在每次替换前提示你是否进行替换。

文件保存与退出流程

保存和退出文件是常见的操作,以下是具体流程:
1. 保存文件
- 若要保存当前文件,可使用 :w 命令。
- 若要保存为新文件,可使用 :w new_file_name 命令。
- 若要将指定行范围保存到新文件,可使用 :n,m w new_file_name 命令,其中 n m 是行号。
2. 退出编辑器
- 若文件有更改且需要保存后退出,可使用 :wq 命令。
- 若文件无更改或想直接退出,可使用 :q 命令。
- 若想不保存更改直接退出,可使用 :q! 命令。

命令之间的关联与组合

在实际编辑过程中,常常需要将多个命令组合使用,以实现更复杂的操作。以下是一些常见的命令组合示例:

复制并移动文本

若要将第 10 行到第 20 行的文本复制到第 30 行之后,可按以下步骤操作:
1. 复制文本 :使用 :10,20y a 命令将第 10 行到第 20 行的文本复制到寄存器 a 中。
2. 移动光标 :使用 :30 命令将光标移动到第 30 行。
3. 粘贴文本 :使用 :pu a 命令将寄存器 a 中的文本粘贴到第 30 行之后。

查找并替换特定文本

若要在整个文件中查找所有包含 “error” 的行,并将其中的 “old_error” 替换为 “new_error”,可使用以下命令组合:

:g/error/s/old_error/new_error/g

此命令先使用 g 命令查找所有包含 “error” 的行,然后在这些行中使用 s 命令将 “old_error” 替换为 “new_error”。

编辑命令的效率提升技巧

为了提高编辑效率,可采用以下技巧:

使用标记和跳转

标记可以帮助你快速定位到之前标记的位置。例如,在编辑大型文件时,可使用 m x 命令在重要位置标记 x ,之后可使用 `x 命令快速跳转到该位置。

利用宏录制

宏录制可以将一系列操作记录下来,之后可重复执行这些操作。例如,若需要对多行文本进行相同的格式调整,可使用 q x 命令开始录制宏到寄存器 x 中,完成操作后使用 q 命令停止录制,之后可使用 @ x 命令重复执行该宏。

编辑命令的注意事项

在使用编辑命令时,需要注意以下几点:

命令的大小写敏感

部分命令对大小写敏感,例如 G 表示移动到文件末尾,而 gg 表示移动到文件开头。因此,在使用命令时要注意大小写的正确使用。

寄存器的使用

寄存器在复制、移动和粘贴操作中起着重要作用。要注意寄存器名称的大小写,小写字母表示覆盖寄存器内容,大写字母表示追加到寄存器内容。

编辑命令的总结

以下是对上述编辑命令的总结表格:
| 类别 | 常用命令 | 功能概述 |
| — | — | — |
| 搜索 | N, /,?, , #, g , g# 等 | 实现不同方向和方式的搜索 |
| 插入 | a, A, i, I, o, O 等 | 在不同位置插入文本 |
| 编辑 | cw, cc, dd, dw 等 | 更改、删除和复制文本 |
| 保存和退出 | :w, :wq, :q, :q! 等 | 保存文件和退出编辑器 |
| 多文件操作 | :e, :n, :prev 等 | 编辑多个文件 |
| 窗口操作 | :new, :sp, :vsp 等 | 管理编辑窗口 |
| 宏命令 | :ab, :map, q x, @ x 等 | 定义缩写和录制执行宏 |

编辑命令的流程图
graph TD;
    A[开始编辑] --> B[搜索文本];
    B --> C{是否找到};
    C -- 是 --> D[进行编辑操作];
    C -- 否 --> B;
    D --> E{是否需要保存};
    E -- 是 --> F[保存文件];
    E -- 否 --> G{是否继续编辑};
    G -- 是 --> B;
    G -- 否 --> H[退出编辑器];
    F --> G;

通过掌握这些丰富的编辑命令和操作技巧,你可以在文本编辑过程中更加高效、灵活地完成各种任务。不断练习和实践这些命令,你将逐渐成为文本编辑的专家。希望以上内容对你有所帮助,祝你在编辑工作中取得更好的成果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值