1. 前言

目前最常用的环境还是linux的服务器,所以最终选择的是nvim作为自己的首要编辑器,毕竟没有写一些比较大型的项目。在经过多次的摸索后,我还是选择了Neovim + Coc.nvim,放弃了 YCM。

在文章的最后,有完整的init.vim文件,这个文件是我目前正在使用的,相对于文中的部分有变动。本文希望在你学习和使用vim的过程中,帮助你熟悉相关的环境配置。

这里假设在没有root权限的情况,考虑的是软件的源码安装(相比之下,直接用各个发行版的命令安装会更加简单)。

2.Neovim 和插件安装

2.1 Neovim 安装

neovim:下载地址

选择最新的release 的版本,

这里除了source code 是源码外,其他的都是编译好的,直接

wget https://github.com/neovim/neovim/releases/download/v0.4.3/nvim-linux64.tar.gz

tar -zxvf nvim-linux64.tar.gz

然后把neovim路径下的bin加入到~/.bashrc,然后在source一下就算是成功了。

2.2 插件安装

1. Vim-Plug

vim-plug是一个我很喜欢的vim的插件管理工具,使用下面的命令可以进行安装(其他平台和工具的安装方法地址中有):

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs

https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

这样,这个~/.local/share/nvim/site/autoload/plug.vim就会在你的目录下,并且vim会被调用。

创建nvim的配置文件(这个配置文件和vim的'.vimrc')一样:

mkdir ~/.config/nvim/

nvim ~/.config/nvim/init.vim

然后把

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

call plug#end()

加入到init.vim中,这样以后在call begin和call end 之间加上插件就可以使用了。

之后的每个插件在init.vim文件中配置好后,要进行保存退出,再次进入nvim,使用命令 :PlugInstall安装

2. indentLine

indentLine此插件提供的一个可视化的缩进,把Plug 'Yggdroot/indentLine',放到init.vim的call begin和call end之间,同时加入一些简单的配置:

let g:indent_guides_guide_size = 1 " 指定对齐线的尺寸

let g:indent_guides_start_level = 2 " 从第二层开始可视化显示缩进

效果如图:

3. vim-monokai

vim-monokai,这个插件是nvim的一个主题,monokai这个配色是我最喜欢的,从开始用sublime的时候我一直都用的是这个主题。

在 call begin 和 call end 之间加上Plug 'crusoexia/vim-monokai',然后把

colo monokai

加到后面。

效果:

4.vim-airline

vim-airline给nvim 提供一个强大的状态栏和标签栏,当打开多个文本时,可以用它进行快速的切换,是一个很强大的工具。

在 call begin 和 call end 之间加上:

Plug 'vim-airline/vim-airline'

Plug 'vim-airline/vim-airline-themes' "airline 的主题

然后在init.vim里加上一些个性的配置:

" 设置状态栏

let g:airline#extensions#tabline#enabled = 1

let g:airline#extensions#tabline#left_alt_sep = '|'

let g:airline#extensions#tabline#buffer_nr_show = 0

let g:airline#extensions#tabline#formatter = 'default'

let g:airline_theme = 'desertink' " 主题

let g:airline#extensions#keymap#enabled = 1

let g:airline#extensions#tabline#buffer_idx_mode = 1

let g:airline#extensions#tabline#buffer_idx_format = {

'0': '0 ',

'1': '1 ',

'2': '2 ',

'3': '3 ',

'4': '4 ',

'5': '5 ',

'6': '6 ',

'7': '7 ',

'8': '8 ',

'9': '9 '

}

" 设置切换tab的快捷键 <> + 切换到第i个 tab

nmap 1 AirlineSelectTab1

nmap 2 AirlineSelectTab2

nmap 3 AirlineSelectTab3

nmap 4 AirlineSelectTab4

nmap 5 AirlineSelectTab5

nmap 6 AirlineSelectTab6

nmap 7 AirlineSelectTab7

nmap 8 AirlineSelectTab8

nmap 9 AirlineSelectTab9

" 设置切换tab的快捷键 <> + 切换到前一个 tab

