关于vim:vim之强大的global

2次阅读

共计 5055 个字符,预计需要花费 13 分钟才能阅读完成。

vim global

:global 命令是 Vim 中一个更弱小的命令 (之一)。它容许你找到一个匹配点并且在那里执行一个命令。它的个别模式是:

:[range]g/{pattern}/{command}

在每一匹配行上执行命令 command. 这个命令只能是冒号命令,一般模式命令不能在这里应用。如果须要,能够应用 :normal 命令。

如果要查看能够应用的命令,能够help ex-cmd-index。如果要查看具体解释,查看help 10.4help multi-repeat

vglobal相当于global!, 两者能够组合应用,如:g/found/v/notfound/{cmd}

利用 global 咱们能够把咱们之前学的很多货色都串连起来,以齐全一些十分微妙的动作。

所以上面咱们通过示例来学习 global 的用法。

示例

示例一

用法:显示匹配行高低共 3 行,第二写法能更清晰的看到高低 3 行

:g/patttern/z#.3
:g/pattern/z#.3|echo "========"

对于 z 的用法,能够输出help :z, 如下所示

:{range}z[+-^.=]{count}

显示突围 {range} 指定行的若干行文本,如果没有 {range},显示以后行高低的文本。如果有 {count},它指定 你能看到的行数。否则,如果只有一个窗口,应用 ‘scroll’ 选项值的两倍。再不然,应用以后的窗口大小减 3。

如果提供了 {count},’window’ 选项会被设为该值。

:z 能够独自应用,也能够后跟数个标点符号中的一个。他们有如下的成果:

标记 首行 末行 新光标行
+ 以后行 向前 1 屏 向前 1 屏
向后 1 屏 以后行 以后行
^ 向后 2 屏 向后 1 屏 向后 1 屏
. 向后 1/2 屏 向前 1/2 屏 向前 1/2 屏
= 向后 1/2 屏 向前 1/2 屏 以后行

不指定任何标记相当于指定 “+”。如果标记是 “=”,以后行会 被连字符组成的两行突围。

:{range}z#[+-^.=]{count}
和 “:z” 相似,但显示行号。

示例二

用法:删除所有匹配行 或 所有不匹配行

:g/pattern/d
:g!/pattern/d
:v/pattern/d

g!v 是等价的。

这个例子的一个用法就是删除所有空行

:g/^\s*$/d

示例三

用法: 在所有行之间加上空行

:g/^/pu \"\n\"

对于 pu 的用法,能够输出:help :put

:[line]pu[t] [x]
搁置文本 [从寄存器 x] 在行号 [line] (缺省为以后行) 之后。它总是 |linewise| 口头作,因此这个命令能够用来把抽出的块搁置在新行上。寄存器也能够是 ‘=’,追随一个可选的表达式。表达式持续到该命令完结为止。你须要在 ‘|’ 和 ‘”‘ 字符前加上反斜杠不让它们终止你的命令行。例如: :put =’path’ . \”,/test\” ; 如果 ‘=’ 之后没有表达式,Vim 应用前一个表达式。用 “:dis =” 你能够看到它。|

示例四

用法: 将所有匹配行附加到文件尾

:g/pattern/t$

对于 t 的用法,能够输出help :t。它的用法同copy

command usage
:[line]pu[t]! [x] 搁置文本 [从寄存器 x] 在行号 [line] (缺省为以后行) 之前。
:[range]co {address} 把 [range] 指定的行复制到 {address} 给出的行之下。
:[range]m[ove] {address} 把 [range] 指定的行挪动到 {address} 给出的行之下。

示例五

用法: 将所有匹配行挪动到文件尾

:g/pattern/m$

示例六

用法: 复制所有匹配行到寄存器 ’a’

qaq:g/pattern/y A

这里的命令分成两局部:

qaq : 清空寄存器 ’a’ 的内容
:g/pattern/y A : y A 是一个 Ex 命令,能够通过 help :yank 来理解具体作用,它把所有的匹配行复制(附加)到寄存器 ’a’ 中。

:[range]y[ank] [x]
抽出 [range] 所指定的行 [到寄存器 x]。仅当蕴含 |+clipboard| 个性时才能够抽出到 “* 或 “+ 寄存器。

