主題 3 編輯器(Vim)
編輯器 (Vim) · the missing semester of your cs education (missing-semester-cn.github.io)
代碼編輯器和和其他的編輯器(比如用來寫文章的編輯器)有一些不同,
因為寫程式和寫文章不同,當你寫程式時,會花大量時間來閱讀你寫的東西,或者來移動游標,做一些小小的修改;而不是像寫文章的時候,從上到下一氣呵成,因此,對于不同的用途,我們會使用不同的編輯器,
1.編輯器選擇
Stack Overflow 的調查顯示,VS Code 是目前最流行的代碼編輯器,而 Vim 則是最流行的基于命令列的編輯器,就算最終你沒有打算長期使用Vim,我們仍然認為學習Vim背后的思想很有價值,
另外,許多工具也覺得 vim 哲學很棒,從而提供了 Vim 模式,例如當前最熱門的 VS Code,支持 Vim 鍵位系結,該插件已經被下載了數百萬次,
2.Vim的思想
Vim 是一個基于模式(Modal)的編輯器,這意味著 Vim 有多個模式,
Modal 這個詞源于 Mode
多模式的思想源于,當你在寫程式的時候會經常做不同的事情,在編程的時候,你會把大量時間花在閱讀/編輯而不是在寫代碼上,
所以 Vim 是一個多模態編輯器:它對于插入文字和操縱文字有不同的模式,
Vim 是可編程的(可以使用 Vimscript 或者像 Python 一樣的其他程式語言),
Vim 的介面本身也是一個程式語言:鍵入操作(以及其助記名) 是命令,這些命令也是可組合的,Vim 避免了使用滑鼠,因為那樣太慢了;Vim 甚至避免用上下左右鍵因為那樣需要太多的手指移動,
這樣的設計思想使得 Vim 成為了一個能跟上你思維速度的編輯器,
3.編輯模式
正常模式:Normal,在檔案中四處移動游標進行修改
插入模式:Insert,插入文本
替換模式:replace,替換文本
可視化模式(一般,行,塊):Visual,Visual Line,Visual Block,選中文本塊
命令列模式:Command Line,用于執行命令
- Normal 正常模式 & Insert 插入模式
當你開始使用 Vim 時,它會在 Normal 模式下啟動,
在這個模式下,各種鍵位組合擁有在這個模式下的特定意義,其中就有一些按鍵組合來切換到其他的模式,而切換后這些鍵位組合和意義也相應改變,
但你的大部分時間都會在 Insert 和 Normal 模式下,在Normal模式下按下i鍵就可以進入Insert模式,而在Insert模式下按下Esc就可以回到Normal模式,
這里注意一下我們表示按鍵的方式,這個表示方式將會用于筆記以及Vim給你的提示中:
當僅僅是代表
i鍵這樣一個按鍵本身時,那么就會直接寫i,但是對于如Ctrl+v這種按鍵組合,就有可能以這么幾種形式來體現:第一種是一個脫字符號后跟著控制用字符:
^v(這里控制用字符指v,也就是組合鍵中的另一個鍵),另一種寫法可能是你最熟悉的:Ctrl-v,而有的地方我們可能會寫成:<c-v>
Vim 有好幾種模式,而 Normal 模式是用來移動游標、閱讀東西,以及在檔案間切換的,
而 Insert 模式是用來輸入的,因此在 Insert 模式下,你的按鍵大多會直接進入 buffer(緩沖區),而在 Normal模式下則不然,它們不會進入 buffer,而是用來進行了一些瀏覽和編輯操作,
- replace 替換模式
不像插入模式那樣會把字符往后移,替換模式會直接覆寫掉文本,
- 可視化模式(一般,行,塊)
可視化模式有 Visual 模式,Visual Line 模式,以及一個 Visual Block 模式,
- 各種模式的切換
你可以按下 <ESC>(退出鍵)從任何其他模式回傳正常模式,在正常模式,鍵入 i 進入插入 模式,R 進入替換模式,v 進入可視(一般)模式,shift+V 進入可視(行)模式,<C-v> (Ctrl-V, 有時也寫作 ^V)進入可視(塊)模式,: 進入命令模式,
- 映射Esc鍵
從非 Normal 模式切換到 Normal 模式下都是按 Esc 鍵,因此使用 Vim 時要頻繁按 Esc 鍵,但這個鍵在鍵盤的角落里,按起來很不方便,所以很多人會將鍵盤上某個鍵映射成 Esc,通常這個鍵是 Caps Lock ,因為它在鍵盤的中間一行上,
4.基本操作
- 如何打開Vim程式
Vim 是一個基于命令列的編輯器,我們要打開 Vim,只需要在命令列中鍵入 vim,
vim 也可以接收引數,當我們想用它直接編輯特定的檔案時,可以在 vim 后面加上檔案的路徑+檔案名,
[lighthouse@VM-8-17-centos vim]$ ls
poem.md
[lighthouse@VM-8-17-centos vim]$ vim poem.md
4.1插入文本
Vim 以 Normal 模式啟動,在 normal 模式下按下i鍵,進入 Insert 模式,螢屏左下角將會提示--INSERT--,在插入模式下按下<esc>鍵,可以回傳 Normal 模式,
左下角總會顯示你所在的模式,但 Nomal 模式下是空白的,
4.2命令列
在 Normal 模式按下 : (冒號)將會進入命令列模式,這時你的游標將會跳到螢屏左下方的命令列,這個模式有很多功能,包括打開,保存,關閉檔案,退出 vim,
在命令列模式下:
| 命令 | 釋義 |
|---|---|
:q / :quit |
退出(關閉視窗) |
:w / :wirite |
保存檔案 |
:wq |
保存并退出 |
:ls |
顯示打開的快取 |
:e {檔案名} |
打開對應檔案 |
:help <特定鍵/特定命令> |
打開幫助檔案 |
注意,這里的特定命令和特定鍵不同,如 :help :w 表示獲取命令 :w 的說明,而 :help w 表示在 Normal 模式下 w 鍵的說明,
4.3buffer, tab, window
Vim 會維護一系列打開的檔案(buffer),稱為快取,
一個 Vim 會話包含一系列標簽頁(tab),每個標簽頁包含一系列視窗(window,分隔面板),每個視窗顯示一個快取(buffer),
跟普通的程式不一樣的是, 快取和視窗不是一一對應的關系;視窗只是視角,一個快取可以在多個視窗打開,甚至在同一個標簽頁內的多個視窗打開,這個功能其實很好用,比如在查看同一個檔案的不同部分的時候,
Vim 默認打開一個標簽頁,這個標簽包含一個視窗,
如何理解并正確使用 Vim 中的 Buffer , Window 和 Tab
Vim Tab Madness. Buffers vs Tabs
5.Vim的介面是一種編程語言
Vim 最重要的設計思想是 Vim 的界面本身是一個程式語言,你可以鍵入命令來對檔案,視窗等進行操作,而不僅僅是編輯字符,
5.1移動命令
Normal 模式下:
-
基本移動:
h j k l(左, 下, 上, 右) -
以詞為單位:
w(word,向前移動一個單詞)b(beginning of word,向后移動一個單詞)e(end of word,移動到單詞末尾)
-
以行為單位:
0(到行首)^(到本行第一個非空格字符)$(到行末)
-
螢屏:
H(Highest,螢屏首行),M(Middle,螢屏中間),L(Lowest,螢屏底部) -
翻頁:
Ctrl-u(上翻),Ctrl-d(下翻) -
檔案:
gg(到檔案最開始),G(到檔案最底部) -
行數:
:{行數}<CR>或者{行數}G({行數}為行數) -
雜項:
%(找到配對,比如括號或者 /* */ 之類的注釋對) -
查找:
f{字符},t{字符},F{字符},T{字符}-
f{字符}/t{字符}:相對于游標,在本行向前查找的第一個匹配的{字符} -
F{字符}/T{字符}:相對于游標,在本行向后查找的第一個匹配的{字符}相對于f/F,t/T 查找的游標不會落在匹配的字符上,而是落在匹配的字符的前一個/后一個字符
-
,/;用于導航匹配
-
-
搜索:
/{正則運算式},n/N用于導航匹配,Esc+u撤銷搜索高光顯示
5.2編輯命令
在 Normal 模式下:
-
按下
i,進入insert模式 -
按下
o鍵,可以在游標下面開(open)新的一行,同時切入 Insert 模式, -
按下
O鍵,在游標上面開新的一行,同時切入 Insert 模式 -
d{移動命令},命令可以配合移動命令來選擇洗掉范圍dw洗掉詞d0洗掉到行首d3l向右洗掉3個字符de從當前位置開始洗掉到詞末
-
c{移動命令},和上面命令相似,不同的是它洗掉后會進入insert模式(c代表change)cw洗掉詞,并進入insert模式c$洗掉到行尾,并進入到insert模式
c 和 d 這兩個命令很像,它們都會接受一個操作范圍作為引數,然后按照操作的范圍進行洗掉或者更改,不同在于c命令會進入insert模式,d命令不會
-
如果按下某個編輯鍵兩次,它將作用于當前行
dd洗掉當前行cc洗掉當前行,并進入insert模式
-
x洗掉一個字符(等于dl) -
r替換一個字符 -
u撤銷操作,最早可以回到你打開的狀態 -
ctrl+r重做操作 -
y賦值(yank,提取,拉拽),y 也接收一個操作范圍作為引數yy復制當前行yw復制單詞
-
p粘貼
5.3選擇命令
Visual 模式下可以使用大多數 Normal 模式下的移動命令移動游標,它會自動選中移動范圍的文本,然后可以對其進行操作,其中最常用的就是復制(y)這段文本,復制完后會自動退回普通模式,
-
普通 Visual 模式(normal 模式下按
v進入) -
Visual Line 模式(normal 模式下按
V進入),它的操作以行為單位,一次可以選擇一行文字, -
Visual Block 模式(normal 模式下按
ctrl+v進入),它可以選擇矩形的文字塊,其他與上述模式類似,
5.4計數
數字可以和移動、編輯、選擇命令結合,
例如:4j:表示執行j命令4次,游標向下移動4行;5w:執行w命令5次,游標向前移動5個單詞,或者在普通visual模式下,按10e,就可以向右選中單詞10次;
還可以和編輯命令結合,例如:7dw,表示執行dw命令7次,向右洗掉7個單詞,
5.5修飾語
你可以用修飾語改變“名詞”的意義,修飾語有 i,表示“內部”或者“在內“(inside),和 a, 表示”周圍“(around),
ci(洗掉當前括號()之內的內容;di(洗掉包括()在內的內容ci[改變當前方括號[]之內的內容;di[洗掉包括[]在內的內容da'洗掉一個單引號字串, 包括周圍的單引號
6.演示
這里有一個存在bug的代碼fizz_buzz,使用vim來快速修改它:
fizz_buzz是一個輸出1到n的練習,當數字能被3整除時,輸出fizz;當數字能被5整除時,輸出buzz;當數字同時能被3和5整除時,輸出fizzbuzz;如果這些條件都不滿足,就直接輸出數字,
例如:1,2,fizz,4,buzz,...
def fizz_buzz(limit):
for i in range(limit):
if i % 3 == 0:
print('fizz')
if i % 5 == 0:
print('fizz')
if i % 3 and i % 5:
print(i)
def main():
fizz_buzz(10)
問題和解決操作:
問題一:主函式沒有被呼叫:
-
G跳到檔案尾 -
o向下打開一個新行 -
輸入 “if name …”
問題二:fizz_buzz命令應該從 0 而不是 1 開始
-
搜索
/range -
ww向前移動兩個詞 -
i插入文字1, -
ea在 limit 后插入+1(a表示append)
問題三:在 5 的整數倍的時候列印 “fizz”
-
搜索
/fizz,按n搜索下一個,一直到第三個"fizz“ -
鍵入
ci',再將“fizz”改為“buzz”
問題四:在 15 的整數倍的時候在換行列印了 “fizz” 和 “buzz”
-
在第四行,鍵入
$i插入文字到行尾,然后加入內容, end=''
-
想要對下兩行如法炮制,先鍵入
jj跳到下兩行,然后鍵入.(在vim中按下.會重復之間的編輯命令)
-
jjo在 if 打開一行 -
加入 “else: print()”
問題五:采用了硬編碼的引數 10 而沒有從命令控制行讀取引數
-
gg回到檔案頭,O向上打開新行,然后鍵入內容“import sys”,然后回到normal模式
-
鍵入
/10,跳到10文字處,然后鍵入ci(命令,添加內容:int(sys.argv[1])
7.自定義Vim
Vim 由一個位于 ~/.vimrc 的文本組態檔(包含 Vim 腳本命令),
在這兒下載我們的設定,將它保存成
~/.vimrc
Vim 能夠被重度自定義,你可以參考其他人的在 GitHub 上共享的設定檔案如:Anish, Jon (uses neovim), Jose,
8.擴展Vim
9.其他程式的Vim模式
10.Vim 進階
11.拓展資料
12.課后練習
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/556504.html
標籤:其他
上一篇:【筆試實戰】LeetCode題單刷題-編程基礎 0 到 1【一】
下一篇:返回列表
