La configuración de vim explicada en "vim must-notice" en geek.com

" 1、
" 为了可以重新执行 vimrc,开头先清除当前组的自动命令
if has('autocmd')
  " 为了可以重新执行 vimrc,开头先清除当前组的自动命令
  au!
endif


" 2、
" 图形界面的字体配置

" 如果图形界面在运行的话。
if has('gui_running')
    " 下面两行仅为占位使用,可以填入自己的字体,第二行的是设置宽字符字体,比如中文字体(根据需要直接百度或者通过命令:"helpgui-font"直
    " 接查看有哪些字体)
    set guifont=
    set guifontwide=

    " 在菜单中显示文件类型(如果是终端打开vim是看不出菜单的,有没有菜单都无所谓)
    " 不管有没有该语句,输入":emenu [tab]"也是可以显示出菜单的,而且里面也有语法选项,
    " 也可以查看全部的语法。
    let do_syntax_sel_menu = 1

    " 不延迟加载菜单(需要放在下面的 source 语句之前,终端打开的vim是没有菜单的,所以
    " 终端打开看不出什么效果)
    let do_no_lazyload_menus = 1
endif


" 3、
" 设置编辑文件的内码,对于现在类Unix的vim8来说可以省略,但如果是Window系统,最好还是加上。
set enc=utf-8


" 4、

" 导入vim示例配置,VIMRUNTIME我估计应该是配置的一个环境变量。
source $VIMRUNTIME/vimrc_example.vim


" 5、
" 启用 man 插件
" 光标在vim的某个关键字中,按大写K可以打开man帮助文档界面进行查看。
source $VIMRUNTIME/ftplugin/man.vim
set keywordprg=:Man

" 6、
" 设置tags文件的搜索路径
" 加入记录系统头文件的标签文件和上层的 tags 文件
set tags=./tags,../tags,../../tags,tags,/usr/local/etc/systags

" 7、
" 设置vim的语系解码的顺序,如果是在Linux环境下,一直使用UTF-8,这个设置有没有无所谓

" 以下解码的顺序的说明如下:
" 首先,检查文件是不是有 Unicode 的 BOM(字节顺序标记)字符,有的话按照 BOM 字符来转换文件内容。
" 其次,检查文件能不能当作 UTF-8 来解码;如果可以,就当作 UTF-8 来解释。
" 最后,如果上面的解码都不成功,就按 Latin1 字符集来解码;由于这是单字节的编码,转换必定成功。
set fileencodings=ucs-bom,utf-8,gb18030,latin1


" 8、
" 屏幕滚动设置

" 屏幕滚动设置主要是影响一般命令模式下的H命令和L命令,H命令功能是光标移动到最上面,但如果scrolloff=5的话,H命令就变成了6H命令,即会移动到
" 屏幕上方的第六行,这就改变了原来的含义了,同理L也是如此,因此屏幕滚动设置可以是0,也可以是1。
set scrolloff=0


" 9、
" 备份和撤销文件 

" 每次进行编辑的时候会备份上一次的文件,备份文件的文件名相比于原文件的文件名结尾会多一个~。
" set backup

" 一般大佬会如下进行配置:

" 将备份直接关闭
set nobackup

" 如果vim版本支持undo的话,即支持撤销文件
if has('persistent_undo')    
    " vim在重新打开一个文件时仍然可以撤销之前的编辑,这个记录了操作历史信息的撤销文件会保存到一个开头是.,结尾是.un~的文件中
    set undofile

    " 将撤销文件保留在目录(~/.vim/undodir)中,并将这个目录字符串赋值undodir变量
    " 这样设置会使撤销文件保存到指定的目录
    set undodir=~/.vim/undodir

    " 设置自动创建撤销文件目录(~/.vim/undodir)
    " isdirectory()是一个函数,作用是判断一个目录是否存在,存在返回true,不存在返回false 
    if !isdirectory(&undodir)         
	" &undodir 代表 undodir 这个变量的值。
        " call语句简单的说是用来调用一个函数的,后面跟函数名和相关的参数。
        " mkdir()函数可以用来创建一个目录,下面第一个参数是目录,第二个参数'p'我觉得是递归创建需要的参数,第三个选项是创建之
	" 后这个目录的权限,有点类似于命令行模式下的mkdir命令。
        call mkdir(&undodir, 'p', 0700) 
    endif
endif


" 10、
" 设置vim不需要和vi兼容,Unix上的vim8可以去掉,Windows系统上也可以去掉。
set nocompatible


" 11、
" 对鼠标支持进行设置(可以使用鼠标在vim中进行光标的移动,滑动鼠标进入可视模式进行文本选择)

