我的vim配置

虽然在 Vim安装 中可以通过自定义编译以及插件安装方式,打造一个功能强大的IDE。不过,步骤相对繁琐。所以,我以 Ultimate vimrc 为基础,重新构建一个精简的vim开发环境:

  • Ultimate vimrc 在GitHUB上拥有 26.8k 的Star,足以见得该项目的成功;并且还在不断改进

  • Ultimate vimrc awesome version 提供了精简但同时具备插件扩展,可以方便自己定制

Ultimate vimrc安装

建议安装Awesome版本,包含了大量强大插件,并且非常容易扩展:

安装Ultimate vimrc Awsome版本
git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_awesome_vimrc.sh

是的,安装步骤就是这么简单…

升级

要升级 vimrc 执行以下命令(git rebase):

升级Ultimate vimrc
cd ~/.vim_runtime
git reset --hard
git clean -d --force
git pull --rebase
python update_plugins.py  # use python3 if python is unavailable

jedi-vim

Ultimate vimrc 使用了 GitHub:jedi-vim 来实现vim的 Python autocompletion,依赖于 python-jedi 。在 Arch Linuxstrike:macOS ( macOS 系统自带vim不支持python也会报这个错误,但是 pip install jedi 不能解决这个问题,需要使用 Homebrew 安装内置支持Python3的vim ) 上默认可能没有安装,此时使用 vim 编辑文件会提示错误:

Error detected while processing BufRead Autocommands for "*.rst"..FileType Autocommands for "*"..Syntax Autocommands for "*"..function <SNR>14_SynSet[25]..script /usr/share/vim/vim90/syntax/rst.vim[230]../h
ome/huatai/.vim_runtime/sources_non_forked/jedi-vim/after/syntax/python.vim[1]../home/huatai/.vim_runtime/sources_non_forked/jedi-vim/autoload/jedi.vim[260]..function jedi#init_python[13]..BufRead Autocomma
nds for "*.rst"..FileType Autocommands for "*"..Syntax Autocommands for "*"..function <SNR>14_SynSet[25]..script /usr/share/vim/vim90/syntax/rst.vim[230]../home/huatai/.vim_runtime/sources_non_forked/jedi-v
im/after/syntax/python.vim[1]../home/huatai/.vim_runtime/sources_non_forked/jedi-vim/autoload/jedi.vim[260]..function jedi#init_python[11]..<SNR>156_display_exception:
line   19:
Error: jedi-vim failed to initialize Python: jedi#setup_python_imports: ModuleNotFoundError: No module named 'jedi' (in BufRead Autocommands for "*.rst"..FileType Autocommands for "*"..Syntax Autocommands f
or "*"..function <SNR>14_SynSet[25]..script /usr/share/vim/vim90/syntax/rst.vim[230]../home/huatai/.vim_runtime/sources_non_forked/jedi-vim/after/syntax/python.vim[1]../home/huatai/.vim_runtime/sources_non_
forked/jedi-vim/autoload/jedi.vim[260]..function jedi#init_python[4]..<SNR>156_init_python[6]..jedi#setup_python_imports, line 20). See :messages and/or :JediDebugInfo for more information.

验证可以在 python 中执行 import jedi 会提示错误:

>>> import jedi
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'jedi'

Arch Linux 解决方法很简单,就是安装 python-jedi

pacman -S python-jedi

也可以通过 pip 安装,例如在 macOS 上,现在默认是python3/pip3,则执行以下命令安装:

sudo pip3 install jedi

然后就可以正常使用

Ultimate vimrc配置

安装完成后,打开 ~/.vimrc 就会看出 Ultimate vimrc 巧妙之处:

用户目录 ~/.vimrc
" DO NOT EDIT THIS FILE
" Add your own customizations in ~/.vim_runtime/my_configs.vim

set runtimepath+=~/.vim_runtime

source ~/.vim_runtime/vimrcs/basic.vim
source ~/.vim_runtime/vimrcs/filetypes.vim
source ~/.vim_runtime/vimrcs/plugins_config.vim
source ~/.vim_runtime/vimrcs/extended.vim
try
  source ~/.vim_runtime/my_configs.vim
catch
endtry

Ultimate vimrc 将默认配置文件划分为4类,对应4个标准默认配置文件;同时提供个用户一个自定义配置文件 ~/.vim_runtime/my_configs.vim 让用户进行定制。我们的所有配置定制都应该在这个文件进行,避免项目原更新后本地配置被覆盖或冲突。

初步定制

relative行号

我觉得 relative linue number 可能是最值得启用的功能:

  • 以往需要复制多行数据,往往需要肉眼计算需要 yy 多少行,繁琐而容易出错

  • vim提供了自动现实相对行号的功能: 以当前光标行为基础,动态显示上下行的相对行差,这样就非常容易知道需要复制多少行能够覆盖需要复制的内容

启用命令:

:set relativenumber
:set rnu

关闭命令:

:set norelativenumber
:set nornu

不过,此时当前行一直显示是 0 不是很直观。没关系,从 vim 7.4 开始可以同时启用当前行号和相对行号:

