Vim hacks

1,807 views

Published on

对使用vim的人会有帮助!!

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,807
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
31
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Vim hacks

  1. 1. VIM HacksWhyVim Vim 能幫助我們什麼 c9s / Cornelius 林佑安 AIINK.com
  2. 2. 編輯器
  3. 3. It doesn’t matter
  4. 4. It does matter
  5. 5. 好的編輯器帶你上天堂 差的編輯器帶你住套房
  6. 6. 敏捷開發
  7. 7. 敏捷
  8. 8. 太多 選擇
  9. 9. 想當年...
  10. 10. 年輕不懂事
  11. 11. 第一次
  12. 12. Microsoft Visual Studio
  13. 13. Eclipse
  14. 14. Code Block
  15. 15. Notepad++
  16. 16. 太多
  17. 17. 怎麼都沒有理想 中的編輯器呢? 鬱卒了....
  18. 18. 於是....
  19. 19. • 繼續嘗試其他編輯器
  20. 20. • 繼續嘗試其他編輯器 • 花銀子買 IDE , Editor
  21. 21. • 繼續嘗試其他編輯器 • 花銀子買 IDE , Editor • 又再寫一個 XXX Editor ..
  22. 22. • 繼續嘗試其他編輯器 • 花銀子買 IDE , Editor • 又再寫一個 XXX Editor .. • 又或者....
  23. 23. 筆記本
  24. 24. 自從不用 Microsoft Windows 之後 ...
  25. 25. GEdit
  26. 26. Emacs
  27. 27. TextMate
  28. 28. VIM
  29. 29. 最糟糕的 編輯方式
  30. 30. #!/usr/bin/env perl my $hppiness = COS::CUP();
  31. 31. #!/usr/bin/env perl my $hppiness = COS::CUP(); Oops! 少了 “a”
  32. 32. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  33. 33. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  34. 34. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  35. 35. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  36. 36. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  37. 37. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  38. 38. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  39. 39. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  40. 40. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  41. 41. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  42. 42. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  43. 43. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  44. 44. #!/usr/bin/env perl my $hppiness = COS::CUP(); x N
  45. 45. #!/usr/bin/env perl my $hppiness = COS::CUP();
  46. 46. #!/usr/bin/env perl my $happiness = COS::CUP();
  47. 47. #!/usr/bin/env perl my $happiness = COS::CUP(); 一百個類似的狀況 ?一百個類似的狀況 ?
  48. 48. #!/usr/bin/env perl my $happiness = COS::CUP(); 一百個類似的狀況 ? 糟
  49. 49. 浪費時間 移動游標
  50. 50. TheVIM way...
  51. 51. #!/usr/bin/env perl my $hppiness = COS::CUP(); VIM: F h
  52. 52. #!/usr/bin/env perl my $happiness = COS::CUP(); VIM: a append
  53. 53. VIM
  54. 54. VIM 不是
  55. 55. IDE
  56. 56. 不是...
  57. 57. 也不是...
  58. 58. 強而有力!!!
  59. 59. 強而有力!!! 喔喔喔喔!!!
  60. 60. VIM 是
  61. 61. VI Improved
  62. 62. 進階 編輯器
  63. 63. 提高
  64. 64. 文字 編輯 效率
  65. 65. Learning Curve
  66. 66. 各種Vim
  67. 67. 各種Vim • Vim
  68. 68. 各種Vim • Vim • gVim
  69. 69. 各種Vim • Vim • gVim • gVim Easy
  70. 70. 各種Vim • Vim • gVim • gVim Easy • MacVim
  71. 71. 各種Vim • Vim • gVim • gVim Easy • MacVim • Vi in Emacs
  72. 72. 各種Vim • Vim • gVim • gVim Easy • MacVim • Vi in Emacs • Vi in Bash
  73. 73. 各種Vim • Vim • gVim • gVim Easy • MacVim • Vi in Emacs • Vi in Bash • etc ...
  74. 74. Features
  75. 75. 1.編輯模式 Mode
  76. 76. 四種以上 編輯模式
  77. 77. INSERT NORMAL VISUAL SELECT... et cetera
  78. 78. [Ii]NSERT NORMAL [Vv]ISUAL ESC
  79. 79. 1.1 Normal Mode
  80. 80. Motion
  81. 81. 丟掉方向鍵吧
  82. 82. 節省 移動 時間
  83. 83. 請愛用
  84. 84. HJKL ←↓↑→
  85. 85. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { }
  86. 86. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } Cursor
  87. 87. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } [{
  88. 88. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } f@
  89. 89. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } $
  90. 90. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } ^
  91. 91. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } H 畫面最上方
  92. 92. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } M 畫面中間行
  93. 93. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } L 畫面最下方
  94. 94. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } 修改至行尾
  95. 95. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep } sub func1 { } C 並進入 Insert mode
  96. 96. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { }
  97. 97. # comments ... foreach my $foo ( @bar ) { # 做點事情 my @outs = grep /pattern/ , @list; } sub func1 { } %
  98. 98. :h motion.txt
  99. 99. 1.2 Insert Mode
  100. 100. Editing text
  101. 101. Insert Mode • i : Insert text before the cursor
  102. 102. • i : Insert text before the cursor • I : Insert text before the first non-blank in the line Insert Mode
  103. 103. • i : Insert text before the cursor • I : Insert text before the first non-blank in the line • a : Append text after the cursor Insert Mode
  104. 104. • i : Insert text before the cursor • I : Insert text before the first non-blank in the line • a : Append text after the cursor • A :Append text at the end of the line Insert Mode
  105. 105. 1.3 Visual Mode
  106. 106. Select region
  107. 107. Visual Mode • v : startVisual mode per character.
  108. 108. Visual Mode • v : startVisual mode per character. • V : startVisual mode linewise.
  109. 109. Visual Mode • v : startVisual mode per character. • V : startVisual mode linewise. • Ctrl-v : startVisual mode blockwise.
  110. 110. Visual Mode • v : startVisual mode per character. • V : startVisual mode linewise. • Ctrl-v : startVisual mode blockwise. 接上 operator 如 y (yank) , d (delete) , c (change) ... etc
  111. 111. 2.語法標記 Syntax Highlight Support
  112. 112. /opt/local/share/vim/vim72 $ ls -1 syntax/ | wc -l 520 包含五百多種語法設定檔
  113. 113. 可自訂 Syntax
  114. 114. ~/.vim/syntax/[filetype].vim
  115. 115. ~/.vim/syntax/[filetype].vim syn match [id] [re] [options]
  116. 116. ~/.vim/syntax/[filetype].vim syn match [id] [re] [options] syn region [id] start=[re] end=[re]
  117. 117. ~/.vim/syntax/[filetype].vim syn match [id] [re] [options] syn region [id] start=[re] end=[re] syn keyword [id] [keyword] ...
  118. 118. ~/.vim/syntax/[filetype].vim syn match [id] [re] [options] syn region [id] start=[re] end=[re] syn keyword [id] [keyword] ... hi [id] guibg=[color] ctermfg=[color]
  119. 119. :help syntax.txt
  120. 120. 3.編碼支援 ENCODING
  121. 121. :set fencs=utf-8,gbk,big5,euc-jp,utf-16le :set fenc=utf-8 enc=utf-8 tenc=utf-8
  122. 122. :set fencs=utf-8,gbk,big5,euc-jp,utf-16le :set fenc=utf-8 enc=utf-8 tenc=utf-8 設定檔案編碼清單
  123. 123. :set fencs=utf-8,gbk,big5,euc-jp,utf-16le :set fenc=utf-8 enc=utf-8 tenc=utf-8 設定檔案編碼清單 Vim 會從第一組編碼開始讀取檔案,若是 失敗則會跳下一組編碼讀取檔案
  124. 124. :set fencs=utf-8,gbk,big5,euc-jp,utf-16le :set fenc=utf-8 enc=utf-8 tenc=utf-8 檔案編碼
  125. 125. :set fencs=utf-8,gbk,big5,euc-jp,utf-16le :set fenc=utf-8 enc=utf-8 tenc=utf-8 內部編碼
  126. 126. :set fencs=utf-8,gbk,big5,euc-jp,utf-16le :set fenc=utf-8 enc=utf-8 tenc=utf-8 Terminal 編碼
  127. 127. :help encoding
  128. 128. 4. 快捷鍵 Key Mapping
  129. 129. :map :nmap :vmap :imap :smap :xmap ... more
  130. 130. :map (all) :nmap (normal mode) :vmap (visual mode) :imap (insert mode) :smap (select mode) :xmap (visual , select mode) ... more
  131. 131. :map (all) :nmap (normal mode) :vmap (visual mode) :imap (insert mode) :smap (select mode) :xmap (visual , select mode) ... more 最常用 最常用 最常用
  132. 132. :nmap <C-c><C-c> :!gcc -Wall % -o %:r.out<CR> Ctrl C Ctrl C 呼叫 GCC 編譯現在編輯的檔案 並將輸出檔名命名為現在檔案名稱並取代副檔名為 .out
  133. 133. nmap <tab> v> nmap <s-tab> v< vmap <tab> >gv vmap <s-tab> <gv Normal Mode 時,可用 Tab 及 Shift-Tab 做縮排
  134. 134. nmap <tab> v> nmap <s-tab> v< vmap <tab> >gv vmap <s-tab> <gv Visual/Select Mode 時,也可用 Tab 及 Shift-Tab 做縮排
  135. 135. nmap <tab> v> nmap <s-tab> v< vmap <tab> >gv vmap <s-tab> <gv Visual/Select Mode 時,也可用 Tab 及 Shift-Tab 做縮排 When mappings and menus are defined with the |:vmap| or |:vmenu| command they work both inVisual mode and in Select mode. When these are used in Select modeVim automatically switches toVisual mode, so that the same behavior as inVisual mode is effective.
  136. 136. imap <F2> <C-R>=strftime("%c")<CR> 在 Insert Mode 時,按下 F2 會插入時間戳記
  137. 137. cmap <c-a> <home> cmap <c-e> <end> cnoremap <c-b> <left> cnoremap <c-d> <del> cnoremap <c-f> <right> cnoremap <c-n> <down> cnoremap <c-p> <up> cnoremap <esc><c-b> <s-left> cnoremap <esc><c-f> <s-right> 讓 Command Mode 也有 Bash 的 Key Binding
  138. 138. :h map.txt
  139. 139. 5.文字物件 TEXT OBJECT
  140. 140. Text Object • word • string • paragraph • block ⇛ action (yank,delete,change ...etc)
  141. 141. v | c | d i | a { | [ | ( | “ | ‘ visual change delete Inner Object An Object Region { } [ ] ( ) “ “ ‘ ‘ Operator Mapping Operator
  142. 142. va{
  143. 143. function ( blah , blah ) ci( function ( ) function ( new_args )
  144. 144. “Hello World” di” “” “Hello New World”
  145. 145. 6.分頁支援 TAB PAPGES
  146. 146. :tabnew
  147. 147. :tabnew :tabedit path/to/file
  148. 148. :tabnew :tabedit path/to/file :tabfind path/to/file
  149. 149. :help tabpage.txt
  150. 150. 7.程式碼折疊 FOLDS
  151. 151. FOLD IS
  152. 152. Fold Methods
  153. 153. Syntax Fold Fold Methods
  154. 154. Syntax Fold Fold Methods :set foldmethod=syntax 以程式語言語法做為折疊規則。 某些特定的設定可以參考 $VIMRUNTIME/syntax/*.vim
  155. 155. 以 Perl 為例: /opt/local/share/vim/vim72/syntax/perl.vim if exists("perl_want_scope_in_variables") “ ..... if exists("perl_extended_vars") “ ..... if exists("perl_fold") “ ..... 便可在 .vimrc 內設定啟用這些特 定的語法標記或折疊 (Fold) let perl_fold = 1 let perl_extended_vars = 1 “ .... etc
  156. 156. Syntax Fold Marker Fold Fold Methods
  157. 157. Syntax Fold Marker Fold Fold Methods :set foldmethod=marker 以特定標記作為折疊規則, 預設是 “{{{“ 以及 “}}}”
  158. 158. # fold this {{{ function do_something { echo “COSCUP”; } # }}}
  159. 159. Syntax Fold Marker Fold Indent Fold Fold Methods
  160. 160. Syntax Fold Marker Fold Indent Fold Fold Methods :set foldmethod=indent 以縮排作為折疊規則
  161. 161. Syntax Fold Marker Fold Indent Fold Manual Fold Fold Methods
  162. 162. :set foldmethod=manual 手動建立折疊區塊, 以 z f 鍵建立。
  163. 163. 利用 autocmd 加上 mkview , loadview 來儲存手動建立 的折疊區塊,儲存的折疊會被放在 ~/.vim/view/ 裡頭。 autocmd BufWinLeave *.* silent mkview autocmd BufWinEnter *.* silent loadview
  164. 164. Syntax Fold Marker Fold Indent Fold Manual Fold Expr Fold (Custom Fold Function) Fold Methods
  165. 165. :set foldexpr=MyFoldLevel(v:lnum) 呼叫自訂的折疊函式
  166. 166. Syntax Fold Marker Fold Indent Fold Manual Fold Expr Fold (Custom Fold Function) Diff Fold Fold Methods
  167. 167. 8.Modeline & FileType
  168. 168. ModeLine
  169. 169. " vim:fdm=marker:sw=2:ts=2:et:fdl=0: "============================ " Author: Cornelius < cornelius.howl{at}gmail{dot}com >
  170. 170. " vim:fdm=marker:sw=2:ts=2:et:fdl=0: "============================ " Author: Cornelius < cornelius.howl{at}gmail{dot}com > 開啟此檔時,使用 Marker 作為折疊, 縮排為兩個空隔,將 Tab 延展為空白, 折疊所有的 Fold (Level 0 以上)
  171. 171. FileType
  172. 172. ~/.vim/ftplugin/ruby.vim 針對某種檔案類型的設定 不一定都要寫在 vimrc 內
  173. 173. ~/.vim/filetype.vim 可在 filetype.vim 內定義新 的檔案類型。
  174. 174. 9.格式化 FORMATTING
  175. 175. 程式碼很亂,怎麼辦?
  176. 176. 要手動自己排嗎?
  177. 177. :set equalprg=perltidy
  178. 178. :set equalprg=perltidy 選擇文字區塊後,按下 “=” 鍵,可使用 外部的 perltidy 程式來做格式化處理。 可針對特定區塊重新排列程式碼
  179. 179. autocmd Filetype perl :set equalprg=perltidy 可使用 autocmd 針對檔案類型做 equalprg 設定
  180. 180. autocmd Filetype c :set equalprg=indent 開啟 C 程式碼時,使用外部的 GNU Ident 程式來做格式化處理。
  181. 181. SQL $ cat bin/sql-beautify.pl #!/usr/bin/env perl use warnings; use strict; use SQL::Beautify; local $/; my $sql = SQL::Beautify->new( query => <STDIN> , spaces => 4 , break => "n" ); print $sql->beautify; autocmd Filetype sql :set equalprg=sql-beautify.pl 開啟 SQL 程式碼時,使用外部的 Filter 來做格式化處理。
  182. 182. 10. QuickFix
  183. 183. :grep & :make
  184. 184. :grep [pattern] [filepath]
  185. 185. :grep [pattern] [filepath] 呼叫 grepprg (預設 vimgrep) 執行,並 將 grep 的結果彙整至 QuickFix
  186. 186. QuickFix Window
  187. 187. :set grepprg=/path/to/grep 設置 grepprg (預設VIM 內建 grep)
  188. 188. :make
  189. 189. :make 呼叫 makeprg (預設 make) 執行 Makefile. 並以該語言的 compiler output parser 彙整結果。
  190. 190. :set makeprg=gmake 設置 makeprg (預設 make)
  191. 191. Result ⇛ QuickFix Window
  192. 192. :copen 開啟 QuickFix Window
  193. 193. :cclose 關閉 QuickFix Window
  194. 194. :cnext 下一筆 Result
  195. 195. :cprevious 上一筆 Result
  196. 196. com! -bang -nargs=? QFix cal QFixToggle(<bang>0) fu! QFixToggle(forced) if exists("g:qfix_win") && a:forced == 0 cclose unlet g:qfix_win else copen 10 let g:qfix_win = bufnr("$") en endf nn <leader>q :QFix<cr> QuickFix Window Toggle
  197. 197. com! -bang -nargs=? QFix cal QFixToggle(<bang>0) fu! QFixToggle(forced) if exists("g:qfix_win") && a:forced == 0 cclose unlet g:qfix_win else copen 10 let g:qfix_win = bufnr("$") en endf nn <leader>q :QFix<cr> QuickFix Window Toggle nmap 至 “q” , <leader> 預設為 “” 鍵
  198. 198. 11. 插件 Plugin
  199. 199. SnipMate 提供類似 TextMate 編輯器的 程式碼片段完成功能。
  200. 200. snippet cla class .. initialize .. end class ${1:`substitute(Filename(), '^.', 'u&', '')`} def initialize(${2:args}) ${3} end end 自訂常用程式碼樣板
  201. 201. DBExt.vim 資料庫輔助插件,支援 Oracle, Sybase, MSSQL , MySQL, DBI 等等
  202. 202. xml.vim 提供 XML 相關輔助功能, 如自動補完標籤等等。
  203. 203. FuzzyFinder.vim Fuzzy/Partial pattern explorer
  204. 204. The_NERD_TREE.vim 樹狀目錄檔案瀏覽
  205. 205. The NERD Commenter 註解輔助工具
  206. 206. taglist.vim 透過 ctags 工具產生程式碼標籤 並可將 macro , function , variable 等資料整理出來
  207. 207. cscope C 程式碼追蹤輔助
  208. 208. autocomplpop.vim
  209. 209. MRU most recently used
  210. 210. bufexplorer.vim Buffer Explorer
  211. 211. Rails.vim
  212. 212. git-vim
  213. 213. 那麼,怎麼安裝呢?
  214. 214. 最原始的作法
  215. 215. 下載套件
  216. 216. 閱讀安裝步驟
  217. 217. 閱讀安裝步驟 太繁瑣!
  218. 218. 閱讀安裝步驟 太繁瑣!
  219. 219. VimanaVim script Manager
  220. 220. • Vimball • Archive File ( zip , rar ) • .vim file
  221. 221. POWERED BY Perl
  222. 222. $ cpan Vimana 使用 CPAN 安裝Vimana
  223. 223. $ vimana search xml 搜尋
  224. 224. $ vimana search xml rrd.vim - Edit RRD data with Vim. qt.vim - tiny tool for the uic used in Qt from Trolltech syntax-for-xul - Highlighting for XML User interface Language. maven2.vim - Compiler plugin for maven2 .... skip
  225. 225. $ vimana info xml.vim 查詢 script 資訊
  226. 226. $ vimana install xml.vim 安裝 xml.vim 外掛
  227. 227. $ vimana install xml.vim $ vimana install rails.vim $ vimana install the-nerd-tree.vim $ vimana install taglist.vim $ vimana install snipmate $ vimana install fuzzyfinder.vim etc ... ALL Works
  228. 228. http://github.com/c9s/Vimana/tree/master Git Repository
  229. 229. ENJOY
  230. 230. ThankYou
  231. 231. Demo 如果有時間....
  232. 232. Q & A

×