" 检查当前vim版本是否支持鼠标,可以在命令行模式,通过命令(vim --version)查看对应的mouse项前面是否有加号,是一种方式。 
if has('mouse')     
    " 如果图形界面正在运行,终端是xtermk兼容,但不是mac的时候,因为不一定是所有的mac都支持xterm。 
    if has('gui_running') || (&term =~ 'xterm' && !has('mac'))         
	" 启用完全的鼠标支持,a我猜是对应all的简写,也就是所有权限的意思,如果在vim的所有模式中使用鼠标滑动时会进入可视模式,
	" 这时是不能将文本从vim中复制出去粘贴到vim之外的文件的,但是如果是xterm模式的话,可以通过按住键盘上的shift键不放手,
	" 之后滑动鼠标选择要进行复制的内容,之后右键进行复制就可以了,一定要按住shift键不放手。
	" 开启了鼠标支持之后如果使用分割命令将vim分割成多个窗口,可以直接用鼠标拖动的方式改变每个窗口的大小。非常的方便。
	set mouse=a     
    else    
	" nvi分别是是一般命令模式、可视模式和插入模式的简写,对于不支持xterm模式,一旦设置了mouse=a的话,那么我在vim中的所有模式中滑动鼠标,
	" 都会进入可视模式,从而永远不能将vim打开的文件中把一些信息复制出去,所以不能将vim中所有的模式都设置鼠标支持,一般可以将命令行模式不
	" 设置鼠标支持,其他的像一般命令模式、可视模式和插入模式都设置鼠标支持就行,这样就可以通过":"键进入命令行模式,从而可以将vim打开的文
	" 件中将文本复制出去了。具体的mouse参数设置可以在命令行输入(:help mouse)进行查看。
        set mouse=nvi     
    endif
endif



" 12、
" 使用minpac这个包管理器(管理下载的插件/软件包)
if exists('*minpac#init')
    " Minpac is loaded.
    call minpac#init()
    call minpac#add('k-takata/minpac', {'type': 'opt'})


    " Other plugins
    " 你肯定遇见过文件需要更名或者移动吧。这当然很简单,你可以通过图形界面或命令行进行操作。但这样操作之
    " 后,有一个问题是 Vim 的撤销历史跟文件就再也对不上了,你也没法再继续撤销更名或移动前的编辑操作了。有
    " 一个 Vim 插件,也是 Tim Pope 写的 tpope/vim-eunuch,可以解决这个问题。事实上,这个插件的功能远不止更
    " 名和移动。它实际上是把 Unix 的很多命令行工具搬到了 Vim 里(比较一下 Unix 和 eunuch 的发音你就知道这个
    " 插件的名字是什么意思了)。对我来说,最重要的就是它提供的 :Rename 和 :Move 命令,后面跟的参数就是新的
    " 名字或路径。这样操作之后,以后再打开这个更名或移动后的文件,仍然能够访问它的一切编辑历史。
    call minpac#add('tpope/vim-eunuch')

    " 文本对象增强的插件,其可以实现的功能如下:
    " 在一个单词的外面加上引号,如把 word 变成 "word",可以使用命令 ysiw"。
    " 把一个单词的外面的双引号变成单引号(有强迫症的 Python程序员很可能有这样的需求),如把 "word" 变成 'word',
    " 可以使用命令 cs"'。
    " 把外面的引号或括号变成 HTML 标签也没有问题,如把 [my choice] 变成 <em>mychoice</em>,可以使用命令 cs[<em>。
    " 可视模式也有类似的命令,如可以在选中 my choice 后,输入 S<em> 把文本变成<em>my choice</em>。
    " 当然,你也可以把加上的包围符号移除,命令是 ds 后面跟包围符号,如 ds" 可以移除外围的双引号;要移除 HTML 标签
    " 则使用 t 来表达,即使用 dst 来移除文本外面的第一个 HTML 标签
    call minpac#add('tpope/vim-surround')

    " 让用户自定义命令重复使用的插件。
    " 注意 Vim 命令 . 只能用来重复 Vim 的内置命令,而不能用来重复上面这样的用户自定义命令。为了解决这个问题,我也
    " 会安装 tpope/vim-repeat 插件,使得重复自定义用户的命令能够生效。
    call minpac#add('tpope/vim-repeat')
    
    " yegappan/mru插件可以在图形界面的菜单中查看最近使用的文件。如果是终端打开的vim
    " 是看不出什么效果的。如果是使用远程连接,不能使用图形界面,需要进行以下配置才
    " 可以在终端中查看最近使用的文件。
    call minpac#add('yegappan/mru')

    " 目录树插件
    " 以下是关于目录树的按键操作:
    " I键:开启和关闭隐藏文件显示
    " i键:打开一个文件到水平分割窗口
    " s键:打开一个文件到竖直分割窗口
    " t键:打开一个文件到一个新的标签页
    " 一般命令模式输入【:NERDTreeToggle】可打开目录树,可以设置快捷键。
    call minpac#add('preservim/nerdtree')

    " tagbar插件
    " Ctags 是一个可以从源代码中提取符号的工具。Vim 的插件 tagbar 就可以利用 Ctags 来提取符号,
    " 生成源代码的结构图。只要 Ctags 能支持这种语言,插件就能“识别” 这种语言,来生成结构图;识
    " 别的好坏程度也视 Ctags对其的支持程度而定。在使用tagbar插件之前要在github上先下载universal ctags。
    " 可以对tagbar插件进行快捷键设置,用以快速打开和关闭tagbar窗口。
    call minpac#add('majutsushi/tagbar')
	
    " asyncrun.vim插件
    " 可以支持异步任务,针对于命令【:make】、【:grep】等vim内部命令,在这些命令执行时可以做其他的
    " 事情,需要进行一定的配置
    call minpac#add('skywind3000/asyncrun.vim')
    
    " 知道文件名或其中的关键部分,但不知道或不关心文件在哪里。这种情况下,可以使用Fzf的模糊匹配来
    " 查找文件。在使用该插件的时候需要下载fzf软件。
    " 通过在一般命令行模式输入【:Files<CR>】之后输入关键字就可以进行模糊查询了。
    call minpac#add('junegunn/fzf', {'do': {-> fzf#install()}})
    call minpac#add('junegunn/fzf.vim') 

    " 撤销树插件
    " Vim 不仅支持多级撤销,而且有撤销树的概念。利用撤销树,你可以转回到编辑中的任何一个历史状态。不过,
    " 问题是,Vim 用来管理撤销树的命令不那么直观。
    " 著名的撤销树插件有两个,一个是 mbbill/undotree,一个是 sjl/gundo.vim。两者功能相似,界面风格和快捷
    " 键有所不同。下面使用功能更加丰富的undotree。可以通过快捷键设置开关撤销树。
    call minpac#add('mbbill/undotree')
