├── Modern.Vim.2018.5.pdf
├── README.md
├── Vim实用技巧(第2版).pdf
├── Vim快捷键大全.md
├── Vim用户手册中文版72.pdf
├── fortune.vim
├── init.vim
└── keymap.png
/Modern.Vim.2018.5.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgoyo/DeliberatePracticeVimIn30Days/1cc53bdf1af6f828e4b2e538b2c6c5e527e2ed86/Modern.Vim.2018.5.pdf
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |

2 |
3 | 
4 |
5 | # DeliberatePracticeVimIn30Days
6 | 刻意练习Vim30天能达到什么效果,是麻瓜,还是成神?
7 |
8 | 本人使用Vim编程方式来开发已经有3年的经验,但是虽然有三年经验,但也仅仅是使用到Vim比较常用的快捷编辑方式而已,虽然只是懂得这冰山一角,但是已经让我在开发效率上面有了很大的提高,由于本人从事的是Android,还有前端开发,虽然用的是IDE,但是并不影响我使用Vim插件来开发,所以为了更好的发挥Vim的编程优势,还有提高自己的编码效率,于是乎就有了这个仓库。
9 |
10 | 本人非常喜欢并且崇拜`Bisqwit`敲代码,那种代码在屏幕上快速输出,键指如飞的潇洒,还有喜欢`GeoHotz`使用Vim敲代码的样子,所以本人也暗下励志要成为像他们一样的人,可能做不到他们的那般优秀,但是这并不影响我离他们更近。
11 |
12 | | 资源名称 | 简介 |
13 | | --- | --- |
14 | | [七个高效的文本编辑习惯](http://www.moolenaar.net/habits.html) | 作者:Bram Moolenaar(即 Vim 的作者) |
15 | | [《 Vim 实践 (第 2 版)》](https://github.com/itgoyo/DeliberatePracticeVimIn30Days/blob/master/Vim实用技巧(第2版).pdf) | 轻取 Vim 最佳书籍 |
16 | | [Vim用户手册中文版72](https://github.com/itgoyo/DeliberatePracticeVimIn30Days/blob/master/Vim用户手册中文版72.pdf) | Vim用户手册 |
17 | | [Modern.Vim.2018.5](https://github.com/itgoyo/DeliberatePracticeVimIn30Days/blob/master/Modern.Vim.2018.5.pdf) | 现代Vim |
18 |
19 | 本人第一次使用的Vim项目是[spf13-vim](https://github.com/spf13/spf13-vim),当初搜Github项目的时候就属它Star最多,后面国人有个项目叫[SpaceVim](https://github.com/SpaceVim/SpaceVim),作者也是一个比较厉害的人,以前每天都能看到他每天满满提交页面。因为项目集成的插件比较多,我印象中的spf13光是插件就有七八十个,启动起来不算卡,但是很多插件都是自己没用过的,自己也没怎么理会了。
20 |
21 | 本人关于Vim的推荐是先尝试使用别人弄好的Vim dotfiles,因为别人的配置比你的白板强太多了,vim之所以强是因为它有很多插件,就像变形金刚一样自己组装,但是如果你什么都不安装,那么你用Vim真的还不如使用IDE来的快。先尝试使用别人的项目,对Vim操作先熟悉起来,然后再根据自己的需要,定制合适自己的Vim,安装自己需要的插件。
22 |
23 | 常用Vim插件推荐,更多插件刻意查看[vimawesome](https://vimawesome.com/)
24 | | 资源名称 | 简介 |
25 | | --- | --- |
26 | | [fugitive-vim](https://vimawesome.com/plugin/fugitive-vim) | fugitive.vim: A Git wrapper so awesome, it should be illegal |
27 | |[surround-vim](https://vimawesome.com/plugin/surround-vim)|surround.vim: quoting/parenthesizing made simple|
28 | |[nerdtree](https://vimawesome.com/plugin/nerdtree-red)|A tree explorer plugin for vim|
29 | |[vim-airline](https://vimawesome.com/plugin/vim-airline-superman)|lean & mean status/tabline for vim that's light as air|
30 | |...|[vimawesome](https://vimawesome.com/)|
31 |
32 | ### 关于本人之前折腾Vim的记录
33 | [Vim折腾帖子](https://github.com/itgoyo/500Days-Of-Github/issues?q=vim)
34 |
35 | ### Day01
36 | #### 下载安装NeoVim
37 | [NeoVim官网](https://github.com/neovim/neovim)
38 | - Download nvim-macos.tar.gz
39 | - Extract: tar xzvf nvim-macos.tar.gz
40 | - Run ./nvim-osx64/bin/nvim
41 | 因为没有桌面快捷启动方式,于是我就在`.zshrc`文件里面映射了快捷启动方式
42 | ```
43 | # NeoVim
44 | alias nvim='./nvim-osx64/bin/nvim'
45 | ```
46 | 每次我只需要在终端里面输入`nvim`就刻意快速打开`NeoVim`了
47 |
48 | #### 与Vim的区别
49 |
50 | ```
51 | ~/.vimrc 对应 $CONFIG_HOME/nvim/init.vim
52 |
53 | ~/.vim 对应 $CONFIG_HOME/nvim
54 |
55 | ```
56 |
57 | Neovim 是能使用 vim 的配置文件的,如果有 vim 的配置,直接软链接就好:
58 |
59 | ```
60 | $(~) ln -s ~/.vim .config/nvim
61 | $(~) ln -s ~/.vimrc .config/nvim/init.vim
62 |
63 | ```
64 |
65 | 如果想 nvim 单独使用一个配置,那就在 .config 下创建配置文件就行:
66 |
67 | ```
68 | $(~) mkdir .config/nvim
69 | $(~) touch .config/nvim/init.vim
70 | ```
71 | 之前`spf-13`项目用的插件安装方式是`Vundle`,为了体验别的方式这里就更换成为`VimPlug`来安装插件
72 | 第一天先安装一些常用的插件:
73 | ```
74 | - Finishing ... Done! │~
75 | - fzf: Already installed │~
76 | - ctrlp.vim: Already installed │~
77 | - vim-airline: Already installed │~
78 | - tagbar: Already installed │~
79 | - nerdtree: Already installed │~
80 | - fzf.vim: Already installed │~
81 | - vim-instant-markdown: Already installed │~
82 | - gruvbox: Already installed
83 | - vim-easymotion: Already installed
84 |
85 | ```
86 |
87 | #### init.vim(.config/nvim/init.vim)
88 | ```
89 |
90 | "设置相对行号
91 | set relativenumber
92 |
93 | :let mapleader=','
94 | :let g:mapleader = ','
95 |
96 |
97 | call plug#begin('~/.vim/plugged')
98 |
99 | " vim-airline
100 | Plug 'vim-airline/vim-airline'
101 |
102 | " colorscheme gruvbox
103 | Plug 'morhetz/gruvbox'
104 |
105 | " nerdtree
106 | Plug 'preservim/nerdtree'
107 |
108 | " Tagbar
109 | Plug 'majutsushi/tagbar'
110 |
111 | " ctrlp
112 | Plug 'ctrlpvim/ctrlp.vim'
113 |
114 | " MarkdownPreview
115 | Plug 'suan/vim-instant-markdown', {'for': 'markdown'}
116 |
117 | " Fzf Vim
118 | Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
119 | Plug 'junegunn/fzf.vim'
120 | set rtp+=/usr/local/opt/fzf
121 | Plug '/usr/local/opt/fzf'
122 |
123 |
124 | " easymotion
125 | Plug 'easymotion/vim-easymotion'
126 |
127 | call plug#end()
128 |
129 |
130 | exec 'cd ' . fnameescape('/Users/itgoyo/Documents/Vim')
131 |
132 |
133 | " 切换buffer
134 | nnoremap [b :bprevious
135 | nnoremap ]b :bnext
136 | nnoremap [B :bfirst
137 | nnoremap ]B :blast
138 |
139 |
140 |
141 | " use ctrl+hjkl switch window
142 | " nnoremap l 这种用法没效果因为已经被方向快捷键拦截了
143 | nnoremap h h
144 | nnoremap j j
145 | nnoremap k k
146 | nnoremap l l
147 | "使用leader+w 直接保存
148 | inoremap w :w
149 | noremap w :w
150 |
151 | "noremap :w
152 | "noremap s :w
153 | ":noremap s :w
154 | :noremap p :MarkdownPreview
155 |
156 | "stackoverflow 上面绑定ctrl+s 为保存的回答
157 |
158 | noremap :update
159 | vnoremap :update
160 | inoremap :update
161 |
162 | "解决insert模式切换回normal模式下延迟的问题
163 | set timeoutlen=1 ttimeoutlen=0
164 |
165 |
166 | " install easy-motion
167 | " Plugin 'easymotion/vim-easymotion'
168 |
169 |
170 |
171 |
172 | "Mode Settings
173 |
174 | let &t_SI.="\e[5 q" "SI = INSERT mode
175 | let &t_SR.="\e[4 q" "SR = REPLACE mode
176 | let &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)
177 |
178 | "Cursor settings:
179 |
180 | " 1 -> blinking block
181 | " 2 -> solid block
182 | " 3 -> blinking underscore
183 | " 4 -> solid underscore
184 | " 5 -> blinking vertical bar
185 | " 6 -> solid vertical bar
186 |
187 |
188 |
189 | "let &t_SI = "\]50;CursorShape=1\x7"
190 | "let &t_SR = "\]50;CursorShape=2\x7"
191 | "let &t_EI = "\]50;CursorShape=0\x7"
192 |
193 |
194 |
195 |
196 | "MarkdownPreview
197 | "let g:instant_markdown_port = 8888
198 |
199 | " 退出插入模式指定类型的文件自动保存
200 | au InsertLeave *.go,*.sh,*.php,*.java,*.py,*.md,*.txt,*.html write
201 |
202 | " colorscheme
203 | set bg=dark
204 | colorscheme gruvbox
205 |
206 | " NERDTree
207 | map :NERDTreeToggle
208 |
209 | " Tagbar
210 | nmap :TagbarToggle
211 | " Tagbar
212 | nmap tb :TagbarToggle
213 |
214 | " fzf
215 | " Always enable preview window on the right with 60% width
216 | let g:fzf_preview_window = 'right:60%'
217 |
218 | nmap :Files
219 | nmap :Buffers
220 |
221 |
222 | " f{char} to move to {char}
223 | "nmap f (easymotion-overwin-f)
224 |
225 | " s{char}{char} to move to {char}{char}
226 | nmap s (easymotion-overwin-f)
227 |
228 | nmap w (easymotion-overwin-w)
229 |
230 |
231 |
232 | " 切换buffer
233 | nnoremap [b :bprevious
234 | nnoremap ]b :bnext
235 | nnoremap [B :bfirst
236 | nnoremap ]B :blast
237 |
238 |
239 |
240 | " 让输入上方,搜索列表在下方
241 | let $FZF_DEFAULT_OPTS = '--layout=reverse'
242 |
243 | " 打开 fzf 的方式选择 floating window
244 | let g:fzf_layout = { 'window': 'call OpenFloatingWin()' }
245 |
246 | function! OpenFloatingWin()
247 | let height = &lines - 3
248 | let width = float2nr(&columns - (&columns * 2 / 10))
249 | let col = float2nr((&columns - width) / 2)
250 |
251 | " 设置浮动窗口打开的位置,大小等。
252 | " 这里的大小配置可能不是那么的 flexible 有继续改进的空间
253 | let opts = {
254 | \ 'relative': 'editor',
255 | \ 'row': height * 0.3,
256 | \ 'col': col + 30,
257 | \ 'width': width * 2 / 3,
258 | \ 'height': height / 2
259 | \ }
260 |
261 | let buf = nvim_create_buf(v:false, v:true)
262 | let win = nvim_open_win(buf, v:true, opts)
263 |
264 | " 设置浮动窗口高亮
265 | call setwinvar(win, '&winhl', 'Normal:Pmenu')
266 |
267 | setlocal
268 | \ buftype=nofile
269 | \ nobuflisted
270 | \ bufhidden=hide
271 | \ nonumber
272 | \ norelativenumber
273 | \ signcolumn=no
274 | endfunction
275 |
276 |
277 | set modifiable
278 | ```
279 |
280 | ### Day2
281 | #### 自定义一些常用的快捷键
282 | 自定义一些常用的快捷键,但是遇到按键不起作用的问题,查找了很多资料都没找到是什么原因,最后才发现原来是自己的操作不当引起的,这个不是组合按键而是,静默按1s后组合触发按键
283 |
284 | 发现在`iterm2`里面启动的`nvim`设置`meta`键位是没有作用的,这个是一直存在的问题,查找一下资料看看有没有什么比较好的解决方式
285 |
286 | 解决方式:[在iterm设置中将left Option设置成Esc+这样子就可以了]
287 | 
288 |
289 | silent 代表不回显,静默的意思
290 |
291 | 还有学习到了一些简单的Vim功能脚本的使用方法
292 |
293 | 比如:
294 | ```
295 | function! DateAndTime()
296 | redraw
297 | echohl WarningMsg
298 | echo strftime(" ⏰ 現在時間 %Y-%m-%d %H:%M:%S ⏰ ")
299 | echohl NONE
300 | endfunction
301 |
302 |
303 | " 输入xtime 然后按一下tab按键就可以显示时间了 2020-07-29 16:23:13
304 | iab xtime =strftime("%Y-%m-%d %H:%M:%S")
305 |
306 | nnoremap :call DateAndTime() fzf#install() } }
340 | Plug 'junegunn/fzf.vim'
341 | set rtp+=/usr/local/opt/fzf
342 | Plug '/usr/local/opt/fzf'
343 |
344 |
345 | " easymotion
346 | Plug 'easymotion/vim-easymotion'
347 |
348 | " wakatime
349 | Plug 'wakatime/vim-wakatime'
350 |
351 |
352 | call plug#end()
353 |
354 |
355 | exec 'cd ' . fnameescape('/Users/itgoyo/Documents/Vim')
356 |
357 |
358 |
359 | " use ctrl+hjkl switch window
360 | " nnoremap l 这种用法没效果因为已经被方向快捷键拦截了
361 | :noremap h h
362 | :noremap j j
363 | :noremap k k
364 | :noremap l l
365 | "使用leader+w 直接保存
366 | inoremap w :w
367 | noremap w :w
368 |
369 | "noremap :w
370 | "noremap s :w
371 | ":noremap s :w
372 | :noremap p :MarkdownPreview
373 |
374 | "stackoverflow 上面绑定ctrl+s 为保存的回答
375 |
376 | noremap :update
377 | vnoremap :update
378 | inoremap :update
379 |
380 | "解决insert模式切换回normal模式下延迟的问题
381 | set timeoutlen=1 ttimeoutlen=0
382 |
383 |
384 | " install easy-motion
385 | " Plugin 'easymotion/vim-easymotion'
386 |
387 |
388 |
389 |
390 | "Mode Settings
391 |
392 | let &t_SI.="\e[5 q" "SI = INSERT mode
393 | let &t_SR.="\e[4 q" "SR = REPLACE mode
394 | let &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)
395 |
396 | "Cursor settings:
397 |
398 | " 1 -> blinking block
399 | " 2 -> solid block
400 | " 3 -> blinking underscore
401 | " 4 -> solid underscore
402 | " 5 -> blinking vertical bar
403 | " 6 -> solid vertical bar
404 |
405 |
406 |
407 | "let &t_SI = "\]50;CursorShape=1\x7"
408 | "let &t_SR = "\]50;CursorShape=2\x7"
409 | "let &t_EI = "\]50;CursorShape=0\x7"
410 |
411 |
412 |
413 |
414 | "MarkdownPreview
415 | "let g:instant_markdown_port = 8888
416 |
417 | " 退出插入模式指定类型的文件自动保存
418 | au InsertLeave *.go,*.sh,*.php,*.java,*.py,*.md,*.txt,*.html write
419 |
420 | " colorscheme
421 | set bg=dark
422 | colorscheme gruvbox
423 |
424 | " NERDTree
425 | map :NERDTreeToggle
426 |
427 | " Tagbar
428 | nmap :TagbarToggle
429 | " Tagbar
430 | nmap tb :TagbarToggle
431 |
432 | " fzf
433 | " Always enable preview window on the right with 60% width
434 | let g:fzf_preview_window = 'right:60%'
435 |
436 | nmap :Files
437 | nmap :Buffers
438 |
439 |
440 | " f{char} to move to {char}
441 | nmap f (easymotion-overwin-f)
442 |
443 | " s{char}{char} to move to {char}{char}
444 | nmap s (easymotion-overwin-f)
445 |
446 | "nmap w (easymotion-overwin-w)
447 |
448 |
449 |
450 | " 切换buffer
451 | " Buffer Navigation
452 | nmap :bprevious
453 | nmap :bnext
454 | nmap :bprevious
455 | nmap :bnext
456 |
457 | nnoremap :bnext
458 | nnoremap :bprevious
459 |
460 |
461 | " 让输入上方,搜索列表在下方
462 | let $FZF_DEFAULT_OPTS = '--layout=reverse'
463 |
464 | " 打开 fzf 的方式选择 floating window
465 | let g:fzf_layout = { 'window': 'call OpenFloatingWin()' }
466 |
467 | function! OpenFloatingWin()
468 | let height = &lines - 3
469 | let width = float2nr(&columns - (&columns * 2 / 10))
470 | let col = float2nr((&columns - width) / 2)
471 |
472 | " 设置浮动窗口打开的位置,大小等。
473 | " 这里的大小配置可能不是那么的 flexible 有继续改进的空间
474 | let opts = {
475 | \ 'relative': 'editor',
476 | \ 'row': height * 0.3,
477 | \ 'col': col + 30,
478 | \ 'width': width * 2 / 3,
479 | \ 'height': height / 2
480 | \ }
481 |
482 | let buf = nvim_create_buf(v:false, v:true)
483 | let win = nvim_open_win(buf, v:true, opts)
484 |
485 | " 设置浮动窗口高亮
486 | call setwinvar(win, '&winhl', 'Normal:Pmenu')
487 |
488 | setlocal
489 | \ buftype=nofile
490 | \ nobuflisted
491 | \ bufhidden=hide
492 | \ nonumber
493 | \ norelativenumber
494 | \ signcolumn=no
495 | endfunction
496 |
497 |
498 | set modifiable
499 |
500 | syntax on " 自动语法高亮
501 |
502 | " 键位绑定 Keymap
503 |
504 | " - 小键盘 0 到 9
505 | " Shift+键
506 | " Control+键
507 | " Alt+键 或 meta+键
508 | " 同
509 | " Escape 键
510 | " 光标上移键
511 | " 插入空格
512 | " 插入 Tab
513 | " 等于
514 | " Command
515 |
516 |
517 | " 窗口快速切换切换
518 | nmap J j
519 | nmap H h
520 | nmap K k
521 | nmap L l
522 | nmap W w
523 | " 括号自动不全
524 | inoremap ( ()O
525 | inoremap [ []O
526 | inoremap { {}O
527 |
528 |
529 |
530 | " 時間顯示 http://vim.wikia.com/wiki/Insert_current_date_or_time
531 | function! DateAndTime()
532 | redraw
533 | echohl WarningMsg
534 | echo strftime(" ⏰ 現在時間 %Y-%m-%d %H:%M:%S ⏰ ")
535 | echohl NONE
536 | endfunction
537 | nnoremap :call DateAndTime()
538 |
539 | " 输入xtime 然后按一下tab按键就可以显示时间了 2020-07-29 16:23:13
540 | iab xtime =strftime("%Y-%m-%d %H:%M:%S")
541 | ```
542 | ### Day03
543 |
544 | 原本昨天以为解决了键的问题,但是事实上并不是这样子的,昨天只是碰巧能触发而已,并不能随时触发,真正影响键位功能的是因为一句话引起的
545 | ```
546 | "解决insert模式切换回normal模式下延迟的问题 这货会影响leader的事件触发,最好别用 浪费我很多时间
547 | "set timeoutlen=1 ttimeoutlen=0
548 | ```
549 | 去掉之后现在关于相关的组合键位都能正常使用了
550 |
551 | 配置相关的已经提交到Github上面去了
552 |
553 | 现在终于可以正式入门Vim还有自定义一些属于自己的快捷键了,美滋滋,下面的日子就是学习快速跳转,还有窗口切换相关的事情,再者就是Vim的快捷键训练
554 |
555 | #### [使用 vim-pathogen 进行插件管理](https://www.cnblogs.com/gtarcoder/p/4632325.html)转载自农民伯伯
556 |
557 | 使用 vim 的插件管理器 pathogen 进行 vim 的插件管理。
558 |
559 | 1. pathogen 管理插件
560 | pathogen 让每个插件占有一个单独的目录,解决了文件分散的问题。安装完 pathogen 之后,只需要在~/.vim/ 目录下新建一个目录~/.vim/bundle/,并将要安装的所有插件放在~/.vim/bundle / 目录下即可以使用(直接在~/.vim/bundle 目录下 git clone xxx.git 即可)。如果要删除某个插件,只需要将~/.vim/bundle/ 目录下对应的插件目录删除即可。如果想保持某个插件为最新版本,直接从插 件的仓库 checkout 一份代码到 bundle 目录即可。
561 |
562 | 2. 安装 vim 的插件管理器 pathogen
563 |
564 | 从 github 上获得 pathogen,解压到~/.vim 目录下,将 pathogen 中的 autoload 目录拷贝到~/.vim 目录下。
565 |
566 | $cd ~/.vim
567 |
568 | $mkdir bundle && mkdir autoload && cd bundle
569 |
570 | $git clone https://github.com/tpope/vim-pathogen.git
571 |
572 | $cp -r pathogen/autoload ~/.vim
573 |
574 | 3. 在.vimrc 中设置 pathogen
575 |
576 | 在~/.vimrc 文件里,filetype plugin indent on 之前的任何地方,加入这句:call pathogen#infect ()
577 |
578 | 4. 安装新插件
579 |
580 | 例如 安装 NERDTree
581 |
582 | 例如,要下载安装 NERDTree 插件,只需要进入到~/.vim/bundle/ 目录,然后执行以下命令:
583 |
584 | git clone http://github.com/scrooloose/nerdtree.git
585 |
586 | 下载完成后,会看到~/.vim/bundle/ 目录下会多出一个新的目录:nerdtree
587 |
588 | OK!NERDTree 插件已经安装完成了!可以看到这种方式比传统的 vim 插件安装方式简单多了!
589 |
590 | 而要卸载该插件也非常简单,只需要在~/.vim/bundle/ 目录下删除 nerdtree 目录即可,干净利落!
591 |
592 | 要更新该插件到最新版本,只需要进入到该目录~/.vim/bundle/nerdtree/,并执行以下命令:
593 |
594 | git pull origin
595 |
596 | 当然这种安装和更新插件的方法只适用于代码仓库支持 git 的方法。
597 |
598 | 对于无法用 git 下载的插件,就更新 bundle 里的那个以插件名为名的目录就好。
599 |
600 | #### Vim-Go
601 | 到Go官网下载安装Go得安装包,然后在自己的`.zshrc`文件里面配置好环境变量
602 | ```
603 | export PATH=$HOME/bin:/usr/local/go/bin:$PATH
604 | ```
605 |
606 | 在`init.vim`中添加
607 | ```
608 | " Vim-GO
609 | Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }
610 | ```
611 |
612 | 然后在`Vim`里面`:GoInstallB...`
613 | 如果提示`guru,依然提示 "could not find 'guru'. Run :GoInstallBinaries to fix it`
614 |
615 | ```
616 | go get golang.org/x/tools/cmd/guru
617 | go build golang.org/x/tools/cmd/guru
618 | mv guru $(go env GOROOT)/bin
619 | ```
620 | ### Day04
621 |
622 | - Vim-Ranger
623 | ```
624 | " Vim-Ranger
625 | Plug 'francoiscabrol/ranger.vim'
626 | Plug 'rbgrouleff/bclose.vim'
627 | ```
628 |
629 | - Vim-Rainbow
630 | ```
631 | " Rainbow
632 | Plug 'luochen1990/rainbow'
633 | ```
634 |
635 | - Vim-css-color
636 | ```
637 | " Color
638 | Plug 'ap/vim-css-color'
639 | ```
640 | =======
641 | - [Vim-surround](https://github.com/tpope/vim-surround)
642 |
643 | 快速加符号的插件
644 |
645 | Normal mode
646 | -----------
647 | ds - delete a surrounding
648 | cs - change a surrounding
649 | ys - add a surrounding
650 | yS - add a surrounding and place the surrounded text on a new line + indent it
651 | yss - add a surrounding to the whole line
652 | ySs - add a surrounding to the whole line, place it on a new line + indent it
653 | ySS - same as ySs
654 |
655 | Visual mode
656 | -----------
657 | s - in visual mode, add a surrounding
658 | S - in visual mode, add a surrounding but place text on new line + indent it
659 |
660 | Insert mode
661 | -----------
662 | - in insert mode, add a surrounding
663 | - in insert mode, add a new line + surrounding + indent
664 | s - same as
665 | S - same as
666 | 示例
667 | 
668 |
--------------------------------------------------------------------------------
/Vim实用技巧(第2版).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgoyo/DeliberatePracticeVimIn30Days/1cc53bdf1af6f828e4b2e538b2c6c5e527e2ed86/Vim实用技巧(第2版).pdf
--------------------------------------------------------------------------------
/Vim快捷键大全.md:
--------------------------------------------------------------------------------
1 | # Vim快捷键大全
2 |
3 | # [1\. 关于 Vim](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id59)
4 |
5 | vim 是我最喜欢的编辑器,也是 linux 下第二强大的编辑器。 虽然 emacs 是公认的世界第一,我认为使用 emacs 并没有使用 vi 进行编辑来得高效。 如果是初学 vi,运行一下 vimtutor 是个聪明的决定。 (如果你的系统环境不是中文,而你想使用中文的 vimtutor,就运行 vimtutor zh)
6 |
7 | ## [1.1 Vim 的几种模式](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id60)
8 |
9 | * 正常模式:可以使用快捷键命令,或按:输入命令行。
10 | * 插入模式:可以输入文本,在正常模式下,按 i、a、o 等都可以进入插入模式。
11 | * 可视模式:正常模式下按 v 可以进入可视模式, 在可视模式下,移动光标可以选择文本。按 V 进入可视行模式, 总是整行整行的选中。ctrl+v 进入可视块模式。
12 | * 替换模式:正常模式下,按 R 进入。
13 |
14 | # [2\. 启动 Vim](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id61)
15 |
16 | * vim -c cmd file: 在打开文件前,先执行指定的命令;
17 | * vim -r file: 恢复上次异常退出的文件;
18 | * vim -R file: 以只读的方式打开文件,但可以强制保存;
19 | * vim -M file: 以只读的方式打开文件,不可以强制保存;
20 | * vim -y num file: 将编辑窗口的大小设为 num 行;
21 | * vim + file: 从文件的末尾开始;
22 | * vim +num file: 从第 num 行开始;
23 | * vim +/string file: 打开 file,并将光标停留在第一个找到的 string 上。
24 | * vim --remote file: 用已有的 vim 进程打开指定的文件。 如果你不想启用多个 vim 会话,这个很有用。但要注意, 如果你用 vim,会寻找名叫 VIM 的服务器;如果你已经有一个 gvim 在运行了, 你可以用 gvim --remote file 在已有的 gvim 中打开文件。
25 |
26 | # [3\. 文档操作](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id62)
27 |
28 | * :e file -- 关闭当前编辑的文件,并开启新的文件。 如果对当前文件的修改未保存,vi 会警告。
29 | * :e! file -- 放弃对当前文件的修改,编辑新的文件。
30 | * :e+file -- 开始新的文件,并从文件尾开始编辑。
31 | * :e+n file -- 开始新的文件,并从第 n 行开始编辑。
32 | * :enew -- 编译一个未命名的新文档。(CTRL-W n)
33 | * :e -- 重新加载当前文档。
34 | * :e! -- 重新加载当前文档,并丢弃已做的改动。
35 | * :e# 或 ctrl+^ -- 回到刚才编辑的文件,很实用。
36 | * :f 或 ctrl+g -- 显示文档名,是否修改,和光标位置。
37 | * :f filename -- 改变编辑的文件名,这时再保存相当于另存为。
38 | * gf -- 打开以光标所在字符串为文件名的文件。
39 | * :w -- 保存修改。
40 | * :n1,n2w filename -- 选择性保存从某 n1 行到另 n2 行的内容。
41 | * :wq -- 保存并退出。
42 | * ZZ -- 保存并退出。
43 | * :x -- 保存并退出。
44 | * :q [uit] —— 退出当前窗口。(CTRL-W q 或 CTRL-W CTRL-Q)
45 | * :saveas newfilename -- 另存为
46 | * :browse e -- 会打开一个文件浏览器让你选择要编辑的文件。 如果是终端中,则会打开 netrw 的文件浏览窗口; 如果是 gvim,则会打开一个图形界面的浏览窗口。 实际上:browse 后可以跟任何编辑文档的命令,如 sp 等。 用 browse 打开的起始目录可以由 browsedir 来设置:
47 | * :set browsedir=last -- 用上次访问过的目录(默认);
48 | * :set browsedir=buffer -- 用当前文件所在目录;
49 | * :set browsedir=current -- 用当前工作目录;
50 | * :Sex -- 水平分割一个窗口,浏览文件系统;
51 | * :Vex -- 垂直分割一个窗口,浏览文件系统;
52 |
53 | # [4\. 光标的移动](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id63)
54 |
55 | ## [4.1 基本移动](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id64)
56 |
57 | 以下移动都是在 normal 模式下。
58 |
59 | * h 或退格:左移一个字符;
60 | * l 或空格:右移一个字符;
61 | * j: 下移一行;
62 | * k: 上移一行;
63 | * gj: 移动到一段内的下一行;
64 | * gk: 移动到一段内的上一行;
65 | * + 或 Enter: 把光标移至下一行第一个非空白字符。
66 | * -: 把光标移至上一行第一个非空白字符。
67 | * w: 前移一个单词,光标停在下一个单词开头;
68 | * W: 移动下一个单词开头,但忽略一些标点;
69 | * e: 前移一个单词,光标停在下一个单词末尾;
70 | * E: 移动到下一个单词末尾,如果词尾有标点,则移动到标点;
71 | * b: 后移一个单词,光标停在上一个单词开头;
72 | * B: 移动到上一个单词开头,忽略一些标点;
73 | * ge: 后移一个单词,光标停在上一个单词末尾;
74 | * gE: 同 ge ,不过‘单词’包含单词相邻的标点。
75 | * (: 前移 1 句。
76 | * ): 后移 1 句。
77 | * {: 前移 1 段。
78 | * }: 后移 1 段。
79 | * fc: 把光标移到同一行的下一个 c 字符处
80 | * Fc: 把光标移到同一行的上一个 c 字符处
81 | * tc: 把光标移到同一行的下一个 c 字符前
82 | * Tc: 把光标移到同一行的上一个 c 字符后
83 | * ;: 配合 f & t 使用,重复一次
84 | * ,: 配合 f & t 使用,反向重复一次
85 |
86 | 上面的操作都可以配合 n 使用,比如在正常模式 (下面会讲到) 下输入 3h, 则光标向左移动 3 个字符。
87 |
88 | * 0: 移动到行首。
89 | * g0: 移到光标所在屏幕行行首。
90 | * ^: 移动到本行第一个非空白字符。
91 | * g^: 同 ^ ,但是移动到当前屏幕行第一个非空字符处。
92 | * $: 移动到行尾。
93 | * g$: 移动光标所在屏幕行行尾。
94 | * n|: 把光标移到递 n 列上。
95 | * nG: 到文件第 n 行。
96 | * :n 移动到第 n 行。
97 | * :$ 移动到最后一行。
98 | * H: 把光标移到屏幕最顶端一行。
99 | * M: 把光标移到屏幕中间一行。
100 | * L: 把光标移到屏幕最底端一行。
101 | * gg: 到文件头部。
102 | * G: 到文件尾部。
103 |
104 | ## [4.2 翻屏](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id65)
105 |
106 | * ctrl+f: 下翻一屏。
107 | * ctrl+b: 上翻一屏。
108 | * ctrl+d: 下翻半屏。
109 | * ctrl+u: 上翻半屏。
110 | * ctrl+e: 向下滚动一行。
111 | * ctrl+y: 向上滚动一行。
112 | * n%: 到文件 n% 的位置。
113 | * zz: 将当前行移动到屏幕中央。
114 | * zt: 将当前行移动到屏幕顶端。
115 | * zb: 将当前行移动到屏幕底端。
116 |
117 | ## [4.3 标记](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id66)
118 |
119 | 使用标记可以快速移动。到达标记后,可以用 Ctrl+o 返回原来的位置。 Ctrl+o 和 Ctrl+i 很像浏览器上的 _后退_ 和 _前进_ 。
120 |
121 | * m {a-z}: 标记光标所在位置,局部标记,只用于当前文件。
122 | * m {A-Z}: 标记光标所在位置,全局标记。标记之后,退出 Vim, 重新启动,标记仍然有效。
123 | * `{a-z}: 移动到标记位置。
124 | * '{a-z}: 移动到标记行的行首。
125 | * `{0-9}:回到上 [2-10] 次关闭 vim 时最后离开的位置。
126 | * ``: 移动到上次编辑的位置。'' 也可以,不过`` 精确到列,而 '' 精确到行 。如果想跳转到更老的位置,可以按 C-o,跳转到更新的位置用 C-i。
127 | * `": 移动到上次离开的地方。
128 | * `.: 移动到最后改动的地方。
129 | * :marks 显示所有标记。
130 | * :delmarks a b -- 删除标记 a 和 b。
131 | * :delmarks a-c -- 删除标记 a、b 和 c。
132 | * :delmarks a c-f -- 删除标记 a、c、d、e、f。
133 | * :delmarks! -- 删除当前缓冲区的所有标记。
134 | * :help mark-motions 查看更多关于 mark 的知识。
135 |
136 | # [5\. 插入文本](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id67)
137 |
138 | ## [5.1 基本插入](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id68)
139 |
140 | * i: 在光标前插入;一个小技巧:按 8,再按 i,进入插入模式,输入 =, 按 esc 进入命令模式,就会出现 8 个 =。 这在插入分割线时非常有用,如 30i+ 就插入了 36 个 + 组成的分割线。
141 | * I: 在当前行第一个非空字符前插入;
142 | * gI: 在当前行第一列插入;
143 | * a: 在光标后插入;
144 | * A: 在当前行最后插入;
145 | * o: 在下面新建一行插入;
146 | * O: 在上面新建一行插入;
147 | * :r filename 在当前位置插入另一个文件的内容。
148 | * :[n] r filename 在第 n 行插入另一个文件的内容。
149 | * :r !date 在光标处插入当前日期与时间。同理,:r !command 可以将其它 shell 命令的输出插入当前文档。
150 |
151 | ## [5.2 改写插入](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id69)
152 |
153 | * c [n] w: 改写光标后 1 (n) 个词。
154 | * c [n] l: 改写光标后 n 个字母。
155 | * c [n] h: 改写光标前 n 个字母。
156 | * [n] cc: 修改当前 [n] 行。
157 | * [n] s: 以输入的文本替代光标之后 1 (n) 个字符,相当于 c [n] l。
158 | * [n] S: 删除指定数目的行,并以所输入文本代替之。
159 |
160 | 注意,类似 cnw,dnw,ynw 的形式同样可以写为 ncw,ndw,nyw。
161 |
162 | # [6\. 剪切复制和寄存器](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id70)
163 |
164 | ## [6.1 剪切和复制、粘贴](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id71)
165 |
166 | * [n] x: 剪切光标右边 n 个字符,相当于 d [n] l。
167 | * [n] X: 剪切光标左边 n 个字符,相当于 d [n] h。
168 | * y: 复制在可视模式下选中的文本。
169 | * yy or Y: 复制整行文本。
170 | * y [n] w: 复制一 (n) 个词。
171 | * y [n] l: 复制光标右边 1 (n) 个字符。
172 | * y [n] h: 复制光标左边 1 (n) 个字符。
173 | * y$: 从光标当前位置复制到行尾。
174 | * y0: 从光标当前位置复制到行首。
175 | * :m,ny 复制 m 行到 n 行的内容。
176 | * y1G 或 ygg: 复制光标以上的所有行。
177 | * yG: 复制光标以下的所有行。
178 | * yaw 和 yas:复制一个词和复制一个句子,即使光标不在词首和句首也没关系。
179 | * d: 删除(剪切)在可视模式下选中的文本。
180 | * d$ or D: 删除(剪切)当前位置到行尾的内容。
181 | * d [n] w: 删除(剪切)1 (n) 个单词
182 | * d [n] l: 删除(剪切)光标右边 1 (n) 个字符。
183 | * d [n] h: 删除(剪切)光标左边 1 (n) 个字符。
184 | * d0: 删除(剪切)当前位置到行首的内容
185 | * [n] dd: 删除(剪切)1 (n) 行。
186 | * :m,nd 剪切 m 行到 n 行的内容。
187 | * d1G 或 dgg: 剪切光标以上的所有行。
188 | * dG: 剪切光标以下的所有行。
189 | * daw 和 das:剪切一个词和剪切一个句子,即使光标不在词首和句首也没关系。
190 | * d/f:这是一个比较高级的组合命令,它将删除当前位置 到下一个 f 之间的内容。
191 | * p: 在光标之后粘贴。
192 | * P: 在光标之前粘贴。
193 |
194 | ## [6.2 文本对象](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id72)
195 |
196 | * aw:一个词
197 | * as:一句。
198 | * ap:一段。
199 | * ab:一块(包含在圆括号中的)。
200 |
201 | y, d, c, v 都可以跟文本对象。
202 |
203 | ## [6.3 寄存器](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id73)
204 |
205 | * a-z:都可以用作寄存器名。"ayy 把当前行的内容放入 a 寄存器。
206 | * A-Z:用大写字母索引寄存器,可以在寄存器中追加内容。 如 "Ayy 把当前行的内容追加到 a 寄存器中。
207 | * :reg 显示所有寄存器的内容。
208 | * "":不加寄存器索引时,默认使用的寄存器。
209 | * "*:当前选择缓冲区,"*yy 把当前行的内容放入当前选择缓冲区。
210 | * "+:系统剪贴板。"+yy 把当前行的内容放入系统剪贴板。
211 |
212 | # [7\. 查找与替换](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id74)
213 |
214 | ## [7.1 查找](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id75)
215 |
216 | * /something: 在后面的文本中查找 something。
217 | * ?something: 在前面的文本中查找 something。
218 | * /pattern/+number: 将光标停在包含 pattern 的行后面第 number 行上。
219 | * /pattern/-number: 将光标停在包含 pattern 的行前面第 number 行上。
220 | * n: 向后查找下一个。
221 | * N: 向前查找下一个。
222 |
223 | 可以用 grep 或 vimgrep 查找一个模式都在哪些地方出现过,
224 |
225 | 其中:grep 是调用外部的 grep 程序,而:vimgrep 是 vim 自己的查找算法。
226 |
227 | 用法为: :vim [grep]/pattern/[g] [j] files
228 |
229 | g 的含义是如果一个模式在一行中多次出现,则这一行也在结果中多次出现。
230 |
231 | j 的含义是 grep 结束后,结果停在第 j 项,默认是停在第一项。
232 |
233 | vimgrep 前面可以加数字限定搜索结果的上限,如
234 |
235 | :1vim/pattern/ % 只查找那个模式在本文件中的第一个出现。
236 |
237 | 其实 vimgrep 在读纯文本电子书时特别有用,可以生成导航的目录。
238 |
239 | 比如电子书中每一节的标题形式为:n. xxxx。你就可以这样:
240 |
241 | :vim/^d{1,}./ %
242 |
243 | 然后用:cw 或:copen 查看结果,可以用 C-w H 把 quickfix 窗口移到左侧,
244 |
245 | 就更像个目录了。
246 |
247 | ## [7.2 替换](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id76)
248 |
249 | * :s/old/new - 用 new 替换当前行第一个 old。
250 | * :s/old/new/g - 用 new 替换当前行所有的 old。
251 | * :n1,n2s/old/new/g - 用 new 替换文件 n1 行到 n2 行所有的 old。
252 | * :% s/old/new/g - 用 new 替换文件中所有的 old。
253 | * :% s/^/xxx/g - 在每一行的行首插入 xxx,^ 表示行首。
254 | * :% s/$/xxx/g - 在每一行的行尾插入 xxx,$ 表示行尾。
255 | * 所有替换命令末尾加上 c,每个替换都将需要用户确认。 如:% s/old/new/gc,加上 i 则忽略大小写 (ignore)。
256 |
257 | 还有一种比替换更灵活的方式,它是匹配到某个模式后执行某种命令,
258 |
259 | 语法为 :[range] g/pattern/command
260 |
261 | 例如 :% g/^ xyz/normal dd。
262 |
263 | 表示对于以一个空格和 xyz 开头的行执行 normal 模式下的 dd 命令。
264 |
265 | 关于 range 的规定为:
266 |
267 | * 如果不指定 range,则表示当前行。
268 | * m,n: 从 m 行到 n 行。
269 | * 0: 最开始一行(可能是这样)。
270 | * $: 最后一行
271 | * .: 当前行
272 | * %: 所有行
273 |
274 | ## [7.3 正则表达式](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id77)
275 |
276 | 高级的查找替换就要用到正则表达式。
277 |
278 | * \d: 表示十进制数(我猜的)
279 | * \s: 表示空格
280 | * \S: 非空字符
281 | * \a: 英文字母
282 | * \|: 表示 或
283 | * \.: 表示.
284 | * {m,n}: 表示 m 到 n 个字符。这要和 \s 与 \a 等连用,如 \a\{m,n} 表示 m 到 n 个英文字母。
285 | * {m,}: 表示 m 到无限多个字符。
286 | * **: 当前目录下的所有子目录。
287 |
288 | :help pattern 得到更多帮助。
289 |
290 | * * *
291 |
292 | # [8\. 排版](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id78)
293 |
294 | ## [8.1 基本排版](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id79)
295 |
296 | * << 向左缩进一个 shiftwidth
297 | * >> 向右缩进一个 shiftwidth
298 | * :ce (nter) 本行文字居中
299 | * :le (ft) 本行文字靠左
300 | * :ri (ght) 本行文字靠右
301 | * gq 对选中的文字重排,即对过长的文字进行断行
302 | * gqq 重排当前行
303 | * gqnq 重排 n 行
304 | * gqap 重排当前段
305 | * gqnap 重排 n 段
306 | * gqnj 重排当前行和下面 n 行
307 | * gqQ 重排当前段对文章末尾
308 | * J 拼接当前行和下一行
309 | * gJ 同 J ,不过合并后不留空格。
310 |
311 | ## [8.2 拼写检查](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id80)
312 |
313 | * :set spell-开启拼写检查功能
314 | * :set nospell-关闭拼写检查功能
315 | * ] s-移到下一个拼写错误的单词
316 | * [s-作用与上一命令类似,但它是从相反方向进行搜索
317 | * z=-显示一个有关拼写错误单词的列表,可从中选择
318 | * zg-告诉拼写检查器该单词是拼写正确的
319 | * zw-与上一命令相反,告诉拼写检查器该单词是拼写错误的
320 |
321 | ## [8.3 统计字数](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id81)
322 |
323 | g ^g 可以统计文档字符数,行数。 将光标放在最后一个字符上,用字符数减去行数可以粗略统计中文文档的字数。 以上对 Mac 或 Unix 的文件格式适用。 如果是 Windows 文件格式(即换行符有两个字节),字数的统计方法为: 字符数 - 行数 * 2。
324 |
325 | * * *
326 |
327 | # [9\. 编辑多个文件](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id82)
328 |
329 | ## [9.1 一次编辑多个文件](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id83)
330 |
331 | 我们可以一次打开多个文件,如
332 |
333 | > vi a.txt b.txt c.txt
334 |
335 | * 使用:next (:n) 编辑下一个文件。
336 | * :2n 编辑下 2 个文件。
337 | * 使用:previous 或:N 编辑上一个文件。
338 | * 使用:wnext,保存当前文件,并编辑下一个文件。
339 | * 使用:wprevious,保存当前文件,并编辑上一个文件。
340 | * 使用:args 显示文件列表。
341 | * :n filenames 或:args filenames 指定新的文件列表。
342 | * vi -o filenames 在水平分割的多个窗口中编辑多个文件。
343 | * vi -O filenames 在垂直分割的多个窗口中编辑多个文件。
344 |
345 | ## [9.2 多标签编辑](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id84)
346 |
347 | * vim -p files: 打开多个文件,每个文件占用一个标签页。
348 | * :tabe, tabnew -- 如果加文件名,就在新的标签中打开这个文件, 否则打开一个空缓冲区。
349 | * ^w gf -- 在新的标签页里打开光标下路径指定的文件。
350 | * :tabn -- 切换到下一个标签。Control + PageDown,也可以。
351 | * :tabp -- 切换到上一个标签。Control + PageUp,也可以。
352 | * [n] gt -- 切换到下一个标签。如果前面加了 n , 就切换到第 n 个标签。第一个标签的序号就是 1。
353 | * :tab split -- 将当前缓冲区的内容在新页签中打开。
354 | * :tabc [lose] -- 关闭当前的标签页。
355 | * :tabo [nly] -- 关闭其它的标签页。
356 | * :tabs -- 列出所有的标签页和它们包含的窗口。
357 | * :tabm [ove] [N] -- 移动标签页,移动到第 N 个标签页之后。 如 tabm 0 当前标签页,就会变成第一个标签页。
358 |
359 | ## [9.3 缓冲区](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id85)
360 |
361 | * :buffers 或:ls 或:files 显示缓冲区列表。
362 | * ctrl+^:在最近两个缓冲区间切换。
363 | * :bn -- 下一个缓冲区。
364 | * :bp -- 上一个缓冲区。
365 | * :bl -- 最后一个缓冲区。
366 | * :b [n] 或:[n] b -- 切换到第 n 个缓冲区。
367 | * :nbw (ipeout) -- 彻底删除第 n 个缓冲区。
368 | * :nbd (elete) -- 删除第 n 个缓冲区,并未真正删除,还在 unlisted 列表中。
369 | * :ba [ll] -- 把所有的缓冲区在当前页中打开,每个缓冲区占一个窗口。
370 |
371 | # [10\. 分屏编辑](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id86)
372 |
373 | * vim -o file1 file2: 水平分割窗口,同时打开 file1 和 file2
374 | * vim -O file1 file2: 垂直分割窗口,同时打开 file1 和 file2
375 |
376 | ## [10.1 水平分割](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id87)
377 |
378 | * :split (:sp) -- 把当前窗水平分割成两个窗口。(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在终端下,CTRL-S 可能会冻结终端,请按 CTRL-Q 继续。
379 | * :split filename -- 水平分割窗口,并在新窗口中显示另一个文件。
380 | * :nsplit (:nsp) -- 水平分割出一个 n 行高的窗口。
381 | * :[N] new -- 水平分割出一个 N 行高的窗口,并编辑一个新文件。 (CTRL-W n 或 CTRL-W CTRL-N)
382 | * ctrl+w f -- 水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 。
383 | * C-w C-^ -- 水平分割一个窗口,打开刚才编辑的文件。
384 |
385 | ## [10.2 垂直分割](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id88)
386 |
387 | * :vsplit (:vsp) -- 把当前窗口分割成水平分布的两个窗口。 (CTRL-W v 或 CTRL CTRL-V)
388 | * :[N] vne [w] -- 垂直分割出一个新窗口。
389 | * :vertical 水平分割的命令: 相应的垂直分割。
390 |
391 | ## [10.3 关闭子窗口](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id89)
392 |
393 | * :qall -- 关闭所有窗口,退出 vim。
394 | * :wall -- 保存所有修改过的窗口。
395 | * :only -- 只保留当前窗口,关闭其它窗口。(CTRL-W o)
396 | * :close -- 关闭当前窗口,CTRL-W c 能实现同样的功能。 (象 :q :x 同样工作)
397 |
398 | ## [10.4 调整窗口大小](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id90)
399 |
400 | * ctrl+w + -- 当前窗口增高一行。也可以用 n 增高 n 行。
401 | * ctrl+w - -- 当前窗口减小一行。也可以用 n 减小 n 行。
402 | * ctrl+w _ -- 当前窗口扩展到尽可能的大。也可以用 n 设定行数。
403 | * :resize n -- 当前窗口 n 行高。
404 | * ctrl+w = -- 所有窗口同样高度。
405 | * n ctrl+w _ -- 当前窗口的高度设定为 n 行。
406 | * ctrl+w < -- 当前窗口减少一列。也可以用 n 减少 n 列。
407 | * ctrl+w > -- 当前窗口增宽一列。也可以用 n 增宽 n 列。
408 | * ctrl+w | -- 当前窗口尽可能的宽。也可以用 n 设定列数。
409 |
410 | ## [10.5 切换和移动窗口](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id91)
411 |
412 | 如果支持鼠标,切换和调整子窗口的大小就简单了。
413 |
414 | * ctrl+w ctrl+w: 切换到下一个窗口。或者是 ctrl+w w。
415 | * ctrl+w p: 切换到前一个窗口。
416 | * ctrl+w h (l,j,k): 切换到左(右,下,上)的窗口。
417 | * ctrl+w t (b): 切换到最上(下)面的窗口。
418 | * ctrl+w H (L,K,J): 将当前窗口移动到最左(右、上、下)面。
419 | * ctrl+w r:旋转窗口的位置。
420 | * ctrl+w T: 将当前的窗口移动到新的标签页上。
421 |
422 | # [11\. 快速编辑](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id92)
423 |
424 | ## [11.1 改变大小写](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id93)
425 |
426 | * ~: 反转光标所在字符的大小写。
427 | * 可视模式下的 U 或 u:把选中的文本变为大写或小写。
428 | * gu (U) 接范围(如 $,或 G),可以把从光标当前位置到指定位置之间字母全部 转换成小写或大写。如 ggguG,就是把开头到最后一行之间的字母全部变为小 写。再如 gu5j,把当前行和下面四行全部变成小写。
429 |
430 | ## [11.2 替换(normal 模式)](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id94)
431 |
432 | * r: 替换光标处的字符,同样支持汉字。
433 | * R: 进入替换模式,按 esc 回到正常模式。
434 |
435 | ## [11.3 撤消与重做(normal 模式)](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id95)
436 |
437 | * [n] u: 取消一 (n) 个改动。
438 | * :undo 5 -- 撤销 5 个改变。
439 | * :undolist -- 你的撤销历史。
440 | * ctrl + r: 重做最后的改动。
441 | * U: 取消当前行中所有的改动。
442 | * :earlier 4m -- 回到 4 分钟前
443 | * :later 55s -- 前进 55 秒
444 |
445 | ## [11.4 宏](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id96)
446 |
447 | * . -- 重复上一个编辑动作
448 | * qa:开始录制宏 a(键盘操作记录)
449 | * q:停止录制
450 | * @a:播放宏 a
451 |
452 | # [12\. 编辑特殊文件](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id97)
453 |
454 | ## [12.1 文件加解密](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id98)
455 |
456 | * vim -x file: 开始编辑一个加密的文件。
457 | * :X -- 为当前文件设置密码。
458 | * :set key= -- 去除文件的密码。
459 |
460 | [这里是](http://www.cnblogs.com/jiqingwu/admin/vim-quick-edit.html) 滇狐总结的比较高级的 vi 技巧。
461 |
462 | ## [12.2 文件的编码](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id99)
463 |
464 | * :e ++enc=utf8 filename, 让 vim 用 utf-8 的编码打开这个文件。
465 | * :w ++enc=gbk,不管当前文件什么编码,把它转存成 gbk 编码。
466 | * :set fenc 或:set fileencoding,查看当前文件的编码。
467 | * 在 vimrc 中添加 set fileencoding=ucs-bom,utf-8,cp936,vim 会根据要打开的文件选择合适的编码。 注意:编码之间不要留空格。 cp936 对应于 gbk 编码。 ucs-bom 对应于 windows 下的文件格式。
468 |
469 | 让 vim 正确处理文件格式和文件编码,有赖于 [~/.vimrc 的正确配置](http://www.cnblogs.com/jiqingwu/admin/vimrc.html)
470 |
471 | ## [12.3 文件格式](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id100)
472 |
473 | 大致有三种文件格式:unix, dos, mac. 三种格式的区别主要在于回车键的编码:dos 下是回车加换行,unix 下只有 换行符,mac 下只有回车符。
474 |
475 | * :e ++ff=dos filename, 让 vim 用 dos 格式打开这个文件。
476 | * :w ++ff=mac filename, 以 mac 格式存储这个文件。
477 | * :set ff,显示当前文件的格式。
478 | * 在 vimrc 中添加 set fileformats=unix,dos,mac,让 vim 自动识别文件格式。
479 |
480 | # [13\. 编程辅助](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id101)
481 |
482 | ## [13.1 一些按键](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id102)
483 |
484 | * gd: 跳转到局部变量的定义处;
485 | * gD: 跳转到全局变量的定义处,从当前文件开头开始搜索;
486 | * g;: 上一个修改过的地方;
487 | * g,: 下一个修改过的地方;
488 | * [[: 跳转到上一个函数块开始,需要有单独一行的 {。
489 | * ]]: 跳转到下一个函数块开始,需要有单独一行的 {。
490 | * []: 跳转到上一个函数块结束,需要有单独一行的}。
491 | * ][: 跳转到下一个函数块结束,需要有单独一行的}。
492 | * [{: 跳转到当前块开始处;
493 | * ]}: 跳转到当前块结束处;
494 | * [/: 跳转到当前注释块开始处;
495 | * ]/: 跳转到当前注释块结束处;
496 | * %: 不仅能移动到匹配的 (),{} 或 [] 上,而且能在 #if,#else, #endif 之间跳跃。
497 |
498 | 下面的括号匹配对编程很实用的。
499 |
500 | * ci', di', yi':修改、剪切或复制 ' 之间的内容。
501 | * ca', da', ya':修改、剪切或复制 ' 之间的内容,包含 '。
502 | * ci", di", yi":修改、剪切或复制" 之间的内容。
503 | * ca", da", ya":修改、剪切或复制" 之间的内容,包含 "。
504 | * ci (, di (, yi (:修改、剪切或复制 () 之间的内容。
505 | * ca (, da (, ya (:修改、剪切或复制 () 之间的内容,包含 ()。
506 | * ci [, di [, yi [:修改、剪切或复制 [] 之间的内容。
507 | * ca [, da [, ya [:修改、剪切或复制 [] 之间的内容,包含 []。
508 | * ci {, di {, yi {:修改、剪切或复制 {} 之间的内容。
509 | * ca {, da {, ya {:修改、剪切或复制 {} 之间的内容,包含 {}。
510 | * ci<, di<, yi<:修改、剪切或复制 <> 之间的内容。
511 | * ca<, da<, ya<:修改、剪切或复制 <> 之间的内容,包含 <>。
512 |
513 | ## [13.2 ctags](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id103)
514 |
515 | * ctags -R: 生成 tag 文件,-R 表示也为子目录中的文件生成 tags
516 | * :set tags=path/tags -- 告诉 ctags 使用哪个 tag 文件
517 | * :tag xyz -- 跳到 xyz 的定义处,或者将光标放在 xyz 上按 C-],返回用 C-t
518 | * :stag xyz -- 用分割的窗口显示 xyz 的定义,或者 C-w ], 如果用 C-w n ],就会打开一个 n 行高的窗口
519 | * :ptag xyz -- 在预览窗口中打开 xyz 的定义,热键是 C-w }。
520 | * :pclose -- 关闭预览窗口。热键是 C-w z。
521 | * :pedit abc.h -- 在预览窗口中编辑 abc.h
522 | * :psearch abc -- 搜索当前文件和当前文件 include 的文件,显示包含 abc 的行。
523 |
524 | 有时一个 tag 可能有多个匹配,如函数重载,一个函数名就会有多个匹配。 这种情况会先跳转到第一个匹配处。
525 |
526 | * :[n] tnext -- 下一 [n] 个匹配。
527 | * :[n] tprev -- 上一 [n] 个匹配。
528 | * :tfirst -- 第一个匹配
529 | * :tlast -- 最后一个匹配
530 | * :tselect tagname -- 打开选择列表
531 |
532 | tab 键补齐
533 |
534 | * :tag xyz -- 补齐以 xyz 开头的 tag 名,继续按 tab 键,会显示其他的。
535 | * :tag /xyz -- 会用名字中含有 xyz 的 tag 名补全。
536 |
537 | ## [13.3 cscope](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id104)
538 |
539 | * cscope -Rbq: 生成 cscope.out 文件
540 | * :cs add /path/to/cscope.out /your/work/dir
541 | * :cs find c func -- 查找 func 在哪些地方被调用
542 | * :cw -- 打开 quickfix 窗口查看结果
543 |
544 | ## [13.4 gtags](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id105)
545 |
546 | Gtags 综合了 ctags 和 cscope 的功能。 使用 Gtags 之前,你需要安装 GNU Gtags。 然后在工程目录运行 gtags 。
547 |
548 | * :Gtags funcname 定位到 funcname 的定义处。
549 | * :Gtags -r funcname 查询 funcname 被引用的地方。
550 | * :Gtags -s symbol 定位 symbol 出现的地方。
551 | * :Gtags -g string Goto string 出现的地方。 :Gtags -gi string 忽略大小写。
552 | * :Gtags -f filename 显示 filename 中的函数列表。 你可以用 :Gtags -f % 显示当前文件。
553 | * :Gtags -P pattern 显示路径中包含特定模式的文件。 如 :Gtags -P .h$ 显示所有头文件, :Gtags -P /vm/ 显示 vm 目录下的文件。
554 |
555 | ## [13.5 编译](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id106)
556 |
557 | vim 提供了:make 来编译程序,默认调用的是 make, 如果你当前目录下有 makefile,简单地:make 即可。
558 |
559 | 如果你没有 make 程序,你可以通过配置 makeprg 选项来更改 make 调用的程序。 如果你只有一个 abc.java 文件,你可以这样设置:
560 |
561 | set makeprg=javac\ abc.java
562 |
563 | 然后:make 即可。如果程序有错,可以通过 quickfix 窗口查看错误。 不过如果要正确定位错误,需要设置好 errorformat,让 vim 识别错误信息。 如:
564 |
565 | :setl efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
566 |
567 | % f 表示文件名,% l 表示行号, % m 表示错误信息,其它的还不能理解。 请参考 :help errorformat。
568 |
569 | ## [13.6 快速修改窗口](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id107)
570 |
571 | 其实是 quickfix 插件提供的功能, 对编译调试程序非常有用 :)
572 |
573 | * :copen -- 打开快速修改窗口。
574 | * :cclose -- 关闭快速修改窗口。
575 |
576 | 快速修改窗口在 make 程序时非常有用,当 make 之后:
577 |
578 | * :cl -- 在快速修改窗口中列出错误。
579 | * :cn -- 定位到下一个错误。
580 | * :cp -- 定位到上一个错误。
581 | * :cr -- 定位到第一个错误。
582 |
583 | ## [13.7 自动补全](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id108)
584 |
585 | * C-x C-s -- 拼写建议。
586 | * C-x C-v -- 补全 vim 选项和命令。
587 | * C-x C-l -- 整行补全。
588 | * C-x C-f -- 自动补全文件路径。弹出菜单后,按 C-f 循环选择,当然也可以按 C-n 和 C-p。
589 | * C-x C-p 和 C-x C-n -- 用文档中出现过的单词补全当前的词。 直接按 C-p 和 C-n 也可以。
590 | * C-x C-o -- 编程时可以补全关键字和函数名啊。
591 | * C-x C-i -- 根据头文件内关键字补全。
592 | * C-x C-d -- 补全宏定义。
593 | * C-x C-n -- 按缓冲区中出现过的关键字补全。 直接按 C-n 或 C-p 即可。
594 |
595 | 当弹出补全菜单后:
596 |
597 | * C-p 向前切换成员;
598 | * C-n 向后切换成员;
599 | * C-e 退出下拉菜单,并退回到原来录入的文字;
600 | * C-y 退出下拉菜单,并接受当前选项。
601 |
602 | ## [13.8 多行缩进缩出](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id109)
603 |
604 | * 正常模式下,按两下 >; 光标所在行会缩进。
605 | * 如果先按了 n,再按两下 >;,光标以下的 n 行会缩进。
606 | * 对应的,按两下 <;,光标所在行会缩出。
607 | * 如果在编辑代码文件,可以用 = 进行调整。
608 | * 在可视模式下,选择要调整的代码块,按 =,代码会按书写规则缩排好。
609 | * 或者 n =,调整 n 行代码的缩排。
610 |
611 | ## [13.9 折叠](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id110)
612 |
613 | * zf -- 创建折叠的命令,可以在一个可视区域上使用该命令;
614 | * zd -- 删除当前行的折叠;
615 | * zD -- 删除当前行的折叠;
616 | * zfap -- 折叠光标所在的段;
617 | * zo -- 打开折叠的文本;
618 | * zc -- 收起折叠;
619 | * za -- 打开 / 关闭当前折叠;
620 | * zr -- 打开嵌套的折行;
621 | * zm -- 收起嵌套的折行;
622 | * zR (zO) -- 打开所有折行;
623 | * zM (zC) -- 收起所有折行;
624 | * zj -- 跳到下一个折叠处;
625 | * zk -- 跳到上一个折叠处;
626 | * zi -- enable/disable fold;
627 |
628 | # [14\. 命令行](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id111)
629 |
630 | normal 模式下按:进入命令行模式
631 |
632 | ## [14.1 命令行模式下的快捷键:](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id112)
633 |
634 | * 上下方向键:上一条或者下一条命令。如果已经输入了部分命令,则找上一 条或者下一条匹配的命令。
635 | * 左右方向键:左 / 右移一个字符。
636 | * C-w: 向前删除一个单词。
637 | * C-h: 向前删除一个字符,等同于 Backspace。
638 | * C-u: 从当前位置移动到命令行开头。
639 | * C-b: 移动到命令行开头。
640 | * C-e: 移动到命令行末尾。
641 | * Shift-Left: 左移一个单词。
642 | * Shift-Right: 右移一个单词。
643 | * @: 重复上一次的冒号命令。
644 | * q: 正常模式下,q 然后按 ':',打开命令行历史缓冲区, 可以像编辑文件一样编辑命令。
645 | * q / 和 q? 可以打开查找历史记录。
646 |
647 | ## [14.2 执行外部命令](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id113)
648 |
649 | * :! cmd 执行外部命令。
650 | * :!! 执行上一次的外部命令。
651 | * :sh 调用 shell,用 exit 返回 vim。
652 | * :r !cmd 将命令的返回结果插入文件当前位置。
653 | * :m,nw !cmd 将文件的 m 行到 n 行之间的内容做为命令输入执行命令。
654 |
655 | # [15\. 其它](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id114)
656 |
657 | ## [15.1 工作目录](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id115)
658 |
659 | * :pwd 显示 vim 的工作目录。
660 | * :cd path 改变 vim 的工作目录。
661 | * :set autochdir 可以让 vim 根据编辑的文件自动切换工作目录。
662 |
663 | ## [15.2 一些快捷键(收集中)](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id116)
664 |
665 | * K: 打开光标所在词的 manpage。
666 | * *: 向下搜索光标所在词。
667 | * g*: 同上,但部分符合即可。
668 | * #: 向上搜索光标所在词。
669 | * g#: 同上,但部分符合即可。
670 | * g C-g: 统计全文或统计部分的字数。
671 |
672 | ## [15.3 在线帮助](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id117)
673 |
674 | * :h (elp) 或 F1 打开总的帮助。
675 | * :help user-manual 打开用户手册。
676 | * 命令帮助的格式为:第一行指明怎么使用那个命令; 然后是缩进的一段解释这个命令的作用,然后是进一步的信息。
677 | * :helptags somepath 为 somepath 中的文档生成索引。
678 | * :helpgrep 可以搜索整个帮助文档,匹配的列表显示在 quickfix 窗口中。
679 | * Ctrl+] 跳转到 tag 主题,Ctrl+t 跳回。
680 | * :ver 显示版本信息。
681 |
682 | ## [15.4 一些小功能](http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html#id118)
683 |
684 | * 简单计算器:在插入模式下,输入 C-r =,然后输入表达式,就能在 光标处得到计算结果。
--------------------------------------------------------------------------------
/Vim用户手册中文版72.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/itgoyo/DeliberatePracticeVimIn30Days/1cc53bdf1af6f828e4b2e538b2c6c5e527e2ed86/Vim用户手册中文版72.pdf
--------------------------------------------------------------------------------
/fortune.vim:
--------------------------------------------------------------------------------
1 | scriptencoding utf-8
2 |
3 | " Function: s:get_random_offset {{{1
4 | function! s:get_random_offset(max) abort
5 | return str2nr(matchstr(reltimestr(reltime()), '\.\zs\d\+')[1:]) % a:max
6 | endfunction
7 |
8 | " Function: s:draw_box {{{1
9 | function! s:draw_box(lines) abort
10 | let longest_line = max(map(copy(a:lines), 'strwidth(v:val)'))
11 | let top_bottom_without_corners = repeat(s:char_top_bottom, longest_line + 2)
12 | let top = s:char_top_left . top_bottom_without_corners . s:char_top_right
13 | let bottom = s:char_bottom_left . top_bottom_without_corners . s:char_bottom_right
14 | let lines = [top]
15 | for l in a:lines
16 | let offset = longest_line - strwidth(l)
17 | let lines += [s:char_sides . ' '. l . repeat(' ', offset) .' ' . s:char_sides]
18 | endfor
19 | let lines += [bottom]
20 | return lines
21 | endfunction
22 |
23 | " Function: #quote {{{1
24 | function! startify#fortune#quote() abort
25 | return s:quotes[s:get_random_offset(len(s:quotes))]
26 | endfunction
27 |
28 | " Function: #boxed {{{1
29 | function! startify#fortune#boxed(...) abort
30 | let wrapped_quote = []
31 | if a:0 && type(a:1) == type([])
32 | let quote = a:1
33 | else
34 | let Quote = startify#fortune#quote()
35 | let quote = type(Quote) == type(function('tr')) ? Quote() : Quote
36 | endif
37 | for line in quote
38 | let wrapped_quote += split(line, '\%50c.\{-}\zs\s', 1)
39 | endfor
40 | let wrapped_quote = s:draw_box(wrapped_quote)
41 | return wrapped_quote
42 | endfunction
43 |
44 | " Function: #cowsay {{{1
45 | function! startify#fortune#cowsay(...) abort
46 | if a:0
47 | let quote = a:0 && type(a:1) == type([]) ? a:1 : startify#fortune#quote()
48 | let s:char_top_bottom = get(a:000, 1, s:char_top_bottom)
49 | let s:char_sides = get(a:000, 2, s:char_sides)
50 | let s:char_top_left = get(a:000, 3, s:char_top_left)
51 | let s:char_top_right = get(a:000, 4, s:char_top_right)
52 | let s:char_bottom_right = get(a:000, 5, s:char_bottom_right)
53 | let s:char_bottom_left = get(a:000, 6, s:char_bottom_left)
54 | else
55 | let quote = startify#fortune#quote()
56 | endif
57 | let boxed_quote = startify#fortune#boxed(quote)
58 | return boxed_quote + s:cow
59 | endfunction
60 |
61 | " Function: #predefined_quotes {{{1
62 | function! startify#fortune#predefined_quotes() abort
63 | return s:predefined_quotes
64 | endfunction
65 |
66 | " Variables {{{1
67 | let s:cow = [
68 | \ ' __ ______ ______ ______ __ __ ______ ',
69 | \ '/\ \ /\__ _\ /\ ___\ /\ __ \ /\ \_\ \ /\ __ \ ',
70 | \ '\ \ \ \/_/\ \/ \ \ \__ \ \ \ \/\ \ \ \____ \ \ \ \/\ \ ',
71 | \ ' \ \_\ \ \_\ \ \_____\ \ \_____\ \/\_____\ \ \_____\ ',
72 | \ ' \/_/ \/_/ \/_____/ \/_____/ \/_____/ \/_____/ ',
73 | \ ]
74 |
75 | let s:unicode = &encoding == 'utf-8' && get(g:, 'startify_fortune_use_unicode')
76 |
77 | let s:char_top_bottom = ['-', '─'][s:unicode]
78 | let s:char_sides = ['|', '│'][s:unicode]
79 | let s:char_top_left = ['*', '╭'][s:unicode]
80 | let s:char_top_right = ['*', '╮'][s:unicode]
81 | let s:char_bottom_right = ['*', '╯'][s:unicode]
82 | let s:char_bottom_left = ['*', '╰'][s:unicode]
83 |
84 | let s:predefined_quotes = [
85 | \ ["Don't be a programmer,Be a problem solver.ㅤㅤ", '', '- itgoyo'],
86 | \ ]
87 |
88 | let s:quotes = exists('g:startify_custom_header_quotes')
89 | \ ? g:startify_custom_header_quotes
90 | \ : startify#fortune#predefined_quotes()
91 |
--------------------------------------------------------------------------------
/init.vim:
--------------------------------------------------------------------------------
1 |
2 | "设置相对行号
3 | set relativenumber
4 |
5 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
6 | " => Keymap
7 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
8 |
9 | "let mapleader = ","
10 | "let g:mapleader = ","
11 |
12 | exec 'cd ' . fnameescape('/Users/itgoyo/Documents/Vim')
13 |
14 | let mapleader = ","
15 |
16 | nmap mo :set modifiable
17 | set modifiable
18 |
19 | syntax on " 自动语法高亮
20 |
21 | " 键位绑定 Keymap
22 |
23 | " - 小键盘 0 到 9
24 | " Shift+键
25 | " Control+键
26 | " Alt+键 或 meta+键
27 | " 同
28 | " Escape 键
29 | " 光标上移键
30 | " 插入空格
31 | " 插入 Tab
32 | " 等于
33 | " Command
34 |
35 | " ACK
36 | map :Ack
37 |
38 | " 窗口快速切换切换
39 | nmap J j
40 | nmap H h
41 | nmap K k
42 | nmap L l
43 | nmap W w
44 | nmap C c
45 |
46 | " 括号自动不全
47 | inoremap ( ()i
48 | inoremap [ []i
49 | inoremap { {}O
50 |
51 | :noremap l l
52 | "使用leader+w 直接保存
53 | "nmap w :w!
54 | nmap q :wqall!
55 |
56 | "解决insert模式切换回normal模式下延迟的问题 这货会影响leader的事件触发,最好别用 浪费我很多时间
57 | "set timeoutlen=1 ttimeoutlen=0
58 |
59 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
60 | " => 自定义Keymap
61 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
62 | nnoremap :call AddTitle()
63 | nnoremap :call DateAndTime()
64 |
65 |
66 | "Mode Settings
67 |
68 | let &t_SI.="\e[5 q" "SI = INSERT mode
69 | let &t_SR.="\e[4 q" "SR = REPLACE mode
70 | let &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)
71 |
72 | "Cursor settings:
73 |
74 | " 1 -> blinking block
75 | " 2 -> solid block
76 | " 3 -> blinking underscore
77 | " 4 -> solid underscore
78 | " 5 -> blinking vertical bar
79 | " 6 -> solid vertical bar
80 |
81 |
82 |
83 | "let &t_SI = "\]50;CursorShape=1\x7"
84 | "let &t_SR = "\]50;CursorShape=2\x7"
85 | "let &t_EI = "\]50;CursorShape=0\x7"
86 |
87 |
88 |
89 |
90 | "MarkdownPreview
91 | "let g:instant_markdown_port = 8888
92 |
93 | " 退出插入模式指定类型的文件自动保存
94 | au InsertLeave * write
95 |
96 |
97 |
98 | " NERDTree
99 | map :NERDTreeToggle
100 |
101 | " Tagbar
102 | nmap :TagbarToggle
103 | " Tagbar
104 | nmap tb :TagbarToggle
105 |
106 | " fzf
107 | " Always enable preview window on the right with 60% width
108 | let g:fzf_preview_window = 'right:60%'
109 |
110 | nmap :Files
111 | nmap :Buffers
112 |
113 |
114 | " f{char} to move to {char}
115 | nmap f (easymotion-overwin-f)
116 |
117 | " s{char}{char} to move to {char}{char}
118 | nmap s (easymotion-overwin-f)
119 |
120 | "nmap w (easymotion-overwin-w)
121 |
122 | nnoremap a :echo("\ works! It is set to ")
123 |
124 | " Vim-Ranger
125 | map r :Ranger