第 1 章,vi 文本編輯器#
-
簡要歷史觀
-
開啟和關閉檔案
vi filename
,並編輯ZZ
,保存檔案:w
,保存:w new-filename
,另存為:w!
,強制寫入:e!
,恢復:q!
,強制退出:!rm junk-file
:!df
-
學習 vi 的唯一方法是練習。
第 2 章,簡單編輯#
-
移動光標
- 單一移動:
h
,j
,k
,l
,它們很糟糕!我有 neo 鍵盤佈局 - 數字參數:1,2,...
- 行內移動:
0
,移動到行首$
,移動到行尾^
,移動到第一個非空字符
- 按文本區塊移動
w,b
,按單詞移動,前進,後退,分別。W,B
,按大單詞移動,前進,後退,分別。 "-" 連接的單詞視為一個8G
,移動到第 8 行G
,移動到檔案結尾gg
,像1G
- 移動到前一行 / 下一行的第一個字符:
-
,+
- 單一移動:
-
簡單編輯
a
,附加;(不必要,我會將這些鍵自定義為其他用途)i
,插入;c
,更改;cw, cb
,分別更改單詞,前進,後退c2w
,前進更改 2 個單詞c^
,到第一個非空字符c0, c$
,到行的開始,結束,或者你可以使用c[Home]
,c[End]
d
,刪除;dw
,按單詞db
,按單詞,向後dd
,刪除行d$
,d[End]
,D
,刪除到行尾dto
,dTx
,刪除到(不包括)"x",前進 / 後退d/th
,刪除到第一次匹配 "th"diw
,刪除當前單詞di(
,刪除當前括號內的內容
s
,替換s
(一個或多個字符),S
(整行)。
x, X
,刪除一個字符,前進或後退,分別(不必要)xP, XP
,刪除並粘貼回來xp, Xp
,交換兩個字符
y
,複製;p
,粘貼;$p
,粘貼到行尾0P
,^P
,粘貼到行首
-
vi 命令的一般形式
cc, dd, yy
(command)(text object)
(command)(number)(text object)
(number)(command)(text object)
cc
,更改整行C
,像c$
~
,改變大小寫
-
雜項
- 重複你的最後一個命令
.
- 撤銷,重做
u
,C-r
,U
,在惡魔模式下似乎工作不同
- 插入命令的數字參數:例如
4i<space><Esc>
- 重複你的最後一個命令
-
注意
cc
,dd
,yy
,適用於行C
,D
,S
從當前位置到結尾,而Y
,整行C
===c$
,D
===d$
,但Y
===yy
,而不是y$
-
總體
+------------------------------+------------------------------+------------------------------+------------------------------+ | 文本對象 | 更改 | 刪除 | 複製 | +------------------------------+------------------------------+------------------------------+------------------------------+ | 一個單詞 | cw | dw | yw | +------------------------------+------------------------------+------------------------------+------------------------------+ | 兩個單詞,不計算標點 | 2cW 或 c2W | 2dW 或 d2W | 2yW 或 y2W | | 標點 | | | | +------------------------------+------------------------------+------------------------------+------------------------------+ | 三個單詞向後 | 3cb 或 c3b | 3db 或 d3b | 3yb 或 y3b | +------------------------------+------------------------------+------------------------------+------------------------------+ | 一行 | cc | dd | yy 或 Y | +------------------------------+------------------------------+------------------------------+------------------------------+ | 到行尾 | c$ 或 C | d$ 或 D | y$ | +------------------------------+------------------------------+------------------------------+------------------------------+ | 到行首 | c0 | d0 | y0 | +------------------------------+------------------------------+------------------------------+------------------------------+ | 單一字符 | r | x 或 X | yl 或 yh | +------------------------------+------------------------------+------------------------------+------------------------------+ | 五個字符 | 5s | 5x | 5yl | +------------------------------+------------------------------+------------------------------+------------------------------+
-
例子
r
,dd
,P
,cw
,x
使用編輯器你可以滾動頁面, 使用屏幕編輯器你可以滾動頁面, 移動光標,刪除行,插入 移動光標,刪除行,插入 字符,還有更多,當你進行 字符,還有更多,當你進行 編輯時看到你的結果。 編輯時看到你的結果。 由於它們允許你在閱讀文件時進行更改, 屏幕編輯器非常受歡迎。 就像你編輯打印的副本, 由於它們允許你在閱讀文件時進行更改 屏幕編輯器非常受歡迎。 就像你編輯打印的副本。
P
,p
,.
使用屏幕編輯器你可以 使用屏幕編輯器你可以 滾動頁面。 滾動頁面。 移動光標。 使用屏幕編輯器你可以 刪除行。 移動光標。 使用屏幕編輯器你可以 刪除行。
J
使用一個 使用屏幕編輯器你可以滾動頁面,移動光標 屏幕編輯器 你可以 滾動頁面,移動光標
第 3 章,快速移動#
-
按屏幕移動
- 滾動屏幕:
C-b
,C-f
,C-u
(在 emacs 惡魔模式下無效),C-d
,C-y
,C-e
z<Enter>
,z.
,z-
,移動到頂部 / 中心 / 底部並滾動到它(不如 emacs 的recenter-top-center
好,我會在我的惡魔模式中放棄這個)
- 滾動屏幕:
-
重新繪製屏幕:
C-l
(在我的惡魔模式中無效,我們有recenter-top-center
) -
在屏幕內移動
H
,M
,L
:到屏幕的頂部 / 中間 / 底部2H
,2L
:距離頂部 / 底部的第二行
-
按行移動
+
,<Enter>
,-
,移動到下一行 / 前一行的第一個字符。- 當前行的移動:
20|
,移動到第 20 列,^
,移動到第一個非空字符。
-
按文本區塊移動
e
,E
,單詞結尾,(忽略標點符號)(
,)
,當前 / 下一句的開頭{
,}
,當前 / 下一段的開頭[[
,]]
,當前 / 下一部分的開頭
-
按搜索移動
/pattern
,?pattern
,向前 / 向後搜索n
,下一個匹配N
,下一個匹配,反方向:set nowrapscan
,不進行循環搜索d/pattern
-
當前行搜索
fx
,Fx
,移動到前一個 / 下一個 'x'tx
,Tx
,移動到字符 'x' 之前,前一個 / 下一個;
,,
,重複相同方向,反方向7fx
,移動到第 7 次匹配dfx
,例如dfi
,從這裡刪除到 'i' 的第一次出現,然後d;
,刪除到 'i' 的第二次出現
-
按行號移動
20G
,移動到第 20 行``
, 返回(舊位置)''
,返回,但在行首
使用屏幕編輯器你可以滾動頁面, move1 move2 move4 move5 move6 move7 光標,刪除行,插入 字符,還有更多,當你看到 字符,和 你的編輯結果時。
第 4 章,超越基礎#
-
更多命令組合
+------------+------------+-----------+------------------------------+ |更改 |刪除 |複製 |從光標到... | +------------+------------+-----------+------------------------------+ |cH |dH |yH |屏幕頂部 | +------------+------------+-----------+------------------------------+ |cL |dL |yL |屏幕底部 | +------------+------------+-----------+------------------------------+ |c+ |d+ |y+ |下一行 | +------------+------------+-----------+------------------------------+ |c5| |d5| |y5| |當前行的第 5 列 | +------------+------------+-----------+------------------------------+ |2c) |2d) |2y) |第二個句子 | +------------+------------+-----------+------------------------------+ |c{ |d{ |y{ |前一段 | +------------+------------+-----------+------------------------------+ |c/pattern |d/pattern |y/pattern |模式 | +------------+------------+-----------+------------------------------+ |cn |dn |yn |下一個模式 | +------------+------------+-----------+------------------------------+ |cG |dG |yG |檔案結尾 | +------------+------------+-----------+------------------------------+ |c13G |d13G |y13G |第 13 行 | +------------+------------+------------+------------------------------+
-
啟動 vi 時的選項
vi +3 filename
,在第 3 行打開檔案vi + filename
,在最後一行打開檔案vi +/pattern filename
,在模式的第一次出現打開檔案vi +R filename
,以只讀模式讀取檔案vi -r filename
,ex -r filename
,恢復緩衝區
-
複製到命名緩衝區
"dyy
,複製到緩衝區 "d""ayw
,複製到緩衝區 "a""ap
,"
dp`,放置緩衝區"a"/"d"
-
標記你的位置
mx
,標記當前位置為 x'x
,''
,``
, 移動到最後的位置
第 5 章,介紹 ex 編輯器#
__ _ _ _ _
/ _| ___ _ __ | | __ _| |_ ___ _ __ _ __ ___ __ _ __| (_)_ __ __ _
| |_ / _ \| '__| | |/ _` | __/ _ \ '__| | '__/ _ \/ _` |/ _` | | '_ \ / _` |
| _| (_) | | | | (_| | || __/ | | | | __/ (_| | (_| | | | | | (_| |
|_| \___/|_| |_|\__,_|\__\___|_| |_| \___|\__,_|\__,_|_|_| |_|\__, |
|___/
第 6 章,全球替換#
-
替換
:s/old/new
,替換第一次出現的 old:s/old/new/g
,多次出現:50,100s/old/new/g
,:50,100s/old/new
適用於 50~100 行:1,$s/old/new
,適用於整個檔案
-
c,確認
y
表示是n
表示否Enter
,退出
-
內容敏感的替換
:%s/old/new/g
,不確認,整個檔案:g/pattern/s/old/new/g
,:1,200g/pattern/s/old/new/g
:g/pattern/s/old/new/g
,同:g/pattern/s//new/g
-
模式匹配規則
.
,單個字符,除了換行符*
,匹配零或多次出現的前一字符- 例如
a*
可以匹配a
,aa
,aaa
,等等 - 例如
.*
可以匹配任何字符組合
- 例如
^,$
,當它是正則表達式的第一個 / 最後一個字符時,視為行的開始 / 結束,否則視為其本身。- 例如
^Line
匹配任何以 "Line" 開頭的行 - 例如
something^*
,可以匹配 "something","something^","something^^",等等
- 例如
[]
,例如[aoei]
匹配a
,o
,e
,i
;和[a-z]
,;:[a-z0-9]
符合預期。:%s/\(That\) or \(this\)/\2 or \1/
~
,匹配最後的搜索歷史。就像你用/the
搜索 "the",然後你可以用/~n
搜索 "then"\
,例如\.
匹配 "."\<m
,\>tion
,匹配以 'm' 開頭的單詞,以 "tion" 結尾的單詞
-
POSIX 括號表達式
[:alnum:]
字母數字字符[:alpha:]
字母字符[:blank:]
空格和制表符字符[:cntrl:]
控制字符[:digit:]
數字字符[:graph:]
可打印和可見(非空格)字符[:lower:]
小寫字符[:print:]
可打印字符(包括空白)[:punct:]
標點字符[:space:]
空白字符[:upper:]
大寫字符[:xdigit:]
十六進制數字
-
新的
s/old/NEW/g
模式\n
,n 是 1..9,匹配 (THIS)&
,匹配的部分~
,s/thier/their/
,然後s/her/~/
就像s/her/their
\u,\l
,大寫 / 小寫字符。:s/\(That\) or \(this\)/\u\2 or \l\1/
\U,\L,\e,\E
,大寫區域,或整個匹配:set ic
,忽略大小寫
-
更多替換技巧
:s//~/
,重複最後一次替換:%&g
,在所有地方重複最後一次替換:%s;/user1/tim;/home/tim;g
-
練習
/four
,<Enter>
,cwfive
,n
(重複搜索),n
(跳過一次匹配),.
(應用最後的cwfive
)
-
例子
- 例子 - 1
<p>something</p> <p>somethingelse</p> <a>something</a> ===> `:%300,400g/<p>/s/something/somethingelse/g` ===> <a>something</a> <a>something</a> <a>something</a> <p>something</p> <p>somethingelse</p>
- 例子 - 2
one (one) two (two) three ===> `:348,352s/.*/(&)/` ===> (three) four (four) five (five)
- 例子 - 3
That or this ===> `:%s/\(That\) or \(this\)/\2 or \1/` ===> this or That
__ _ _ _ _
/ _| ___ _ __ | | __ _| |_ ___ _ __ _ __ ___ __ _ __| (_)_ __ __ _
| |_ / _ \| '__| | |/ _` | __/ _ \ '__| | '__/ _ \/ _` |/ _` | | '_ \ / _` |
| _| (_) | | | | (_| | || __/ | | | | __/ (_| | (_| | | | | | (_| |
|_| \___/|_| |_|\__,_|\__\___|_| |_| \___|\__,_|\__,_|_|_| |_|\__, |
|___/
第 7 章,高級編輯#
-
自定義 vi
- 命令
:set option
,或:set nooption
- .exrc 文件
- 命令
-
執行 Unix 命令
:!cmd
:r !date
,輸出到檔案,Thu May 1 12:59:55 CST 2014:. !date
,與:r
相同,但覆蓋當前行:r Learning-Vim.md
,這是 .... 好的。
-
通過命令過濾文本
:%!sort
,你試試你死...!)cmd
,將這些句子傳遞給 cmd!!
,當前行!2!
,2!!
,兩行
-
保存命令
- 單詞縮寫
:ab abbr phrase
:unab abbr
- 單詞縮寫
第 8 章,vi 克隆的介紹#
技巧#
diw
,di"
,di{}
:!xxd
,十六進制編輯器
:!xxd -r
de
,然後.
隨你想要ddp
,交換當前行和下一行bye
,yiw
'.
,最後編輯的行`.
, 最後編輯的字符:changes
,列出更改- /rgba/y A
10.gv
,重新選擇最後的視覺選擇 g~~
,gUU
,guu
>>
,<<
,縮進#
,*
,搜索光標下的單詞