Vim 操作及其配置

在 Linux 终端下用 Vim 编辑程序时,不能按 Ctrl + S!

对于大多数终端,可以用 Ctrl + S 禁用“回显”,然后用Ctrl + Q 启用“回显”。引用来源

打印了一份《Vim基本操作思维导图.pdf》,放在桌子上,用到的时候随时查看。其中有不足之处,例如,关于替换的操作让我困惑了好几次,后来在网上重新搜索 Vim查找替换及正则表达式的使用 之后,才明白过来 g 参数并非全局,而是整行。

所以,系统性的学习还是很有必要的。参考 Vim命令合集,其中也有瑕疵,多看评论。在实践中慢慢掌握才是王道,再如何花费时间去查阅,随手敲敲命令看看效果都是浪费时间,刻意地进行反复练习,效果有,但是意义呢?

windows 之 gVim

引用 windows下gVim(Vi/vim)基本使用 中的描述:

Vim 是一个 Linux 平台上功能非常强大的编辑器,他是早年的 Vi 编辑器的加强版。这个 gVim 是 windows 版的,并且有了标准的 windows 风格的图形界面,所以叫 g(graphical)Vim。我们可以将 gvim 理解为 vim(vi的加强版)图形化版本,其指令和用法都完全相同,所以可以參考 vim 的指令。

安装之后,gVim, gVim Diff, gVim Easy, gVim Read-only 简单区别:

  • 通常我们常用的是 gVim.

  • Diff 是用来对比两个文件内容用的,直接打开挺没用的,不过直接拖 2 个文件到快捷方式上倒是可行;

  • Easy 启动的时候是 insert 模式,适合普通 windows 用户的习惯;

  • Read-Only 的用途:比如用 read-only 打开已经用 vim 打开过的文件,就不会提示让人烦躁的 .swp 文件存在的问题;

    比如可以用它来看 TXT 的电子书不会存在误删误改(ctrl+b ctrl+f 很方便).

Vim 配置

在网上直接找到了 spf13,号称 vim 的终极配置。应该是很棒的样子。但是我只开发 C/C++,感觉 spf13 整合的好多。一方面机器资源有限,能感觉到配置 spf13 之后打开 vim 变慢,另一方面,毕竟是 vim 新手,连复制粘贴都尚未熟练掌握的菜鸟,并不能领会到 spf13 有多强大。或许太容易得到的也就不珍惜吧。

讨论帖-用 vim 开发 c/c++,求推荐 vim 配置 中一句甚合我意,说得很是贴心。所以打算自己一点点来,学习 vim 配置的语法,磨合专属的 vim。

vim 这玩意就是自己磨合出来的,别人的配置拿过来还用 vim 干嘛,直接上 ide 了

以后就泡 Vimer 的程序世界-把VIM打造成一个真正的IDE,慢慢来。不要有投机取巧的心理,以为找到一款好的配置就可以熟练操作 vim,写起代码来虎虎生风。所有事情都是需要积累,付出辛苦,付出努力的!

等磨合一段时间之后,回过头来再看别人的配置。

Debian8Light 系统 vimer 用户操作记录

2016/7/13 19:50:19 Vim 配置暂告一段落,先用用再说。重点在于 c++11 的编程能力!要懂得适可而止,互联网时代任何知识点进行深挖都是可以穷尽时间的。

  1. 安装 vundle

  2. 安装 YouCompleteMe

    安装过程中碰到空间不足问题,其实是 /tmp 分区时分配空间太小,只有几十M造成的。解决方案 linux下编译出现空间不足解决办法

  3. 插件控,主要参考 编辑利器 Vim 之插件配置 折腾。大多数插件都设置有快捷键,死记硬背是没用的

    括号、引号的匹配输入,我要求的是在括号、引号中输入完毕后使用快捷键跳出,然后继续输入,而不是手工移到括号、引号外。验证 delimitMate、auto-pairs 相关功能

  4. 代码补全: YCM + (ultisnips & vim-snippets),两者在快捷键上存在冲突。。即便

    YouCompleteMe 的文档说它集成了 supertab 的功能

    需要进一步配置,参考 How to Make YouCompleteMe Compatible with UltiSnips。可能是 YCM 集成 supertab 有过调整,如果采用上述中的配置并使之生效的话需要单独安装 supertab。实际操作中,并不理想,会出现莫名其妙的状况。

  5. 自动补齐括号、引号。使用 delimitMate 跳出自动补全的括号快捷键 Shift+Tab,一直无效,所以觉得不好用。直到发现:

    1. 先是被 XShell 终端占用了,作为“转到最近对话”的快捷键;
    2. 其次,是被 YCM 占用了
    3. 结果,还是无效……
    4. auto-pairs 的 也无效……
  6. 注释开关:[count]<leader>c<space>