endif

" 对包管理器minpac进行命令配置
if has('eval')
    " Minpac commands
    command! PackUpdate packadd minpac | source $MYVIMRC | call minpac#update('', {'do': 'call minpac#status()'})
    command! PackClean  packadd minpac | source $MYVIMRC | call minpac#clean()
    command! PackStatus packadd minpac | source $MYVIMRC | call minpac#status()
    " asyncrun.vim插件配置在执行内置命令【:make】时可以做其他事情
    " 和 asyncrun 一起用的异步 make 命令
    " 下面的命令会使用 makeprg 选项。不过,还有个问题是默认情况下屏幕上看不到执行过程的信息。
    " 我们可以让 asyncrun 在执行命令时立即打开 quickfix窗口,可以设置quickfix窗口的大小,设置
    " 语句在下面。
    command! -bang -nargs=* -complete=file Make AsyncRun -program=make @ <args>
endif


" yegappan/mru插件远程连接的相关配置。
" 下面的配置中按下F2,之后按tab键就可以看到最近使用的文件有哪些了。
if !has('gui_running')
    " 设置文本菜单
    if has('wildmenu')
        set wildmenu
        set cpoptions-=<
        set wildcharm=<C-Z>
        nnoremap <F2>      :emenu <C-Z>
        inoremap <F2> <C-O>:emenu <C-Z>
    endif
endif