:[range]y[ank] [x] {count}
从 [range] 的最初一行开始 (缺省: 以后行 |cmdline-ranges|) 抽出 {count} 行 [到寄存器 x]。

示例七

用法: 从本行到行尾将行首的数字都加 1

:.,$g/^\d\+/exe "normal!\<C-A>"

.,$:从本行到行尾
^\d\+ : 行首是数字
exe "normal! \<C-A> : 执行 normal 命令,相当于在匹配项上按键 <C-A>, <C-A> 能够将以后数字加 1

对于特殊字符,能够输出 help expr-quote 来查看
s
“string” 字符串常数 expr-quote

留神 应用的是双引号。

字符串常数承受以下特殊字符:

字符 含意
\... 三位八进制数 (例如,”\316″)
\.. 两位八进制数 (必须后跟非数字)
\. 一位八进制数 (必须后跟非数字)
\x.. 两位十六进制数指定的字节 (例如,”\x1f”)
\x. 一位十六进制数指定的字节 (必须后跟非十六进制数字)
\X.. 等同于 \x..
\X. 等同于 \x.
\u.... 四位十六进制指定的字符。依据 ‘encoding’ 的以后值决定的编码进行存贮 (例如,”\u02a4″)
\U.... 等同于 \u 但承受多达 8 位十六进制数。
\b 退格 <BS>
\e escape <Esc>
\f 换页 <FF>
\n 换行 <NL>
\r 回车 <CR>
\t 制表 <Tab>
\\ 反斜杠
\" 双引号
\<xxx> “xxx” 命名的特殊字符,例如 “\<C-W>” 代表 CTRL-W。用于映射,0x80 字节被本义。

双引号必须本义: "<M-\">"
不要用 <Char-xxxx> 来失去 utf-8 字符,用下面提到的 \uxxxxx
留神 “\xff” 保留为字节 255,在某些编码中它是不非法的。应用 “\u00ff” 能够依照 ‘encoding’ 的以后值保留字符 255。
留神 “\000” 和 “\x00” 强制字符串完结。

对于递增和递加,能够用 help CTRL-A 来查看

递 增 与 递 减 ~
CTRL-A
把以后光标之上或之后的数值或者字母加上 [count]。

{Visual}CTRL-A
给高亮文本内的数值或者字母加上 [count]。

{Visual}g CTRL-A
给高亮文本内的数值或者字母加上 [count]。如果高亮超过一 行,每行会加上额定的 [count] (即生成 [count] 为增量的 递增数列)。

例如,假设有如下数字的列表:

1. 
1. 
1. 
1. 

挪动至第二个 “1.”,可视地抉择后三行,按 g CTRL-A 会生
生成:

1. 
2. 
3. 
4. 

CTRL-X
把以后光标之上或之后的数值或者字母减去 [count]。

{Visual}CTRL-X
给高亮文本内的数值或者字母减去 [count]。

MS-Windows 上,此键被映射到剪切可视文本 |dos-standard-mappings|。要屏蔽该映射,可用: silent! vunmap <C-X>

{Visual}g CTRL-X
给高亮文本内的数值或者字母减去 [count]。如果高亮超过一 行,每行会减去额定的 [count] (即生成 [count] 为增量的 递加数列)。

CTRL-A 和 CTRL-X 命令可用于:

  • 带符号或无符号十进制数
  • 无符号二进制、八进制和十六进制数
  • 字母

示例八

用处: 在所有蕴含 DEBUG 的行用 // 变成正文

" using :normal
g/^\s*DEBUG/exe "norm! I/* \<Esc>A */\<Esc>"
" using :substituting
g/^\s*DEBUG/s!.*!/* & */!

这里 & 用来示意后面的整个匹配项

示例九

用处: 显示匹配行的上一行

:g/pattern/?^\w?p                   "if only name is interesting
:g/pattern/ka|?^\w?p|'ap"if name and the lookup-line is interesting
:g/pattern/?^\w?|+,/^[^]/-1p       "if entire record is interesting

