Usr_25
Nvim :help
页面,从 源代码 使用 tree-sitter-vimdoc 解析器生成的。
VIM 用户手册 - 作者 Bram Moolenaar
编辑格式化文本
文本很少以每行一个句子的形式出现。本章将介绍如何拆分句子以使其适合页面和其他格式化。Vim 还提供了一些有用的功能来编辑单行段落和表格。
拆分行
Vim 提供了许多功能,使处理文本变得更加轻松。默认情况下,编辑器不会执行自动换行。换句话说,您必须自己按
<Enter>
。当您编写需要自己决定行尾位置的程序时,这很有用。但对于创建文档并希望文本最宽为 70 个字符时,这就不太合适了。如果设置
'textwidth' 选项,Vim 会自动插入换行符。例如,假设您想要一个非常窄的 30 个字符的列。您需要执行以下命令
:set textwidth=30
现在您开始输入(添加标尺)
1 2 3
12345678901234567890123456789012345
我教了编程一
如果您接下来输入“l”,这会使该行超过 30 个字符限制。当 Vim 看到这一点时,它会插入一个换行符,您将得到以下内容
1 2 3
12345678901234567890123456789012345
我教了编程一
会
继续下去,您可以输入段落的其余部分
1 2 3
12345678901234567890123456789012345
我教了编程一
会。有一次,我被
沃斯堡警察拦住,
因为我的作业太
难了。真实故事。
您不必输入换行符;Vim 会自动插入它们。
注意: 'wrap' 选项使 Vim 显示带有换行符的行,但这不会在文件中插入换行符。
Vim 编辑器不是文字处理程序。在文字处理程序中,如果删除段落开头的某个内容,换行符会重新排列。在 Vim 中,它们不会重新排列;因此,如果您从第一行中删除单词“编程”,您只会得到一行短的文本
1 2 3
12345678901234567890123456789012345
我教了
会。有一次,我被
沃斯堡警察拦住,
因为我的作业太
难了。真实故事。
这看起来不好。要使段落恢复正常,请使用“gq”操作符。首先,让我们在可视化选择中使用它。从第一行开始,输入
v4jgq
"v" 以启动可视模式,“4j”以移动到段落的末尾,然后是“gq”操作符。结果是
1 2 3
12345678901234567890123456789012345
我教了一会儿。一
次,我被沃斯堡
警察拦住,因为我的
作业太难了。真实
故事。
注意: 有一种方法可以对特定类型的文本布局进行自动格式化,请参阅
自动格式化。
由于“gq”是一个操作符,您可以使用三种方法之一来选择它所作用的文本:使用可视模式、使用移动命令和使用文本对象。上面的示例也可以用“gq4j”完成。这更少输入,但您必须知道行数。一个更有用的移动命令是“}”。这会移动到段落的末尾。因此“gq}”会从光标到当前段落的末尾进行格式化。与“gq”一起使用的一个非常有用的文本对象是段落。试试这个
gqap
"ap" 代表“a-paragraph”。这会格式化一个段落的文本(以空行分隔)。还有光标之前的部分。如果您的段落以空行分隔,您可以通过输入以下内容来格式化整个文件
gggqG
"gg" 以移动到第一行,“gqG”以格式化到最后一行。
警告: 如果您的段落没有正确分隔,它们将合并在一起。一个常见的错误是有一行包含空格或制表符。这算作空白行,但不算是空行。
要使一系列行居中,请使用以下命令
:{range}center [width]
{range}
是常用的命令行范围。[width] 是一个可选的行宽,用于居中。如果未指定 [width],则默认为
'textwidth' 的值。(如果
'textwidth' 为 0,则默认为 80。)例如
:1,5center 40
结果如下
我教了一会儿。一
次,我被沃斯堡
警察拦住,因为我的
作业太难了。真实
故事。
右对齐
类似地,“:right”命令会将文本右对齐
:1,5right 37
得到以下结果
我教了一会儿。一
次,我被沃斯堡
警察拦住,因为我的
作业太难了。真实
故事。
左对齐
最后,还有这个命令
:{range}left [margin]
但是,与“:center”和“:right”不同,“:left”的参数不是行的长度。而是左边的边距。如果省略它,文本将放在屏幕的左侧(使用零边距的效果相同)。如果它是 5,则文本将缩进 5 个空格。例如,使用以下命令
:1left 5
:2,5left
这会得到以下结果
我教了一会儿。一
次,我被沃斯堡
警察拦住,因为我的
作业太难了。真实
故事。
两端对齐文本
Vim 没有内置的两端对齐文本功能。但是,有一个不错的宏包可以完成这项工作。要使用这个包,请执行以下命令
:packadd justify
或者将此行添加到您的
vimrc 文件中
packadd! justify
此 Vim 脚本文件定义了一个新的可视命令“_j”。要使文本块两端对齐,请在可视模式下突出显示文本,然后执行“_j”。在文件中查找更多说明。要转到该文件,请对以下名称执行“gf”操作:$VIMRUNTIME/pack/dist/opt/justify/plugin/justify.vim。
另一种方法是通过外部程序过滤文本。示例
:%!fmt
缩进可用于使文本在其他文本中脱颖而出。例如,本手册中的示例文本缩进了 8 个空格或一个制表符。您通常通过在每行开头输入一个制表符来输入它。以这段文本为例
第一行
第二行
这是通过输入制表符、一些文本、
<Enter>
、制表符和更多文本来输入的。
'autoindent' 选项会自动插入缩进
:set autoindent
当开始新行时,它会获得与前一行相同的缩进。在上面的示例中,
<Enter>
后的制表符不再需要。
增加缩进
要增加一行中的缩进量,请使用“>”操作符。这通常用作“>>”,它会向当前行添加缩进。添加的缩进量由
'shiftwidth' 选项指定。默认值为 8。例如,要使“>>”插入 4 个空格的缩进,请键入以下内容
:set shiftwidth=4
在示例文本的第二行上使用它时,您会得到以下结果
"4>>" 会增加四行的缩进。
制表位
如果您想使缩进为 4 的倍数,请将
'shiftwidth' 设置为 4。但是,当按下
<Tab>
时,您仍然会获得 8 个空格的缩进。要更改此设置,请设置
'softtabstop' 选项
:set softtabstop=4
这将使
<Tab>
键插入 4 个空格的缩进。如果已经存在四个空格,则将使用
<Tab>
字符(在文件中节省七个字符)。(如果您始终想要空格而不是制表符,请设置
'expandtab' 选项。)
更改制表符
您正在编辑一个使用制表位 3 编写的文件。在 Vim 中,它看起来很丑,因为它使用的是正常的制表位 8。您可以通过将
'tabstop' 设置为 3 来解决此问题。但是,您必须在每次编辑此文件时执行此操作。Vim 可以更改文件中制表位的用法。首先,将
'tabstop' 设置为使缩进看起来良好,然后使用“:retab”命令
:set tabstop=3
:retab 8
“:retab”命令会将
'tabstop' 更改为 8,同时更改文本以使其看起来相同。为此,它会将空白范围更改为制表符和空格。您现在可以写入该文件。下次编辑它时,缩进将正确,无需设置任何选项。
警告: 在对程序使用“:retab”时,它可能会更改字符串常量中的空白。因此,养成使用“\t”代替实际制表符的习惯是一个好习惯。
有时您会编辑一个比窗口中的列数更宽的文件。发生这种情况时,Vim 会将行换行,以使所有内容都适合屏幕。如果将
'wrap' 选项关闭,则文件中的每行都将在屏幕上显示为一行。然后,长行的末尾将从屏幕右侧消失。当您将光标移动到无法看到的字符时,Vim 会滚动文本以显示它。这就像在水平方向上将视窗移到文本上一样。默认情况下,Vim 在 GUI 中不显示水平滚动条。如果您想启用一个滚动条,请使用以下命令
:set guioptions+=b
将在 Vim 窗口底部出现一个水平滚动条。
如果您没有滚动条或不想使用它,请使用以下命令来滚动文本。光标将保持在相同的位置,但如果需要,它会被移回可见文本中。
zh 向右滚动 4zh 向右滚动四个字符 zH 向右滚动半个窗口宽度 ze 向右滚动以将光标置于末尾 zl 向左滚动 4zl 向左滚动四个字符 zL 向左滚动半个窗口宽度 zs 向左滚动以将光标置于开头
让我们尝试用一行文本来展示这一点。光标位于“which”的“w”上。行上方的“当前窗口”表示当前可见的文本。文本下方的“窗口”表示命令左侧可见的文本。
|<-- 当前窗口 -->|
一些很长的文本,部分文本在窗口中可见
ze
|<-- 窗口 -->|
zH
|<-- 窗口 -->|
4zh
|<-- 窗口 -->|
zh
|<-- 窗口 -->|
zl
|<-- 窗口 -->|
4zl
|<-- 窗口 -->|
zL
|<-- 窗口 -->|
zs
|<-- 窗口 -->|
在关闭换行的情况下移动
当
'wrap' 关闭并且文本已在水平方向上滚动时,您可以使用以下命令将光标移动到您能看到的字符。因此,窗口左侧和右侧的文本将被忽略。这些命令永远不会导致文本滚动
g0 到该行的第一个可见字符 g^ 到该行的第一个非空白可见字符 gm 到屏幕行的中间 gM 到该行文本的中间 g$ 到该行的最后一个可见字符
|<-- 窗口 -->|
一些很长的文本,部分文本在一行中可见
g0 g^ gm gM g$
在将文本准备用于另一个程序时,您可能需要创建没有换行的段落。使用
'nowrap' 的缺点是您无法看到正在处理的整个句子。当
'wrap' 处于开启状态时,单词会被截断,这会使它们难以阅读。编辑此类段落的良好解决方案是设置
'linebreak' 选项。Vim 然后在显示行时会在适当的位置换行。文件中的文本保持不变。没有
'linebreak' 文本可能看起来像这样
+---------------------------------+
|letter generation program for a b|
|ank. They wanted to send out a s|
|pecial, personalized letter to th|
|eir richest 1000 customers. Unfo|
|rtunately for the programmer, he |
+---------------------------------+
After
:set linebreak
it looks like this
+---------------------------------+
|letter generation program for a |
|bank. They wanted to send out a |
|special, personalized letter to |
|their richest 1000 customers. |
|Unfortunately for the programmer,|
+---------------------------------+
按可见行移动
"j" 和 "k" 命令分别移动到下一行和上一行。当在长行上使用时,这意味着一次移动许多屏幕行。要只移动一行屏幕,请使用 "gj" 和 "gk" 命令。当一行没有换行时,它们与 "j" 和 "k" 执行相同的操作。当行换行时,它们移动到显示在下方或上方的一行的字符。您可能想使用这些映射,将这些移动命令绑定到光标键
:map <Up> gk
:map <Down> gj
将段落转换为一行
edit-paragraph-join
如果您想将文本导入到 MS-Word 等程序中,每个段落都应该是一行。如果您的段落当前用空行分隔,以下是将每个段落转换为一行的步骤
:g/./,/^$/join
这看起来很复杂。让我们把它分解成几部分
:g/./ 一个 ":global" 命令,用于查找包含至少一个字符的所有行。,/^$/ 一个范围,从当前行(非空行)开始,直到一个空行。join ":join" 命令将范围内的行合并为一行。
从包含八行在第 30 列换行的文本开始
+----------------------------------+
|A letter generation program |
|for a bank. They wanted to |
|send out a special, |
|personalized letter. |
| |
|To their richest 1000 |
|customers. Unfortunately for |
|the programmer, |
+----------------------------------+
您最终得到两行
+----------------------------------+
|A letter generation program for a |
|bank. They wanted to send out a s|
|pecial, personalized letter. |
|To their richest 1000 customers. |
|Unfortunately for the programmer, |
+----------------------------------+
请注意,当分隔行为空白但非空时,这不起作用;当它包含空格和/或制表符时。此命令适用于空白行
:g/\S/,/^\s*$/join
这仍然需要在文件末尾有一个空白或空行才能将最后一个段落合并。
假设您正在编辑一个包含四列的表格
nice table test 1 test 2 test 3
input A 0.534
input B 0.913
您需要在第三列中输入数字。您可以移动到第二行,使用 "A",输入大量空格,然后输入文本。对于这种类型的编辑,有一个特殊的选项
set virtualedit=all
现在您可以将光标移动到没有文本的位置。这被称为“虚拟空间”。用这种方式编辑表格容易得多。通过搜索最后一列的标题来移动光标
/test 3
现在按下 "j",您就可以在可以输入 "input A" 的值的位置。输入 "0.693" 将导致
nice table test 1 test 2 test 3
input A 0.534 0.693
input B 0.913
Vim 会自动为您填充新文本前的空白。现在,要输入此列中的下一个字段,请使用 "Bj"。"B" 移动到空格分隔单词的开头。然后 "j" 移动到可以输入下一个字段的位置。
注意:您可以将光标移动到显示器中的任何位置,包括行尾以外的位置。但是 Vim 不会在那里插入空格,直到您在该位置插入字符为止。
复制列
您想要添加一列,该列应该是第三列的副本,并放置在 "test 1" 列之前。分七步完成:1. 将光标移动到该列的左上角,例如使用 "/test 3"。2. 按 CTRL-V
以启动块状视觉模式。3. 使用 "2j" 将光标向下移动两行。您现在处于“虚拟空间”中:"test 3" 列的 "input B" 行。4. 将光标向右移动,以将整列包含在选择中,以及您想要在列之间留出的空格。"9l" 应该可以做到。5. 使用 "y" 复制选定的矩形。6. 将光标移动到 "test 1",新列必须放置的位置。7. 按 "P"。
结果应该是
nice table test 3 test 1 test 2 test 3
input A 0.693 0.534 0.693
input B 0.913
请注意,整个 "test 1" 列都被向右移动了,包括 "test 3" 列没有文本的行。
使用以下命令返回到非虚拟光标移动
:set virtualedit=
虚拟替换模式
使用
'virtualedit' 的缺点是它“感觉”不同。当您四处移动光标时,您无法识别行尾之后的制表符或空格。可以使用另一种方法:虚拟替换模式。假设您在表格中有一行包含制表符和其他字符。在第一个制表符上使用 "rx"
| rx | V
布局被破坏。要避免这种情况,请使用 "gr" 命令
| grx | V
发生的事情是 "gr" 命令确保新字符占据正确的屏幕空间。插入额外的空格或制表符以填充空白。因此实际发生的是制表符被替换为 "x",然后添加空格以使之后的文本保持其位置。在这种情况下,将插入一个制表符。当您需要替换多个字符时,您可以使用 "R" 命令进入替换模式(参见
04.9)。这会破坏布局并替换错误的字符
| R0.786 | V
"gR" 命令使用虚拟替换模式。这会保留布局
| gR0.786 | V