咱們一般只要在 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 的正則有四種模式, 分別是 \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 模式或插件, 我日常工做中用到的 CLion 的 IdeaVim 插件很是好使, 能模擬大部分經常使用的功能, 配合 IntelliJ 平臺的代碼提示, 開發效率特別高.
歡迎關注個人公衆號