zoukankan      html  css  js  c++  java
  • 简洁实用的vim配置

    原文:https://www.cnblogs.com/youxia/p/linux034.html

    前言##

    由于 Vim 的广泛流行,在网络上关于 Vim 的自定义配置汗牛充栋。既有高手 Tim Pope 的极简配置 tpope/vim-sensible(这个配置一个插件都没有),也有 spf13/spf13-vim 和 SpaceVim 这样大而全的配置。而对我来说,我喜欢简洁而优雅,一大堆 Plugin 堆砌起来的东西我固然不喜欢,但是一个插件都没有的极简配置那用起来也不太顺手。所以我必须得自己配。

    自己配 Vim,必然涉及到 Plugin 的选型的问题。说到选型,那就有很多话要说了。首先是 Vim 自身版本的进步和功能的进步,目前 Vim 已经进入到 Vim 8 的时代,增加了不少新功能,比如异步啊、比如内置 Terminal 啊之类的。而且还有 NeoVim 和它抢饭碗。其次就是 Vim 插件的作者的理念发生了变化,他们逐渐瞧不上纯粹 VimScript 写的插件,毕竟纯 VimScript 写的插件功能比较有限,速度也不够快。目前的 Vim 插件有几个发展趋势:一是要充分利用异步的支持,二是往往使用某些后端提供更强大的功能支持,三是喜欢搞大而全的框架。下面我来逐一举例说明。

    例如管理插件的插件,我以前一直都是用 Vundle,我觉得挺好用的。但是这几年又雨后春笋般的冒出了几种新的管理插件的插件,像 junegunn/vim-plug
    和 Shougo/dein.vim,看一下它们的说明,无一例外都是说使用了并发技术,加快了插件的下载速度。

    再例如 Vim 中的自动补全。其实 Vim 自身就支持补全功能,不过使用起来一点都不自动,需要使用 Ctrl+P 或者 Ctrl+X Ctrl+O 这样的快捷键才会调出补全功能。Vim 自身的补全功能支持 buffers 中的单词,也支持 dictionary 和 tags 中的条目。但是不管怎么说,都只是基于字面意义上的补全,不支持深层次的对编程语言的语义分析。但是可以用后端解决这个问题啊。像 Valloric/YouCompleteMe,在网络上的名声就是典型的难安装难配置,因为它需要使用 Clang 作为后端提供对 C/C++ 语义的支持,使用 Jedi 提供对 Python 的支持,使用 OmniSharp 提供对 C# 的支持,等等……。正是如此,使得我们若是想使用某些插件,还不得不在系统上安装 Clang、Python、Lua 这样的一些程序,比较复杂。

    自动补全中还有大名鼎鼎的 Shougo/neocomplete.vim。但是我到 github 上一看,好家伙,居然说在 Vim 8 上建议就不要用了,要用就用 Shougo/deoplete.nvim。这也算是 Vim 版本的升级推动插件的升级吧,虽然怎么看怎么像这些插件倾向于 NeoVim 更多一点。而 deoplete 也只是一个自动补全的框架,它还是需要很多后端对编程语言的语义分析提供支持。看下面这个截图,这些都是 deoplete 所需要的后端:

    再来一个例子,关于 Vim 中文件管理的,老牌的 NerdTree 不用说了吧,我用的挺舒服的。但现在流行的趋势是 vimfiler。然后我在 github 上一看,马上发现两个难题。一是 vimfiler 需要 unite.vim 支持,二是这个插件也不更新了,在 Vim 8 或者 NeoVim 的时代,请使用 Shougo/defx.nvim ,而且在 Defx 的文档中,赤裸裸地写明了,需要 Python 3.6.1+ 的支持。哦对了,必须提一下,Defx 我试用了,根本没配成功。

    通过前面的介绍,发现这个 Shougo 还真是有点高产。前面提到的 unite.vim 也是他写的,而且又升级了。在 Vim 8 或 NeoVim 中建议使用 Shougo/denite.nvim。这里的 unite 和 denite 就是我前面说的大而全的框架,框架之下,需要别的更多的插件作为 source 来提供更多的功能,而这个框架,负责把控 Vim 的界面。

    还有一个网红插件 Yggdroot/LeaderF,主要是为了取代经典的 ctrlp,而且其功能比 ctrlp 强大不少。这个倒是没有要求 Vim 8,不过还是要求 Python。值得一用。

    鉴于以上提到的错综复杂的关系,以及我自身的强迫症,我决定还是回归经典。Vim 7 就能用多好,纯 VimScript 多好,不想整那后端这后端的。所以我还是使用 Vundle 管理插件,并选择了 5 到 6 个最常用的插件,其中一个还是 scheme,算不得真正的插件。唯一的升级,可能算是把 taglist 升级为 tagbar 了吧。另外,我还是选择了 ctrlp,没有选择 LeaderF。我觉得功能够用了。至于 tpope/vim-surround 、nerdcommenter 之类的,那就不要了吧,不要它们也多敲不了几下键盘,还可以省下学习成本。

    必须得说明一下:怎么为 Vim 配插件还得看自己的需求。我主要是看文档和看代码,偶尔改改配置文件,有时还要在非 GUI 环境下改配置文件。就算写代码也只用 Vim 写非常简单的。所以我这个经典配置完全够用了,而且开箱即用,超级方便。至于需求比较复杂的,建议玩玩我前面提到的 SpaceVim 。

    准备工作##

    为了使用 Vim 自带的 tag 功能和按 tag 跳转功能,至少要安装 ctags。如果要阅读 Linux 的 Kernel 源代码,还得安装这个包,并解压缩。然后在 /usr/include 和 /usr/src/linux-source-4.15.0目录中执行 ctags 命令生成 tags 文件。命令如下:

    sudo apt install exuberant-ctags linux-source
    cd /usr/src/
    sudo tar jxvf linux-source-4.15.0.tar.bz2
    cd linux-source-4.15.0
    sudo ctags -R --c++-kinds=+p --fields=+ias --extra=+q
    cd /usr/include
    sudo ctags -R --c++-kinds=+p --fields=+ias --extra=+q
    

    ctags 可不仅仅只支持 C/C++ 语言哦。使用如下命令,可以看到 ctags 支持很多语言的:

    ctags --list-languages
    

    我的 Vim 配置##

    配置文件是 ~/.vimrc。我的思路是使用 Vundle 管理插件,而且只选择了少量几个最常用的插件。加上空行,代码也只有 75 行,非常简洁。其内容如下:

    set nocompatible
    
    filetype off
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    Plugin 'VundleVim/Vundle.vim'
    Plugin 'majutsushi/tagbar'
    Plugin 'kien/ctrlp.vim'
    Plugin 'scrooloose/nerdtree'
    Plugin 'vim-scripts/AutoComplPop'
    Plugin 'vim-scripts/OmniCppComplete'
    Plugin 'altercation/vim-colors-solarized'
    call vundle#end()
    filetype plugin indent on
    
    set history=1000
    set ruler
    set number
    set showcmd
    set showmode
    set laststatus=2
    set cmdheight=2
    set scrolloff=3
    
    set fillchars=stl: ,stlnc: ,vert: 
    
    set noerrorbells
    set novisualbell
    set t_vb=
    
    syntax on
    colorscheme desert
    set background=dark
    set cursorline
    hi CursorLine term=NONE cterm=NONE ctermbg=0 guibg=Gray40
    
    set backspace=2
    set whichwrap+=<,>,h,l
    
    set expandtab
    set smarttab
    set shiftwidth=4
    set tabstop=4
    set autoindent
    set cindent
    
    set nobackup
    set noswapfile
    set autoread
    set autowrite
    set autochdir
    set fileencodings=utf-8
    set fileformats=unix,dos,mac
    
    set showmatch
    set matchtime=2
    set hlsearch
    set incsearch
    set ignorecase
    set smartcase
    set magic
    set lazyredraw
    set nowrapscan
    set iskeyword+=_,$,@,%,#,-,.
    
    if has("gui_running")
        colorscheme solarized
        set guifont=monospace 12
    endif
    
    set tags+=/usr/include/tags
    map <F2> :NERDTreeToggle<CR>
    map <F3> :TagbarToggle<CR>
    map <F4> :CtrlPMixed<CR>
    map <F12> :!ctags -R --c++-kinds=+p --fields=+ias --extra=+q -I<CR>
    

    使用 Vundle 管理插件##

    我选择的插件管理器是 Vundle。首先在主目录下建立 .vim/bundle 目录,然后进入该目录,使用 git 下载 Vundle。

    mkdir ~/.vim
    mkdir ~/.vim/bundle
    cd ~/.vim/bundle
    git clone https://github.com/VundleVim/Vundle.vim.git
    

    配置方法见上面的第 3 到 14 行。然后启动 Vim,在其中输入 :PluginInstall 安装插件。

    运行效果##

    在使用过程中,按 F2 键调出 NerdTree,按 F3 键调出 Tagbar,按 F4 键调出 CtrlP。如果查看某个项目的代码,只需要进入该项目的目录后,按 F12 键,则自动生成该项目的 tags 文件。控制台下运行,是这个效果:

    用 GVim 运行,是这个效果:

    人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。
  • 相关阅读:
    valueof这个万能方法,将string转换为int或者int转换为string都可以
    java的数组index[]方括号内是可以进行算数运算的
    项目工程的包package与文件夹的关系
    导入项目后下载jar包问题理解
    MySQL 5.6.19 二进制安装
    左右 android AES 所述机器的一部分 javax.crypto.BadPaddingException: pad block corrupted
    iOS_词典阵列 按key分组和排序
    Maven真——聚合和继承(于)
    机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型
    切点算法模板(Cut-vertex)
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/14428344.html
Copyright © 2011-2022 走看看