1. 程式人生 > >Vim global命令和重復操作

Vim global命令和重復操作

range hold tab filetype 搜索 標簽 分享 lock code

Vim global命令和重復操作

技術分享圖片 vim.ink 不是女神的女漢子

Vim global命令允許我們在某個指定模式的所有匹配行上運行可執行的 Ex 命令,縮寫形式為 :g,其處理重復工作的效率極高。

一、Vim global命令介紹

Vim global命令形式為 :[range]g[lobal][!]/{pattern}/[cmd],用於指示Vim在 [range] 界定範圍內對 (不) 匹配模式 {pattern} 的文本行執行 Ex 命令 [cmd]。

range 表示操作範圍,Vim :global 命令的默認作用範圍是整個文件 (用%表示)

! 表示反轉 :global 命令的行為,將在沒有匹配到指定模式的行上執行 [cmd]

pattern 指定 :global 命令要匹配的目標模式,若將該域留空,Vim會自動使用當前(最近一次)的查找模式

cmd:global 命令之外的任何 Ex 命令,Vim缺省使用 :print 命令 (縮寫 :p)

二、Vim global命令使用技巧

2.1 刪除所有包含模式的文本行

假設有以下一段html代碼,每列表項均由主題的標題及其URL兩部分數據構成,我們將利用一條 :global 命令分別取出這兩組數據。

<ol>                                                                     
    <li>
        <a href="/episodes/show-invisibles/" >
            Show invisibles
        </a>
    </li>
    <li>
        <a href="/episodes/tabs-and-spaces/" >
            Tabs and Spaces
        </a>
    </li> 
    <li>
        <a href="/episodes/whitespace-preferences-and-filetypes/" >
            Whitespace preferences and filetypes
        </a>
    </li>
</ol>
如果想保留 <a> 標簽內的標題內容而把其他行刪掉,該怎麽做?

首先,使用vim的搜索命令 /\v\<\/?\w+> 先匹配左尖括號 (\<),再匹配可選的正斜杠 (\/?),再匹配一個或多個單詞型字符(\w+),最後匹配分隔符 (>),從而匹配到所有html標簽。\v 表示使用正則表達式的 very magic 模式。

然後,在Vim命令行模式下使用global命令 :g//d 刪除所有包含html標簽的行。由於 :g//d 命令沒有指定命令要匹配的目標模式,因此將默認使用上一次用到的搜索目標 /\v\<\/?\w+>

最後,為了刪除剩余行所有行首的多余空格,可以使用Vim替換命令 :%s/^ *//

上述的Vim教程視頻如下圖所示。

技術分享圖片

如果想只包含 URL 的文本行,該如何操作?

在vim命令行模式下使用Vim命令 :v/href/d 可實現只保存包含 URL的所有文本行。

如前面所介紹,:vglobal 或簡寫的 :v命令用於執行與 :g 命令完全相反的操作,:v/href/d 表示在指定模式 href 的非匹配行上執行 d操作。

同樣地,為了刪除行首的多余空格,可以用vim替換命令 :%s/^ *// 實現。對應vim視頻教程如下圖所示。

技術分享圖片

彩蛋:如果想刪除vim當前打開文件中的所有空白行,可使用vim命令 :g/^\s*$/d 實現。

PS: 文章首發於我的個人博客:Vim global命令和重復操作-Vim入門教程(31),主要內容參考自《Vim實用教程》第二版。

Vim global命令和重復操作