天天看點

vim 全局指令 g(global)指令格式介紹參考示例

文章目錄

  • 指令格式介紹
  • 參考示例
    • 範圍比對
    • 删除比對的行
    • 删除不比對的行
    • 删除大量比對行
    • 移動比對的行
    • 複制比對的行
    • 複制到 register a
    • 反轉檔案中的每一行
    • 在比對行後添加文字

指令格式介紹

全局指令

g

在 Vim 的底行指令模式下有着意想不到強大的功能。當想要在整個檔案中對于比對的行或者非比對行進行一些操作時,應該第一時間想到這個

g

指令

global

可以簡寫為

g

  1. [range]

    指定文本範圍,預設為整個文檔
  2. pattern

    在範圍

    range

    内的行如果比對

    pattern

    ,則執行

    command

  3. !

    表示取反,也就是不比對的行,也可以使用

    vglobal

  4. 如果不寫

    g

    ,則會對整個文檔執行指令
  5. command

    預設是列印文本

整個指令可以了解成,在

range

範圍内比對 pattern 的行執行

command

;可以通過在“底行指令模式”下輸入

help ex-cmd

來檢視所有的

command

常用的

command

  • d 删除
  • m 移動
  • t 拷貝
  • s 替換

參考示例

範圍比對

比如在20行到200行之間,每一行下插入空行

20,200g/^/pu _
           

我知道

p

是粘貼,

u

是撤銷,完全不懂

pu _

是什麼鬼?誰知道的麻煩留言告訴我下,謝謝!

删除比對的行

删除與pattern比對的行

g/pattern/d
           

删除空白行

g/^$/d
           

删除不比對的行

g!/pattern/d
v/pattern/d
vglobal/pattern/d // 沒有驗證過,不知道行不行
inverse/pattern/d // 沒有驗證過,不知道行不行
           

删除大量比對行

Vim 在删除操作時,會先把要删除的内容放到寄存器中,假如沒有指定寄存器,會預設放到一個未命名的寄存器中,對于要删除大量比對行的行為,可能導緻 Vim 花一些時間處理這些拷貝,避免花費不必要的時間可以指定一個 blackhole 寄存器

_

g/pattern/d_
           

移動比對的行

将所有比對的行移動到檔案的末尾

g/pattern/m$
           

複制比對的行

将所有比對的行複制到檔案末尾

g/pattern/t$
           

複制到 register a

Vim每個字母都是一個寄存器,是以使用全局指令也可以将内容複制到某一個寄存器,比如

a

先在普通指令模式下輸入:

qaq

,清空寄存器 a。

qaq
           

qaq

清空寄存器

a

qa

開始記錄指令到

a

寄存器,

q

停止記錄。

然後在底行指令模式下輸入以下的指令:

g/pattern/y A
           

y

表示複制,大寫英文字母

A

表示把内容追加到寄存器

a

中,是以大寫字母

A

包含兩層含義,其一是指寄存器

a

;其二是指

append

。是以

y A

表示将比對到的内容複制到寄存器

a

中。如果使用小寫的

a

,則會覆寫寄存器

a

原有的内容。

存放到

a

寄存器之後就可以使用指令

"ap

來粘貼使用,其中

"a

表示寄存器

a

p

表示粘貼。

反轉檔案中的每一行

g/^/m0
           

解釋:

^

表示行首,每行都有行首,是以相當于比對到所有的行;

m

表示移動;

表示文檔第

1

行的上方。比對過程是這樣的,先比對到文檔的第

1

行,然後移到文檔的最上方;接着比對到第

2

行,也移動到文檔的最上方,此時文檔的最上方就是第

1

行文本的上方;後面就依照這樣的堆疊順序一行行往上放,最後所有的行就被倒過來了。

在比對行後添加文字

使用替換指令

s

在每行末尾插入字元串

mytext

%s/$/mytext
           

同樣使用全局 g 指令也可以實作同樣的效果,很顯然全局 g 指令把問題複雜化了。

g/pattern/s/$/mytext
           

g/pattern/

比對到需要在行尾插入字元串的行,再結合替換指令

s

将行尾替換成

mytext

,即在行尾插入

mytext