vim的指令筆記

最近被推坑開始用 vim 開發,剛開始幻想自己可以像那些大神一樣,只用鍵盤就能夠在畫面上行雲流水的移動,但實際上剛開始用 vim 開發的我,只能用慘不忍睹來形容,平常用滑鼠習慣了,現在突然要用鍵盤來取代滑鼠真的很痛苦,coding 變得非常卡,甚至比沒有用 vim 還來得慢,說好的極速開發呢?到現在已經過了一個月了,雖然還沒媳婦熬成婆,但至少開始有那麼一點手感了,一開始只會幾個簡單的基本指令,但隨著遇到不同的開發情境,漸漸地挖掘出更多的指令,但多到我實在記不起來 😂,於是決定寫一篇文章來紀錄目前我有用過的 vim 指令,希望可以快點變成我的 muscle memory

如何開始用 vim 開發

可以用 vim 的編輯器,也可以用自己習慣的編輯器,不管你用的是什麼編輯器,基本上都會有 vim 擴充套件可以支援,因此我是用 viscode 加上 vim 擴充套件來開發的

先安裝 viscode 的 vim 擴充套件

安裝成功後,就會在 viscode 的下方看到 normal 這個狀態,然後你就會發現不能打字了(誤)

切換模式

vim 的三大模式:normal(移動)、insert(輸入)、visual(選取)

  • 預設均為 normal 模式
  • 按下 i 進入 insert 模式
  • 按下 v 進入 visual 選取模式

一開始最痛苦的就是發現自己不能隨心所欲的打字,一定要切換到 insert 模式才能打字,這是我最不習慣的地方

如何從 insert 或 visual 切換為 normal 模式?可以按 esc 或 ctrl+[ 或是自行設定快捷鍵,像我是設定 j + k,這樣手就不會離開主要打字區

normal 模式常用指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
####小範圍移動

h = 左
j = 下
k = 上
l = 右

h/j/k/l 前面加上數字 n,就會重複移動 n 次

ex: 2jj = 向下移動兩行
20h = 向左移動 20 的字元

w = 往後移動一個單字,遇到符號會卡住
W = 往後移動一個單字

e = 移動到下一個單字的結尾

b = 往前移動一個單字,遇到符號會卡住
B = 往前移動一個單字

f + a = 也就是 find {字母}的意思,移動到該行有 a 的位置,若有多個 a 就依序往後找

####大範圍移動

shift + { = 向上移動一個段落
shift + } = 向下移動一個段落

gg = 移動到開頭段落
G = 移動到結尾段落

0 = 移到單行最前方
$ = 移到單行最後方

:num = 移動到指定行數
ex. :17 = 會移動到 17 行

#### insert 模式常用指令

o = 在當前游標的下方新增一行
O = 在當前游標的上方新增一行

i = 在游標前方輸入
I = 在該行的最前面,進入輸入模式

a = 在游標後方輸入
A = 在該行的最後面,進入輸入模式

s = 刪除當前的文字,進入輸入模式
S = 刪除該行所有文字,進入輸入模式

#### visual 選取模式

按下 v 進入 visual 模式

v$ = 從該位置選取到句子的最後一個字
vit = 選取該 tag 內的內容(不含 tag)
vat = 選取該 tag 內的內容(含 tag)
vis or V = 選取整行
vgg = 從當前位置選取到整個檔案的開端
vG = 從當前位置選取到整個檔案的尾端

ctrl + v = 選區塊

y = 複製
p = 貼上

#### 刪除

x = 刪除字元
d = 必須先選取才能刪除
D = 刪掉游標到結尾全部
dw = 刪除單字
dd = 刪除單行
2dd = 刪除兩行
dG = 刪掉後面整段

c = 刪掉文字並且進入 insert mode
cw = 替換一個單字
cc = 替換整行
c$ = 替換到結尾的文字 = 大寫C
ciw = 刪除當前的詞,進入輸入模式
ci" = 刪除''的內容,並且可以進入插入模式

di" = 刪除''的內容
dip = 刪除一個段落
dtx = 删除文本直到字符“x”(不包括字符“x”)delete to x
dfx = 删除文本直到字符“x”(包括字符“x”)delete forward x

#### 複製&貼上

y = 複製
yy = 複製單行
2yy = 複製兩行
3yy = 複製三行
...依此類推

y$ = 複製到最後面
y^ = 複製到最前面

y% = 在左括號按下該指令,可以複製括號內所有的內容
[] () {} 都適用

p = 貼上
u = 還原

#### 搜尋

/keyword
輸入完後按下 enter
n = 下一個符合條件的
N = 上一個符合條件的

\* => 搜尋游標當前所在的文字
ex. 游標停在 star 這個單字,按下\*就會搜尋所有符合 star 的結果

將全部的 101 取代為 104
:%s/101/104/g

#### 暫存區

"dyy = 複製該行並且存到 d 的暫存區
"dp = 貼上 d 暫存區的內容

//暫存區有 a-z 可以使用

#### 取代

rW = 將字元替換成W單字
~ = 會把小寫替換成大寫,若原本是大寫則會換成小寫

#### 特殊

J = 將游標所在的行與下一行合併
:split = 視窗上下分割
:vsplit = 視窗左右分割

ctrl + w + w = 切換至右側或下方的視窗
ctrl + w + l = 切換至右邊視窗
ctrl + w + h =切換至左邊視窗
xp = 快速交換兩個字元

easymotion

讓你快速移動到想去的地方,首先打開 vscode settings json 的設定檔加入下面三行,vim leader 可以定義成自己喜歡的按鍵

1
2
3
"vim.easymotion": true,
"vim.leader": ",",
"vim.hlsearch": true,

然後輸入  ,,s 就會看到 vscode 下面出現這幾個字,代表你成功進入 easymotion input

假如我想要跳去第六行的 fetch(f 的位置)

只要輸入 f,就會看到畫面上所有的 f 都會上色,再輸入對應位置(u)的字母就可以瞬間移動過去了!是不是很方便?

最後如果對 vim 有興趣的朋友,非常推薦看龍哥的影片,淺顯易懂!