VIM是一款神一樣的編輯器,起初是Linux的標配編輯器,至於它的起源和好處我不想多講,主要是我自己都搞不懂,我只是認為好東西肯定要花功夫之後你才會真正體會它的好,而我學它的原因只是因為我想像大神一樣使用這等神一樣的編輯器,好吧,最主要的是我想在Linux編輯一些東西。當然,多學一樣東西,沒什麼壞處。
此筆記只是記錄我平時用到的,一些高深的,可能就不寫了,等以後真的用到了,再學習。
安裝什麼的咱就不說了,Linux的話,應該自帶VIM了,如果沒有的話,請自行搜索安裝方法。如果是Windows的話,請下載安裝gVim。如果是Mac的話,你肯定比我懂。
普通的編輯軟件(比如記事本、EditPlus、Notepad++等)都沒有模式,或者只有一種模式(編輯模式),而VIM不止一種,我這邊自己定義為三種,Normal模式(正常模式)、Command模式(命令模式)、Edit 模式(編輯模式)。可能其他地方只分了兩種,但是我說了這裡是我自己這麼歸類而已,主要為了分清楚。
Normal模式(正常模式) 使用鍵盤的按鍵進行相關操作。
Command模式(命令模式) 通過輸入冒號(英文的“:”),然後鍵入相關命令
Edit 模式(編輯模式) 進行編輯文本,與普通的一致。
我要記得就是正常模式的按鍵和命令模式的命令了。(純手打,不復制粘貼)
另外,需要注意的是,如果您的配置文件更改過,可能會造成下面的一些快捷鍵失效,請檢查自己的配置文件。
我再次聲明下,這個這是給我自己學習記錄使用的,可能有些錯誤之處,請參考大牛的文章。
正常模式
打開vim或者gVim就是處於正常模式了。如果不確定的話,多按幾次Esc就會退回到正常模式。
以下的按鍵區分大小寫,如果不願意按大小寫切換按鍵,可以按住Shift + 按鍵,即是大寫。
表示數字,比如3。
[c]表示一個字符,比如c。
[s]表示字符串,比如string。
h 光標向左移動一格,可帶數字,比如3h,向左移動三格
j 光標向下移動一格 ,可帶數字,比如3j,向下移動三格
k 光標向上移動一格 ,可帶數字,比如3k,向上移動三格
l 光標向右移動一格 ,可帶數字,比如3l,向右移動三格
Ctrl+F 向下翻一頁
Ctrl+B 向上翻一頁
gg 光標移動到第一行首字符
G 光標移動到最後一行首字符
G 光標移動到第n行首字符
x 刪除目前光標的字符
i 進入編輯模式,插入符在光標字符的前面
dd 刪除當前行,並保存到剪貼板上(相當於剪切Ctrl+X)
dd 刪除當前行及下面的n-1行,共n行,並保存到剪貼板上,例如:3dd
y 復制當前行到剪貼板(相當於復制Ctrl+C)
y 復制當前行開始共n行到剪貼板
p 粘貼剪貼板中到內容到光標下一行(相當於粘貼Ctrl+V)
p 粘貼剪貼板中到內容到光標下一行n次
u 撤銷(相當於Ctrl+Z)
Ctrl+R 恢復撤銷的動作
w 光標移動到下一個單詞的首字母上(中文的話以空格為單位),可加數字,比如3w,移動三次。
b 光標移動到上一個單詞的首字母上(中文的話以空格為單位),可加數字,比如3b,移動三次。
e 光標移動到下一個單詞的尾字母上(中文的話以空格為單位),可加數字,比如3e,移動三次。
ge 光標移動到上一個單詞的尾字母上(中文的話以空格為單位),可加數字,比如3ge,移動三次。
$ 移動光標到行尾,與鍵同效
^ 移動光標到行首第一個非空白字符
0 移動光標到行首,與鍵同效
% 匹配與當前光標所指的括號對應的括號
% 移動光標到文檔的n%出,比如50%,表示中部
H 移動光標到頂部,Home
M 移動光標到中部,Middle
L 移動光標到底部,Last
Shift+ZZ 保存並關閉
/[s] 查找[s],需回車,按n表示下一個匹配的地方,N表示上一個匹配的地方,此處查找匹配大小寫
* 查找當前光標單詞
# 反方向查找當前光標單詞
以下為我不是很常用到的一些快捷鍵
a 進入編輯模式,插入符在光標字符的後面
o 進入編輯模式,插入符在光標字符的另起一行開頭
O 進入編輯模式,插入符在光標字符的另起上一行一行開頭
J 刪除當前行的換行符,下一行移到本行末尾
f[c] 在當前行,移動光標到以後的字符[c]上。
F[c] 在當前行,移動光標到前面的字符[c]上。
t[c] 在當前行,移動光標到以後的字符[c]前一個字符上。
T[c] 在當前行,移動光標到前面的字符[c]前一個字符上。
Ctrl+G 查看當前行在文檔中的位置,例如40%
Ctrl+U 向下翻半頁
Ctrl+D 向上翻半頁
zz 把當前行至於屏幕中央
zt 把當前行至於屏幕頂部
zb 把當前行至於屏幕底部
?[s] 反方向查找[s],需回車,按n表示下一個匹配的地方,N表示上一個匹配的地方,此處查找匹配大小寫
F1 查看幫助文檔,Ctrl+]和Ctrl+O,分別是跳轉到鏈接的內容和返回。
`` 此次光標位置和上次光標位置來回切換
Ctrl+O 跳轉到前一次光標位置
Ctrl+I 跳轉到後一次光標位置
m[c] 標記當前光標位置為[c],比如ma
`[c] 跳轉到標記為[c]的光標位置
'[c] 跳轉到標記為[c]的行首
這裡看起來命令很少,但是由於這些命令都可以自由組合,且有些命令支持數字,即多次操作,故組合之後會超多。用到熟練確實很難,但是也同樣能夠事半功倍。
命令模式
當在正常模式下(可多按幾次Esc就會退回到正常模式)輸入冒號“:”(英文狀態下),即在最下面可以顯示你的輸入的,此模式為命令模式。然後輸入相關指令再敲回車即可,以下的命令中最後都要敲回車。
:q 關閉不保存
:q! 強制關閉並不保存
:w 保存但不退出
:w! 強制保存
:wq 保存並關閉
:wq! 強制保存並關閉
:help 查看幫助文檔,Ctrl+]和Ctrl+O,分別是跳轉到鏈接的內容和返回。
:e ..\_vimrc 打開上級目錄中的_vimrc文件中
以下是一些不常用到的命令
:set ignorecase 忽略大小寫
:set noignorecase 匹配大小寫
:set hlsearch 高亮顯示搜索結果
:set nohlsearch 關閉高亮顯示搜索結果
:nohlsearch 關閉此次高亮
:set incsearch 開啟即打即找搜索功能
:set noincsearch 關閉即打即找搜索功能
:set wrapscan 開啟到達底部從頭搜索功能
:set nowrapscan 關閉到達底部從頭搜索功能
上面的命令如果是在命令行中運行的話,那麼就只針對這次的效果,為了以後每次都是這樣的效果,可以對設置保存在vim啟動文件中,Linux的話是在~/.vimrc,Windows是在$Vim/_vimrc。
以下配置文件是我從網上http://www.ruchee.com上搜集到的,針對自己的情況進行了稍作修改。可以參看下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
" ----------------- Author: Ruchee
" ----------------- Email: [email protected]
" ----------------- WebSite:http://www.ruchee.com " ----------------- Change: Laycher
" ----------------- WebSite:http://www.laycher.com " ----------------- Date: 2013-01-11
" ----------------- For Windows
" Ctrl + H --光標移當前行行首 [插入模式]
" Ctrl + J --光標移下一行行首 [插入模式]
" Ctrl + K --光標移上一行行尾 [插入模式]
" Ctrl + L --光標移當前行行尾 [插入模式]
" Ctrl + C --單源文件編譯 [已配置 C/C++]
" Ctrl + R --單源文件運行 [已配置 C/C++ Ruby Bash]
" Ctrl + ] --轉到函數定義
" Ctrl + T --返回調用函數
" Ctrl + E --一步加載語法模板和作者、時間信息
" ESC + H --Normal模式下開啟Devhelp查詢功能
" --關鍵字補全
" --整行補全
" --全能補全
" Tab鍵 --插入模式下語法結構補全 [snipMate插件]
" Shift + Insert --向Vim中粘貼從別處復制的內容
" u [小寫] --單步復原 [非插入模式]
" U [大寫] --整行復原 [非插入模式]
" jj --保存文件並留在插入模式 [插入模式]
" kk -n返回Normal模式 [插入模式]
" nt --打開NERDTree [非插入模式]
" tl --打開TagList [非插入模式]
" za --打開或關閉當前折疊
" zM --關閉所有折疊
" zR --打開所有折疊
" :se ft=cpp --手動選擇語法高亮 [:set filetype=cpp 或 :set syntax=cpp 亦可]
" :%!xxd --轉儲二進制文件,以十六進制形式顯示
" :%!xxd -r --還原二進制文件
" ---------- 主要插件詳細用法說明 ---------------------
" :Tlist --呼出變量和函數列表 [TagList插件]
" :LoadTemplate --呼出語法模板 [Load_Template插件]
" :AuthorInfoDetect --添加作者、時間等信息 [NERD_commenter && authorinfo插件]
" ---------- snipMate [全局可用的補全關鍵字] ----------
"
" cprt --插入版權信息 [助記:copyright]
" date --插入當前時間
" fiok --插入文件的最後修改時間 [助記:file ok]
" desc --插入文件描述 [助記:description]
" 更多關鍵字可自行查看vimfiles/snippets下的各個文件 [Linux下為~/.vim/snippets]
" ---------- a.vim [自動切換C/C++同名頭文件] ----------
"
" :A --切換同名頭文件並獨占整個屏幕
" :AS --切換同名頭文件並垂直分屏,頭文件在上
" :AV --切換同名頭文件並水平分割,頭文件在左
" ---------- mark.vim [追蹤高亮指定關鍵字] ------------
"
" \m --normal模式下,在想要高亮的單詞上面敲擊\m即可高亮或取消高亮該單詞
" :Mark --取消所有高亮
" :Mark abc --指定高亮單詞 abc 或取消高亮 abc
" ---------- NERDTree [智能文件浏覽器] ----------------
"
" :NERDTree --啟動NERDTree插件
" o [小寫] --切換當前文件或目錄的打開、關閉狀態
" u --打開上層目錄
" p [小寫] --返回上層目錄
" P [大寫] --返回根目錄
" K --轉到當前目錄第一個節點
" J --轉到當前目錄最後的節點
" m --顯示文件系統菜單 [增、刪、移]
" ? --彈出幫助菜單
" q --退出該插件
colorscheme desert " 著色模式:灰色背景
set guifont=YaHei_Consolas_Hybrid:h11:cGB2312 " 字體 && 字號
"set go=e " 顯示立體標簽頁
set autoindent " 自動對齊
set backspace=2 " 設置退格鍵可用
set cindent shiftwidth=4 " 自動縮進4空格
set autoindent " 自動對齊
set ai! " 設置自動縮進
set smartindent " 智能自動縮進
set shiftwidth=2 " 換行時行間交錯使用2空格
set cindent shiftwidth=2 " 自動縮進2空格
set nu! " 顯示行號
set ignorecase "忽略大小寫
"set showmatch " 顯示括號配對情況
set mouse=a " 啟用鼠標
set ruler " 右下角顯示光標位置的狀態行
set incsearch " 開啟實時搜索功能
set hlsearch " 開啟高亮顯示結果
set nowrapscan " 搜索到文件兩端時不重新搜索
set nocompatible " 關閉兼容模式
set vb t_vb= " 關閉提示音
set hidden " 允許在有未保存的修改時切換緩沖區
set autochdir " 設定文件浏覽器目錄為當前目錄
set foldmethod=syntax " 選擇代碼折疊類型
set foldlevel=100 " 禁止自動折疊
set laststatus=2 " 開啟狀態欄信息
set cmdheight=1 " 命令行的高度,默認為1,這裡設為2
"set showmatch " 顯示括號配對情況
"set cursorline " 突出顯示當前行
"set nowrap " 設置不自動換行
"set writebackup " 設置無備份文件
set nobackup
set list " 顯示Tab符,使用一高亮豎線代替
set listchars=tab:\¦\ ,
set tabstop=2 " 設置Tab鍵的寬度 [等同的空格個數]
set expandtab " 將Tab自動轉化成空格 [需要輸入真正的Tab鍵時,使用 Ctrl+V + Tab]
syntax enable " 打開語法高亮
syntax on " 開啟文件類型偵測
filetype indent on " 針對不同的文件類型采用不同的縮進格式
filetype plugin on " 針對不同的文件類型加載對應的插件
filetype plugin indent on " 啟用自動補全
if has("gui_running")
"au GUIEnter * simalt ~x " 窗口啟動時自動最大化
"winpos 20 20 " 指定窗口出現的位置,坐標原點在屏幕左上角
"set lines=20 columns=90 " 指定窗口大小,lines為高度,columns為寬度
"set guioptions-=m " 隱藏菜單欄
"set guioptions-=T " 隱藏工具欄
"set guioptions-=L " 隱藏左側滾動條
"set guioptions-=r " 隱藏右側滾動條
"set guioptions-=b " 隱藏底部滾動條
"set showtabline=0 " 隱藏Tab欄
endif
"set backup
"set backupext=.bak
"set patchmode=.orig " 保存原始文件為 文件名.orig
" set writebackup " 設置無備份文件
set nobackup
set autochdir " 設定文件浏覽器目錄為當前目錄
"set nowrap " 設置不自動換行
set foldmethod=syntax " 選擇代碼折疊類型
set foldlevel=100 " 禁止自動折疊
set laststatus=2 " 開啟狀態欄信息
set cmdheight=1 " 命令行的高度,默認為1,這裡設為2
" 每行超過80個的字符用下劃線標示
" au BufRead,BufNewFile *.s,*.asm,*.h,*.c,*.cpp,*.cc,*.java,*.cs,*.erl,*.hs,*.sh,*.lua,*.pl,*.pm,*.php,*.py,*.rb,*.erb,*.vim,*.js,*.css,*.xml,*.html,*.xhtml 2match Underlined /.\%81v/
" 記住上次光標的位置
au BufReadPost * if line("'\"") >1 && line("'\"") <= line("$") ¦ exe "normal! g`\"" ¦ en
" 打開上次的文件單引號加0,上上次單引號加1
" 設置編碼
set fenc=utf-8
set encoding=utf-8
set fileencodings=utf-8,gbk,cp936,latin-1
" 解決菜單亂碼
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
" 解決consle輸出亂碼
language messages zh_CN.utf-8
" For Haskell
:let hs_highlight_delimiters=1 " 高亮定界符
:let hs_highlight_boolean=1 " 把True和False識別為關鍵字
:let hs_highlight_types=1 " 把基本類型的名字識別為關鍵字
:let hs_highlight_more_types=1 " 把更多常用類型識別為關鍵字
:let hs_highlight_debug=1 " 高亮調試函數的名字
:let hs_allow_hash_operator=1 " 阻止把#高亮為錯誤
" ======= 引號 && 括號自動匹配 ======= "
:inoremap ( ()i
:inoremap ) =ClosePair(')')
:inoremap { {}i
:inoremap } =ClosePair('}')
:inoremap [ []i
:inoremap ] =ClosePair(']')
":inoremap < <>i
":inoremap > =ClosePair('>')
:inoremap " ""i
:inoremap ' ''i
:inoremap ` ``i
function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\"
else
return a:char
endif
endf
" ESC + H Normal模式下開啟Devhelp查詢功能
function! DevHelpCurrentWord()
let word = expand("")
exe "!devhelp -s " . word . " &"
endfunction
nmap h :call DevHelpCurrentWord()
" MiniBufExplorer 多個文件切換 可使用鼠標雙擊相應文件名進行切換
let g:miniBufExplMapWindowNavVim=1
let g:miniBufExplMapWindowNavArrows=1
let g:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplModSelTarget=1
" :Tlist 調用TagList
let Tlist_Show_One_File=1 " 只顯示當前文件的tags
let Tlist_Exit_OnlyWindow=1 " 如果Taglist窗口是最後一個窗口則退出Vim
let Tlist_Use_Right_Window=1 " 在右側窗口中顯示
let Tlist_File_Fold_Auto_Close=1 " 自動折疊
" TxtBrowser 高亮TXT文本文件
au BufRead,BufNewFile *.txt setlocal ft=txt
" :LoadTemplate 根據文件類型自動加載模板
let g:template_path='~/.vim/template/'
" snipMate Tab智能補全
let g:snips_author='Laycher'
" :AuthorInfoDetect 自動添加作者、時間等信息,本質是NERD_commenter && authorinfo的結合
let g:vimrc_author='Laycher'
let g:vimrc_email='[email protected]'
let g:vimrc_homepage='http://www.laycher.com'
" Ctrl + H 將光標移到當前行的行首
imap I
" Ctrl + J 將光標移到下一行的行首
imap jI
" Ctrl + K 將光標移到上一行的末尾
imap kA
" Ctrl + L 將光標移到當前行的行尾
imap A
" Ctrl + E 一步加載語法模板和作者、時間信息
map :LoadTemplate:AuthorInfoDetectGi
imap :LoadTemplate:AuthorInfoDetectGi
vmap :LoadTemplate:AuthorInfoDetectGi
" Ctrl + S 保存當前文件並留在插入模式 [插入模式]
map :w
imap :wa
vmap :w
" imap :wli
" kk 返回Normal模式,不執行保存 [插入模式]
imap kk l
" nt 打開NERDTree窗口,在左側欄顯示 [非插入模式]
map nt :NERDTree
" tl 打開Taglist窗口,在右側欄顯示 [非插入模式]
map tl :Tlist
" ======= 編譯 && 運行 ======= "
" 編譯源文件
func! CompileCode()
exec "w"
if &filetype == "c"
exec "!clang -std=c99 % elseif &filetype == "cpp"
exec "!clang++ -std=c++98 % elseif &filetype == "java"
exec "!javac %<.java"
elseif &filetype == "haskell"
exec "!ghc --make % elseif &filetype == "lua"
exec "!lua %<.lua"
elseif &filetype == "perl"
exec "!perl %<.pl"
elseif &filetype == "python"
exec "!python %<.py"
elseif &filetype == "ruby"
exec "!ruby %<.rb"
elseif &filetype == "sh"
exec "!bash %<.sh"
endif
endfunc
" 運行可執行文件
func! RunCode()
exec "w"
if &filetype == "c" ¦¦ &filetype == "cpp"
exec "! ./%<"
elseif &filetype == "java"
exec "!java %<"
elseif &filetype == "lua"
exec "!lua %<.lua"
elseif &filetype == "perl"
exec "!perl %<.pl"
elseif &filetype == "python"
exec "!python %<.py"
elseif &filetype == "ruby"
exec "!ruby %<.rb"
elseif &filetype == "sh"
exec "!bash %<.sh"
endif
endfunc
" Ctrl + C 一鍵保存、編譯
" map :call CompileCode()
" imap :call CompileCode()
" vmap :call CompileCode()
" Ctrl + R 一鍵保存、運行
" map :call RunCode()
" imap :call RunCode()
" vmap :call RunCode()
" ======= VimWiki ======= "
" 設置編碼
let g:vimwiki_w32_dir_enc = 'utf-8'
" 使用鼠標映射
let g:vimwiki_use_mouse = 1
" 不要將駝峰式詞組作為 Wiki 詞條
let g:vimwiki_camel_case = 0
" 聲明可以在wiki裡面使用的HTML標簽
let g:vimwiki_valid_html_tags='b,i,s,u,sub,sup,kbd,br,hr,div,del,code,red,center,left,right,h2,h4,h5,h6,pre,script,style'
let g:vimwiki_list = [{
\ 'path': '~/mysite/wiki',
\ 'path_html': '~/mysite/html/',
\ 'html_header': '~/mysite/template/header.html',
\ 'html_footer': '~/mysite/template/footer.html',
\ 'auto_export': 1,
\ 'nested_syntaxes': {'Clang': 'c', 'C++': 'cpp', 'Lisp': 'lisp', 'Ruby': 'ruby', 'SQL': 'sql', 'Bash': 'sh', 'Vim': 'vim', 'Make': 'make', 'CMake': 'cmake', 'JS': 'javascript', 'CSS': 'css', 'HTML': 'html', 'XML': 'xml'},}]
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
"設置鼠標運行模式為WINDOWS模式
behave mswin
VIM相關網站:
VIM官網(被牆) http://www.vim.org/
VIM相關技巧 http://vim-tips.com/
善用佳軟的教程 http://xbeta.info/vim-tutorials.htm
VIM整理的相關文檔打包(點此下載)
>> 若為原創,轉載請注明: 轉載自Laycher's
Blog
>> 本文鏈接地址: Vim學習筆記(2013-08-04)
>> 訂閱本站: http://feed.feedsky.com/laycher