1 Linux操作系统
[username@hostname ~]$ uname -a
2 GCC编译器
[username@hostname ~]$ gcc --version
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。
- brew安装
brew install vim
brew install macvim
vim --version
- 配置别名
编辑.zshrc或.bash_profile
alias vi=vim
alias vim=mvim
alias mvim='/opt/homebrew/bin/mvim -v'
- 安装deoplete报错E605
3.1.3 重要的几个配置文件(目录)
3.2 Vim使用
3.2.1 Vim模式
- normal进入insert
i : insertI : 在行首inserta : appendA : 在行尾appendo : open a line belowO : open a line above
- normal进入command
- normal进入visual
v : 选择光标所在当前字符V : 选择光标所在当前行<ctrl + v> : 块状选择
- normal模式
3.2.2 insert模式——快速编辑
- 快速纠错快捷键
<ctrl + h> : 删除上一个字符<ctrl + w> : 删除上一个单词<ctrl + u> : 删除当前行(即删除一个换行符???)
补充Unix终端快捷键:
<ctrl + a> : 移到行首<ctrl + e> : 移到行尾<ctrl + b> : 光标前移一个字符<ctrl + f> : 光标后移一个字符
- 快速切换到normal模式
- 快速跳转到最后一次编辑的位置并进入插入模式
3.2.3 normal模式——快速移动
-
传统移动:左(h )、下(j )、上(k )、右(l ) -
单词间移动
w /W : 移到下一个word/WORD开头e /E : 移到下一个word/WORD结尾b /B : 移到上一个word/WORD开头
word: 以非空白符(空格)分隔的单词 WORD: 以空白符分隔的单词
- 行间快速移动(搜索一个字符并移动到该字符上)
f/F{char} : 向 后/前 搜索并移动到该char 字符上t/T{char} : 向 后/前 搜索并移动到该char 的前一个字符上- 可以使用
; 搜索并移动到该行下一个匹配字符 - 可以使用
, 搜索并移动到该行上一个匹配字符
- 水平移动
0 : 移动到行首第一个字符;^ 移动到行首第一个非空白字符$ : 移动到行尾最后一个字符;g_ 移动到行尾最后一个非空白字符
- 垂直移动
( / ) : 在句子间移动{ / } : 在段落间移动
- 页面移动
gg : 移动光标到文件首部G : 移动光标到文件尾部<ctrl + o> : 返回H/M/L : 移动光标到屏幕 头部/中间/尾部<ctrl + u> / <ctrl + f> : 向上(upward) / 向下(forward)翻页zz : 将屏幕置为中间 (可能会翻页!zz ! =M )ZZ : 保存并退出
3.2.4 CRUD
: vim的一个抽象概念,比如一个单词,一个句子,一个段落
<digit><command><TextObject>
- digit: 操作次数
- command: 命令,如d(delete),c(change),y(yank)
- TextObject: 如w(word),s(sentence),p(paragraph)
- 示例(i: inner;a: around)
viw : 选中当前wordvaw : 选中当前word包括空格vi{/}/(/)/"/' :选中括号或冒号之间的内容
- normal模式——删除
x : 快速删除光标所在字符d + <TextObject> : 快速删除一个单词;如dw(删除光标后的单词) 、daw(delete around a word) 、diw(delete in aword) <digit> + x / d + <TextObject> : 执行多次;如2xx 、4daw dd / D : 删除当前行d + t + <character> : delete to ,删除光标到之前的字符
- normal模式——修改
-
r + <character> : replace,替换光标所在字符为输入的新字符,仍是normal模式 -
<digit> + r + <character> : replace,替换光标后面个字符,仍是normal模式 -
R : 进入REPLACE,连续替换多个字符 -
c + <TextObject> : change,删除一个并进入insert模式;如cw(删除光标后的单词) 、ciw 、caw -
cc / C : change,删除当前行并进入insert模式 -
c + t + <character> : change,删除之前的字符并进入insert模式 -
c + h/j/k/l : 删除 左边一个字符/下一行/上一行/右边一个字符,并进入insert模式 -
s : 删除当前字符并进入insert模式 -
<digit> + s : substitute,删除个字符并进入insert模式 -
S : substitute,删除当前行并进入insert模式
- normal模式——查询
-
/ + <word> : 前向搜索 -
? + <word> : 反向搜索 -
* : 当前单词的前向匹配 -
# : 当前单词的反向匹配 -
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多文件操作
- buffer
- window
3.2.7 复制粘贴
- normal模式
visual模式
配合文本对象
- insert模式
set autoindent:设置自动缩进 set paste:设置粘贴模式进入insert模式粘贴可以避免缩进混乱
- Vim寄存器
Vim剪切使用的是寄存器,而不是系统剪贴板!默认放入无名寄存器(“”)。
- Tips: 调换两个字符:
x -> p "{register} : 表示使用寄存器{register},如"ayiw 表示复制一个单词到寄存器a 中"0 : 复制专用寄存器("0),使用y 会同时放入无名寄存器和复制专用寄存器"+ : 复制到系统剪贴板,echo has('clipboard') 查看是否支持系统剪贴板功能"% : 当前文件名存放的寄存器". : 上次插入的文本所存放在的寄存器
3.2.8 Vim宏
- 概念:可以看成是一系列命令的集合
- 使用:录制(
q{register} ) + 回放(@{register} ),均是q 命令录制和退出 - 示例:给多行代码加上引号
0. 光标移到行首,(normal模式)qreg1
1. i" esc
2. A" esc
3. (normal模式)q
4. j
5. V
6. G
7. :normal @reg1
3.2.9 Vim补全
常用:
<ctrl + n><ctrl + p> : 补全单词<ctrl + x><ctrl + f> : 补全文件名<ctrl + x><ctrl + o> : 补全代码,需要开启文件类型检查(:filetype on ),安装插件
- 多个候选项:
<ctrl + n> 下一个;<ctrl + p> 上一个
3.3 Vim配置、映射与脚本
3.3.1 配置
编写~/.vimrc文件
3.3.2 映射
- 设置leader
- 自定义命令执行外部命令
3.3.3 VimScript
3.4 Vim插件
3.4.1 插件管理器
- 安装vim-plug
- 编写.vimrc
- 添加/更新/删除插件
3.4.2 寻找插件
3.5 搭建C++开发环境
3.5.1 nerdtree(目录树)
Plug 'preservim/nerdtree'
nnoremap <leader>v :NERDTreeFind<cr>
nnoremap <leader>g :NERDTreeToggle<cr>
3.5.2 tagbar(符号列表)
方式一:brew install --HEAD universal-ctags/universal-ctags/universal-ctags
方式二:
brew tap universal-ctags/universal-ctags
brew install --HEAD universal-ctags
Plug 'preservim/tagbar' //安装tagbar
nnoremap <leader>t :TagbarToggle<cr> //映射<leader>t 打开tagbar
3.5.3 LeaderF(文件查找)
Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }
3.5.4 deoplete.nvim + LanguageClient + clangd(代码补全、函数跳转)
- 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
Plug 'Shougo/deoplete-clangx'
- LanguageClient-neovim
- clangd
3.5.5 AsyncRun(shell命令异步运行)
Plug 'skywind3000/asyncrun.vim'
3.5.6 my .vimrc
- 开箱即用
- 几乎没有个性化的映射
- 安装的插件几乎全部使用原生命令
- 最大限度的通用性
" ========= my .vimrc ========
" :help 可以用来查看帮助文档!!!
" ========== 常用设置<begin> ==========
" 不使用兼容模式
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> ==========
" ========== 映射设置<begin> ==========
" 设置leader变量
let mapleader=','
" insert模式下使用 jj 进入 normal 模式
inoremap jj <Esc>`^
" ========== 映射设置<end> ==========
" ========== 插件设置<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 = '<c-p>'
" 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
\ 'cpp': ['LanguageClient'],
\ 'c': ['LanguageClient'],
\ 'vim': ['vim'],
\ 'zsh': ['zsh']
\})
" 用户输入至少两个字符时再开始提示补全
call deoplete#custom#source('LanguageClient',
\ 'min_pattern_length',
\ 2)
" 字符串中不补全
call deoplete
\ 'disabled_syntaxes', ['String']
\ )
" ========== deoplete.nvim 补充===============================================
" ========== 插件设置<end> ==========
" ========== VimScript设置<begin> ==========
" 设置打开文件光标停留在上次退出的位置
" au BufReadPost * if line("'\"") > 0 | if line("'\"") <= line("$") | exe("norm '\"") | else |exe "norm $"| endif | endif
" ========== VimScript设置<end> ==========
3.6 Tmux(终端复用工具)
参考:https://www.ruanyifeng.com/blog/2019/10/tmux.html
4 GDB程序调试器
https://www.sourceware.org/gdb/
|