Practical Vim Edit Text at the Speed of Thought筆記

Foreword
Vim is highly configurable. However, customization is a personal thing, so I’ve tried to avoid recommending what should or should not go into your vimrc file. Instead, Practical Vim focuses on the core functionality of the editor—the stuff that’s always there, whether you’re working over SSH on a remote server or using a local instance of GVim, with plugins installed to add extra functionality. Master Vim’s core, and you’ll gain portable access to a text editing power tool.
Learn to Touch Type, Then Learn Vim
If you have to look down to find the keys on the keyboard, the benefits of learning Vim won’t come fast. Learning to touch type is imperative.
Get to Know Vim’s Built-in Documentation
The best way to get to know Vim’s documentation is by spending time in it. To help out, I’ve included 「hyperlinks」 for entries in Vim’s documentation. For example, here’s the 「hyperlink」 for the Vim tutor: :h vimtutor. 正則表達式

Chapter 1. The Vim Way
本章核心理念:減小重複操做 從不一樣的操做中提煉共同點 靈活使用.重複修改 shell

1.Meet the Dot Command
The dot command lets us repeat the last change. It is the most powerful and
versatile command in Vim.
======== 用<與>縮進(:h >) express

2.Don’t Repeat Yourself
尋找操做中重複步驟加以簡化 i.e.如要在當前行開始5行末尾增長分號 能夠先$a;<ESC> 而後5次j$. 優化先A;<ESC> 而後j.
要作到這點先要熟悉經常使用修改鍵的變種C=c$ s=cl S=^C I=^i A=$a o=$<CR> O=ko
3.Take One Step Back, Then Three Forward
第一步費操做 方便後面用.來重複操做 vim

======== 用;與,重複最近一次f/t查找命令
4.Act, Repeat, Reverse
熟練使用u來撤銷修改 用成對的移動/查找指令來來回切換 i.e. ;/, f/F t/T n/N
======== 用&重複最近一次替換 app

5.Find and Replace by Hand
======== *即反向#
======== */#前加g爲非全字匹配
======== gd/gD 跳轉本地/全局聲明 ide

6.Meet the Dot Formula
One Keystroke to Move, One Keystroke to Execute
將移動與修改操做區別開來(修改操做容易使用.重複) 優化

 

Part 1 ---- Modes ============================================================== ui

Chapter 2. Normal Mode
本章簡述普通模式下經常使用技巧
要點:儘可能用重複(repeat)指令而不要用計數(count)指令來重複操做(計數須要數數 下降效率 此外計數操做不利於以後重複操做 i.e.刪除兩個單詞(d2w)後再次刪除一個單詞 不如dw後..) lua

7.Pause with Your Brush Off the Page spa

8.Chunk Your Undos
在恰當的位置退出insert mode後從新插入 而非從頭至尾一次性打完代碼 能夠更方便的使用u來撤銷 i.e.每修改一行<ESC>一下
++++++++ 習慣用normal mode的h j k l移動 而不是在insert mode中用<UP> <DOWN> <LEFT> <RIGHT>移動

