March 30, 2020

8871 words 18 mins read

Linux之像IDE一样使用vim(C++版本/Python版本

Linux之像IDE一样使用vim(C++版本/Python版本

打造vim实用配置方案

这篇文章的目的,是打造让自己感觉舒服好用的Vim/NeoVim环境以便获得更好的编程体验,并将我所遇到的一些问题列出解决方案,不足之处还请见谅,欢迎与各位进行交流,邮箱是kangzhiheng@live.cn

本文所有命令,在CentOS7.6 上全部测试通过,Mac系统相对来说配置比较容易,在此不做特别说明,每一步都有详细的步骤,敬请参考。

什么是Vim?

Vim- the ubiquitous text editor,一种无处不在的文本编辑器,维基百科是这么介绍vim的:

Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。

Vim的第一个版本由布莱姆·米勒在1991年发布。最初的简称是Vi IMitation,随着功能的不断增加,正式名称改成了Vi IMproved。现在是在开放源代码方式下发行的自由软件

文件的增删查改——熟悉Windows的朋友可能对文件增删查改习以为常,在此不做讨论。对于一名程序工作者,可能经常在Linux下进行程序的增删查改,很多人可能有这么一套方法:我在Windows环境下编写好了程序,然后通过Xftp、FileZilla等类似的工具将其丢到服务器上,一顿操作下来,发现程序报错了,怎么办?然后在Windows下修改,再丢到服务器上双十合十祈求老天保佑……当然像PyCharm这种强大的IDE,会提供远程接入服务器进行同步文件及程序运行等功能,这种也挺好,就是可能需要鼠标点来点去,也有一定的学习成本。现在有这么一个问题,PyCharm明天到期了……社区版?不好意思所有社区版鄙人都不会去尝试,别问为啥,问就是不喜欢。

配置文件——配置文件和工作效率有着紧密的联系。对于算法工程师或者后端工程师,在Github逛gai的时候终于发现了一个好用的模型,一顿git clone repoyoulike,然后按照配置文档进行修改,什么tf要升级啦,gcc/g++要降级啦,这个文档要修改路径,那个文档要改参数,都离不开Vim,如果是带桌面的Linux系统,可能会使用gedit来打开文件进行编辑,但是这样效率很低,尤其是大型程序修改起来特别费劲。对于大多数情况,可能用ssh连接远程服务器,这个时候,怎么也绕不开Vim,尤其是那些只能在服务器上运行的程序。

知其然知其所以然——使用Vim来处理程序方面的设定问题,不但可以让自己比较熟悉Linux的运行状况,也更加能保证你的修改可以在Linux下正确运行。

Vim适用于各种操作系统上,比如类Unix(种Linux发行版本、Mac 用户)以及Windwos系统。Unix可以使用包管理器安装 Vim;对于 Windows 用户,可以从官网下载。

Vim哲学

简单概括:摆脱鼠标,一键到达。

即为全命令操作,能用键盘做到的事情,绝不用鼠标,在Vim下,键盘可以满足你的一切需求,效率是第一生产力。

升级支持python3的Vim8

在众多Linux发行版中,比如CentOS或者Ubuntu等,默认安装的是vi编辑器,Vim兼容vi。Vim已经存在20年了,时代在进步,Vim8NeoVim的步步紧逼下,扩展了一些新的特征,比如支持时钟、异步操作、支持终端窗口terminal,尤其是支持terminal非常关键。本文最开始在Vim7下进行操作的,但是有些插件需要Vim8版本,尤其是代码补全插件YouCompleteMe,在升级了支持Python3的Vim8后(在Vim版本中,不能同时支持Python2和Python3),依然有些瑕疵,比如对Python3的第三方库的扩展不是很友好,对C/C++支持得还不错,不知道是不是我的插件安装有问题还是什么原因,折腾了两三天后,果断把Vim换成了NeoVimYouCompleteMe换了另一个代码补全插件coc-vim,香得不行。在这一小节,介绍怎么编译支持Python3的Vim8版本前提是系统了安装Python3,Python3的安装不做讨论。

  1. 编译安装yum源里的vim最新版

    参考YouCompleteMe里给出的方法,略作调整。

    首先检查系统里的Vim是否已经安装,在终端输入命令

    rpm -qa | grep vim
    

    如果有显示且没有提示任何缺包或者错误,则表示Vim已经被安装,如果没有安装,直接从第3步(下载Vim最新版源代码)开始阅读。

    一般情况下,运行下列命令安装Vim

    yum -y install yum*    // CentOS7.6系统
    

    查看vim版本

    vim --version
    

    可以看到,Vim版本一般是7.4,而现在Vim发行版已经发行到了第八代,包括很多新的功能,为了打造属于自己的IDE,必须升级Vim到最新版本。

    如果是Vim版本,查看Vim是否支持Python3

    vim --version | grep python
    

    如果结果显示python3前面是+号,则这一小节可以跳过,如果是-号,则需要自己编译Vim,需执行以下步骤。

  2. 卸载Vim

    在编译之前,需要卸载系统上的Vim版本

    • 如果使用yum install vim*命令安装的Vim,卸载Vim时执行

      yum remove vim
      
    • 如果Vim是使用make编译过的,在CentOS7.6系统下,进入到Vim源代码目录,执行

      sudo make uninstall
      

    如果Vim源代码已经删除,则需要重新[下载Vim源码](git clone https://github.com/vim/vim.git),然后cd vim,再执行上述语句。

    如果是Ubuntu系统,卸载起来就比较方便

    sudo apt install checkinstall
    cd ~/vim       // vim是Vim源代码文件夹
    sudo checkinstall
    
  3. 下载Vim最新版源代码

    cd ~                                         // 进入到当前用户的根目录下
    git clone https://github.com/vim/vim.git     // 下载Vim源代码
    cd vim                                       // 进入到Vim源代码文件
    
  4. 配置

    ./configure --with-features=huge \
                --enable-multibyte \
                --enable-rubyinterp=yes \
                --enable-python3interp=yes \
                --with-python3-config-dir=$(python3-config --configdir) \
                --enable-perlinterp=yes \
                --enable-luainterp=yes \
                --enable-gui=gtk2 \
                --enable-cscope \
                --prefix=/usr/local
    

    命令解释

    --with-features=huge:支持最大特性

    --enable-multibyte:打开多字节支持,可以在Vim中输入中文

    --enable-rubyinterp:打开对ruby编写的插件的支持

    --enable-python3interp:打开对python3编写的插件的支持

    --with-python-config-dir:Python3的路径

    --enable-perlinterp:打开对perl编写的插件的支持

    --enable-luainterp:打开对lua编写的插件的支持

    --enable-gui:打开GUI支持

    --enable-cscope:打开对cscope的支持

    --prefix=/usr/local/:指定将要安装到的路径

  5. 设置VIMRUNTIMEDIR

    VIMRUNTIMEDIR是vim运行时候所需资源的目录,非常重要。

        make VIMRUNTIMEDIR=/usr/local/share/vim/vim82
    
  6. 编译安装

    sudo make install
    
  7. 设置Vim为默认的编辑器

    使用update-alternative设置vim为默认编辑器:

    sudo update-alternatives --install /usr/bin/editor editor /usr/local/bin/vim 1
    sudo update-alternatives --set editor /usr/local/bin/vim
    sudo update-alternatives --install /usr/bin/vi vi /usr/local/bin/vim 1
    sudo update-alternatives --set vi /usr/local/bin/vim
    

按照上述步骤完成后查看Vim**版本

vim --version

vim版本

可以看到Vim版本是8.2版本,已开启python3支持,需要进行验证,在终端输入vim,接着在正常模式下输入:echo has("python3"),按一下回车键,若屏幕最下面输出1,则配置正确,Vim支持Python3。

编译的时候可能会出现各种意想不到的问题,这个时候要多看专业的文档,比如官网文档、github及Issues(非常有用)stackoverflow等,其次再考虑其它出处,尽可能多看专业的英文文档,很多问题我们习惯看一些野路子中文解答,看似走了捷径但是花费了更多的时间,切记!一些优秀的项目有对应的中文文档,首推!

该方法是全局设置方法。

  • 安装中文vim帮助文档

    进入Vim环境,按一下前缀键esc,在英文语法环境下,输入:help后(终端最下面显示),进入vim帮助文档,此界面是英文的,如果想要设置中文帮助文档,请执行以下步骤:

    • 下载中文安装包

      wget https://github.com/yianwillis/vimcdoc/archive/v2.3.0.tar.gz
      
    • 解压

      tar zxvf v2.3.0.tar.gz
      
    • 安装

      cd vimcdoc-2.3.0/				# 进入解压后的目录
      ./vimcdoc.sh -i					# 安装
      

      命令会自动识别 Vim 的安装路径,并将中文的文档拷贝到相应的地方,原有的英文文档不受影响,查阅中文文档学习Vim。

Vim8 —> NeoVim

完全是偶然。在上回讲到,在Vim下折腾了两三天的代码补全插件YouCompleteMe,使用起来并不是很顺手,比如对Python3的第三方库的扩展不是很友好,对C/C++支持得还不错,不知道是不是我的插件安装有问题还是什么原因,果断把Vim换成了NeoVimYouCompleteMe换了另一个代码补全插件coc-vim,香得不行。

基本操作

基本模式

编辑模式

基础设置

键盘映射技巧

"+p可以将外部内容粘贴到终端vim文件中

插件管理

vim-plug插件管理器

Vim的插件管理有Vundlevim-plugSpaceVim等,Vundle是一款非常出名且历史悠久的Vim插件管理工具,但随着安装的vim插件越来越多,使用Vundle来管理这些插件时效率变得越来越低,vim启动耗时也越来越大,且多年没有更新;SpaceVim挺酷炫,有时间可以尝试一下,在这里推荐使用vim-plug

Unix安装(包括CentOS和Mac)

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

该命令在Unix系统下无须进行修改,会自动创建目录~/.vim/autoload/

更新vim-plug插件自身:

:PlugUpgrade

批量更新所有已安装的插件:

:PlugUpdate

查看插件状态

:PlugStatus

卸载插件:请先在**~/.vim/vimrc**或者**~/.config/nvim/init.vim**配置文件中注释或者删除对应插件的配置信息,然后再执行以下命令:

:PlugClean

插件安装

假设系统已经安装了python3解释器,如没有安装,请参考这篇文章

美化启动界面 — vim-startify

https://github.com/mhinz/vim-startify

Plug 'mhinz/vim-startify'

startigy

在终端输入nvim后,显示nvim启动界面,列出最近打开的文件,很方便。

美化状态栏 — ariline

https://github.com/vim-airline/vim-airline

Plug 'vim-airline/vim-airline'

美化状态栏

文件管理插件 — NERDTree

使用方法

Ctrl + w + w 窗口之间的跳转

当光标在NERDTree窗口时,

shift+i是打开/关闭隐藏文件

o - 展开/合并某个目录

C - 如果需要某个文件夹作为你的工作区,则需要按下大写C即可设置此目录为当前工作区

U - 跳转到上一层目录

cd - 设置该目录为家目录

CD - 可能在别的目录迷失了方向,直接输入CD跳转到已经设置好的家目录

代码自动补全 — YouCompleteMe

call plug#begin('~/.vim/pluged')

" 插件配置

" 文件树
Plug 'scrooloose/nerdtree'

" 代码补全
Plug 'ycm-core/YouCompleteMe'

call plug#end()               

在Vim配置文件~/.vim/vimrc下的插件Vundle部分,加入代码补全插件YouCompleteMe,然后在正常模式下,键入:PluginInstall进行插件安装,安装完成后,会在命令行提出

The ycmd server SHUT DOWN (restart with ‘:YcmRestartServer’). YCM core library not detected; you need to compile YCM before using it. Follow the instructions in the documentation.

这是因为,YouCompleteMe 需要手工编译出库文件 ycm_core.so (以及依赖的libclang.so) 才可使用。YouCompleteMe支持的语言

  • C系列(C/C++/Objective-C/Objective-C++):编译时添加--clangd-completer
  • C#:先安装Mono,编译时添加--cs-completer
  • Go:先安装[Go](https://golang.org/doc/install,编译时添加--go-completer
  • JavaScriptTypeScript:先安装 Node.js and npm,编译时添加--ts-completer
  • Rust: 编译时添加--rust-completer
  • Java: 先安装JDK8,编译时添加--java-completer
  • 全部支持:先安装所有的依赖环境,编译时添加--all

要使用--all功能进行安装,请确保已在PATH中安装了msbuildgonodenpm工具。

个人对C系列使用较多,因此

cd ~/.vim/pluged/YouCompleteMe
python3 install.py --clangd-completer

如果系统没有设置默认的Python为Python3版本,则需要注意以上命令是python3开头的,这时C系列语言的代码自动补全功能配置完毕。

python语言自动补全

需要在Vim配置文件~/.config/nvim/init.vim下的插件Vundle部分,加入

 " YouCompleteMe配置                                                                                                                              
nnoremap gd :YcmCompleter GoToDefinitionElseDeclaration<CR>                                 nnoremap g/ :YcmCompleter GetDoc<CR>                                                       nnoremap gt :YcmCompleter GetType<CR>                                                       nnoremap gr :YcmCompleter GoToReferences<CR>                                                 let g:ycm_autoclose_preview_window_after_completion=0                                       let g:ycm_autoclose_preview_window_after_insertion=1                                         let g:ycm_use_clangd = 0                                                                     let g:ycm_seed_identifiers_with_syntax=1                                                     let g:ycm_collect_identifiers_from_tags_files = 1                                           let g:ycm_min_num_of_chars_for_completion=2                                                  let g:ycm_path_to_python_interpreter='/usr/bin/python3' 

注意python3解释器的位置,这个设置好像对第三方库不是很友好,我再探索探索。

括号自动补全 — auto-pairs

链接

函数列表 — TagBar

链接

首先安装ctags

# CentOS7.6
sudo yum install ctags
# Ubuntu
sudo apt-get install ctags
# Mac
brew install ctags

~/.config/nvim/init.vim里的插件配置

" 显示函数列表                        
Plug 'majutsushi/tagbar'
代码自动补全 coc-vim(推荐)

根据官网建议,安装coc-vim前,需要首先安装nodejs

curl -sL install-node.now.sh/lts | bash

利用vim-plus来进行安装

" Coc-vim 自动补全插件
Plug 'neoclide/coc.nvim', {'branch': 'release'}

保存并重启(更新)~/.config/nvim/init.vim文件,运行PlugInstall进行安装。

如果出现错误

[coc.nvim] javascript file not found, please compile the code or use release branch.

参考issue651,打开~/.config/nvim/init.vim文件,运行命令:call coc#util#install()可以解决该问题。

安装完成后,根据项目对coc-vim插件进行配置,参考链接(重要),在~/.config/nvim/init.vim下进行coc-vim插件进行个性化配置使其更加易用,这部分配置文件如下:

" ====
" ==== coc-vim插件配置
" ====
" 允许在有未保存的修改时切换缓冲区, 此时的修改由 vim 负责保存
set hidden

" 覆盖文件时不备份
set nobackup

" 表示编辑的时候不需要备份文件
set nowritebackup

" 命令行(在状态行下)的高度, 默认为1, 这里是2, 展示更多的信息
set cmdheight=2

" 根据默认设置,交换文件会每隔4000毫秒(4秒)或者200个字符保存一次
" 我们可以使用以下命令,修改保存交换文件的频率
" 较长的更新时间(默认值为4000 ms = 4 s)会导致明显的延迟和较差的用户体验。
set updatetime=300

" 历史原因,Vim的界面可能会显示“帮助乌干达的可怜儿童”,该命令将其屏蔽
" Don't pass messages to |ins-completion-menu|.
set shortmess+=c

" 始终显示标号列
set signcolumn=yes

" inoremap命令用于在“插入模式”中进行映射按键
" 使用TAB键来启动代码补全触发器,并在前面加上字符并进行导航。
" 注意:使用命令':verbose imap <tab>'来确保选项卡未由
",然后再将其放入配置中
inoremap <silent><expr> <TAB>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

" 使用ctrl+空格键来强制触发补全
inoremap <silent><expr> <c-space> coc#refresh()

" <cr>表示空格键,<C-g>表示Ctrl+g
" 使用<cr>确认补全,“ <C-g> u”表示在当前位置断开撤消链
" Coc仅在确认时进行摘要和其他编辑
if has('patch8.1.1068')
  " Use `complete_info` if your (Neo)Vim version supports it.
  inoremap <expr> <cr> complete_info()["selected"] != "-1" ? "\<C-y>" : "\<C-g>u\<CR>"
else
  imap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
endif

"  键盘映射参考:https://zhuanlan.zhihu.com/p/38150203
" nmap是:map的普通模式板,也就是说其绑定的键只作用于普通模式 
" <silent> 表示静默映射,不会显示Vim在处理rhs(映射后的键位)过程中对界面产生的变化
" 使用`[g`和`]g`浏览诊断
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)

" 代码跳转
" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

" 使用K键在预览窗口中显示文档
nnoremap <silent> K :call <SID>show_documentation()<CR>
function! s:show_documentation()
  if (index(['vim','help'], &filetype) >= 0)
    execute 'h '.expand('<cword>')
  else
    call CocAction('doHover')
  endif
endfunction

" 按住光标时高亮符号及其引用
autocmd CursorHold * silent call CocActionAsync('highlight')

" 符号重命名
nmap <leader>rn <Plug>(coc-rename)

" 格式化所选代码
xmap <leader>f  <Plug>(coc-format-selected)
nmap <leader>f  <Plug>(coc-format-selected)
augroup mygroup
  autocmd!
  " Setup formatexpr specified filetype(s).
  autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
  " Update signature help on jump placeholder.
  autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end

" 将codeAction应用于所选区域。
" 示例:<leader> aap 表示当前代码段
xmap <leader>a  <Plug>(coc-codeaction-selected)
nmap <leader>a  <Plug>(coc-codeaction-selected)

" 将codeAction应用于当前行的键的重新映射
nmap <leader>ac  <Plug>(coc-codeaction)
" 自动修复当前行的代码问题
nmap <leader>qf  <Plug>(coc-fix-current)

" 介绍功能文本对象
xmap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap if <Plug>(coc-funcobj-i)
omap af <Plug>(coc-funcobj-a)

" 将<TAB>用于选择范围
nmap <silent> <TAB> <Plug>(coc-range-select)
xmap <silent> <TAB> <Plug>(coc-range-select)

" 添加`:Format`命令格式化当前缓冲区
command! -nargs=0 Format :call CocAction('format')

" 添加`:Fold`命令折叠当前缓冲区
command! -nargs=? Fold :call     CocAction('fold', <f-args>)

" 添加`:OR`命令来组织当前缓冲区的import
command! -nargs=0 OR   :call     CocAction('runCommand', 'editor.action.organizeImport')

" 关于CoCList的一些键盘映射
" 显示所有的诊断
nnoremap <silent> <space>a  :<C-u>CocList diagnostics<cr>
" 管理所有的插件
nnoremap <silent> <space>e  :<C-u>CocList extensions<cr>
" 显示命令
nnoremap <silent> <space>c  :<C-u>CocList commands<cr>
" 找出当前文件的符号
nnoremap <silent> <space>o  :<C-u>CocList outline<cr>
" 在当前文件进行搜索
nnoremap <silent> <space>s  :<C-u>CocList -I symbols<cr>
" 对下一项执行默认操作
nnoremap <silent> <space>j  :<C-u>CocNext<CR>
" 对前一项执行默认操作
nnoremap <silent> <space>k  :<C-u>CocPrev<CR>
" 恢复最新的coc列表
nnoremap <silent> <space>p  :<C-u>CocListResume<CR>

Language Server Protocol,LSP以及链接

配置C/C++环境

安装clangd,需要cmake>=3.12gcc>=5.1

首先检测cmake版本

cmake --version

如果其版本小于3.12,则需要升级cmake,下面是编译最新cmake版本的脚本,在终端里新建build_camke.sh脚本,将下面的内容复制到脚本里

#!/bin/bash                                                                                                                                                                    
yum remove cmake -y && rm -f /usr/bin/cmake
wget -c https://github.com/Kitware/CMake/releases/download/v3.14.2/cmake-3.14.2.tar.gz
tar xvf cmake-3.14.2.tar.gz 
cd $(pwd)/cmake-3.14.2   
./bootstrap              
gmake                    
gmake install            
sudo ln -s /usr/local/bin/cmake /usr/bin/
cmake --version

然后在终端里运行

bash build_camke.sh

即可,如果出现问题,可以一步一步在终端运行命令。

接着查看gcc版本信息

gcc --version

如果版本小于5.1,则需要对gcc进行升级

sudo yum install devtoolset-4-gcc devtoolset-4-gcc-c++
scl enable devtoolset-4 bash

再查看gcc版本,输出

gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

接下来编译clangd,参考链接链接链接

  • Mac OS下,直接运行

    brew install llvm
    
  • Windows下,下载预编译好的版本,安装即可

  • Debian/Ubuntu系统下,运行代码

    sudo apt-get install clangd-9
    

    clangd 的二进制文件将被安装在/usr/bin/clangd-9,将其设置为默认的连接符

    sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-9 100
    
  • Other systems(CentOS等)

    服务器因为是CentOS7.6版本,所有需要自己编译,通过查阅无数资料,clangd的编译脚本如下:

    #!/bin/bash
      
    set -e
      
    mkdir clangd
    cd clangd/
    svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
      
    cd llvm/tools
    svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
    cd ../..
      
    cd llvm/tools/clang/tools
    svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
    cd ../../../..
      
    mkdir build
    cd build
    cmake -G "Unix Makefiles" ../llvm
    make clangd
      
    sudo update-alternatives --install /usr/bin/clangd clangd ./bin/clangd 100
    

将其保存为build-clangd.sh,在终端根目录(cd ~进入自己的根目录下)运行bash build-clangd.sh进行编译,我大概花费了7个小时左右的时间进行编译

build clangd

如图所示,编译完成,二进制文件在~/clangd/build/bin目录下,脚本的Line 22设置默认的clangd链接符,以便系统对clangd进行识别,在终端输入clangd --version,若可以看到版本信息且没有报错,则表明安装成功。若有类似的提示:未知的clangd命令,则可能需要将其二进制文件添加到系统PATH下,打开

nvim ~/.bashrc

在最后一行,加入export PATH="~/clangd/build/bin:$PATH",即添加clangd编译好的二进制文件目录路径到PATH,再运行

source ~/.bashrc    // 更新文件,即时生效
sudo update-alternatives --install /usr/bin/clangd clangd ~/clangd/build//clangd 100

安装coc-clangd

打开~/.vim/vimrc文件,运行命令:CocInstall coc-clangd,coc-clangd不需要在coc-settings.json里进行设置,至此在nvim里的C/C++智能代码感知功能安装完成。

你以为到这儿就结束了吗?本来我是这么以为的,直到……

我创建了一个示例文件试试代码补全的功能,一顿操作

nvim ~/a.cpp

输入内容

#include <iostream>
#include <vector>        
#include <unordered_map> 
#include <queue>
#include <list>          

using namespace std;     

int main()               
{
	cout << "hello world!" << endl;                         
	
	return 0;            
}

在终端运行g++ a.cpp -o a,然后翻车了

编译error

啥意思呢?就是说a.py用到了C++11的新特性(#include <unordered_map> ),而当前g++版本是4.8.5(g++ –version查看),默认支持C++98,所以如果要使用C++11的新特性,在编译时加上-std=c++11-std=gnu++11,即

g++ -std=c++11 a.cpp -o a

配置Python环境

参考链接,首先需要安装python-language-server

sudo pip3 install 'python-language-server[all]'

接着安装Jedi

sudo pip3 install jedi

此时语言解析器配置完成。

在终端输入nvim,运行命令:CocInstall coc-python,显示[coc.nvim]Installed extension: coc-python,表示安装完成。

在系统里,可能不同的python脚本需要不同的python解释器,系统也允许存在不同的python解释器,所以在打开你想要编辑的python文件后,需要设置你所有需要的python解释器,假设a.py需要python3解释器,

nvim a.py

然后在普通模式下输入命令:CocCommand,接着找到python.setInterpreter,找到你所需要的环境即可,这时安装在此环境下的包才会出发自动补全功能。

coc-python

其它语言请参考LSP

缩进显示 — indentLine
" 显示缩进标注, Python语言必须
Plug 'Yggdroot/indentLine'
文件操作历史 — Undotree
" 列出文件最近的操作历史
Plug 'mbbill/undotree'
命令行模糊搜索工具 — fzf/fzf-vim

fzf

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

fzf-vim

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

要想使用文件内搜索命令,需要提前安装ag

sudo yum install the_silver_searcher

一些要点

一些问题

  • :PluginInstall 不是编辑器命令?

    两个原因

    • 路径配置出错

    目前来看是路径问题,根据官网描述,安装命令为

    git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    

    可能在~/.vim/vimrc配置文件中把bundle写成了bunldeVundle写成Vumdle……真的醉了……浪费了两个小时时间……

    • 实在没有办法,将安装命令调整为
    git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/plugin/Vundle.vim
    

    哔了狗了。

  • Vim卡住,死机?

    原因

    使用vim时,会因为不小心按了Ctrl + s后,会发现不能输入任何字符,类似死机;

    这并不是Linux死机,或者vim卡住,而只是按了Ctrl + s后,vim停止向终端输出。

    解决方法

    退出这种状态,按下Ctrl + q

  • 升级Ruby

    打开nvim,输入命令:CheckHealth,如果提示Ruby版本过低,则需要升级

    1. 查看当前Ruby版本

      ruby --version
      

      显示的是ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

    2. 安装yum源

      yum install -y centos-release-scl-rh
      
    3. 安装指定版本的ruby

      yum install -y rh-ruby24
      
    4. 使升级后的ruby版本生效

      scl enable rh-ruby24 bash
      
    5. 查看是否升级成功

      ruby --version
      

      显示ruby 2.4.6p354 (2019-04-01 revision 67394) [x86_64-linux]

    但是,这种方法,只会在当前环境下有效,也就是说,退出当前环境就没有用了,还要执行第5步,所以最好对的方法是重新编译,方法如下

    wget http://cache.ruby-lang.org/pub/ruby/ruby-2.4.10.tar.gz
    tar xvfvz ruby-2.4.10.tar.gz
    cd ruby-2.4.10
    ./configure
    make
    sudo make install
    
  • 安装screenkey

    sudo yum install python-distutils-extra    // optional
    wget https://www.thregr.org/~wavexx/software/screenkey/releases/screenkey-0.9.tar.gz
    tar -zxvf screenkey-0.9.tar.gz
    cd cd screenkey-0.9/
    ./screenkey
    sudo ./setup.py install
    

结语

nvim的外壳onivim

后续计划

插件相关

  • Python交互式编程vim-repl
  • git相关插件

Linux相关

参考