本篇文章介绍 vim 的一些使用技巧:
- 删除行首、行末的空白字符(空格和Tab字符)
-
删除空白行
- 删除只有一个换行符的空行
- 删除包含空白字符的空白行,但不删除只有一个换行符的空行
- 删除包含空白字符的空白行和只有一个换行符的空行
删除行首、行末的空白字符 (空格和Tab字符)
在 vim 中,可以使用 :%s/^\s\+//
命令删除行首的所有空白字符。这里说的 “空白字符” 指的是空格和Tab字符,不包括换行符。对该命令的各个参数具体说明如下:
-
:%s
:s
是替换命令,可以替换字符串,其基本格式是:s/from/to/
,把 "from" 字符串替换成 "to" 字符串,可以用正则表达式来匹配特定模式。该命令默认对光标所在行生效,而:%s
表示对整个文件都进行替换。 -
^
表示匹配行首,即从行首开始匹配。对这个例子来说,只匹配行首的空白字符,不会匹配单词中间的空白字符和行末的空白字符。 -
\s
表示匹配一个空白字符,也就是空格或Tab字符。 -
\+
表示匹配一个或连续多个跟在它前面的上一个字符,其实是正则表达式+
元字符的转义写法。例如,a\+
表示匹配 "a", "aa", "aaaaaa" 等等,\s\+
就是匹配一个或多个空白字符,至少要有一个空白字符。 -
/^\s\+//
表示要匹配的内容是行首开头的一个或多个空白字符,最后的两个//
中间内容为空,即替换后的内容为空,相当于去掉了行首的所有空白字符。
也可以使用 :%s/^\s*//
命令来删除行首的所有空白字符,*
表示匹配零个或连续多个跟在它前面的上一个字符。这个命令会匹配到行首没有空格的情况,由于替换后的内容是空,没有影响。
注意:如果写成 :%s/^\s//
的形式,只会删除行首的第一个空格,而不能删除多个空格。 写成 :%s/^\+\s//
的形式也是只能删除行首的第一个空格。
类似的,可以用 :%s/\s\+$//
命令来删除行末的所有空白字符,$
表示匹配行末。也可以写成 :%s/\s*$//
的形式。
使用 :help :s
命令查看该命令的帮助说明,部分关键内容说明如下:
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
For each line in [range] replace a match of {pattern} with {string}.
When [range] and [count] are omitted, replace in the current line only.
使用 :help \s
命令查看 \s
的含义如下:
s whitespace character: <Space> and <Tab>
使用 :help \+
命令查看 \+
的含义如下:
\+ Matches 1 or more of the preceding atom, as many as possible.
使用 :help /*
命令查看在模式匹配中 *
的含义如下:
* (use \* when 'magic' is not set)
Matches 0 or more of the preceding atom, as many as possible.
删除空白行
空白行指的是看起来没有内容的行,但实际上可能会有空格、Tab字符,或者行末的换行符。针对下面几种情况,需要用不同的命令来删除空白行:
- 删除只有一个换行符的空行
- 删除包含空白字符的空白行,但不删除只有一个换行符的空行
- 删除包含空白字符的空白行和只有一个换行符的空行
删除只有一个换行符的空行
在 vim 中,可以使用 :%g/^$/d
命令来删除只有一个换行符的空行。这里的 ^
表示匹配行首,$
表示匹配行末,在行首和行末之间没有任何字符,也就是空行。严格来说,这里说的“行末”指的是最后一个换行符前面的一个字符,不包括换行符自身。“空行” 实际上还是包含有一个换行符。
假设文件中有如下的内容:
abcd
efg
hijk
lmn
opqrst
那么执行 :%g/^$/d
命令后的内容如下:
abcd
efg
hijk
lmn
opqrst
可以看到,中间的空行都被删除了。
删除包含空白字符的空白行,但不删除只有一个换行符的空行
有一些空白行看起来没有内容,但可能会包含空格、Tab字符等空白字符,这些行用 :%g/^$/d
命令无法删除,^$
匹配不到包含空白字符的情况。
可以用 :%g/^\s\+$/d
命令来删除这些空白行,但不删除只有一个换行符的空行。
这里的 \s
表示匹配一个空白字符,\+
表示匹配一个或连续多个跟在它前面的上一个字符,\s\+
至少匹配一个空白字符,换行符不属于空白字符,所以不匹配只有一个换行符的情况。
删除包含空白字符的空白行和只有一个换行符的空行
可以使用 :%g/^\s*$/d
命令来同时删除包含空白字符的空白行和只有一个换行符的空行。
这里的 *
表示匹配零个或连续多个跟在它前面的上一个字符。对 ^\s*$
模式来说,匹配零个空白字符的情况,就相当于 ^$
模式,也就是匹配只有一个换行符的空行,所以这个命令可以删除只有一个换行符的空行。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。