Vim 的命令模式記錄

基本使用

咱們一般只要在 Normal 模式下輸入 : 冒號就能夠進入命令模式.css

行號跳轉

一般咱們使用 Vim 的命令中, 最經常使用且高效的命令就是跳轉行號, 譬如我如今要跳轉到 30 行去改點東西前端

:30
複製代碼

我想多跳幾行

能夠在一個行數範圍區間內跳轉, 譬如我要在 20 到 30 這個範圍跳轉, 只要這樣bash

:20, 30
複製代碼

那假如我只想指定某一行的多少行呢?編輯器

:20; +10
複製代碼

效果同上, 只是能夠經過 +/- 來控制函數

刪除指定行代碼

Vim 能夠在 Normal 模式下使用 dd 來刪除整行代碼, 我如今能夠經過命令模式輸入 30 行而後按 dd 來刪除該行, 能不能再快點呢?ui

:30 d
複製代碼

我想刪多點

需求又變了, 若是有多行代碼須要刪除, 通常個人習慣是進入 可視化模式選中要刪除的代碼, 而後按下 d, 其實咱們還能夠經過命令來刪除多行代碼, 譬如我要刪除 20, 30 之間的代碼就能夠像這樣spa

:20, 30 d
複製代碼

這樣就能夠作到刪除指令行範圍內的代碼, 一個字爽.插件

從我腳下開始刪

我如今光標在某一行, 可是我不說, 我只想從這一行開始刪到底code

:., $ d
複製代碼

我要刪清爽

如今咱們要把當前文件的全部的代碼刪掉, 通過上面的例子, 你可能會猜, 這還不簡單orm

:1, $ d
複製代碼

是的沒錯, 可是咱們還能夠這樣

:% d
複製代碼

移動代碼

忽然我想把 20 到 30 行的代碼移到 15 行的下面, 通常咱們會在刪除的基礎上到指定行下面按 p 粘貼, 固然經過命令也能知足需求.

:20, 30 m 15
複製代碼

不想移動想複製

繼續剛纔的例子, 不過這趟我是想把 20 到 30 行的代碼複製到 15 行, 只要這樣

:20, 30 t 15
複製代碼

先到這裏吧, 還有一些 +/- 的操做, 可是我日常基本上沒怎麼用過.

搜索

最簡單的搜索

先從普通的搜索開始, 這個用正則去匹配的, 只須要在命令模式下鍵入斜槓 / 來搜索就能夠了.
而後實戰一下, 假設咱們日常寫前端樣式的時候, 有個地方想改一下, 可是隻記得關鍵字

.my-area {
    .my-area__item {
        font-size: 0.24rem;
        /* ... */
    }
    
    .my-area__icon {
        width: 0.5rem;
        height: 0.5rem;
        /* ... */
    }
    /* ... */
}
複製代碼

只要像下面這樣, 咱們就能夠全局將每一行的 my-area 替換成 some-area

:%s /my-area/some-area/
複製代碼

若是我只是想在當前光標處替換, 我只要把 % 去掉就能夠.
繼續舉例子, 假設有以下文本

.test {
    .test__test__item {
        /* ... */
    }
}
複製代碼

如今咱們用上面的 命令來將 test 處理成 hi, 你會發現本來 test__test__item 變成了 hi__test__item, 若是咱們是要將全部的 test 改爲 hi 怎麼辦?

:%s /test/hi/g
複製代碼

只要加一個 g 選項就能夠解決問題了.

Vim 的正則支持

Vim 的正則有四種模式, 分別是 \v \m \M \V, 通常默認的跟經常使用的 JavaScript(Perl 風格) 的正則稍微有點區別. 下面只講 \m 模式

元字符 說明
. 匹配任意字符
[xyz] 匹配括號中的任意一個字符, [a-z] 可匹配小寫字母, [0-9] 可匹配數字
[^xyz] 匹配除括號中字符之外的任意字符
\d 匹配數字, 同 [0-9]
\D 匹配數字以外的字符, 同 [^0-9]
\s 匹配空白字符(含<TAB>)
\S 匹配非空白字符
\t 匹配<TAB>
* 匹配 0- 任意個字符
\+ 匹配 1- 任意個字符
\? 匹配 0-1 個字符
\{n,m} 匹配 n-m 個字符
\{n} 匹配 n 個字符
\{n,} 匹配 n- 任意個字符
\{,m} 匹配 0-m 個字符
^ 匹配行首
$ 匹配行尾
\< 匹配單詞首
\> 匹配單詞尾
\ 能夠經過 \ 轉義, 如 \\ 表示反斜槓自己
\> 匹配單詞尾
\(\) 分組

\m 模式下跟常規正則的不一樣

Vim Perl 說明
\+ + 匹配 1- 多個字符
\? ? 匹配 0-1 個字符
\{n,m} {n,m} 匹配 1-m 個字符
\(\) () 分組

正則變量

大概瞭解了一下 Vim 支持的正則以後, 咱們能夠玩點花頭, 先來匹配一下 aabbbaa, 找規律就行了, 第一部分是兩個 a, 就假設有多個 a\+, 第二部分不是 a 同時假設有多個, 因此是 [^a]\+, 第三部分跟第一部分同樣, 其實能夠用正則的變量 \1 來表示第一部分匹配的規則, 可是第一部分沒有加 \(\), 這樣是無法用變量的, 因此最後就是這樣

:/\(a\+\)[^a]\+\1
複製代碼

接着把 aa 換成 bbb, bbb 換成 aa

:s /\(a\+\)\([^a]\+\)\1/\2\1\2/
複製代碼

其實還有一種函數用法

:s /\(a\+\)\([^a]\+\)\1/\=submatch(2) . submatch(1) . submatch(2)
複製代碼

Vim 玩法仍是蠻多的, 就很棒

跟命令模式指令結合

其實這個只要觸類旁通就行, 不過仍是備個忘, 譬如如今有一段代碼, 我要把空行刪掉

#include <stdio.h>
        
int main(int argc, char **argv) {
    printf("hello world");
    return 0;
}
複製代碼

而空行可能有 <TAB> 或 空格

:/^\s*$/d
複製代碼

經過 d 指令這樣就能夠把 int main 上面那行空行刪掉了.

再來個貪婪模式跟惰性模式, 如今有一串數字 123 1234 12345 123456, 這樣替換就會換成 a a a a

:s /\d\{2, 6}/a/g
複製代碼

而下面這樣替換就會變成 a3 aa aa5 aaa

:s /\d\{-2, 6}/a/g
複製代碼

要想使用貪婪模式, 就不要用 \{-, 這樣就是匹配優先的行爲, 把 - 去掉就是忽略優先的行爲, 也就是惰性模式.

其餘

Vim 的正則還支持環視等操做, 可是我不會, 就這樣吧.


身爲 95 後, 我爲何要用 Vim. 從上面的例子中能夠看出 Vim 編輯文本方面是高效的, 君不見基本上每一個編輯器都提供了 Vim 模式或插件, 我日常工做中用到的 CLionIdeaVim 插件很是好使, 能模擬大部分經常使用的功能, 配合 IntelliJ 平臺的代碼提示, 開發效率特別高.


打廣告

歡迎關注個人公衆號

相關文章
相關標籤/搜索