狠狠撸

狠狠撸Share a Scribd company logo
VIM HacksWhyVim
Vim 能幫助我們什麼
c9s / Cornelius
林佑安
AIINK.com
编辑器
It doesn’t matter
It does matter
好的编辑器帶你上天堂
差的编辑器帶你住套房
敏捷开发
敏捷
太多
選擇
想当年...
年轻不懂事
第一次
Microsoft
Visual Studio
Eclipse
Code Block
Notepad++
太多
怎麼都沒有理想
中的编辑器呢?
鬱卒了....
於是....
? 繼續嘗試其他编辑器
? 繼續嘗試其他编辑器
? 花銀子買 IDE , Editor
? 繼續嘗試其他编辑器
? 花銀子買 IDE , Editor
? 又再寫一個 XXX Editor ..
? 繼續嘗試其他编辑器
? 花銀子買 IDE , Editor
? 又再寫一個 XXX Editor ..
? 又或者....
笔记本
自從不用 Microsoft
Windows 之後 ...
GEdit
Emacs
TextMate
VIM
Vim hacks
最糟糕的
編輯方式
#!/usr/bin/env perl
my $hppiness = COS::CUP();
#!/usr/bin/env perl
my $hppiness = COS::CUP();
Oops!
少了 “a”
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
x N
#!/usr/bin/env perl
my $hppiness = COS::CUP();
#!/usr/bin/env perl
my $happiness = COS::CUP();
#!/usr/bin/env perl
my $happiness = COS::CUP();
一百個類似的狀況 ?一百個類似的狀況 ?
#!/usr/bin/env perl
my $happiness = COS::CUP();
一百個類似的狀況 ?
糟
浪費時間
移動游標
TheVIM way...
#!/usr/bin/env perl
my $hppiness = COS::CUP();
VIM:
F h
#!/usr/bin/env perl
my $happiness = COS::CUP();
VIM:
a append
VIM
VIM 不是
IDE
不是...
Vim hacks
也不是...
强而有力!!!
强而有力!!!
喔喔喔喔!!!
VIM 是
VI Improved
進階
编辑器
提高
文字
編輯
效率
Learning Curve
各种痴颈尘
各种痴颈尘
? Vim
各种痴颈尘
? Vim
? gVim
各种痴颈尘
? Vim
? gVim
? gVim Easy
各种痴颈尘
? Vim
? gVim
? gVim Easy
? MacVim
各种痴颈尘
? Vim
? gVim
? gVim Easy
? MacVim
? Vi in Emacs
各种痴颈尘
? Vim
? gVim
? gVim Easy
? MacVim
? Vi in Emacs
? Vi in Bash
各种痴颈尘
? Vim
? gVim
? gVim Easy
? MacVim
? Vi in Emacs
? Vi in Bash
? etc ...
Features
1.編輯模式
Mode
四種以上
編輯模式
INSERT
NORMAL
VISUAL
SELECT... et cetera
[Ii]NSERT
NORMAL
[Vv]ISUAL
ESC
1.1 Normal Mode
Motion
Vim hacks
丢掉方向键吧
節省
移動
時間
请爱用
HJKL
←↓↑→
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
Cursor
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
[{
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
f@
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
$
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
^
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
H
畫面最上方
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
M
畫面中間行
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
L 畫面最下方
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
修改至行尾
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep
	 	
}
sub func1 {
}
C
並進入 Insert mode
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
# comments ...
foreach my $foo ( @bar ) {
# 做點事情
my @outs = grep /pattern/ , @list;
	 	
}
sub func1 {
}
%
:h motion.txt
1.2 Insert Mode
Editing text
Insert Mode
? i : Insert text before the cursor
? i : Insert text before the cursor
? I : Insert text before the ?rst non-blank in the
line
Insert Mode
? i : Insert text before the cursor
? I : Insert text before the ?rst non-blank in the
line
? a : Append text after the cursor
Insert Mode
? i : Insert text before the cursor
? I : Insert text before the ?rst non-blank in the
line
? a : Append text after the cursor
? A :Append text at the end of the line
Insert Mode
1.3 Visual Mode
Select region
Visual Mode
? v : startVisual mode per character.
Visual Mode
? v : startVisual mode per character.
? V : startVisual mode linewise.
Visual Mode
? v : startVisual mode per character.
? V : startVisual mode linewise.
? Ctrl-v : startVisual mode blockwise.
Visual Mode
? v : startVisual mode per character.
? V : startVisual mode linewise.
? Ctrl-v : startVisual mode blockwise.
接上 operator 如 y (yank) , d
(delete) , c (change) ... etc
2.語法標記
Syntax Highlight Support
/opt/local/share/vim/vim72
$ ls -1 syntax/ | wc -l
520
包含五百多種語法設定檔
可自訂 Syntax
~/.vim/syntax/[filetype].vim
~/.vim/syntax/[filetype].vim
syn match [id] [re] [options]
~/.vim/syntax/[filetype].vim
syn match [id] [re] [options]
syn region [id] start=[re] end=[re]
~/.vim/syntax/[filetype].vim
syn match [id] [re] [options]
syn region [id] start=[re] end=[re]
syn keyword [id] [keyword] ...
~/.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]
:help syntax.txt
3.編碼支援
ENCODING
:set fencs=utf-8,gbk,big5,euc-jp,utf-16le
:set fenc=utf-8 enc=utf-8 tenc=utf-8
:set fencs=utf-8,gbk,big5,euc-jp,utf-16le
:set fenc=utf-8 enc=utf-8 tenc=utf-8
設定檔案編碼清單
:set fencs=utf-8,gbk,big5,euc-jp,utf-16le
:set fenc=utf-8 enc=utf-8 tenc=utf-8
設定檔案編碼清單
Vim 會從第一組編碼開始讀取檔案,若是
失敗則會跳下一組編碼讀取檔案
:set fencs=utf-8,gbk,big5,euc-jp,utf-16le
:set fenc=utf-8 enc=utf-8 tenc=utf-8
檔案編碼
:set fencs=utf-8,gbk,big5,euc-jp,utf-16le
:set fenc=utf-8 enc=utf-8 tenc=utf-8
內部編碼
:set fencs=utf-8,gbk,big5,euc-jp,utf-16le
:set fenc=utf-8 enc=utf-8 tenc=utf-8
Terminal 編碼
:help encoding
4. 快捷鍵
Key Mapping
:map
:nmap
:vmap
:imap
:smap
:xmap
... more
:map (all)
:nmap (normal mode)
:vmap (visual mode)
:imap (insert mode)
:smap (select mode)
:xmap (visual , select mode)
... more
:map (all)
:nmap (normal mode)
:vmap (visual mode)
:imap (insert mode)
:smap (select mode)
:xmap (visual , select mode)
... more
最常用
最常用
最常用
:nmap <C-c><C-c> :!gcc -Wall % -o %:r.out<CR>
Ctrl C Ctrl C
呼叫 GCC 編譯現在編輯的檔案
並將輸出檔名命名為現在檔案名稱並取代副檔名為 .out
nmap <tab> v>
nmap <s-tab> v<
vmap <tab> >gv
vmap <s-tab> <gv
Normal Mode 時,可用 Tab 及 Shift-Tab 做縮排
nmap <tab> v>
nmap <s-tab> v<
vmap <tab> >gv
vmap <s-tab> <gv
Visual/Select Mode 時,也可用 Tab 及 Shift-Tab 做縮排
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 de?ned 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.
imap <F2> <C-R>=strftime("%c")<CR>
在 Insert Mode 時,按下 F2 會插入時間戳記
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
:h map.txt
5.文字物件
TEXT OBJECT
Text Object
? word
? string
? paragraph
? block
? action
(yank,delete,change ...etc)
v | c | d i | a { | [ | ( | “ | ‘
visual
change
delete
Inner Object
An Object
Region
{ }
[ ]
( )
“ “
‘ ‘
Operator Mapping
Operator
va{
Vim hacks
function ( blah , blah )
ci(
function ( )
function ( new_args )
“Hello 奥辞谤濒诲”
di”
“”
“Hello New 奥辞谤濒诲”
6.分頁支援
TAB PAPGES
Vim hacks
:tabnew
:tabnew
:tabedit path/to/file
:tabnew
:tabedit path/to/file
:tabfind path/to/file
:help tabpage.txt
7.程式碼折疊
FOLDS
FOLD IS
Vim hacks
Fold Methods
Syntax Fold
Fold Methods
Syntax Fold
Fold Methods
:set foldmethod=syntax
以程式語言語法做為折疊規則。
某些特定的設定可以參考
$VIMRUNTIME/syntax/*.vim
以 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
Syntax Fold
Marker Fold
Fold Methods
Syntax Fold
Marker Fold
Fold Methods
:set foldmethod=marker
以特定標記作為折疊規則,
預設是 “{{{“ 以及 “}}}”
# fold this {{{
function do_something {
echo “COSCUP”;
}
# }}}
Syntax Fold
Marker Fold
Indent Fold
Fold Methods
Syntax Fold
Marker Fold
Indent Fold
Fold Methods
:set foldmethod=indent
以縮排作為折疊規則
Syntax Fold
Marker Fold
Indent Fold
Manual Fold
Fold Methods
:set foldmethod=manual
手動建立折疊區塊,
以 z f 鍵建立。
利用 autocmd 加上 mkview , loadview 來儲存手動建立
的折疊區塊,儲存的折疊會被放在 ~/.vim/view/ 裡頭。
autocmd BufWinLeave *.* silent mkview
autocmd BufWinEnter *.* silent loadview
Syntax Fold
Marker Fold
Indent Fold
Manual Fold
Expr Fold (Custom Fold Function)
Fold Methods
:set foldexpr=MyFoldLevel(v:lnum)
呼叫自訂的折疊函式
Syntax Fold
Marker Fold
Indent Fold
Manual Fold
Expr Fold (Custom Fold Function)
Diff Fold
Fold Methods
8.Modeline & FileType
ModeLine
" vim:fdm=marker:sw=2:ts=2:et:fdl=0:
"============================
" Author: Cornelius <
cornelius.howl{at}gmail{dot}com >
" vim:fdm=marker:sw=2:ts=2:et:fdl=0:
"============================
" Author: Cornelius <
cornelius.howl{at}gmail{dot}com >
開啟此檔時,使用 Marker 作為折疊,
縮排為兩個空隔,將 Tab 延展為空白,
折疊所有的 Fold (Level 0 以上)
FileType
~/.vim/ftplugin/ruby.vim
針對某種檔案類型的設定
不一定都要寫在 vimrc 內
~/.vim/filetype.vim
可在 ?letype.vim 內定義新
的檔案類型。
9.格式化
FORMATTING
程式码很乱,怎麼办?
要手动自己排吗?
:set equalprg=perltidy
:set equalprg=perltidy
選擇文字區塊後,按下 “=” 鍵,可使用
外部的 perltidy 程式來做格式化處理。
可針對特定區塊重新排列程式碼
autocmd Filetype perl :set equalprg=perltidy
可使用 autocmd 針對檔案類型做
equalprg 設定
autocmd Filetype c :set equalprg=indent
開啟 C 程式碼時,使用外部的
GNU Ident 程式來做格式化處理。
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 來做格式化處理。
10. QuickFix
:grep & :make
:grep [pattern] [filepath]
:grep [pattern] [filepath]
呼叫 grepprg (預設 vimgrep) 執行,並
將 grep 的結果彙整至 QuickFix
QuickFix Window
:set grepprg=/path/to/grep
設置 grepprg (預設VIM 內建 grep)
:make
:make
呼叫 makeprg (預設 make) 執行
Make?le. 並以該語言的 compiler
output parser 彙整結果。
:set makeprg=gmake
設置 makeprg (預設 make)
Result ? QuickFix Window
:copen
開啟 QuickFix Window
:cclose
關閉 QuickFix Window
:cnext
下一筆 Result
:cprevious
上一筆 Result
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
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> 預設為 “” 鍵
11. 插件
Plugin
SnipMate
提供類似 TextMate 编辑器的
程式碼片段完成功能。
snippet cla class .. initialize .. end
class ${1:`substitute(Filename(), '^.', 'u&', '')`}
def initialize(${2:args})
${3}
end
end
自訂常用程式碼樣板
DBExt.vim
資料庫輔助插件,支援
Oracle, Sybase, MSSQL ,
MySQL, DBI 等等
xml.vim
提供 XML 相關輔助功能,
如自動補完標籤等等。
FuzzyFinder.vim
Fuzzy/Partial pattern explorer
The_NERD_TREE.vim
樹狀目錄檔案瀏覽
The NERD Commenter
註解輔助工具
taglist.vim
透過 ctags 工具產生程式碼標籤
並可將 macro , function , variable 等資料整理出來
cscope
C 程式碼追蹤輔助
autocomplpop.vim
MRU
most recently used
bufexplorer.vim
Buffer Explorer
Rails.vim
git-vim
那麼,怎麼安装呢?
最原始的作法
Vim hacks
Vim hacks
Vim hacks
Vim hacks
下载套件
阅读安装步骤
阅读安装步骤
太繁瑣!
阅读安装步骤
太繁瑣!
Vim hacks
VimanaVim script Manager
? Vimball
? Archive File ( zip , rar )
? .vim ?le
POWERED BY
Perl
$ cpan Vimana
使用 CPAN 安裝Vimana
$ vimana search xml
搜尋
$ 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
$ vimana info xml.vim
查詢 script 資訊
$ vimana install xml.vim
安裝 xml.vim 外掛
$ 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
http://github.com/c9s/Vimana/tree/master
Git Repository
ENJOY
ThankYou
Demo
如果有時間....
Q & A

More Related Content

Vim hacks