• Linux搭建C++开发环境


    1 Linux操作系统

    [username@hostname ~]$ uname -a
    
    • 1

    2 GCC编译器

    [username@hostname ~]$ gcc --version
    
    • 1

    3 Vim命令行代码编辑器

    不要问我为什么不用VSCode?为什么不用CLion?为什么不用Fleet?直接开干就完事了。

    Vim是一款命令行编辑器。

    3.1 Vim安装

    请安装vim8及以上版本!

    3.1.1 Linux(CentOS)下安装

    yum -y install vim

    3.1.2 MacOS下安装

    macos自带vim,即Vim。可使用vim --version查看,但是自带的vim部分特性不支持,如conceal,可使用homebrew重新安装vim和macvim。

    1. brew安装
    brew install vim
    brew install macvim
    vim --version
    
    • 1
    • 2
    • 3
    1. 配置别名
    编辑.zshrc或.bash_profile
    alias vi=vim
    alias vim=mvim
    alias mvim='/opt/homebrew/bin/mvim -v'
    
    • 1
    • 2
    • 3
    • 4
    1. 安装deoplete报错E605

    3.1.3 重要的几个配置文件(目录)

    • .vimrc
    • .vim
    • .viminfo

    3.2 Vim使用

    3.2.1 Vim模式

    在这里插入图片描述

    1. normal进入insert
    • i: insert
    • I: 在行首insert
    • a: append
    • A: 在行尾append
    • o: open a line below
    • O: open a line above
    1. normal进入command
    • :
    • /
    1. normal进入visual
    • v: 选择光标所在当前字符
    • V: 选择光标所在当前行
    • : 块状选择
    1. normal模式
    • u: 撤销操作
    • : 反撤销操作

    3.2.2 insert模式——快速编辑

    1. 快速纠错快捷键
    • : 删除上一个字符
    • : 删除上一个单词
    • : 删除当前行(即删除一个换行符???)

    补充Unix终端快捷键:

    • : 移到行首
    • : 移到行尾
    • : 光标前移一个字符
    • : 光标后移一个字符
    1. 快速切换到normal模式
    1. 快速跳转到最后一次编辑的位置并进入插入模式
    • gi

    3.2.3 normal模式——快速移动

    1. 传统移动:左(h)、下(j)、上(k)、右(l

    2. 单词间移动

    • w/W: 移到下一个word/WORD开头
    • e/E: 移到下一个word/WORD结尾
    • b/B: 移到上一个word/WORD开头

    word: 以非空白符(空格)分隔的单词
    WORD: 以空白符分隔的单词

    1. 行间快速移动(搜索一个字符并移动到该字符上)
    • f/F{char}: 向 后/前 搜索并移动到该char字符上
    • t/T{char}: 向 后/前 搜索并移动到该char的前一个字符上
    • 可以使用;搜索并移动到该行下一个匹配字符
    • 可以使用,搜索并移动到该行上一个匹配字符
    1. 水平移动
    • 0: 移动到行首第一个字符;^移动到行首第一个非空白字符
    • $: 移动到行尾最后一个字符;g_移动到行尾最后一个非空白字符
    1. 垂直移动
    • ( / ): 在句子间移动
    • { / }: 在段落间移动
    1. 页面移动
    • gg: 移动光标到文件首部
    • G: 移动光标到文件尾部
    • : 返回
    • H/M/L: 移动光标到屏幕 头部/中间/尾部
    • / : 向上(upward) / 向下(forward)翻页
    • zz: 将屏幕置为中间 (可能会翻页!zz ! =M)
    • ZZ: 保存并退出

    3.2.4 CRUD

    : vim的一个抽象概念,比如一个单词,一个句子,一个段落

    • digit: 操作次数
    • command: 命令,如d(delete),c(change),y(yank)
    • TextObject: 如w(word),s(sentence),p(paragraph)
    1. 示例(i: inner;a: around)
    • viw: 选中当前word
    • vaw: 选中当前word包括空格
    • vi{/}/(/)/"/':选中括号或冒号之间的内容
    1. normal模式——删除
    • x: 快速删除光标所在字符
    • d + : 快速删除一个单词;如dw(删除光标后的单词)daw(delete around a word)diw(delete in aword)
    • + x / d + : 执行多次;如2xx4daw
    • dd / D: 删除当前行
    • d + t + : delete to ,删除光标到之前的字符
    1. normal模式——修改
    • r + : replace,替换光标所在字符为输入的新字符,仍是normal模式

    • + r + : replace,替换光标后面个字符,仍是normal模式

    • R: 进入REPLACE,连续替换多个字符

    • c + : change,删除一个并进入insert模式;如cw(删除光标后的单词)ciwcaw

    • cc / C: change,删除当前行并进入insert模式

    • c + t + : change,删除之前的字符并进入insert模式

    • c + h/j/k/l: 删除 左边一个字符/下一行/上一行/右边一个字符,并进入insert模式

    • s: 删除当前字符并进入insert模式

    • + s: substitute,删除个字符并进入insert模式

    • S: substitute,删除当前行并进入insert模式

    1. normal模式——查询
    • / + : 前向搜索

    • ? + : 反向搜索

    • *: 当前单词的前向匹配

    • #: 当前单词的反向匹配

    • n/N: 跳转到下一个/上一个匹配

    • 设置增量搜索

    3.2.5 替换

    :[range] s[ubstitute]/{pattern}/{string}/[flags]

    • range: 表示范围,如10,20表示10-20行,%表示全部
    • pattern: 要替换的模式,支持正则表达式
    • string: 替换后的文本
    • flags: 有几个常用标志位,g(global)表示全局执行;c(confirm)表示确认;n(number)表示报告次数而不匹配

    3.2.6 Vim多文件操作

    1. buffer

    在这里插入图片描述

    1. window

    在这里插入图片描述
    在这里插入图片描述

    • 窗口移动: H/J/K/L

    3.2.7 复制粘贴

    1. normal模式
    • y: yank
    • p: put
    • d: delete

    visual模式

    • v/V: 选中想复制的内容,然后p粘贴

    配合文本对象

    • yiw: 复制一个单词
    • yy: 复制一行
    1. insert模式
    • : 粘贴

    set autoindent:设置自动缩进
    set paste:设置粘贴模式进入insert模式粘贴可以避免缩进混乱

    1. Vim寄存器

    Vim剪切使用的是寄存器,而不是系统剪贴板!默认放入无名寄存器(“”)。

    • Tips: 调换两个字符:x-> p
    • "{register}: 表示使用寄存器{register},如"ayiw表示复制一个单词到寄存器a
    • "0: 复制专用寄存器("0),使用y会同时放入无名寄存器和复制专用寄存器
    • "+: 复制到系统剪贴板,echo has('clipboard')查看是否支持系统剪贴板功能
    • "%: 当前文件名存放的寄存器
    • ".: 上次插入的文本所存放在的寄存器

    3.2.8 Vim宏

    1. 概念:可以看成是一系列命令的集合
    2. 使用:录制(q{register}) + 回放(@{register}),均是q命令录制和退出
    3. 示例:给多行代码加上引号
    0. 光标移到行首,(normal模式)qreg1
    1. i" esc
    2. A" esc
    3. (normal模式)q
    4. j
    5. V
    6. G
    7. :normal @reg1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.2.9 Vim补全

    在这里插入图片描述

    常用:

    1. : 补全单词
    2. : 补全文件名
    3. : 补全代码,需要开启文件类型检查(:filetype on),安装插件
    • 多个候选项:下一个;上一个

    3.3 Vim配置、映射与脚本

    3.3.1 配置

    编写~/.vimrc文件

    3.3.2 映射

    1. 设置leader
    2. 自定义命令执行外部命令

    3.3.3 VimScript

    • 简单的脚本语言

    3.4 Vim插件

    3.4.1 插件管理器

    1. 安装vim-plug
    2. 编写.vimrc
    3. 添加/更新/删除插件

    3.4.2 寻找插件

    3.5 搭建C++开发环境

    3.5.1 nerdtree(目录树)

    Plug 'preservim/nerdtree'
    nnoremap <leader>v :NERDTreeFind<cr>
    nnoremap <leader>g :NERDTreeToggle<cr>
    
    • 1
    • 2
    • 3

    3.5.2 tagbar(符号列表)

    方式一:brew install --HEAD universal-ctags/universal-ctags/universal-ctags
    
    方式二:
    brew tap universal-ctags/universal-ctags
    brew install --HEAD universal-ctags
    
    • 1
    • 2
    • 3
    • 4
    • 5
    Plug 'preservim/tagbar' //安装tagbar
    nnoremap <leader>t :TagbarToggle<cr> //映射<leader>t 打开tagbar
    
    • 1
    • 2

    3.5.3 LeaderF(文件查找)

    Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }
    
    • 1

    3.5.4 deoplete.nvim + LanguageClient + clangd(代码补全、函数跳转)

    在这里插入图片描述

    1. deoplete.nvim
    " deoplete.nvim
    if has('nvim')
      Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
    else
      Plug 'Shougo/deoplete.nvim'
      Plug 'roxma/nvim-yarp'
      Plug 'roxma/vim-hug-neovim-rpc'
    endif
    let g:deoplete#enable_at_startup = 1
    Plug 'Shougo/deoplete-clangx'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. LanguageClient-neovim
    1. clangd

    3.5.5 AsyncRun(shell命令异步运行)

    Plug 'skywind3000/asyncrun.vim'
    
    • 1

    3.5.6 my .vimrc

    • 开箱即用
    • 几乎没有个性化的映射
    • 安装的插件几乎全部使用原生命令
    • 最大限度的通用性
    " ========= my .vimrc ========
    " :help 可以用来查看帮助文档!!!
    " ========== 常用设置 ==========
    " 不使用兼容模式
    set nocompatible
    
    " 设置字符集
    set encoding=utf-8
    
    " 与buffer有关的hidden
    " abandoned的Buffer隐藏起来,这是vim的设置。
    " 如果没有这个设置,修改过的文件需要保存了才能换buffer
    " 这会影响全局重命名,因为Vim提示保存因此打断下一个文件的重命名。
    set hidden
    
    " 设置行号
    set number
    
    " 设置tab宽度为4个空格
    set tabstop=4
    set expandtab
    
    " 设置主题(需要安装插件)
    colorscheme default
    
    " 设置高亮搜索
    set hlsearch
    
    " 设置语法高亮
    syntax on
    
    " 设置折叠方式(按缩进,za展开/关闭)
    " set foldmethod=indent
    
    " 显示光标当前位置
    "set ruler
    
    " 高亮显示当前行/列
    set cursorline
    set cursorcolumn
    
    " ========== 常用设置<end> ==========
    
    " ========== 映射设置 ==========
    " 设置leader变量
    let mapleader=','
    
    " insert模式下使用 jj 进入 normal 模式
    inoremap jj <Esc>`^
    
    
    " ========== 映射设置 ==========
    
    " ========== 插件设置<begin> ==========
    " 使用vim-plug插件管理器
    call plug#begin('~/.vim/plugged')
    " vim-startify插件(vim启动页)
    Plug 'mhinz/vim-startify'
    
    " vim-airline插件(状态栏显示)
    Plug 'vim-airline/vim-airline'
    Plug 'vim-airline/vim-airline-themes'
    
    " yggdroot/indentline(缩进线显示)
    "(MacVim) conceal is invalid. To use the plugin, please enable the conceal
    " Plug 'yggdroot/indentline'
    
    " w0ng/vim-hybrid(颜色主题)
    Plug 'w0ng/vim-hybrid'
    colorscheme hybrid
    
    " nerdtree(目录树)
    Plug 'preservim/nerdtree'
    nnoremap <leader>v :NERDTreeFind<cr>
    nnoremap <leader>g :NERDTreeToggle<cr>
    let NERDTreeShowHidden=0
    let NERDTreeIgnore=['\.git$','\DS_Store$']
    
    " ctrlp-vim(文件搜索)
    Plug 'ctrlpvim/ctrlp.vim'
    let g:ctrlp_map = ''
    
    " vim-easymotion(移动到任意位置)
    Plug 'easymotion/vim-easymotion'
    nmap ss <Plug>(easymotion-s2)
    
    " vim-surround(成对编辑)
    Plug 'tpope/vim-surround'
    
    " vim-interstingwords(高亮单词)
    Plug 'lfv89/vim-interestingwords'
    
    " vim-commentary(注释代码)
    Plug 'tpope/vim-commentary'
    
    " tagbar(需要依赖universal ctags)
    Plug 'preservim/tagbar'
    nnoremap <leader>t :TagbarToggle<cr>
    
    " LeaderF(文件查找)
    Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }
    
    " 代码补全、提示、函数跳转(deoplete + LanguageClient + clangd)
    " ========== deoplete.nvim ===============================================
    if has('nvim')
      Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
    else
      Plug 'Shougo/deoplete.nvim'
      Plug 'roxma/nvim-yarp'
      Plug 'roxma/vim-hug-neovim-rpc'
    endif
    let g:deoplete#enable_at_startup = 1
    
    " 补全结束或离开插入模式时,关闭预览窗口
    autocmd InsertLeave,CompleteDone * if pumvisible() == 0 | pclose | endif
    
    
    " deoplete 的c/c++ completion source(选用LanguageClient插件 +
    " clangd作为c/c++ 的completion source源,就不需要这个设置啦)
    " Plug 'Shougo/deoplete-clangx'
    
    " ========== deoplete.nvim ===============================================
    
    " ========== LanguageClient-neovim =======================================
    Plug 'autozimu/LanguageClient-neovim', {
        \ 'branch': 'next',
        \ 'do': 'bash install.sh',
        \ }
    
    " 把Server的补全API提交给Vim
    " 一般有deoplete就可以用了,加上一条以防万一。
    set completefunc=LanguageClient#complete
    " 把Server的格式化API提交给Vim
    set formatexpr=LanguageClient_textDocument_rangeFormatting()
    
    " (Optional) Multi-entry selection UI.
    Plug 'junegunn/fzf'
    
    " 为语言指定Language server和server的参数
    let g:LanguageClient_serverCommands = {
                \ 'cpp': ['clangd'],
                \ 'c': ['clangd'],
                \ }
    
    " 告诉LS那个文件夹才是project root,同时也告诉它compile_commands在哪里
    let g:LanguageClient_rootMarkers = {
                \ 'cpp': ['compile_commands.json', 'build'],
                \ 'c': ['compile_commands.json', 'build']
                \ }
    
    " ========== LanguageClient-neovim =======================================
    
    " AsyncRun(异步运行)
    Plug 'skywind3000/asyncrun.vim'
    let g:asyncrun_open=6
    
    call plug#end()
    
    " ========== deoplete.nvim 补充===============================================
    " 为每个语言定义completion source
    " 是的vim script和zsh script都有,这就是deoplete
    call deoplete#custom#option('sources', {
                \ 'cpp': ['LanguageClient'],
                \ 'c': ['LanguageClient'],
                \ 'vim': ['vim'],
                \ 'zsh': ['zsh']
                \})
    
    " 用户输入至少两个字符时再开始提示补全
    call deoplete#custom#source('LanguageClient',
                \ 'min_pattern_length',
                \ 2)
    
    " 字符串中不补全
    call deoplete#custom#source('_',
                \ 'disabled_syntaxes', ['String']
                \ )
    " ========== deoplete.nvim 补充===============================================
    
    " ========== 插件设置<end> ==========
    
    " ========== VimScript设置 ==========
    " 设置打开文件光标停留在上次退出的位置
    " au BufReadPost * if line("'\"") > 0 | if line("'\"") <= line("$") | exe("norm '\"") | else |exe "norm $"| endif | endif
    
    " ========== VimScript设置<end> ==========
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187

    3.6 Tmux(终端复用工具)

    参考:https://www.ruanyifeng.com/blog/2019/10/tmux.html

    4 GDB程序调试器

    https://www.sourceware.org/gdb/

  • 相关阅读:
    CentOS MySQL安装及问题解决
    Lazysysadmin靶机
    k8s部署三个节点zookeeper,1主2从集群
    P1165 日志分析
    java排序之compareTo方法和Comparator<T>接口
    [AI] LRTA*ls(k)搜索算法
    Colossal-AI
    蓄电池与超级电容混合储能并网逆变系统Simulink仿真
    如何进行统一异常处理
    【基于C的排序算法】归并排序
  • 原文地址:https://blog.csdn.net/weixin_44666217/article/details/127594532