├── 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 | ![](keymap.png) 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 | ![](https://gitee.com/itgoyo/PicGoRes/raw/master/img/20200729160234.png) 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 | ![](https://gitee.com/itgoyo/PicGoRes/raw/master/img/20200731134927.png) 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. 126 | g:ranger_command_override 127 | let g:ranger_command_override = 'ranger --cmd "set show_hidden=true"' 128 | set shell=bash 129 | 130 | 131 | " 切换buffer 132 | " Buffer Navigation 133 | "nmap :bprevious 不知道mac hhkb下面是什么原因,如果是这个组合键的话,Caps映射的ESC会经常触发这个所以打算更换快捷键 134 | "nmap :bnext 135 | nmap :bprevious 136 | nmap :bnext 137 | 138 | """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 139 | " => Plugin 140 | """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 141 | 142 | call plug#begin('~/.vim/plugged') 143 | 144 | " vim-airline 145 | Plug 'vim-airline/vim-airline' 146 | 147 | " colorscheme gruvbox 148 | Plug 'morhetz/gruvbox' 149 | 150 | " nerdtree 151 | Plug 'preservim/nerdtree' 152 | 153 | " Tagbar 154 | Plug 'majutsushi/tagbar' 155 | 156 | " ctrlp 157 | Plug 'ctrlpvim/ctrlp.vim' 158 | 159 | " MarkdownPreview 160 | Plug 'suan/vim-instant-markdown', {'for': 'markdown'} 161 | 162 | " Fzf Vim 163 | Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } 164 | Plug 'junegunn/fzf.vim' 165 | set rtp+=/usr/local/opt/fzf 166 | Plug '/usr/local/opt/fzf' 167 | 168 | 169 | " easymotion 170 | Plug 'easymotion/vim-easymotion' 171 | 172 | " wakatime 173 | Plug 'wakatime/vim-wakatime' 174 | 175 | " indent 176 | Plug 'nathanaelkane/vim-indent-guides' 177 | 178 | " COC 179 | " Use release branch (recommend) 180 | Plug 'neoclide/coc.nvim', {'branch': 'release'} 181 | 182 | " Vim-GO 183 | Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } 184 | 185 | " ACK 186 | Plug 'mileszs/ack.vim' 187 | 188 | " Vim-Startify 189 | Plug 'mhinz/vim-startify' 190 | 191 | " Vim-Surround 192 | Plug 'tpope/vim-surround' 193 | 194 | " Vim-Ranger 195 | Plug 'francoiscabrol/ranger.vim' 196 | Plug 'rbgrouleff/bclose.vim' 197 | 198 | " Rainbow 199 | Plug 'luochen1990/rainbow' 200 | 201 | " Color 202 | Plug 'ap/vim-css-color' 203 | 204 | 205 | call plug#end() 206 | 207 | 208 | " ACK 209 | Plug 'mileszs/ack.vim' 210 | 211 | " Vim-Startify 212 | Plug 'mhinz/vim-startify' 213 | 214 | " Vim-Surround 215 | Plug 'tpope/vim-surround' 216 | 217 | call plug#end() 218 | 219 | """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 220 | " => Methods 221 | """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 222 | 223 | 224 | " 让输入上方,搜索列表在下方 225 | let $FZF_DEFAULT_OPTS = '--layout=reverse' 226 | 227 | " 打开 fzf 的方式选择 floating window 228 | let g:fzf_layout = { 'window': 'call OpenFloatingWin()' } 229 | 230 | function! OpenFloatingWin() 231 | let height = &lines - 3 232 | let width = float2nr(&columns - (&columns * 2 / 10)) 233 | let col = float2nr((&columns - width) / 2) 234 | 235 | " 设置浮动窗口打开的位置,大小等。 236 | " 这里的大小配置可能不是那么的 flexible 有继续改进的空间 237 | let opts = { 238 | \ 'relative': 'editor', 239 | \ 'row': height * 0.3, 240 | \ 'col': col + 30, 241 | \ 'width': width * 2 / 3, 242 | \ 'height': height / 2 243 | \ } 244 | 245 | let buf = nvim_create_buf(v:false, v:true) 246 | let win = nvim_open_win(buf, v:true, opts) 247 | 248 | " 设置浮动窗口高亮 249 | call setwinvar(win, '&winhl', 'Normal:Pmenu') 250 | 251 | setlocal 252 | \ buftype=nofile 253 | \ nobuflisted 254 | \ bufhidden=hide 255 | \ nonumber 256 | \ norelativenumber 257 | \ signcolumn=no 258 | endfunction 259 | 260 | 261 | 262 | 263 | 264 | " 時間顯示 http://vim.wikia.com/wiki/Insert_current_date_or_time 265 | function! DateAndTime() 266 | redraw 267 | echohl WarningMsg 268 | echo strftime(" ⏰ 現在時間 %Y-%m-%d %H:%M:%S ⏰ ") 269 | echohl NONE 270 | endfunction 271 | 272 | 273 | " 输入xtime 然后按一下tab按键就可以显示时间了 2020-07-29 16:23:13 274 | iab xtime =strftime("%Y-%m-%d %H:%M:%S") 275 | 276 | function AddTitle() 277 | call append(1,"/**") 278 | call append(2," * Author: itgoyo - itgoyo@gmail.com") 279 | call append(3," * Create time: " . strftime("%Y-%m-%d %H:%M")) 280 | call append(4," * Last modified: " . strftime("%Y-%m-%d %H:%M")) 281 | call append(5," * Filename: " . expand("%")) 282 | call append(6," * Description: ") 283 | call append(7," */") 284 | endf 285 | 286 | 287 | 288 | "have indent guides enabled by default 289 | let g:indent_guides_enable_on_vim_startup = 1 290 | 291 | " colorscheme 292 | set bg=dark 293 | colorscheme gruvbox 294 | 295 | 296 | let g:go_highlight_functions = 1 297 | let g:go_highlight_methods = 1 298 | let g:go_highlight_fields = 1 299 | let g:go_highlight_types = 1 300 | let g:go_highlight_operators = 1 301 | let g:go_highlight_build_constraints = 1 302 | autocmd FileType go nmap r (go-run) % 303 | autocmd FileType go nmap b (go-build) % 304 | autocmd FileType go nmap t (go-test) % 305 | 306 | 307 | let g:rainbow_active = 1 308 | 309 | autocmd FileType go nmap t (go-test) % 310 | -------------------------------------------------------------------------------- /keymap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/itgoyo/DeliberatePracticeVimIn30Days/1cc53bdf1af6f828e4b2e538b2c6c5e527e2ed86/keymap.png --------------------------------------------------------------------------------