:set number relativenumber
:set nu rnu
  • ~/.vim_runtime/my_configs.vim 中添加以下行启用上述功能:

    set nu rnu
    

字体色彩定制

Ultimate vimrc 内置了多种 color schemes ,默认是 peaksea 。但是这个默认字体色彩比较暗淡(素雅),阅读代码色彩对不不太强烈清晰,所以我修订为 dracula (暗黑模式尤其出彩)。

  • ~/.vim_runtime/my_configs.vim 中添加以下行启用暗黑模式 dracula 色彩模式:

    set background=dark
    colorscheme dracula
    

完整 my_configs.vim

  • 最终完成 ~/.vim_runtime/my_configs.vim :

~/.vim_runtime/my_configs.vim
" 行号和配色
"
set nu rnu
set background=dark
colorscheme dracula

" 自动缩进
"
filetype indent on
set ai
set si

" 折叠
"
set foldmethod=syntax
set foldlevelstart=99

插件安装

常规插件安装

Ultimate vimrc 使用 tpope / vim-pathogen 管理插件。 vim-pathogen 包装了著名的 Vundle.vim GitHub ,提供自动插件安装

  • 只需要将插件的github项目clone到 ~/.vim_runtime 目录下,例如 XXX_plugin

    cd ~/.vim_runtime/my_plugins
    git clone https://github.com/xxx/XXX_plugin.git
    
  • 然后打开vim应用, Ultimate vimrc 会自动完成插件安装

YouCompleteMe插件

  • 需要注意,默认 Kali Linux 安装的是 vim.basic

    $ ls -lh /etc/alternatives/vim
    lrwxrwxrwx 1 root root 18 Feb 10 04:06 /etc/alternatives/vim -> /usr/bin/vim.basic
    

这个基础版本vim没有内建支持Python:

YouCompleteMe unavailable: requires Vim compiled with Python (3.6.0+) support.

那么要如何安装一个内置支持python的vim呢?

备注

RedHat Linux 系列中,使用 Fedora ,则安装 vim-enhanced 软件包:

sudo dnf install vim-enhanced

安装完成后检查 /etc/alternative/vim 可以看到原先软链接到 /usr/bin/vim.basic 被修订成 /usr/bin/vim.nox

$ ls -lh /etc/alternatives/vim
lrwxrwxrwx 1 root root 16 Apr 26 07:24 /etc/alternatives/vim -> /usr/bin/vim.nox
  • 完整安装依赖(包括支持python的vim版本,以及cmake等):

Ubuntu编译YouCompleteMe依赖软件安装
sudo apt install build-essential cmake vim-nox python3-dev -y
Fedora编译YouCompleteMe依赖软件安装
sudo dnf install cmake gcc-c++ make python3-devel

备注

对于 Fedora 需要安装 python3-devel ,不过默认可能已经安装

安装自己需要的开发软件

Liinux平台安装Rust
curl https://sh.rustup.rs -sSf | sh -s -- --profile default
source $HOME/.cargo/env
Ubuntu安装Go和node.js
sudo apt install golang nodejs npm -y
Fedora安装Go和node.js
sudo apt install golang nodejs npm -y
  • 进入YouCompleteMe目录:

准备YCM目录
cd ~/.vim_runtime/my_plugins/
git clone https://github.com/ycm-core/YouCompleteMe.git
cd YouCompleteMe

由于 golang.org 网站被GFW屏蔽,所以会导致编译时无法获取go模块,需要 配置Go程序代理服务器 :

alias设置go代理
alias go='http_proxy=192.168.7.9:3128 go'

由于 npm 需要访问 npmjs.com 已经被GFW屏蔽( npm.org 没有屏蔽,但是重定向到 npmjs.com ),所以也要 配置npm代理 :

alias设置npm代理
alias npm='npm --proxy http_proxy=192.168.7.9:3128'

配置 git 代理:

全局配置git使用HTTP/HTTPS代理
git config --global http.proxy http://192.168.7.9:3128

由于 YouCompleteMe 编译需要从github下载 clangd 源代码tar包,所以还需要配置 Fedora/CentOS/RHEL代理设置

按需编译YouCompleteMe:

按需编译YouCompleteMe
git submodule update --init --recursive

python3 install.py --clangd-completer --go-completer \
        --ts-completer --rust-completer

如果出现编译错误,可以按照提示采用debug模式来观察哪里出现错误:

/usr/bin/python3 /home/huatai/.vim_runtime/my_plugins/YouCompleteMe/third_party/ycmd/build.py --clangd-completer --go-completer --ts-completer --rust-completer --verbose

使用YouCompleteMe

编译安装 YouCompleteMe 之后,使用 vim 打开任何支持开发语言的项目,都会自动创建索引并支持代码自动完成功能。这对提高开发效率非常有帮助,几乎就是IDE的完备功能。不过需要注意,类似 Go Atlas 项目构建索引需要访问Internet上的golang网站,如果被GFW屏蔽,会导致 vim 长时间停滞在 loading packages 状态而导致代码自动完成功能失效。

所以,务必确保 配置Go程序代理服务器 配置正确,即上述采用 alias 来保证 go 能够安装模块。

参考