nmap - AirlineSelectPrevTab

" 设置切换tab的快捷键 <> + 切换到后一个 tab

nmap + AirlineSelectNextTab

" 设置切换tab的快捷键 <> + 退出当前的 tab

nmap q :bp:bd #

" 修改了一些个人不喜欢的字符

if !exists('g:airline_symbols')

let g:airline_symbols = {}

endif

let g:airline_symbols.linenr = "CL" " current line

let g:airline_symbols.whitespace = '|'

let g:airline_symbols.maxlinenr = 'Ml' "maxline

let g:airline_symbols.branch = 'BR'

let g:airline_symbols.readonly = "RO"

let g:airline_symbols.dirty = "DT"

let g:airline_symbols.crypt = "CR"

效果为:

5. nerdcommenter

nerdcommenter是一个很好用的注释工具,在normal和visual模式下,他会对你光标所在行或所选中的多行进行注释和去注释,只需要你按下 <>++。

在 call begin 和 call end 之间加上Plug 'scrooloose/nerdcommenter',在进行简单的配置

"add spaces after comment delimiters by default

let g:NERDSpaceDelims = 1

" python 自动的会多加一个空格

au FileType python let g:NERDSpaceDelims = 0

" Use compact syntax for prettified multi-line comments

let g:NERDCompactSexyComs = 1

" Align line-wise comment delimiters flush left instead of following code indentation

let g:NERDDefaultAlign = 'left'

" Set a language to use its alternate delimiters by default

let g:NERDAltDelims_java = 1

" Add your own custom formats or override the defaults

" let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/' } }

" Allow commenting and inverting empty lines (useful when commenting a region)

let g:NERDCommentEmptyLines = 1

" Enable trimming of trailing whitespace when uncommenting

let g:NERDTrimTrailingWhitespace = 1

" Enable NERDCommenterToggle to check all selected lines is commented or not

let g:NERDToggleCheckAllLines = 1

6. rainbow

rainbow是一个提供嵌套括号高亮的一个工具。

在 call begin 和 call end 之间加上Plug 'luochen1990/rainbow'

我对括号的颜色进行了简单的修改:

let g:rainbow_active = 1

let g:rainbow_conf = {

'guifgs': ['darkorange3', 'seagreen3', 'royalblue3', 'firebrick'],

'ctermfgs': ['lightyellow', 'lightcyan','lightblue', 'lightmagenta'],

'operators': '_,_',

'parentheses': ['start=/(/ end=/)/ fold', 'start=/[/ end=/]/ fold', 'start=/{/ end=/}/ fold'],

'separately': {

'*': {},

'tex': {

'parentheses': ['start=/(/ end=/)/', 'start=/[/ end=/]/'],

},

'lisp': {

'guifgs': ['darkorange3', 'seagreen3', 'royalblue3', 'firebrick'],

},

'vim': {

'parentheses': ['start=/(/ end=/)/', 'start=/[/ end=/]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimFuncBody', 'start=/[/ end=/]/ containedin=vimFuncBody', 'start=/{/ end=/}/ fold containedin=vimFuncBody'],

},

'html': {

'parentheses': ['start=/v])@!z([-_:a-zA-Z0-9]+)(s+[-_:a-zA-Z0-9]+(=("[^"]*"|'."'".'[^'."'".']*'."'".'|[^ '."'".'"><=`]*))?)*>/ end=## fold'],

},

'css': 0,

}

}

效果:

7. nerdtree

nerdtree是一个树形的目录管理插件,可以方便在nvim中进行当前文件夹中的文件切换

在 call begin 和 call end 之间加上

Plug 'preservim/nerdtree'

Plug 'Xuyuanp/nerdtree-git-plugin'

在 call begin 和 call end 之间加上'preservim/nerdtree'

进行以下的简单配置

" autocmd vimenter * NERDTree "自动开启Nerdtree

let g:NERDTreeWinSize = 25 "设定 NERDTree 视窗大小

let NERDTreeShowBookmarks=1 " 开启Nerdtree时自动显示Bookmarks

