:全局命令将Ex 命令的功能与Vim 模式匹配的功能结合在一起。此命令允许您在与指定模式匹配的所有行上运行Ex 命令。在有效处理重复性任务方面,全局命令是除了点范式和宏之外最强大的Vim 工具之一。
技巧98 认识global命令
:全局命令允许您对指定模式的所有匹配行运行Ex 命令。请先研究一下它的语法。
:global 命令通常采用以下形式(请参阅:h :g)
)。
:[range] global[!] /{pattern}/[cmd] 首先,默认情况下,global 命令的作用范围是整个文件(%),这与大多数其他Ex 命令类似(:delete、delete、substitute 和:normal ),这些命令的默认范围仅限于当前行(.)。
接下来,{pattern} 字段与搜索历史相关。这意味着如果您将此字段留空,Vim 将自动使用当前的搜索模式。
此外,[cmd] 可以是除:global 命令之外的任何Ex 命令。在实际应用中,表5-1 中列出的所有Ex 命令在处理文本中都发挥着重要作用。顺便说一下,如果你没有为[cmd] 指定任何内容,Vim 默认使用:print。
您还可以使用:global! 或:vglobal (v 表示反转)反转:global 命令的行为。这两个命令告诉Vim 在与指定模式不匹配的行上运行[cmd]。以下部分分别提供:global 和:vglobal 的示例应用程序。
最后,请注意,当对指定范围内的文本行执行时,global 命令通常分为两轮。在第一轮中,Vim 标记[pattern] 的所有匹配行。第二遍在所有标记的文本行上运行[cmd]。另外,由于可以独立设置[cmd]范围,因此也可以在多行文本段落内进行操作。技巧101 中解释了这种强大的技术。
技巧99 删除所有包含模式的文本行
:global 命令可与:delete 命令结合使用,以快速修剪文件的内容。与{pattern} 匹配的文本行可以保留或丢弃。
以下内容摘自Vimcasts.org 存档页面,并包含指向先前主题的链接。
全局/episode.html
ol li a href='/episodes/show-invisibles/' 显示隐藏/a /li li a href='/episodes/tabs-and-spaces/' 制表符和空格/a /li li a href='/episodes/Whitespace-preferences-and-filetypes/' Whitespace 首选项和文件类型/a /li/ol 显然,每个列表项都包含两部分数据:主题的标题及其URL。接下来,使用:global 命令检索这两个数据集中的每一个。
用 ‘:g/re/d’ 删除所有的匹配行
a 如果我只想保留标签内的标题并删除其他行怎么办?在这个例子中,每个链接组的内容占据一行,而其他行的文本标签只有两种类型:打开和关闭,因此如果您设计了与HTML 标记匹配的模式,则可以使用它并使用:global 命令来匹配该模式的所有匹配项,然后可以删除行。
您可以使用以下命令来执行此操作:
/\v\\/?\w+ :g//d 在Vimcasts.org 存档文件上运行这两个命令后,文件的内容将如下所示:
“InvisiblesTabs”和“SpacesWhitespace”的设置和文件类型与:substitute 命令类似。您还可以将:global 命令的搜索字段留空。这将导致Vim 重用最后的搜索模式(参见技巧91)。这意味着您可以从粗粒度匹配开始,然后在构建正则表达式的过程中对其进行微调,如提示85 中所示。
此示例中的正则表达式使用Very Magic 模式(如技巧74 中所述)。首先匹配左尖括号(\),然后匹配可选的斜杠(\/?),最后匹配一个或多个单词类型字符(\w+)。字尾分隔符()。该正则表达式不会匹配所有标签,但对于这个特定示例来说已经足够了。
grep 一词的由来
: 仔细考虑全局命令的缩写。
:g/re/p
re代表正则表达式,p是:print的缩写,用作默认的[cmd]。如果我们忽略符号/,我们可以看到单词“grep”已经准备好了。
用 ‘:v/re/d’ 只保留匹配行
这次我会尝试相反的方法。如前所述,vglobal 或简称:v 命令的作用与:g 命令相反。换句话说,它用于在指定模式的不匹配行上运行Ex 命令。
在此示例中,包含URL 的每一行文本都包含一个href 属性,因此您可以轻松识别它。因此,您可以通过运行以下命令来获取这些文本行:
:v/href/d 上面的命令可以解释为“删除所有不包含href的文本行”。最终结果如下。
a href='/episodes/show-invisibles/'a href='/episodes/tabs-and-spaces/'a href='/episodes/whitespace-preferences-and-filetypes/'只需一个命令即可完成整个文档被细化为我们感兴趣的文本片段。
技巧100 将TODO项收集至寄存器
通过组合:global 和:yank 这两个命令,您可以将与{pattern} 匹配的所有文本行收集到寄存器中。
以下代码包含几行以“TODO”开头的注释行。
全局/markdown.js
Markdown.dialects.Gruber={lists: function() { //TODO: 将此正则表达式缓存在特定深度function regex_for_ Depth( Depth) { /*implementation */} }, ''`: function inlineCode( text ) { var m=文本.match( /(`+)(([\s\S]*?)\1)/); if ( m m[2] ) return [ m[1].length + m[2 ].length ] ; { //TODO: 找不到匹配的退出代码- 警告! return [ 1, '`' ] } }} 假设您想将所有TODO 项收集在一起。只需输入以下命令即可一目了然地查看这些信息:
:克/待办
:g/TODO/拉克A :reg a
垂直对齐:基线;
}
结论
事实上,您可以使用:global命令对文件中所有规则的属性进行排序。假设您在此示例样式表上运行以下命令:
:g/{/.+1,/}/-1排序最终得到如下结果:
html { border: 0; font-size: 100%; margin: 0;vertical-align: benchmark;} body { background: black; } 对每个规则执行此排序命令。块中的{}。虽然这个示例样式表只包含几十行文本,但是这种方法也可以应用于内容更多的CSS文件。
该命令相当复杂,但是一旦您掌握了它的工作原理,您就会对:global 命令的强大功能印象深刻。global 命令的标准格式为:
:g/{pattern}/[cmd] 请注意,Ex 命令通常接受“范围”作为参数(如技巧28 中所述)。此规则对于:global 命令中的[cmd] 仍然有效。因此,命令模板可以扩展为以下格式:
:g/{pattern}/[range][cmd]其实可以以:g/{pattern}匹配为参考点动态设置[cmd]中的[range]。 符号通常表示光标所在的行,但在:global 命令的上下文中,它表示{pattern} 的匹配行。
为了便于说明,我们可以将原始命令拆分为两个单独的Ex 命令,并首先分析命令的后半部分。以下是有效的Ex 命令:
:+1,/}/-1 如果去掉排序范围内的偏移量,则范围可以简化为./}/。这意味着“从当前行开始,到与模式/} 匹配的行结束”。 /”。偏移值+1和-1只是用来缩小操作范围,让你可以专注于{}之间的内容。对于排序前的原始CSS文件来说,光标是如果放在行上1 或第9 行,上面的Ex 命令将按字母顺序对相应的{} 内的规则进行排序。
这意味着您只需将光标放在每个{} 块的开头并运行:/}/sort 命令即可按字母顺序对规则进行排序。明白吗?接下来,尝试使用{pattern} 和:global 命令运行搜索。
//上面的命令将光标定位在目标所在的{}块的开头。现在使用Ex 命令[cmd] 重新组合:global。
:g/{/.+1,/}/—1 在模式{ 与每个{} 块的起始行匹配的位置进行排序。对于每个匹配的行,会在从匹配行到{} 块末尾的[range] 内执行:sort。最后,每个规则的CSS 属性按字母顺序排序。
技巧101 将CSS文件中所有规则的属性按照字母排序
:global命令的大致格式为:
:g/{start}/.{finish} [cmd] 可以解释为“对以{start} 开头并以{finish} 结尾的所有文本行运行指定的[cmd]。”
可以使用相同的范例将:global 命令与任何Ex 命令组合起来。例如,如果要缩进指定范围内的特定文本,可以使用Ex 命令:(请参阅:h)。
:g/{/.+1,/}/—1 《6行1次3行1次
{注意:}
与:sort 不同,Vim 每次调用: 命令时都会打印一条消息。您可以通过在[cmd] 前添加:slient 来阻止以下消息(请参阅:h :sil)。
:g/{/sil.+1,/}/1
当:g/{pattern} 匹配多行文本时,此方法特别有用。
本文摘自《Vim实用技巧》(第2 版)。
Vim 是一款功能丰富、功能强大的文本编辑器,尤其丰富了代码补全、编译、错误跳转等有用的编程功能,在程序员中使用非常广泛。 Vim 极大地提高了程序员的效率。对于Vim 大师来说,Vim 可以让你以你的思维速度编辑文本。同时,Vim 很难学习和使用。
本书是为那些想要提高自己的程序员而写的。阅读本书是获得良好Vim 技能的唯一途径。全书共21章,包含123个技巧。每一章都是相关主题的提示集合。每种技术都有针对性地解决一种或某种类型的问题,并帮助读者提高Vim 使用技能。本书实例丰富,讲解清晰,并使用简单的符号技巧来表达交互式编辑效果,帮助读者快速学习Vim。
本书适合想要学习和掌握Vim工具的读者,也可供有使用Vim解决具体问题经验的程序员参考。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。