" 13、
" 对Vim 8.0.0210之前的版本手工配置括号粘贴模式,由于该版本之后的vim大多数
" 兼容xterm,以及引入了括号粘贴模式,所以以下代码变得不重要了。
if !has('patch-8.0.210')
    " 进入插入模式时启用括号粘贴模式
    let &t_SI .= "\<Esc>[?2004h"
    " 退出插入模式时停用括号粘贴模式
    let &t_EI .= "\<Esc>[?2004l"
    " 见到 <Esc>[200~ 就调用 XTermPasteBegin
    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

    function! XTermPasteBegin()
	" 设置使用 <Esc>[201~ 关闭粘贴模式
    	set pastetoggle=<Esc>[201~
    	" 开启粘贴模式
    	set paste
    	return ""
    endfunction
endif


" 14、
" 在图形界面的vim8中,开启在文件已经打开时自动切换到已经打开的 Vim窗口上。
" 这个功能在文件处于一个不活跃的标签页时特别有用,因为 Vim 能把这个标签页自动
" 切到最前面。
if v:version >= 800
    packadd! editexisting
endif


" 15、
" 各个功能的快捷键设置
" nnoremap是正常模式使用的按键映射,inoremap是插入模式下使用的按键映射。

" 切换窗口的键映射
" 切换到下面窗口
noremap <C-j> <C-W>j
" 切换到上面窗口
noremap <C-k> <C-W>k
" 切换到左面窗口
noremap <C-h> <C-W>h
" 切换到右面窗口
noremap <C-l> <C-W>l

" 停止搜索高亮的键映射
" 在一般命令模式和插入模式中按F2,即可设置取消高亮。
nnoremap <silent> <F3>      :nohlsearch<CR>
inoremap <silent> <F3> <C-O>:nohlsearch<CR>

" nerdtree目录树插件快捷键设置
" 设置打开目录树快捷键F7
nnoremap <F7> :NERDTreeToggle<CR>

" 开关撤销树的键映射
nnoremap <F6>      :UndotreeToggle<CR>
inoremap <F6> <C-O>:UndotreeToggle<CR>

" tagbar快捷键的设置
nnoremap <F9>      :TagbarToggle<CR>
nnoremap <F9> <C-O>:TagbarToggle<CR>

" 用于 quickfix、标签和文件跳转的键映射
" Vim 里有一种特殊类型的窗口,被称作 quickfix(快速修复)。这个窗口中会展示外部
" 命令的结果,并可以通过这个窗口中的内容直接跳转到特定文件的特定位置。这个设计
" 最初是用来加速“编辑 - 编译 - 编辑”这个循环的,但它的实际用处并不只是用来编译程序。
" 如果你的代码可以简单执行 make 来编译的话(也就是说,你已经写了或者生成了合适的 Makefile),
" 你可以尝试直接在 Vim 里执行 :make。你会看到正常的执行过程。唯一不一样的地方是,
" 如果编译失败了,Vim 会自动跳转到第一个出错的位置!如果使用 :copen 命令,我们就
" 可以打开 quickfix 窗口。在里面我们可以看到完整的出错信息,并能通过颜色看出 Vim 
" 解析了文件名和行号。我们在带文件名的行上双击即可跳转到对应位置。
" 设置ctrl + n在一般命令模式下查看下一处错误
nmap <C-n>   :cn<CR>
" 设置ctrl + p在一般命令模式下查看上一处错误
nmap <C-p>   :cp<CR>
" 设置ctrl + o在一般命令模式下打开quickfix窗口
nmap <C-o> :copen<CR>
" 设置ctrl + o在一般命令模式下关闭quickfix窗口
nmap <C-c> :cclose<CR>


" 替换光标下单词的键映射
" viw表示可视模式下选中一个单词,然后将其粘贴为最近复制过的一个内容(可以是dd命令
" 删除的内容,也可以是y命令复制的内容)。一般模式下和可视模式都设置为【\v】。
nnoremap <Leader>v viw"0p
vnoremap <Leader>v    "0p


" asyncrun.vim插件快捷键设置 
" 对于 C/C++程序员来讲,启动和停止构建是一个很频繁的操作。所以,给它分配了一个快捷键F5
" 映射按键来快速启停构建
nnoremap <F5>  :if g:asyncrun_status != 'running'<bar>
                 \if &modifiable<bar>
                   \update<bar>
                 \endif<bar>
                 \exec 'Make'<bar>
               \else<bar>
                 \AsyncStop<bar>
               \endif<CR>

" 16、
" 设置一些自动命令
if has('autocmd')
    function! GnuIndent()
	setlocal cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1
        setlocal shiftwidth=2
        setlocal tabstop=8
    endfunction
    
    " asyncrun 在执行命令时立即打开 quickfix窗口,可以设置quickfix窗口的大小。
    " 异步运行命令时打开 quickfix 窗口,高度为 10 行
    let g:asyncrun_open = 10

    au FileType c,cpp,objc  setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=4 cinoptions=:0,g0,(0,w1
    au FileType json        setlocal expandtab shiftwidth=2 softtabstop=2
    au FileType vim         setlocal expandtab shiftwidth=2 softtabstop=2

    au FileType help        nnoremap <buffer> q <C-W>c

    au BufRead /usr/include/*  call GnuIndent()
endif

Supongo que te gusta

Origin blog.csdn.net/ISs_Cream/article/details/107778047
Recomendado
Clasificación