"打开vim时如果没有文件自动打开NERDTree

" autocmd vimenter * if !argc()|NERDTree|endif

"当NERDTree为剩下的唯一窗口时自动关闭

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

" 设置树的显示图标

let g:NERDTreeDirArrowExpandable = '+'

let g:NERDTreeDirArrowCollapsible = '-'

let NERDTreeIgnore = ['.pyc$'] " 过滤所有.pyc文件不显示

let g:NERDTreeShowLineNumbers=0 " 是否显示行号

let g:NERDTreeHidden=0 "不显示隐藏文件

""Making it prettier

let NERDTreeMinimalUI = 1

let NERDTreeDirArrows = 1

nnoremap :NERDTreeToggle " 开启/关闭nerdtree快捷键

默认的情况下是关闭的,可以把autocmd vimenter * NERDTree的注释打开,改成默认开启的状态。同时把开关的按键映射到了F3,按下可以打开或关闭。

效果:

8. tagbar

tagbar可以用来展示当前的文件的一些函数。

这个插件依赖ctags,需要先安装ctags。从官网下载源码,进行编译(如果有root权限直接安装,跳过源码编译)。

wget http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz

tar -zxvf ctags-5.8.tar.gz

cd ctags-5.8

./configure --prefix=$PATH # $PATH是你要安装的位置

make -j

make install

然后把安装目录里的bin所在的路径加到~/.bashrc中,在source一下,输入命令ctags,如果输出

ctags: No files specified. Try "ctags --help".

那ctags就安装成功了。

然后在init.vim中的call begin和call end 之间加入Plug 'majutsushi/tagbar',我这里还设置了tagbar的宽度和按键映射,这样可以通过F4方便的进行打开和关上。在tagbar窗口可以按下回车跳转到指定的函数。

let g:tagbar_width=30

nnoremap :TagbarToggle " 将tagbar的开关按键设置为 F4

9. vim-cpp-enhanced-highlight

vim-cpp-enhanced-highlight,这个是用来加强C++的高亮的,很少用C++,没仔细看

Plug 'octol/vim-cpp-enhanced-highlight'

10. vim-snippets

honza/vim-snippets我用来提供C++的snippets,python 那边使用的coc.nvim提供的,感觉这个东西挺复杂的,也没咋看,但是能用就行。

Plug 'honza/vim-snippets'

11. coc.nvim

coc.nvim是目前我用过的最舒服的、集代码补全、静态检测、函数跳转等功能的一个引擎,强力推荐!!!

安装coc.nvim,需要安装nodejs。和nvim一样,这个也有编译好的版本,解压后把bin的路径放到放到.bashrc里,之后运行

npm install -g neovim

安装

Plug 'neoclide/coc.nvim', {'branch': 'release'}

注意的是,低版本的git会在后面进行更新coc.nvim插件的时候报错,报的啥我也忘了,反正如果更新的时候发现有git的错误,升级一下git就行了。

下面的设置是在他的主页上参考的。

" if hidden is not set, TextEdit might fail.

set hidden

" Some servers have issues with backup files, see #649

set nobackup

set nowritebackup

" You will have bad experience for diagnostic messages when it's default 4000.

set updatetime=300

" don't give |ins-completion-menu| messages.

set shortmess+=c

" always show signcolumns

set signcolumn=yes

" Use tab for trigger completion with characters ahead and navigate.

" Use command ':verbose imap ' to make sure tab is not mapped by other plugin.

inoremap

pumvisible() ? "" :

check_back_space() ? "" :

coc#refresh()

inoremap pumvisible() ? "" : ""

function! s:check_back_space() abort

let col = col('.') - 1

return !col || getline('.')[col - 1] =~# 's'

endfunction

" Use to trigger completion.

inoremap coc#refresh()

" Use to confirm completion, `u` means break undo chain at current position.

" Coc only does snippet and additional edit on confirm.

inoremap pumvisible() ? "" : "u"

" Or use `complete_info` if your vim support it, like:

" inoremap complete_info()["selected"] != "-1" ? "" : "u"

