codetalks-new / notes

About me
4 stars 0 forks source link

Ubuntu 18.04 打造 简单趁手的 Vim +C 开发环境 #16

Open codetalks-new opened 5 years ago

codetalks-new commented 5 years ago

Vim 基本配置

  1. 默认情况下没有安装完整的 Vim 包.可以直接通过 sudo apt install vim 来安装.

set number " 显示行号
let mapleader = "," 

set showcmd " 状态栏中显示命令
set showmatch " 显示匹配的括号
set ignorecase " 搜索的时间忽略大小写
set smartcase " 搜索时智能匹配大小写
set incsearch " 启用增量搜索
set autowrite " 启用自动保存,如在 :next 及 :make 前自动保存
set hidden " 当 buffers 丢弃时隐藏
set mouse=a " 启用鼠标支持,全模式

""" 设置缩进
filetype plugin indent on " 根据文件类型自动设置缩进规则
set tabstop=4 " 默认是8
set expandtab " 使用空格替换 tab
set shiftwidth=4 " 缩进改为4空格
set autoindent " 启用自动缩进
set smartindent " 启用智能缩进
set cindent " 启用严格的C风格缩进

Vim 插件

  1. 首先安装 Vim 插件管理器 curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

基本使用见 vim-plug 文档说明.

  1. 安装 global 用于 vim 的符号检索 sudo apt install global

  2. 配置 gnutags 相关插件. 如下: 参考 Vim 8 中 C/C++ 符号索引:GTags 篇

    
    Plug 'ludovicchabant/vim-gutentags'
    Plug 'skywind3000/gutentags_plus'

" enable gtags module let g:gutentags_modules = ['gtags_cscope'] " " config project root markers. let g:gutentags_project_root = ['.root','.svn','.git','.hg','.project'] " generate datebases in my cache directory, prevent gtags files polluting my " project let g:gutentags_cache_dir = expand('~/.cache/tags') " change focus to quickfix window after search (optional). let g:gutentags_plus_switch = 1 let g:gutentags_define_advanced_commands = 1 let g:gutentags_auto_add_gtags_cscope = 1


### 安装配置 YCM 插件

1. 安装编译依赖 `sudo apt install -y build-essential cmake python3-dev`

2.  插件配置如下:
```vim
Plug 'Valloric/YouCompleteMe', {'for': ['c','cpp'] }
let g:ycm_global_ycm_extra_conf='~/.vim/plugged/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py'
" 其他可选配置
"输入2个字符,自动启动语义补全
let g:ycm_semantic_triggers =  {
            \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
            \ 'cs,lua,javascript': ['re!\w{2}'],
            \ }
"let g:ycm_show_diagnostics_ui=0 "禁用 ycm 诊断
"
" 禁用原型预览
"set completeopt=menu,menuone
"let g:ycm_add_preview_to_completeopt = 0
  1. 最简单的是进入到 插件根目录 安装. 例如 cd ~/.vim/plugged/YouCompleteMe/ && python3 install.py --clang-completer

  2. 复杂安装如下,指定我们安装的 llvm-8

mkdir -p ~/ycm_build && cd ~/ycm_build && cmake -G "Unix Makefiles" -DUSE_PYTHON2=OFF -DPATH_TO_LLVM_ROOT=/usr/lib/llvm-8 ~/.vim/plugged/YouCompleteMe/third_party/ycmd/cpp && cmake --build . --target ycm_core

相关输出如下:

codetalks@codetalks-vm:~/ycm_build
▶ cmake -G "Unix Makefiles" -DUSE_PYTHON2=OFF -DPATH_TO_LLVM_ROOT=/usr/lib/llvm-8  ~/.vim/plugged/YouCompleteMe/third_party/ycmd/cpp
-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.6m.so (found suitable version "3.6.8", minimum required is "3.5")
-- Using libclang to provide semantic completion for C/C++/ObjC
-- Using external libclang: /usr/lib/x86_64-linux-gnu/libclang-8.so.1
-- NOT using clang-tidy for static analysis.
-- Configuring done
-- Generating done
-- Build files have been written to: /home/codetalks/ycm_build
<中间省略部分输出>
[ 50%] Built target BoostParts
Scanning dependencies of target ycm_core
[ 52%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Candidate.cpp.o
[ 54%] Building CXX object ycm/CMakeFiles/ycm_core.dir/CandidateRepository.cpp.o
[ 56%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Character.cpp.o
[ 58%] Building CXX object ycm/CMakeFiles/ycm_core.dir/CharacterRepository.cpp.o
[ 60%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/ClangCompleter.cpp.o
[ 62%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/ClangHelpers.cpp.o
[ 64%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/ClangUtils.cpp.o
[ 66%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/CompilationDatabase.cpp.o
[ 68%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/CompletionData.cpp.o
[ 70%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/Documentation.cpp.o
[ 72%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/Range.cpp.o
[ 74%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/TranslationUnit.cpp.o
[ 76%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ClangCompleter/TranslationUnitStore.cpp.o
[ 78%] Building CXX object ycm/CMakeFiles/ycm_core.dir/CodePoint.cpp.o
[ 80%] Building CXX object ycm/CMakeFiles/ycm_core.dir/CodePointRepository.cpp.o
[ 82%] Building CXX object ycm/CMakeFiles/ycm_core.dir/IdentifierCompleter.cpp.o
[ 84%] Building CXX object ycm/CMakeFiles/ycm_core.dir/IdentifierDatabase.cpp.o
[ 86%] Building CXX object ycm/CMakeFiles/ycm_core.dir/IdentifierUtils.cpp.o
[ 88%] Building CXX object ycm/CMakeFiles/ycm_core.dir/PythonSupport.cpp.o
[ 90%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Result.cpp.o
[ 92%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Utils.cpp.o
[ 94%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Word.cpp.o
[ 96%] Building CXX object ycm/CMakeFiles/ycm_core.dir/versioning.cpp.o
[ 98%] Building CXX object ycm/CMakeFiles/ycm_core.dir/ycm_core.cpp.o
[100%] Linking CXX shared library /home/codetalks/.vim/plugged/YouCompleteMe/third_party/ycmd/ycm_core.so
[100%] Built target ycm_core
  1. 可选编译 cregex 组件 .
mkdir -p ~/regex_build && cd ~/regex_build && cmake -G "Unix Makefiles" ~/.vim/plugged/YouCompleteMe/third_party/ycmd/third_party/cregex && cmake --build . --target _regex

安装 LLVM 8

参考 http://apt.llvm.org/

  1. 添加源,在 /etc/apt/sources.list.d/ 目录下创建一个源列表文件即可

    ▶ cat /etc/apt/sources.list.d/llvm.list
    deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-7 main
    deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-8 main
  2. 添加 GPG wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key |sudo apt-key add -

  3. 安装 LLVM 8 安装基本工具. 其他的按需要安装参考上面文档. apt-get install clang-8 lldb-8 lld-8 安装好之后为了方便使用,可以添加两个别名.

alias c=clang-8
alias cpp=clang++-8
codetalks-new commented 5 years ago

跳转

配置文件查找路径

当我们使用如 gf 等指令查找当前包含的头文件时,很多文件会提示找不到. 查看 vim 的变量我们可以发现,默认的path 变量只包含 .,/usr/include,, 也就是当前路径和 /usr/include 根据我们上面使用 clang-8 或者 gcc

  1. clang-8 可以通过开启 -v 参数来输出对应的搜索的头文件路径. clang-8 -c anyfile.c -v 从中可以找到如下信息:
▶ clang-8 -c fib.c -v
clang version 8.0.1-svn360950-1~exp1~20190517004233.70 (branches/release_80)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.4.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.4.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.4.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/usr/lib/llvm-8/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name fib.c -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -v -coverage-notes-file /home/codetalks/Workspace/learn-c/linux-c/fib.gcno -resource-dir /usr/lib/llvm-8/lib/clang/8.0.1 -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-8/lib/clang/8.0.1/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdebug-compilation-dir /home/codetalks/Workspace/learn-c/linux-c -ferror-limit 19 -fmessage-length 174 -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o fib.o -x c fib.c -faddrsig
clang -cc1 version 8.0.1 based upon LLVM 8.0.1 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/llvm-8/lib/clang/8.0.1/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
  1. gcc 的话,类似可以使用 gcc -c anyfile.c -v 来查看.

配置好之后,现在可以方便的使用 gf 命令来跳转头文件声明的位置. 使用 <C-o> 跳转(打开)对应文件,使用 <C-i> 关闭(返回上一个跳转位置)

codetalks-new commented 5 years ago

补全与 Snippets

前面使用 YCM 配置了自动补全. 现在加上使用 snippets.

插件安装及配置如下:

Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
let g:UltiSnipsExpandTrigger="<C-l>"
let g:UltiSnpsEditSplit="vertical"

上面配置中 <C-l> 表示 CTRL + l 选定对应的补全项. 可以使用 <C-j>,<C-j> 来在补全代码的占位符之间跳转.