9.Compose Repeatable Changes
======== daw刪除整個單詞 無需先b到單詞頭部再dw (仍是方便.重複操做 後者.只會執行dw 刪除不完整單詞)
======== aw(a word) 一個單詞(包含空格) iw(inner word) 一個單詞(不包含空格) 相似還有ap ip as is a( i( a[ i[ 具體:h可查
======== c d v後面不光能夠接w b p 還能夠接/xxx 具體能夠:h operator查看操做符 :h motion查看位移符

10.Use Counts to Do Simple Arithmetic
======== <C-a>與<C-x>能夠增長/減小光標所在(或光標右側最近)的數字

11.Don’t Count If You Can Repeat
repeat指令像是原子指令 能夠重複利用 而count指令下降可重複利用性

12.Combine and Conquer
======== gu/gU/g~修改大小寫 i.e.guaw將當前光標所在單詞改成小寫 這樣就不用bvwu了(其實我以爲這樣也挺方便 可是不利於重複)

Chapter 3. Insert Mode
本章大部分大部分技巧於我自身習慣並不合適 故略記

13.Make Corrections Instantly from Insert Mode
Touch typing is more than just not looking at the keyboard; it means doing it by feel. When touch typists make an error, they know it even before their eyes process the information on the screen in front of them. They feel it in their fingers, like a misplaced step.
提高打字速度(每分鐘60個單詞) 單個錯誤能夠直接刪除錯誤後從新鍵入(尼瑪臣妾作不到啊)
======== insert mode下分別刪除一個字符(退格)<C-h> 一個單詞<C-w> 一行<C-u>

14.Get Back to Normal Mode
======== <C-[> insert mode下可切換至normal mode 效果同<ESC>
======== <C-o> insert mode下可切換至insert normal mode (insert normal mode 可執行一次normal mode命令而後回到insert mode)

15.Paste from a Register Without Leaving Insert Mode
++++++++ 重映射Caps Lock 防止使用k l移動時變爲K L (很是贊成! 可是更好的辦法是使用<C-[>來退出 使用SHIFT gu gU來大小寫) 可映射爲<ESC>
======== 附註: H L 光標移到頂部/底部 J 合併兩行 K 在man page中查找光標所在字符串
======== 用<C-r>{register}在insert mode下粘貼

16.Do Back-of-the-Envelope Calculations in Place
======== 用<C-r>=在insert mode下輸入數學表達式可直接得到結果

17.Insert Unusual Characters by Character Code
======== <C-v>{num} 輸入num對應的ASCII字符
======== 用ga :as獲取光標所在字符的ASCII碼

18.Insert Unusual Characters by Digraph

19.Overwrite Existing Text with Replace Mode
======== gR進入virtual replace mode 與普通replace mode區別在於tab被看作8個字符 只有當替換字符超過8個時tab纔會被替換

Chapter 4. Virtual Mode
本章要點:始終記住visual mode下命令是對全部行/列/區域執行的 注意命令對全部行/列/區域都適用

20.Grok Visual Mode

21.Define a Visual Selection
======== gv重選上次選擇的區域
======== visual mode下o/O切換選擇方向

22.Repeat Line-Wise Visual Commands

23.Prefer Operators to Visual Commands Where Possible

24.Edit Tabular Data with Visual-Block Mode
用visual-block mode修改塊狀數據

25.Change Columns of Text
多列修改

26.Append After a Ragged Visual Block
不規則矩形區域修改
======== visual mode下插入用I/A i/a不是插入鍵

Chapter 5. Command-Line Mode

27.Meet Vim’s Command Line
======== ex mode命令: delete yank put copy move join normal substitutue global
======== ex mode命令範圍符: .當前行 $最後行 %=.,$ 所有範圍 't mark t位置 /xxx/ 匹配xxx \/ 上次搜索 \?上次搜索(反向) \& 上次替換 每一個命令後都可加+/- num偏移位置
======== ex mode也有<C-w> <C-u>

28.Execute a Command on One or More Consecutive Lines

29.Duplicate or Move Lines Using ‘:t’ and ‘:m’ Commands
======== :copy {addr}命令縮寫:co :t 後跟地址表示拷貝到所在行以後 如需拷貝到文件首 使用0表示第0行後(實際並無第0行)
======== 複製當前行:t. 至關於normal mode下yyp 區別在於yyp使用寄存器 :t.不使用寄存器(重要:不覆蓋默認寄存器值)
++++++++ 對於複製較遠的行使用:t.無需來回切換光標所在位置 使用較方便
======== 重複最後一次command mode命令@:

30.Run Normal Mode Commands Across a Range
======== :normal {cmd}命令對選定範圍內每行執行cmd命令

31.Repeat the Last Ex Command

32.Tab-Complete Your Ex Commands
======== <TAB>補全command mode命令
======== <C-d>列出全部可選命令

33.Insert the Current Word at the Command Prompt
======== <C-r><C-w>在command mode下複製光標所在字符(一個word) 經常使用於加速替換命令 i.e. %s//<C-r><C-w>/g
======== <C-r><C-a>複製一個WORD

34.Recall Commands from History
======== <C-p> <C-n>在command mode下做用同<UP> <DOWN> 區別在於前者不能根據已鍵入內容過濾歷史命令 但後者難鍵入 因此建議將前者映射爲後者 i.e. cnoremap <C-p> <UP>
======== q:打開command-line window command-line window下能夠正常編輯命令(就像編輯文本同樣) 而後執行新命令
======== 同理q? q/打開搜索記錄窗口
======== <C-f>在command mode下可切換至command-line window

35.Run Commands in the Shell
======== :! 命令是在shell中執行的 :命令是vim中執行的

 

Part 2 ---- Files ==============================================================

Chapter 6. Manage Multiple Files
本章重點:<C-w>命令集

36.Track Open Files with the Buffer List
++++++++ <C-^>做用同:b# 使用前者來替代後者加速切換
======== :bd命令前可加範圍 i.e. :%bd 刪除全部buffer

37.Group Buffers into a Collection with the Argument List
======== argument list與buffer區別: 後者僅僅是個緩衝文件 前者更像是文件集合 能夠對argument list總體操做 但不能對buffer總體操做
======== :args 列出文件列表 若是後面跟參數可向argument list添加文件

38.Manage Hidden Files

39.Divide Your Workspace into Split Windows
======== <C-w>s <C-w>v可橫向/縱向分割窗口(才知道 一直都是:vertical split)
======== <C-w>c關閉窗口(close) <C-w>o關閉除此之外窗口(only)
======== <C-w>=均勻顯示窗口大小
======== <C-w>_最大化當前窗口高度 若是命令前加數字 按數字大小行數顯示
======== <C-w>|最大化當前窗口寬度 若是命令前加數字 按數字大小列數顯示

40.Organize Your Window Layouts with Tab Pages
======== <C-w>T將當前buffer在新標籤頁中打開(必須是多buffer狀態)
++++++++ gt gT切換標籤頁(效果同:tabn :tabp) 使用前者來代替後者加速切換

Chapter 7. Open Files and Save Them to Disk
本章重點:利用find命令直接打開文件 只讀文件的保存

41.Open a File by Its Filepath Using ‘:edit’
======== :e % 編輯當前文件
======== :e %:h 編輯當前目錄 能夠重映射該鍵cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h').'/' : '%%'

42.Open a File by Its Filename Using ‘:find’
======== :find 直接查找並打開文件
======== :set path+= 添加文件搜索路徑 使用**匹配全部搜索目錄 *匹配全部當前目錄文件名 詳情請:h file-searching

43.Explore the File System with netrw
======== :Explore 等於:edit .

44.Save Files to Nonexistent Directories

45.Save a File as the Super User
======== 修改只讀文件後保存的辦法 :w !sudo tee % > /dev/null 命令詳解 :write !{cmd}將文件內容做爲輸入傳給cmd 其中%被vim解析爲當前文件 tee命令將輸入內容寫到輸出

 

Part 3 ---- Getting Around Faster ==============================================

Chapter 8. Navigate Inside Files with Motions
本章重點:真實行與顯示行的區別 如何在顯示行內移動

46.Keep Your Fingers on the Home Row

47.Distinguish Between Real Lines and Display Lines
======== real line與display line區別: j / k在real line之間移動 gj / gk在display line之間移動 0 / ^ / $ 均有相似對應鍵

48.Move Word-Wise
======== e的反向移動ge

49.Find by Character

50.Search to Navigate
======== 刪除一段代碼的快捷方式v進入visual mode /xxx跳到文字段末尾 h取消多選中的字符 d刪除

51.Trace Your Selection with Precision Text Objects

52.Delete Around, or Change Inside
++++++++ 習慣用ciw 而非viwc

53.Mark Your Place and Snap Back to It
======== m{reg} 添加標記 '{reg} 跳轉標記
======== ''跳轉上次標記 '.跳轉最近修改 '^跳轉最近插入 '[ / ']跳轉最近複製起始 / 結尾 '< / '>跳轉最近選定起始 / 結尾

54.Jump Between Matching Parentheses

Chapter 9. Navigate Between Files with Jumps
與第六章(多文件管理)的命令結合使用

55.Traverse the Jump List

56.Traverse the Change List
======== g; / g,跳轉最近修改記錄 詳情請:h changelist 與53條合用保證來回跳轉

57.Jump to the Filename Under the Cursor
======== gf跳轉文件
======== 增長文件類型 :set suffixesadd+=.c
======== 查看文件路徑 :set path? 增長文件路徑 :set path +=

58.Snap Between Files Using Global Marks
======== m{letter} 當letter爲小寫字母是表明本地mark 不能跳出本文件 當letter爲大寫字母時表明全局mark 可在文件中跳轉

 

Part 4 ---- Registers ==========================================================

Chapter 10. Copy and Paste

59.Delete, Yank, and Put with Vim’s Unnamed Register

60.Grok Vim’s Registers
======== :reg查看register
======== register的使用:在普通命令前加"x x爲寄存器名
======== "是unnamed register 保存默認的最近修改的內容
++++++++ 0是yank register 存最近yank的數據 使用0就不用擔憂先yank後delete會將"寄存器的數據沖掉
======== _是black hole register
++++++++ :version查看vim版本
======== +是system register *是selection register =是expression register

61.Replace a Visual Selection with a Register
++++++++ 注意當使用unnamed register替換文字後寄存器數據就被改變了 若要再次替換需用"0

62.Paste from a Register
++++++++ insert mode下粘貼<C-r>" / <C-r>0

63.Interact with the System Clipboard

Chapter 11. Macros

64.Record and Execute a Macro

65.Normalize, Strike, Abort
++++++++ Normalize the Cursor Position 保證每次執行宏時都能復位到正常位置
++++++++ Strike Your Target with a Repeatable Motion 使用可重複的光標移位技巧
++++++++ Abort When a Motion Fails 利用光標移位失敗不執行以後的命令來忽略命令執行次數

66.Play Back with a Count
++++++++ 利用; , .命令結合macro達到高效輸入

67.Repeat a Change on Contiguous Lines
======== 串行方式{cnt}@{reg} 每一個命令依次執行 須要在命令後增長motion 一次失敗後面均不執行
======== 並行方式選定目標行 :normal @{reg} 命令同時執行 無需在命令後增長motion 失敗時僅跳過改行
++++++++ 並行命令與串行命令比較: 根據狀況靈活使用

68.Append Commands to a Macro
======== 向寄存器x的大寫寄存器X鍵入命令會將其添加在x尾部 而非保存在X中 這個功能可使咱們向寄存器中添加命令

69.Act Upon a Collection of Files

70.Evaluate an Iterator to Number Items in a List
======== :let命令聲明變量 :echo打印變量值
======== 在insert mode下插入表達式值 <C-r>=x<CR> 說明:<C-r>插入一個寄存器內容 =表達式寄存器 後跟表達式x

71.Edit the Contents of a Macro
======== normal mode下粘貼宏 :put x(x爲register名)

 

Part 5 ---- Patterns ===========================================================

Chapter 12. Matching Patterns and Literals

72.Tune the Case Sensitivity of Search Patterns

73.Use the \v Pattern Switch for Regex Searches
======== \v使用智能正則搜索(very magic search) 即特殊字符無需用backslash轉義 默認爲特殊含義 \V相反 默認全部字符爲字符本義(very nomagic search) 詳情:h \v
======== i.e. /\v<leader>匹配leader單詞 由於<>被解釋爲單詞首尾界定符(\v默認轉義含義) /\V<leader>匹配<leader> 即字面單詞
======== i.e. /\v\<leader\>匹配<leader> 由於\< \>被轉爲普通< > /\V\<leader\>匹配leader單詞 由於\< \>被轉義爲單詞首尾界定符

74.Use the \V Literal Switch for Verbatim Searches
======== \V與\v相反 強制認爲字符爲普通字符 轉義字符需用\顯示標記出來
======== i.e. /V.ID 能夠匹配VOID或V.ID /\VV.ID智能匹配V.ID 注意\V必須加在前面 放在後面無效

75.Use Parentheses to Capture Submatches
======== <>匹配單詞邊界 \_s匹配空格或換行 \1 \2 ... \9匹配匹配單詞的子匹配

76.Stake the Boundaries of a Word
======== <>匹配的單詞被稱爲zero width item 僅匹配單詞自己

77.Stake the Boundaries of a Match
======== \zs \ze匹配輸入pattern的submatch 即匹配整個函式 對結果匹配\zs \ze之間內容 可被屢次使用 最終結果爲最後一次起效
======== i.e. /^\s*\zsif 匹配以(包含若干空格的)if開始的行 匹配結果忽略了if前的空格

78.Escape Problem Characters
======== 強制取消字符轉義 escape(string, char) 詳情請:h escape()
======== 獲取命令類型 getcmdtype()

Chapter 13. Search

79.Meet the Search Command
++++++++ 當backward搜索時 可使用N反轉搜索 也可使用/<CR>反轉搜索方向後n繼續搜索

80.Highlight Search Matches

81.Preview the First Match Before Execution

82.Count the Matches for the Current Pattern
======== 如何計數最近搜索字符的出現次數:%s///gn
======== 解釋 n表示不進行替換 ///表示搜索字符爲空(默認使用上次搜索字符) 替換字符爲空(n存在時替換字符非空也同樣不替換) 注意///不能少一條 不然就變成用gn替換上次搜索的內容了

83.Offset the Cursor to the End of a Search Match
======== //跳轉到最近搜索字符的下一次出現位置 //e跳到該字符的末尾

84.Operate on a Complete Search Match

85.Create Complex Patterns by Iterating upon Search History
======== vim搜索策略默認爲貪心匹配 解決辦法強制跳過相同字符
======== i.e. /\v'.+'會匹配多個'的詞組 /\v'[^']+'只能匹配成對的' 改進版/\v(([^']|'\w)+)' 保證能識別won't這類字符
++++++++ 記得使用q/來修改正則表達式
++++++++ 在一組字符/詞組/語法外加括號 c{motion}(<C-r>")<ESC> 技巧在於"寄存器保存內容正是c{motion}改變前的內容
======== 將成對的'替換爲"的辦法 :%s/\v'(([^']|'\w)+)'/「\1」/g
======== \w匹配word等於[0-9A-Za-z_] 相似還有\s匹配space \d匹配digtal等於[0-9] \x匹配hex等於[0-9A-Fa-f] \o匹配octal等於[0-7] \l匹配lowercase等於[a-z] \u匹配uppercase等於[A-Z] 以及以上特殊字符的大寫 表明不匹配對應內容

86.Search for the Current Visual Selection
======== xnoremap * :<C-u>call <SID>VSetSearch()<CR>/<C-R>=@/<CR><CR>
======== xnoremap # :<C-u>call <SID>VSetSearch()<CR>?<C-R>=@/<CR><CR>
======== function! s:VSetSearch()
======== let temp = @s
======== norm! gv"sy
======== let @/ = '\V' . substitute(escape(@s, '/\'), '\n', '\\n', 'g')
======== let @s = temp
======== endfunction

Chapter 14. Substitution

87.Meet the Substitute Command
======== 替換命令flag: g全局 c確認 n不作實際替換動做 &使用上次替換命令的flag
======== 替換命令symbol:\0 \1 \2表明匹配整個函式 子函式1 子函式2

88.Find and Replace Every Match in a File

89.Eyeball Each Substitution

90.Reuse the Last Search Pattern

91.Replace with the Contents of a Register
======== :%s//\=@0/g //表明搜索pattern使用最近pattern \=表示獲取vim腳本表達式 @0表示寄存器0

92.Repeat the Previous Substitute Command
======== 三種重複替換動做(對整個文件) g& :%&& :%s//~/&

93.Rearrange CSV Fields Using Submatches

94.Perform Arithmetic on the Replacement
======== /\v\<\/?h\zs\d :%s//\=submatch(0)-1/g 前者匹配<h1 <h2 <\h1等單詞 後者將數字減1

95.Swap Two or More Words
======== /\v(<man>|<dog>) :%s//\={"dog":"man","man":"dog"}[submatch(1)]/g 前者匹配man與dog 後者交換兩個單詞位置

96.Find and Replace Across Multiple Files
======== 對整個工程文件執行替換命令 :args **/*.txt :set hidden :argdo %s/.../.../g
======== 第一個命令添加當前路徑下全部文件 第二個命令容許修改文件後不保存直接跳轉到其它文件 第三個命令執行替換

Chapter 15. Global Commands

97.Meet the Global Command
======== :[range] global[!] /{pattern}/ [cmd] 命令對全部符合匹配的行執行命令 詳情請:h :g
======== :g 默認範圍爲% 整個文件 這與:d :s :normal默認範圍爲一行的不一樣
======== [cmd]可爲空 此時使用:print打印匹配結果
======== global!或vglobal可強制在全部行執行

98.Delete Lines Containing a Pattern
======== :g//d 刪除全部包含知足匹配字符串的行
======== :v(即:vglobal) 爲:g相副作用 i.e. :v//d 刪除全部不包含知足匹配字符串的行

99.Collect TODO Items in a Register
======== :g/{pattern}/y {reg} 可將匹配行保存至寄存器 注意{reg}必須大寫(即以append形式添加在reg裏) 如用小寫執行每行命令時都會將其替換

100.Alphabetize the Properties of Each Rule in a CSS File
++++++++ 記住[cmd]也支持[range] i.e. :g/{/ .+1,/}/-1 sort 首先匹配{的行對.+1到/}/-1的行執行sort命令 .+1即當前行的下一行 /}/-1即匹配}的前一行

 

Part 6 ---- Tools ==============================================================

Chapter 16. Index and Navigate Source Code with ctags

101.Meet ctags

102.Configure Vim to Work with ctags
======== :set tags? 查看tags路徑
======== :autocmd BufWritePost * call system("ctags -R") 保存文件時自動更新tags

103.Navigate Keyword Definitions with Vim’s Tag Navigation Commands

Chapter 17. Compile Code and Navigate Errors with the Quickfix List

104.Compile Code Without Leaving Vim

105.Browse the Quickfix List

106.Recall Results from a Previous Quickfix List

107.Customize the External Compiler

Chapter 18. Search Project-Wide with grep, vimgrep, and Others

108.Call grep Without Leaving Vim

109.Customize the grep Program

110.Grep with Vim’s Internal Search Engine

Chapter 19. Dial X for Autocompletion

111.Meet Vim’s Keyword Autocompletion
======== 自動補全命令 <C-x><C-i>索引頭文件關鍵字補全 <C-x><C-]>索引tags關鍵字補全 <C-x><C-l>按行補全

112.Work with the Autocomplete Pop-Up Menu

113.Understand the Source of Keywords

114.Autocomplete Words from the Dictionary

115.Autocomplete Entire Lines

116.Autocomplete Filenames

117.Autocomplete with Context Awareness

Chapter 20. Find and Fix Typos with Vim’s Spell Checker

118.Spell Check Your Work

119.Use Alternate Spelling Dictionaries

120.Add Words to the Spell File

121.Fix Spelling Errors from Insert Mode

Chapter 21. Now What? ======== Keep Practicing! ======== Make Vim Your Own ======== Know the Saw, Then Sharpen It

相關文章
相關標籤/搜索