对于 ?^\w?, 两个? 之间的就是要匹配的模式,^\w示意结尾不为空的行,p示意 put` 在后面曾经讲过
? 能够查看help cmdline-range.

符号 行号
{number} 行号
. 以后行
$ 文件的最初一行
% 相当于 1,$ (整个文件)
‘t 标记 t 的地位 (小写)
‘T 标记 T 的地位 (大写);如果标记存在于另一个文件中,则不能在范畴里利用。
/{pattern}[/] 下一个 匹配 {pattern} 的行
?{pattern}[?] 前一个 匹配 {pattern} 的行
/ 下一个 与前次搜寻模式匹配的行
? 前一个 与前次搜寻模式匹配的行
\& 下一个 与前次代替模式匹配的行

对于ka,能够查看help :k

:[range]ma[rk] {a-zA-Z'}
把地位标记 {a-zA-Z’} 设在 [range] 的最初一行,第 0 列。缺省的 [range] 是以后行。

:[range]k{a-zA-Z'}
和 :mark 雷同,然而标记名之前的空格能够省略。

示例十

用处: 反转文件行

:g/^/m0

后面曾经讲过 m 示意move

示例十一

用处: 在以某关键字开关的行尾加上某字符

:g/^pattern/s/$/mytext

示例十二

用处: 删除匹配行

:g/pattern/d _

默认状况下,所有删除行会被复制到 unnamed register,当文件很多时,性能会被影响到,所以这里把内容复制到黑洞 register,相当于NOP, 这样能够进步性能

一些常见命令:

:2,8co15  "copy lines 2 through 8 after line 15
:4,15t$   "copy lines 4 through 15 to end of document (t == co)
:-t$      "copy previous line to end of document
:m0       "move current line to line 0 (i.e. the top of the document)
:.,+3m$-1 "current line through current+3 are moved to the lastLine-1 (i.e. next to last)

示例十三

用处: 在一段范畴里替换字符

:'a,'bg/pattern/s/pattern2/string/gi

示例十四

用处: 在匹配行,执行寄存器 q 里的动作

:g/pattern/normal @q

示例十五

用处: 删除间断的反复行

:g/^\(.*\)\(\r\?\n\1\)\+$/d
:%!uniq

\r\?\n能够用于匹配换行, \r是可选的
g用来搜寻多行匹配时,它只将 command 作用于匹配的第一行,而不是整个的匹配

示例十六

用处: 合并多个连贯的空行为一行

:v/./,/./-j
  • jjoin 的综合,它会把多行连接成一行。
  • ,/./-是一个范畴,残缺模式是.,/./-1, 示意以后行到非空行的上一行

J
连贯 [count] 行,但至多蕴含两行。删除缩进,插入不多于两个的空格 (见下)。在缓冲区末行此操作会失败。[count] 如果过多,会自行缩减至余下可用的行。

{Visual}J
连贯高亮行,但至多蕴含两行。删除缩进,插入不多于两个的空格 (见下)。

gJ
连贯 [count] 行,但至多蕴含两行。不插入或删除任何空格。

{Visual}gJ
连贯高亮行,但至多蕴含两行。不插入或删除任何空格。

[range]j[oin][!] [flags]
连贯 [range] 范畴的行。和 “J” 雷同,但如有 [!] 时,连贯不插入或删除任何空格。如果 [range] 包含雷同的开始和完结行,该命令不做任何事。缺省行为是连贯以后行与下一行。[flags] 局部可参见 |ex-flags|。

:[range]j[oin][!] {count} [flags]
连贯 [range] 开始的 {count} 行 (缺省: 以后行 |cmdline-ranges|)。和 “J” 雷同,但如有 [!] 时,连贯不插入或删除任何空格。[flags] 局部可参见 |ex-flags|。

示例十七

用处: 对关键字突围的端口申明按字母排序

:g/\/\/define begin/+1,/\/\/define end/-1 sort:g/{/ .+1,/}/-1 sort

示例十八

用处: 在以 ”module” 结尾的行上面都减少分隔线

:g/^module/t.|s/./\//g

示例十九

用处: 将某字符行下的第二行打印到某个已存在文件

:g/^Chapter/+2w >> context

援用:
https://vim.fandom.com/wiki/P…
https://wsdjeg.spacevim.org/v…

正文完
 0