" Use `[g` and `]g` to navigate diagnostics

nmap [g (coc-diagnostic-prev)

nmap ]g (coc-diagnostic-next)

" Remap keys for gotos

nmap gd (coc-definition)

nmap gy (coc-type-definition)

nmap gi (coc-implementation)

nmap gr (coc-references)

" Use K to show documentation in preview window

nnoremap K :call show_documentation()

function! s:show_documentation()

if (index(['vim','help'], &filetype) >= 0)

execute 'h '.expand('')

else

call CocAction('doHover')

endif

endfunction

" Highlight symbol under cursor on CursorHold

autocmd CursorHold * silent call CocActionAsync('highlight')

" Remap for rename current word

nmap rn (coc-rename)

" Remap for format selected region

xmap f (coc-format-selected)

nmap f (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

" Remap for do codeAction of selected region, ex: `aap` for current paragraph

xmap a (coc-codeaction-selected)

nmap a (coc-codeaction-selected)

" Remap for do codeAction of current line

nmap ac (coc-codeaction)

" Fix autofix problem of current line

nmap qf (coc-fix-current)

" Create mappings for function text object, requires document symbols feature of languageserver.

xmap if (coc-funcobj-i)

xmap af (coc-funcobj-a)

omap if (coc-funcobj-i)

omap af (coc-funcobj-a)

" Use `:Format` to format current buffer

command! -nargs=0 Format :call CocAction('format')

" Use `:Fold` to fold current buffer

command! -nargs=? Fold :call CocAction('fold', )

" use `:OR` for organize import of current buffer

command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')

这样,coc.nvim 平台安装完成了,此外,为了提高多种功能,还要进行相关插件的安装,这个放到后面的环境配置里。

12. nvim的基本配置

filetype plugin on

" 设置为双字宽显示,否则无法完整显示如:☆

" set ambiwidth=double

set t_ut= " 防止vim背景颜色错误

set showmatch " 高亮匹配括号

set matchtime=1

set report=0

set ignorecase

set nocompatible

set noeb

set softtabstop=4

set shiftwidth=4

set nobackup

set autoread

set nocompatible

set nu "设置显示行号

set backspace=2 "能使用backspace回删

syntax on "语法检测

set ruler "显示最后一行的状态

set laststatus=2 "两行状态行+一行命令行

set ts=4

set expandtab

set autoindent "设置c语言自动对齐

set t_Co=256 "指定配色方案为256

" set mouse=a "设置可以在VIM使用鼠标

set selection=exclusive

" set selectmode=mouse,key

set tabstop=4 "设置TAB宽度

set history=1000 "设置历史记录条数

" 配色方案

" let g:seoul256_background = 234

colo monokai

set background=dark

set shortmess=atl

" colorscheme desert

"共享剪切板

set clipboard+=unnamed

set cmdheight=3

if version >= 603

set helplang=cn

set encoding=utf-8

endif

set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936

set termencoding=utf-8

set encoding=utf-8

set fileencodings=ucs-bom,utf-8,cp936

set fileencoding=utf-8

set updatetime=300

set shortmess+=c

set signcolumn=yes

" autocmd FileType json syntax match Comment +//.+$+

set foldmethod=indent " 设置默认折叠方式为缩进

set foldlevelstart=99 " 每次打开文件时关闭折叠

" hi Normal ctermfg=252 ctermbg=none "背景透明

" au FileType gitcommit,gitrebase let g:gutentags_enabled=0

if has("autocmd")

au BufReadPost * if line("'"") > 1 && line("'"") <= line("$") | exe "normal! g'"" | endif

endif

inoremap jj "将jj映射到Esc

3. Coc.nvim 环境配置

对于Python,直接装anaconda就行了,同时需要用pip装一下pynvim。

pip install pynvim

在nvim输入:checkhealth,会进行基本环境的检查,保证你用的环境不会出问题即可,我不用python2和ruby,这两是warning就无所谓了。

上面的环境安装结束后,并不能直接使用,还需要进一步的配置coc.nvim。

coc.nvim 提供了很多有用的扩展工具在coc extensions中,这些扩展在nvim中通过命令:CocInstall进行安装,下面是我安装的一个表:

:CocInstall coc-clangd # C++环境插件

:CocInstall coc-cmake # Cmake 支持

:CocInstall coc-emmet

:CocInstall coc-git # git 支持

:CocInstall coc-highlight # 高亮支持

:CocInstall coc-jedi # jedi

:CocInstall coc-json # json 文件支持

:CocInstall coc-python # python 环境支持

:CocInstall coc-sh # bash 环境支持

:CocInstall coc-snippets # python提供 snippets

:CocInstall coc-vimlsp # lsp

:CocInstall coc-yaml # yaml

:CocInstall coc-syntax

:CocInstall coc-pairs

对于C++,coc.nvim 会自动进行配置的,如果你没有安装clang的话,插件coc-clangd在你第一次打开C++文件时,会提示

[coc.nvim] clangd was not found on your PATH. :CocCommand clangd.install will install 10.0.0.

按照提示进行,如果不行的话,那只能去装一个clang了,这里参考的是安装 LLVM 和 Clang:

如果你有root的权限,可以参考官方的的安装方法更快捷的安装:http://clangd.llvm.org/installation.html

mkdir llvm-source-build

wget https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.1/llvm-9.0.1.src.tar.xz

tar xvf llvm-9.0.1.src.tar.xz

mv llvm-9.0.1.src llvm

cd llvm/tools/

wget https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.1/clang-9.0.1.src.tar.xz

tar xvf clang-9.0.1.src.tar.xz

rm clang-9.0.1.src.tar.xz

mv clang-9.0.1.src clang

cd clang/tools/

wget https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.1/clang-tools-extra-9.0.1.src.tar.xz

tar xvf clang-tools-extra-9.0.1.src.tar.xz

mv clang-tools-extra-9.0.1.src extra

rm clang-tools-extra-9.0.1.src.tar.xz

cd ../../../

mkdir build

cd build/

cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86" ../ -DCMAKE_INSTALL_PREFIX=$PATH # 改成你的安装路径

make -j

make install

测试一下clang和clangd两个命令,检查是否安装成功。

对于Python的配置,安装好coc-python就算是结束了,进入.py文件的话如果发现jedi报错的话,重新安装一下jedi即可,可能是jedi的版本太低。

最后,我把代码检测里的那个warning的符号改了, 本来是一个黄色的三角图标,我担心对终端不友好,改成了两个叹号。

coc.nvim的配置文件位置为:~/.config/nvim/coc-settings.json。

{

"diagnostic.warningSign":"!!"

}

这样就都配置好了。

在snaipppts的提示中,可以通过 Ctrl + j 进行移动修改(从https://github.com/neoclide/coc-snippets弄来的,侵删)

在函数里,可以通过按下gd进行函数的跳转,ctrl + o 回调到上次的位置,效果如下图:

最后放一下自己目前在用的init.vim(.vimrc)(和上面介绍的有改动):

init.vim/.vimrc

Linux搭建部落冲突,Neovim+Coc.nvim配置 目前个人最舒服终端编辑环境(PythonC++)相关推荐

  1. Linux搭建部落冲突,GitHub - lioyou/nvim-coc: 在Win10上使用WSL安装Ubuntu,并安装neovim+coc.nvim,配置多种语言开发环境......

    在windows上使用Ubuntu并配置多种语言开发境 0 效果 使用C++ 1 开启WSL服务并安装Ubuntu 自己利用搜索引擎去查找相关资料并安装,很容易的就两步 2 安装各类编程语言的相关依赖 ...

  2. Unity3D 仿部落冲突(COC)建造类游戏实现

    COC部落冲突游戏 目前模拟经营类游戏很火,很多游戏公司一直跟风,所以COC的模式一直是倍模仿对象,但一直未被超越,最近静下心来研究了一下,算是小有收获,就先从建造类开始,实现了简单的搭建逻辑处理,包 ...

  3. python部落冲突辅助_coc.vim:让 Vim 具备 VSCode 的编辑效果

    简介 coc.vim 是 2018 年新开发的 Vim / NeoVim 新一代全代码补全插件,使用 TypeScript 编写,运行于 nodejs 环境. 其代码补全具备快速,可靠,完整 LSP( ...

  4. linux搭建git服务器,windows客户端配置git

    Linux服务器配置之Git服务器搭建步骤: 一.配置环境 1.服务器:CentOS 8.2(64位) + Git (version 2.27.0) 2.客户端:Windows 10 (64位) + ...

  5. linux ftp 虚拟目录,Linux搭建FTP之vsftpd 虚拟用户配置步骤

    环境:Ubuntu 10.04 一.安装vsftp sudo apt-get install vsftpd 二.添加虚拟用户 1.创建虚拟用户数据库 创建虚拟用户文本文件/tmp/account.tx ...

  6. Linux、Mac、windows 系统下 配置Python虚拟环境 virtualenvwrapper教程,workon切换环境, 非常简单方便

    前言 开发及测试过程中每个环境都有各自的作用,避免破坏其他环境所以建议每个项目新建一个虚拟环境,经过对比最终我选择了virtualenvwrapper来作为我开发中虚拟环境管理工具,接下来一起来看一下 ...

  7. neovim及coc.nvim自动补全初探

    neovim及coc.nvim自动补全初探 安装 # mac # 安装 brew install neovim # 查看neovim安装路径 brew list nvim# ubuntu apt in ...

  8. 原创OI题目:部落冲突

    部落冲突(coc) Input:coc.in output:coc.out 题目描述: 从前,有一个美丽的村庄,这里环境优美.社会安定.民风淳朴.在这样完美的村庄里,生活着一群完美的野蛮人ljj,他们 ...

  9. 从零开始vim搭建Java开发环境之coc.nvim 篇

    前言 vim之美妙我就不过多介绍了,懂的自然懂.之前我已经有一篇文章介绍如何使用SpaceVim来搭建Java开发环境. 传送门:<从零开始vim搭建Java开发环境[视频]> 最近使用c ...

最新文章

  1. Nginx反向代理和负载均衡部署指南
  2. Apache Samza流处理框架介绍——kafka+LevelDB的Key/Value数据库来存储历史消息+?
  3. 使用split进行分割时遇到特殊字符的问题
  4. 140个Google面试问题
  5. JSON与XML的区别比较(非常全面)
  6. BW事务代码SXMB_ADM、 SICF、SMICM简介
  7. sql 增加链接服务器,SQL server利用脚本添加链接服务器,可设置别名
  8. linux shell 判断文件是否存在
  9. android黑窗口获取md5_Android获取文件的MD5
  10. 装饰模式在Intermec CK1应用程序中通讯模块的应用
  11. Android精准计步器
  12. 司机行为识别_台州交警上线“闯红灯抓拍神器”人脸识别+4米大屏,拍到违章直接曝光...
  13. 项目经理的商务指南系列之三:认识客户(敏捷开发,被动而弱小的客户,理解客户的古怪行为,如何喜欢上客户)...
  14. maven的pom详解
  15. SYNOPSYS™光学设计软件---设计自由曲面反射系统
  16. 同比和与环比的计算公式
  17. mac 清理微信缓存文件
  18. udf在服务器上显示语法错误,udf编译提示语法错误
  19. 音乐系统(译码作曲)
  20. 途家民宿VS木鸟民宿:民宿APP功能体验

热门文章

  1. AI for Science:人工智能改变化学领域,机器学习范式加速化学物质发现
  2. Jemter https app接口测试
  3. 常见的几种移动app开发模式
  4. QT 创建使用动态库
  5. 信用卡和车贷等奇葩的利率计算方式,看起来利率低,实际要比房贷等坑很多
  6. MATLAB科研数据可视化方法
  7. Ewomail邮件服务器搭建,最全最详细
  8. linux批量检查端口脚本,telnet批量检测端口状态(linux)
  9. Linux解决:系统主机名为bogon方法
  10. 用Vue实现简单的echarts在线编辑器