【90 天挑戰 HCIE Cloud】第 3 天 編輯器之神 VI
編輯器之神 VI
VI_001 再見 Word!
在數字時代的今天,盲打已經是一項基礎技能(不看鍵盤打字)。多年前,筆者開始學習盲打,在一個打地鼠軟件上,類似于下圖這種,學會了基本指法。盲打技巧真正的突飛猛進,是在 QQ 開始流行的那段時間 —— 伴隨著“滴滴聲”,手指在鍵盤飛舞,沉迷于全國網友的通宵碼子聊天,打下了 IT 從業人員的堅實基礎…
是的,您猜的沒錯,“90 天挑戰 HCIE Cloud” 系列文章使用的就是安裝了 VI 和 Markdown 插件的 VSCode,這是在繁忙工作下,依然能做到每天一更的重要原因
作為一款超過 40 年歷史的編輯器,VI 在 IT 領域絕對是古化石般的存在,但奇跡的是,在今天依然擁有大量的忠實用戶,常年占據 Top 5 最受開發者歡迎的編輯器行列。VI 到底擁有什么樣的魔力,在最最喜新厭舊的行業,做到了長盛不衰,下面我們一起來了解下 VI 的前世今生
VI 誕生于 1976 年,比第一只光學機械鼠標出現的時間還要早 4 年,一開始是為 Unix 系統開發的,主要結合 QWERTY 鍵盤使用。VIM (VI IMproved) 是 VI 的改進版本,兼容了 VI 特性,同時添加了很多新的功能,如多窗口、宏、視圖模式等,目前 Linux 使用的基本都是 VIM 版本,本文介紹的也是針對的 VIM 版本
VI 最初定位是給終端用戶遠程登錄 Unix 服務器做文本編輯得,這個定位決定了 VI 的幾項關鍵特性:輕便快捷、純文本、完全依賴鍵盤、適合 Terminal 終端使用,這些特性延續至今,一直沒變。VI 的終極使命就是怎么樣在 26 個字母的基礎上,榨取最佳的文本編輯和輸入效率,在這一點上,無人能出其右
VI 是幾乎所有 Linux 發行版本默認內置的編輯器,也是最受 Linux 用戶歡迎的一款編輯器。Linux 的管理和 Unix 一樣,通過 Terminal 命令行終端完成管理操作,所有的圖形化編輯器沒了用武之地,VI 也就成了 Linux 文件編輯的必然選擇
除了適合 Terminal 純命令行的交互方式外,VI 還有很多的優點,受到開發者普遍認可:
跨平臺:服務器和桌面操作系統生態(不考慮移動端,VI 全鍵盤操作不適合移動觸屏交互),微軟、蘋果、Linux 三分天下,微軟在桌面和服務器領域都有很強的統治力,默認是不自帶 VI 編輯器的,但有一眾軟件支持 VI 編輯器,最知名的是 gvim,vscode 通過內嵌插件的方式也支持 vim。蘋果在桌面操作系統有著最佳的用戶體驗和口碑,自帶的 MacVim 是公認的最好用的 VI 軟件。Linux 就更不用說了,原生就提供對 VI 的支持。VI 的軟件自定義配置 vimrc 支持跨平臺共享,確保了用戶在不同平臺上一致的工作體驗
插件:數量眾多且質量上乘的各種類型插件擴充了 VI 的能力,這是開源軟件的獨特優勢,能吸引到諸多軟件大拿共建生態
性能:快人一步永遠重要,VI 小巧的身軀擁有巨大的能量,不需要消耗多少硬件資源,能快速響應用戶操作,完成諸多復雜文字編輯功能,基本上是指哪打哪,不帶停留
可玩性:使用 VI 不是簡單的用一個編輯軟件,里面有很多有趣且實用的特性可以挖掘,體驗 VI 的過程有點像尋寶,可能一步留神又發現一個有意思的玩法
效率:這是 VI 的核心要素,用戶一旦邁過瓶頸期,熟悉 VI 的操作模式、語法,文本編輯效率會得到大幅提升,最高效的快捷鍵(最少的手指位移)、組合式語法、精確位移、重復性操作支持、register 文本寄存、命令模式、視圖模式、宏等眾多特性,讓碼字變成一種創造性的工作體驗,有時會讓人欲罷不能~
To sum up,VI shreds words at the speed of thoughts,讓碼字也能進入心流 (Flow) 的狀態,這真的是一種奇妙的體驗,副作用是最近博客和郵件里越來越喜歡長篇大論。然而,依然強烈推薦 VSCode VI + Markdown + Git 的組合,say goodbye to Word !
小測驗:VI 入門也沒有想象中那么難,VimTutor 是一個非常棒的學習教程,請登錄網站openvim.com,按照指令進行學習,熟悉 VI 的基本操作,完成所有練習預計在 20 分鐘左右
VI_002 停下來思考 Normal-mode
畫師制作一幅畫,畫筆有超過一半的時間不在畫布上,畫師可能提筆懸空構思,也可能將畫筆放在支架上琢磨布局,真正執筆創作的時間并不會很長(引用自 Practical Vim)
寫一篇文章也是一樣,寫字是一個輸出的過程,占的時間比重往往不超過 50%,大量的時間用于構思、瀏覽、檢查和對文章進行修改,像王勃提筆一氣呵成“落霞與孤鶩齊飛,秋水共長天一色”這樣的神作,少之又少;大多數人寫文章,還是像曹公批閱十載、增刪五次寫紅樓夢一樣,反復修改才得終稿
所有“碼字類”工作,包括寫文章、寫博客、寫小說、寫代碼,和畫畫這種藝術創作一樣,重要的不是瘋狂的碼字輸出,而是碼字間隙思考的過程。VI 的設計理念就是這樣的,大多數時間,請 Esc 退出插入模式下的碼字狀態,停下來思考,決定下一步往哪去
VI 支持 3 種編輯狀態,包括正常模式 Normal-mode、插入模式 Insert-mode 和可視模式 Visual-mode。默認打開 VI,進入的就是正常模式 Normal-mode,就是針對瀏覽、修改文章的時間占比過半場景設計的。正如其名稱所展示的,用戶只要不是在打字輸入文本,默認就應該處于 Normal-mode。這點是和其他編輯器最大的不同,也是新手剛開始使用 VI,最容易困惑的地方:怎么鍵盤按了半天,沒什么反應~
Normal-mode 的好處顯而易見:此時不是輸入狀態,鍵盤上的所有按鍵,都可以作為功能鍵,用戶可以通過最少的手指位移,完成想要的編輯動作,操作指令簡單快捷,下面介紹 Normal 模式下的相關操作,內容包括位移(移動光標)、操作符以及兩者之間的組合
位移
VI 是完全基于鍵盤操作的編輯器,核心理念是保持手的位置,不要離開鍵盤核心區域,像下圖展示的:
VI Normal-mode 是基于這個理念設計的,用 Word 和其他編輯器時,位移用的最多的就是鼠標和方向鍵,而 VI 倡導的實踐經驗,要求完全不一樣
首先,遠離鼠標
禁用方向鍵,使用 hjkl 代替,不要把手指挪到離鍵盤核心區那么遠的地方~
少用 hjkl,逐個字符位移太慢,要一個字符串或者一段一段的移動光標
盡可能用 1~2 個鍵將光標移到目標位置,實在不行,也應該在 3 個鍵內完成(絕對不要超過 5 個鍵)
想象一下,將手從鍵盤拿開,找到鼠標,將光標移動到指定的位置,再將手指放回鍵盤,相比按 3 下鍵盤,肯定要慢很多,這是 VI 高效率完成文字編輯的重要原因之一
VI 支持的位移指令參考下表
注:Ctrl-d 指同時按下 Ctrl 和 d 按鍵
單詞類的位移命令 w b e,有對應的大寫的版本 W B E,主要區別是大寫版本的位移距離要更遠一點,如 W 相比 w,會跨越單詞間的標點符號,這個多試幾次就能體會到差別;建議只用小寫版本,位移距離不夠可以疊加數字(參考下面描述)
Normal-mode 位移操作可以和數字組合一起,比如跳轉到 5 個單詞之后,不需要連續按 5 下 w 鍵,只要連續按下 5w 兩個鍵的組合即可,往前跳 3 個段落,也可以用 3{ 的組合鍵,熟練使用數字加位移鍵組合,基本可以實現指哪打哪,這是脫離鼠標后必備的技能
注:使用現代的 vim 編輯器如 vscode,都兼容鼠標和全鍵盤操作,能最大化的利用兩個工具的編輯效率,也不用教條的真把鼠標扔掉了,哪個順手、哪個快,就可以用哪個,比如鼠標滾輪的用戶體驗,就是鍵盤很難替代的
操作符
Normal-mode 支持對文本進行高效編輯,VI 提供豐富操作符,包括復制、刪除、大小寫轉換等,且支持操作符用戶自定義,有非常強的 DIY 屬性,用戶可以將自己最常用到的一些操作,自定義成為操作符
操作符分為兩類,包括組合操作符和獨立操作符,前者可以結合位移一起使用,后者獨立使用,參考下表介紹
獨立操作符用起來比較簡單,輸入完單條指令即可完成對應操作,且可以組合數字一起用,如 5x 的組合鍵,可以刪除當前字符及其后的共 5 個字符
組合類的操作符有兩種特殊用法,效果和獨立操作符很像,使用很廣泛,一定要掌握:
疊詞:如 yy dd cc g~~ guu gUU,對當前行執行復制、刪除和大小寫變換操作
大寫: 如 Y D C,對光標當前位置到行尾內容,執行復制、刪除操作
注:獨立類操作符 s 也有大寫的用法,輸入 S 可刪除本行內容并進入 Insert-mode,這個命令挺好用的
組合類的操作符和位移的結合,是 VI Normal-mode 下最精髓的內容,下面重點介紹
操作符與位移
組合類的操作符有點像及物動詞,后面可以跟操作對象 —— 位移,操作符定義要執行的動作,位移定位動作施加的對象,這兩者結合起來,威力巨大,且有著強大的靈活性
列舉幾個場景,看一下操作符與位移的組合,可以做哪些事情:
組合操作符可以配合一種特殊的位移指令,如 aw (a word) iw (inner word),選擇的范圍是光標下的單詞,兩者的區別是 aw 的范圍要稍微廣一些,會包括單詞旁邊的 1 個空字符,而 iw 只包含單詞本身;除了 word 位移外,還可配合其他類型位移指令使用,介紹如下
aw 此類的位移指令,其本質是選擇一段內容,無法單獨使用,必須配合操作符一起用,這類指令還有很多,除了上面列出的,還有 a( a[ aB a{ a" a’ a` a< ap 等多種用法,且這些都有對應的 i 版本如 i[
注:
a( 和 ab 的效果一樣
a{ 和 aB 的效果一樣
at 指 html 的 tag 標簽如
ap 指一個段落的內容
從上面的示例可以看出來,操作符和位移是任意組合關系,彼此之間沒有依賴,意味著后面有了更多的組合操作符或者位移指令,都適用這套邏輯,如自定義首行注釋的操作符 //,再定義一個選擇全文的位移指令 ae,兩者組合 //ae 就是對全文進行注釋,用起來是不是很酷
操作符與位移的組合,還可以與數字進行再次組合,如 3dw 即刪除當前光標下的 3 個單詞,3y2j 相當于復制 6 行內容
小測驗:請使用 VI 新建一個文檔,逐一試驗本文中列出的操作符和位移的可能組合
VI_003 有趣的玩法
VI 在開發者群體很受歡迎,是一旦入坑很難爬出來的那種,原因之一是 VI 非常多有趣且有用的玩法,熟練使用形成依賴,就再也離不開了;下面按 Tips 分別介紹部分玩法
Tips 1. Don’t repeat yourself
經常寫文章的人都知道,有時需要對不同位置做一樣的修改,如替換某個寫錯的單詞等,常規做法是將鼠標分別移動到各個位置,逐個進行修改。VI 的操作符 dot command . 用于重復執行上一次變化內容,被認為是 VI 最強大和最常用的命令
參考下面示例,紀伯倫《沙與沫》中的一個片段,第 2~8 行都缺少句點
1 曾有七次我鄙視了自己的靈魂: 2 第一次是在她可以上升而卻謙讓的時候 3 第二次是我看見她在瘸者面前跛行的時候 4 第三次是讓她選擇難易,而她選了易的時候 5 第四次是她做錯了事,卻安慰自己說別人也同樣做錯了事 6 第五次是她容忍了軟弱,而把她的忍受稱為強 7 第六次是當她輕蔑一個丑惡的容顏的時候,卻不知道那是她自己的面具中之一 8 第七次是當她唱一首頌歌的時候,自己相信這是一種美德
假定起始光標位置在第 1 行第 1 個字符 曾 上,如果我們用 Word 來做,只能不停移動鼠標,一個個添加句點,VI 則有 N 種高效率的辦法解決問題,我們這里就介紹 dot command 的處理方法
想象一下,如果有超過 50 行都需要添加句號,上面這種可重復操作的方式,是不是超級強大
Tips 2. 可控制的 undo redo
VI normal 模式下,undo 指令是 u,redo 指令是 Ctrl-r,其他編輯器的 undo redo 的顆粒度,都是由軟件自行控制,比如 Word 會把任何一個小的變動,記錄到 undo redo 的清單,用于后續回溯
VI 的 undo redo 機制不同,用戶每一次從 Normal-mode 進入 Insert-mode,完成編輯操作所做的所有修改,就是 undo 和 redo 可以控制的一個原子狀態:也就是說,用戶能通過有意識的退出 Insert-mode,主動控制 undo redo 的顆粒度 —— 寫代碼好處非常明顯,能快速回退到某一個編輯狀態
Tips 3. 剪貼板萬花筒
眾所周知,寫文章的第一神器是“復制、黏貼”,Word 等編輯器用的是系統剪貼板,保存的內容只有一份,遇到大量復制黏貼內容,用起來會很繁瑣,參考下面的場景
復制內容 a
將內容 a 黏貼到 x 處
復制內容 b
將內容 b 黏貼到 y 處
復制內容 a
將內容 a 黏貼到 z 處
上面介紹的操作場景,大家應該會經常遇到,這個時候要將鼠標飛快的從 a -> x -> b -> y -> a -> z,如果涉及更多的復制項,鼠標切換的會更加頻繁,遇到特別大的文檔時,來回的使用鼠標滾輪切換位置,會占用很多時間
VI 有一個剪貼板萬花筒,提供 26 個自定義剪貼板 register a~z,語法用起來非常簡單
復制的內容存儲到寄存器 a,后面可以反復使用;建議將經常黏貼的內容放到寄存器里,有需要用的地方,3 個按鍵 "xp 就能快速完成復制操作
Tips 4.全局定位
寫長文章時,經常要大幅度移動光標位置,VI 支持 mark 記號功能,將文本位置存儲起來,后面要用的時候,快速跳轉對應位置
Tips 5. 全文替換
全文替換是基礎能力,VI 這方面的能力非常強大,能夠精準選擇執行替換操作的范圍以及替換內容,參考下面說明:
# 將全文所有的“銅牌”換成“金牌” :%s/銅牌/金牌/g # 將第 1~10 行“銅牌”換成“金牌” :1,10s/銅牌/金牌/g # 將第 2~8 行的末尾添加句號 。 :2,8s/$/。/g
VI 的替換操作還支持正則表達式,可以對文本進行更精準的篩選,功能非常強大,建議上網查一下了解相關用法
注:VI 有趣用法還有很多,在這里不一一介紹,用戶可以在后續使用過程中,逐步揭開 VI 的神秘面紗
小測驗:請試用 VI 的剪貼板萬花筒和全局定位功能
Linux 編輯百寶箱
筆者在 HCIE Cloud 機試時有一個題目,要求修改 docker 容器下的數據庫配置文件 my.cnf,由于容器鏡像安裝的是精簡 Linux,默認不帶 VI 編輯器,遇到這種情況,該怎么處理呢?
大可不必慌張,Linux 可選編輯器種類多樣,稱之為編輯百寶箱也不為過,可任選最適合的一種完成文本編輯工作,下面分別舉例說明
cat
cat 經常用于文件內容顯示,如展示系統中已創建的用戶名,可以使用指令 cat /etc/passwd 查看
[root@hcie ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
cat 英文全稱是 concatenate 連接,連接操作的用法如下
cat file1 file2 >> file3
上面的操作將 file1 和 file2 文件內容拼接在一起,并導入到 file3 中
cat 也可用于向文件中寫入新的內容令:
cat << EOF >> /ect/mysql/my.cnf [mysqld] log-bin = mysql-bin server-id = 2 EOF
上面的指令往 my.cnf 文件末尾追加寫入鍵盤輸入的內容,直到遇到結束符 EOF 后,停止寫入操作;如果使用 > 替換 >>,則新輸入的內容將完全覆蓋原來文件中的內容
echo
echo 的用法和 cat 類似,也可以顯示出文件內容,支持文件內容編輯的方式和 cat 是一樣的
echo << EOF >> /ect/mysql/my.cnf
sed
sed 語法和 VI 的命令行指令類似,對讀入的文件進行逐行掃描,并根據 sed 語句定義的規則進行處理,參考下面命令
sed 's/old/new/g' file # 將文件中所有的 old 替換為 new sed '/old/ d' file # 將文件中含 old 單詞的行刪除 sed '/^hello/ d' file # 刪除文件中以 hello 開頭的行 sed '/world$/ d' file # 刪除文件中以 world 結尾的行
scp
有時候文檔保存在另一個 Linux 服務器上,只需要將文檔傳過來就行,這時候用 scp 指令最合適,參考下面指令
scp local_file remote_username@remote_ip:remote_folder # 將本地文件復制到遠端文件夾 scp local_file remote_username@remote_ip:remote_file # 將本地文件復制到遠端文件 scp -r local_folder remote_username@remote_ip:remote_folder # 將本地目錄復制到遠端文件夾
小測驗:將遠端文件和目錄復制到本地,命令應該怎么執行
實時更新信息,請關注微信公眾號和微博 齊月太白
點擊進入微博 齊月太白:https://weibo.com/moontaibai
Linux 彈性云服務器 ECS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。