截至 2016/7/13 11:07:15 2017/5/26 17:21:35 使用的 .vimrc 文件和 /home/vimer/.vim/ftplugin 目录下的 cpp.vim 文件。(ps:hexo 不支持 VimL 标签,无语法高亮)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
set nocompatible              " be iMproved, required
filetype off " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Bundle 'ervandew/supertab'
" YCM 已经集成了 syntastic
Bundle 'Valloric/YouCompleteMe'
" 引擎 & 代码块描述
Bundle 'SirVer/ultisnips'
Bundle 'honza/vim-snippets'
" delimitMate 不好用。使用 auto-pairs
"Bundle 'Raimondi/delimitMate'
Bundle 'jiangmiao/auto-pairs'
Bundle 'tpope/vim-surround'
"Bundle 'rdnetto/YCM-Generator'
"快速注释
Bundle 'scrooloose/nerdcommenter'
"文档化注释
Bundle 'vim-scripts/DoxygenToolkit.vim'
"目录树
Bundle 'scrooloose/nerdtree'
"函数列表
Bundle 'majutsushi/tagbar'
"快速查找
Bundle 'kien/ctrlp.vim'
"状态栏
Bundle 'vim-airline/vim-airline'
" Git 工具
Bundle 'tpope/vim-fugitive'
" cpp 语法高亮
Bundle 'octol/vim-cpp-enhanced-highlight'
"代码格式化工具
Bundle 'Chiel92/vim-autoformat'
" plugin from http://vim-scripts.org/vim/scripts.html
Bundle 'EasyGrep'
"头文件和源文件快速切换
Bundle 'a.vim'
" 自动插入 commets
Bundle 'c.vim'
" plugin from http://vim-scripts.org/vim/scripts.html
" Git plugin not hosted on GitHub
" git repos on your local machine (i.e. when working on your own plugin)
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.

" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

let g:ycm_global_ycm_extra_conf = '/home/vimer/.ycm_extra_conf.py'
" 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示
let g:ycm_confirm_extra_conf=0

set number
syntax on
" 映射快捷键。<leader> 前缀键默认是 \
nnoremap <F8> :TagbarToggle<CR>
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap <Leader>fl :NERDTreeToggle<CR>
"设置NERDTree子窗口宽度
let NERDTreeWinSize=23"
" Trigger configuration. Do not use <tab> if you use
" https://github.com/Valloric/YouCompleteMe.
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger='<C-b>'
let g:UltiSnipsJumpBackwardTrigger='<C-z>'
" 解决 Ultisnips 与 YCM 插件的冲突
" First, change the default key-binding of YCM
let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
" Then set the default action of SuperTab to triggering <C-n>
let g:SuperTabDefaultCompletionType = '<C-n>'

let g:DoxygenToolkit_authorName="nielong <nielong2014@gmail.com>"
let g:DoxygenToolkit_briefTag_funcName="yes"
let g:doxygen_enhanced_color=1
1
2
3
4
5
set shiftwidth=2
" 快捷键,编译运行
nnoremap <F5> <Esc>:w<CR>:!g++ -std=c++11 % -o /tmp/a.out && /tmp/a.out<CR>
nnoremap <F7> <Esc>:w<CR>:!g++ -std=c++11 %<CR>
nnoremap <C-F5> <Esc>:w<CR>:!g++ -std=c++11 -g % -o /tmp/a.out && gdb /tmp/a.out<CR>
  • c.vim 插件支持作者信息、创建日期、文件描述等信息,但不包含更新日期;不支持头文件自动生成 ifndf 等宏。