基础开发工具-编辑器vim

vim操作键盘图

下图是比较基础的vim操作键盘图 (IDE例子)

  • vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以运⾏于x window、 mac os、 windows。

vim的基本概念

vim本质是一款多模式的编辑器,vim是所有Linux操作系统自带的,是一款使用成本,配置成本比较高的编辑器,在操作上,也就是说虽然前期比较不好上手,但是学熟后,也就没有什么编辑器可以为难到我们了,在配置上还有一款更复杂的:VSCode。

vim的三种模式(其实有好多模式,⽬前掌握这3种即可),分别是命令模式(command mode)、插⼊模式(Insert mode)和底⾏模式(last line mode),各模式的功能区分如下:

  • 正常/普通/命令模式(Normal mode)

控制屏幕光标的移动,字符、字或⾏的删除,移动复制某区段及进⼊Insert mode下,或者到 lastline mode(是一种指令的快捷方式)

  • 插⼊模式(Insert mode)

只有在Insert mode下,才可以做⽂字输⼊,按「ESC」键可回到命令⾏模式。该模式是我们后⾯⽤的最频繁的编辑模式。

  • 末⾏模式(last line mode)

⽂件保存或退出,也可以进⾏⽂件替换,找字符串,列出⾏号等操作。在命令模式下,*shift+:* 即可进⼊该模式。要查看你的所有模式:打开 vim,底⾏模式直接输⼊:help vim-modes

  • 我这⾥⼀共有12种模式:six BASIC modes和six ADDITIONAL modes.
关系转换图

vim的基本操作 

我们刚开始使用vim,一个裸的vim进行代码的编写,他是没有经过任何配置的,最多会给我们带一点点语法提醒;补全,提示,语法报错是完全没有的。

下面我们演示一下:

我们touch一个code.c文件,并代开code.c进行编辑:

lfz@hcss-ecs-ff0f:~/lesson/code$ touch code.c
lfz@hcss-ecs-ff0f:~/lesson/code$ vim code.c

我们刚开始进入vim的时候是命令模式,我们想要进行编辑代码需要切换成插入模式,最简单的切换方法是:输入 i 就可以啦!(简单的切换就是上面那张图示)(想要推出的话切换成底行模式,输入wq:w是保存,q是退出)

我们可以不通过touch一个文件,我们直接vim就能创建一个新的文件,但是如果什么都不写,按q,该文件不会创建,如果什么都不写,wq后,是会创建一个空文件;

我们应该注意的是:我们无法从插入模式直接切换到底行模式 

其实命令模式是很重要的;和在我们使用Ctrl+c/v的操作,这种快捷键一样,本质就是对应vim的命令模式:

就假如当前处于命令模式下,当前光标在第7行(我们可以使用底行模式:set nu/nonu 来设置/取消行号)我们可以:

gg:使光标直接回到第一行(初始位)

Shift+g=G:使光标直接回到第一行

指定行+G:使光标定位到指定行

Shift+4=$:直接定位到结尾

命令模式切换到插入模式

  • i:在当前光标之前插入字符
  • I:在行首插入字符
  • a:在当前光标之后插入字符
  • A:在行末插入字符
  • o:在下一行新建一行并且插入字符
  • O:在上一行新建一行并且插入字符

命令模式下的文本编辑

  • dd:剪切当前行(剪切后不粘贴即为删除)
  • 数字+dd:删除从当前行开始的几行
  • yy:复制当前行
  • 数字+yy:从当前行开始复制几行
  • p:粘贴到光标的下一行
  • D:剪切从光标处到行末的字符
  • d0:剪切从当前光标开始到行首的字符
  • x:删除当前光标所指的字符
  • X:删除当前光标之前的一个字符
  • Shift+~:字母大小写的转换

命令模式下的撤销与导航

  • u:撤销
  • Ctrl+r:反撤销
  • Ctrl+f:向下翻一页
  • Ctrl+b:向上翻一页
  • Ctrl+u:向上翻半屏
  • Ctrl+d:向下翻半屏
  • H:调到屏幕的第一行
  • M:调到屏幕的中央一行
  • L:调到屏幕的最后一行
  • h:向左移动光标
  • j:向下移动光标
  • k:向上移动光标
  • l:向右移动光标
  • G:调到整个代码的最后一行
  • 数字+G:调到整个代码的指定行
  • gg:调到整个代码的第一行
  • w:跳到下一个单词开头
  • b:跳到上一个单词开头

命令模式下的文本选择与缩进

  • v:按照字符来一个一个选择代码片段
  • V:按照行来选择代码片段(以上两个是用来重命令模式转为视图模式的V-BLOCK,返回也是通过Esc)

通过hjkl进行区域的选择,在通过Shift+i=I就转换到了插入模式,再通过Esc返回命令模式,这样可以达到批量化注释的效果。

当让也可在不进入插入模式下,使用命令模式当中的快捷键进行批量化处理:就比如V后进行配量化选择,再对选择的范围输入d,就可以进行删除选中的nei'r

  • <<:将选中的片段整体左移
  • >>:将选中的片段整体右移
  • {:跳到上一个代码段
  • }:跳到下一个代码段

命令模式下的替换与搜索

  • r:替换一个字符
  • R:替换一段字符(其实这是一种模式:替换模式(进入替换模式(REPLACE):Ctrl+r;退回命令模式:Esc))
  • /+搜索内容:搜索指定内容,并且高亮
  • n:往下走一个搜索对象
  • N:往上走一个搜索对象

命令模式下的保存与退出

  • Shift+zz:保存并且退出

底行模式下的替换

  • :%s/123/abc/g:将代码中所有的123替换成abc
  • :数字,数字s/123/abc/g:将数字指定的行之间的123全部替换成abc

底行模式下

  • 执行命令

输入 : 进入底行模式,可以在这里输入单个或多个命令。

  • 保存文件

:w:保存当前文件。

:wq 或 :x:保存文件并退出 Vim。

  • 退出 Vim

:q:退出 Vim,如果文件被修改过,会提示保存。

:q!:强制退出 Vim,不保存修改。

  • 查找替换

:s/old/new/g:将当前行中的“old”替换为“new”,g 表示全局替换。

:%s/old/new/g:将整个文件中的“old”替换为“new”。

:数字,数字s/123/abc/g:将数字指定的行之间的123全部替换成abc

  • 跳转到行

:数字:跳转到指定行号,例如 :10 跳转到第10行。

  • 设置选项

:set nu:显示行号。

:set nonu:关闭行号显示。

  • 执行外部命令

:!命令:在 Vim 内部执行外部命令,例如 :!ls 列出目录内容。

  • 搜索内容

/搜索内容:向下搜索指定内容。

?搜索内容:向上搜索指定内容。

  • 删除行

:数字d:删除指定行号的行,例如 :10d 删除第10行。

  • 复制和移动行

:数字m数字:将指定行移动到另一行号,例如 :10m20 将第10行移动到第20行。

:数字t数字:将指定行复制到另一行号,例如 :10t20 将第10行复制到第20行。

  • 折叠代码

:fold:创建一个折叠。

:foldopen:打开一个折叠。

  • 执行宏

:@寄存器:执行寄存器中的宏,例如 :@a 执行寄存器 a 中的宏。

  • 分屏操作:

:vs 文件名:进行分屏的多模块操作,编辑代码

对于多窗口,光标在哪一个窗口,那么所执行的操作是对应的窗口,那我们怎么进行窗口操作进行光标切换呢?

最简单的做法是:Ctrl+w+w(Ctrl按住别动,w按两下)(在命令模式下)

有了上面的做法,当然就可以进行窗口间的互相编写,命令的交接使用,比如左窗口代码拷贝到右窗口。

使用vim的一个小技巧:

vim 文件 +n:上次光标+n行,打开文件就是到达原来光标位置+n行对应的光标位置;

!关键字:执行最近一次含有该关键字的指令。

vim的配置

在我们的普通用户,也就是自己创建的,使用的账号下,会存在一些隐藏文件,其中有一个文件叫做:.vimrc

lfz@hcss-ecs-ff0f:~$ ls -al
total 60
drwxr-x--- 4 lfz  lfz   4096 Dec 14 19:06 .
drwxr-xr-x 4 root root  4096 Oct  8 23:34 ..
-rw------- 1 lfz  lfz  12418 Dec 13 16:09 .bash_history
-rw-r--r-- 1 lfz  lfz    220 Oct  3 15:14 .bash_logout
-rw-r--r-- 1 lfz  lfz   3771 Oct  3 15:14 .bashrc
-rw------- 1 lfz  lfz     20 Dec 12 19:10 .lesshst
drwxrwxr-x 5 lfz  lfz   4096 Dec 12 19:04 lesson
drwxrwxr-x 3 lfz  lfz   4096 Oct  3 19:54 .local
-rw-r--r-- 1 lfz  lfz    807 Oct  3 15:14 .profile
-rw-r--r-- 1 lfz  lfz      0 Oct  3 15:42 .sudo_as_admin_successful
-rw------- 1 lfz  lfz  12042 Dec 14 19:06 .viminfo

这里我们可以自己touch一个.vimrc文件:

lfz@hcss-ecs-ff0f:~$ touch .vimrc

然后我们通过vim默认打开.vimrc文件:

lfz@hcss-ecs-ff0f:~$ vim .vimrc

接下来我们就可以通过对.vimrc的文件编辑进行对该用户(lfz)的vim工具的配置

我们需要在.vimrc中编辑配置信息,比如配置信息:

set nu

然后我们保存退出后(wq),再打开(vim)文件,就直接显示行号了。

我们通过:

lfz@hcss-ecs-ff0f:~$ which vim
/usr/bin/vim

可以发现,其实vim是我们在/user/bin/vim目录下给我们安装的一款软件,使用vim,就是把该目录进行打开了,该软件在默认情况下,会自动在你当前用户的home目录里搜索配置文件.vimrc,如果没有,vim就使用默认行为,如果有,vim在打开时就会读取.vimrc这个配置文件来进行配置,在.vimrc文件,我们想要注释掉信息的话,使用  " :(如下例子)

  1 "set nu

这样,我们再次通过vim打开文件就不会再直接显示行号了。

还有系统默认,全局公用的vimrc,这是默认存在的,不管在普通用户还是root用户,我们在Ubuntu下,可以打开该文件进行了解:

lfz@hcss-ecs-ff0f:~$ vim /etc/vim/vimrc

我们推荐的是配置自己home目录下的.vimrc就行,由于权限的存在,该配置文件只有我这个用户(lfz)可以使用,这样就不会影响到其他普通用户。 

我们可以在网上找几个配置项,下面是我的配置项,可以参考参考的,如果愿意的话:

我的系统版本是:

lfz@hcss-ecs-ff0f:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
lfz@hcss-ecs-ff0f:~$ cat /etc/issue
Ubuntu 22.04.4 LTS \n \l

配置项:(about:Ubuntu)

在此之前:

Vim-Plug未安装.vimrc 文件中使用了Vim-Plug作为插件管理器,如果您的系统中没有安装Vim-Plug,那么插件将无法安装。您可以通过以下命令安装Vim-Plug:

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

手动安装 gruvbox: 如果 Vim-Plug 没有成功安装 gruvbox,你可以尝试手动安装它。使用以下命令克隆 gruvbox 仓库到你的 Vim 插件目录:

git clone https://github.com/morhetz/gruvbox.git ~/.vim/plugged/gruvbox

手动复制颜色文件:如果gruvbox插件已经安装,但是Vim仍然无法找到颜色方案,你可以尝试手动将gruvbox.vim文件复制到~/.vim/colors目录下。

mkdir -p ~/.vim/colors
cp ~/.vim/plugged/gruvbox/colors/gruvbox.vim ~/.vim/colors/

打开.vimrc配置:

" 基本设置
set nocompatible              " 必须
syntax enable                " 启用语法高亮
set background=dark           " 背景色
colorscheme gruvbox          " 颜色方案

" 界面设置
set number                    " 显示行号
"set relativenumber            " 显示相对行号
set cursorline                " 高亮当前行
set nowrap                    " 不自动换行
set linebreak                 " 在换行处断行
set autoread                  " 文件在外部被修改后自动重新读取
set mouse=a                   " 启用鼠标支持
set clipboard=unnamedplus     " 允许vim使用系统剪贴板
set expandtab                 " 将制表符展开为空格
set tabstop=4                 " 设置制表符宽度为4
set shiftwidth=4              " 设置缩进宽度为4
set softtabstop=4             " 设置软制表符宽度为4
set list                      " 显示特殊字符
set listchars=tab:▸\ ,eol:¬,trail:⋅,extends:❯,precedes:❮
set wildmenu                  " 增强命令行自动补全
set wildmode=list:longest,full
set scrolloff=3               " 保持三行距离
set sidescrolloff=15          " 侧边滚动距离
set foldmethod=indent         " 代码折叠方式
set foldlevel=1               " 默认折叠级别
set laststatus=2              " 总是显示状态栏
"set statusline=%<%f\ %h%m%r%{fugitive#statusline()}%=%-14.(%l,%c%V%)\ %P

" 插件管理
call plug#begin('~/.vim/plugged')
  Plug 'preservim/nerdtree'         " 文件浏览器
  Plug 'Xuyuanp/nerdtree-git-plugin' " NERDTree的git插件
  Plug 'airblade/vim-gitgutter'      " GitGutter
  Plug 'vim-airline/vim-airline'     " 状态栏增强
  Plug 'vim-airline/vim-airline-themes'
  Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
  Plug 'junegunn/fzf.vim'
  Plug 'tpope/vim-fugitive'
  Plug 'jiangmiao/auto-pairs'
  Plug 'godlygeek/tabular'
  Plug 'AndrewRadev/splitjoin.vim'
  Plug 'tomtom/tcomment_vim'
  Plug 'sbdchd/neoformat'
  Plug 'junegunn/vim-easy-align'
  Plug 'terryma/vim-multiple-cursors'
  Plug 'tpope/vim-surround'
  Plug 'preservim/vim-commentary'
  Plug 'sheerun/vim-polyglot'        " 多语言支持
call plug#end()

" 代码格式化工具配置
" 使用neoformat自动格式化代码
autocmd FileType * nnoremap <leader>f :Neoformat<CR>
let g:neoformat_try_formatprg = 1
" 对于C/C++,使用clang-format
autocmd FileType c,cpp nnoremap <leader>f :0,$!clang-format<CR>
" 对于Python,使用autopep8
autocmd FileType python nnoremap <leader>f :0,$!autopep8<CR>

" 其他个人设置
" 这里可以添加其他个人化的设置

其实现在对于CentOS是较全的,对于CentOS,我们通过该网站,可以得到较为全面的插件:

(就是在卸载的时候有点卸不干净)

一键部署Vim 从入门到精通. Contribute to wsdjeg/vim-galore-zh_cn development by creating an account on GitHub.icon-default.png?t=O83Ahttps://github.com/wsdjeg/vim-galore-zh_cn

补充:这个挺全的

sudo apt install vim-youcompleteme
vim-addon-manager install youcompleteme

依次执行这两句代码,这是Ubuntu的,有自动补全等

另外也可以放弃上面配置,配置如下.vimrc:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 通用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let mapleader = ","      " 定义<leader>键
set nocompatible         " 设置不兼容原始vi模式
filetype on              " 设置开启文件类型侦测
filetype plugin on       " 设置加载对应文件类型的插件
set noeb                 " 关闭错误的提示
syntax enable            " 开启语法高亮功能
syntax on                " 自动语法高亮
set t_Co=256             " 开启256色支持
set cmdheight=2          " 设置命令行的高度
set showcmd              " select模式下显示选中的行数
set ruler                " 总是显示光标位置
set laststatus=2         " 总是显示状态栏
set number               " 开启行号显示
set cursorline           " 高亮显示当前行
set whichwrap+=<,>,h,l   " 设置光标键跨行
set ttimeoutlen=0        " 设置<ESC>键响应时间
set virtualedit=block,onemore   " 允许光标出现在最后一个字符的后面

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 代码缩进和排版
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set autoindent           " 设置自动缩进
set cindent              " 设置使用C/C++语言的自动缩进方式
set cinoptions=g0,:0,N-s,(0    " 设置C/C++语言的具体缩进方式
set smartindent          " 智能的选择对其方式
filetype indent on       " 自适应不同语言的智能缩进
set expandtab            " 将制表符扩展为空格
set tabstop=4            " 设置编辑时制表符占用空格数
set shiftwidth=4         " 设置格式化时制表符占用空格数
set softtabstop=4        " 设置4个空格为制表符
set smarttab             " 在行和段开始处使用制表符
set nowrap               " 禁止折行
set backspace=2          " 使用回车键正常处理indent,eol,start等
set sidescroll=10        " 设置向右滚动字符数
set nofoldenable         " 禁用折叠代码

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 代码补全
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set wildmenu             " vim自身命名行模式智能补全
set completeopt-=preview " 补全时不显示窗口,只显示补全列表

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 搜索设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set hlsearch            " 高亮显示搜索结果
set incsearch           " 开启实时搜索功能
set ignorecase          " 搜索时大小写不敏感

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 缓存设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set nobackup            " 设置不备份
set noswapfile          " 禁止生成临时文件
set autoread            " 文件在vim之外修改过,自动重新读入
set autowrite           " 设置自动保存
set confirm             " 在处理未保存或只读文件的时候,弹出确认

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 编码设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set langmenu=zh_CN.UTF-8
set helplang=cn
set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" gvim/macvim设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("gui_running")
    let system = system('uname -s')
    if system == "Darwin\n"
        set guifont=Droid\ Sans\ Mono\ Nerd\ Font\ Complete:h18 " 设置字体
    else
        set guifont=DroidSansMono\ Nerd\ Font\ Regular\ 18      " 设置字体
    endif
    set guioptions-=m           " 隐藏菜单栏
    set guioptions-=T           " 隐藏工具栏
    set guioptions-=L           " 隐藏左侧滚动条
    set guioptions-=r           " 隐藏右侧滚动条
    set guioptions-=b           " 隐藏底部滚动条
    set showtabline=0           " 隐藏Tab栏
    set guicursor=n-v-c:ver5    " 设置光标为竖线
endif

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 卸载默认插件UnPlug
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:deregister(repo)
  let repo = substitute(a:repo, '[\/]\+$', '', '')
  let name = fnamemodify(repo, ':t:s?\.git$??')
  call remove(g:plugs, name)
endfunction
command! -nargs=1 -bar UnPlug call s:deregister(<args>)

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 插件列表
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
call plug#begin('~/.vim/plugged')

Plug 'chxuan/cpp-mode'
Plug 'chxuan/vim-edit'
Plug 'chxuan/change-colorscheme'
Plug 'chxuan/prepare-code'
Plug 'chxuan/vim-buffer'
Plug 'chxuan/vimplus-startify'
Plug 'preservim/tagbar'
Plug 'Valloric/YouCompleteMe'
Plug 'Yggdroot/LeaderF'
Plug 'mileszs/ack.vim'
Plug 'easymotion/vim-easymotion'
Plug 'haya14busa/incsearch.vim'
Plug 'jiangmiao/auto-pairs'
Plug 'preservim/nerdtree'
Plug 'tiagofumo/vim-nerdtree-syntax-highlight'
Plug 'Xuyuanp/nerdtree-git-plugin'
Plug 'godlygeek/tabular'
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-surround'
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-repeat'
Plug 'tpope/vim-endwise'
Plug 'octol/vim-cpp-enhanced-highlight'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'ryanoasis/vim-devicons'
Plug 'junegunn/vim-slash'
Plug 'junegunn/gv.vim'
Plug 'kana/vim-textobj-user'
Plug 'kana/vim-textobj-indent'
Plug 'kana/vim-textobj-syntax'
Plug 'kana/vim-textobj-function'
Plug 'sgur/vim-textobj-parameter'
Plug 'Shougo/echodoc.vim'
Plug 'terryma/vim-smooth-scroll'
Plug 'rhysd/clever-f.vim'
Plug 'vim-scripts/indentpython.vim'

" 加载自定义插件
if filereadable(expand($HOME . '/.vimrc.custom.plugins'))
    source $HOME/.vimrc.custom.plugins
endif

call plug#end()  

" load vim default plugin
runtime macros/matchit.vim

" 编辑vimrc相关配置文件
nnoremap <leader>e :edit $MYVIMRC<cr>
nnoremap <leader>vc :edit ~/.vimrc.custom.config<cr>
nnoremap <leader>vp :edit ~/.vimrc.custom.plugins<cr>

" 查看vimplus的help文件
nnoremap <leader>h :view +let\ &l:modifiable=0 ~/.vimplus/help.md<cr>

" 打开当前光标所在单词的vim帮助文档
nnoremap <leader>H :execute ":help " . expand("<cword>")<cr>

" 重新加载vimrc文件
nnoremap <leader>s :source $MYVIMRC<cr>

" 安装、更新、删除插件
nnoremap <leader><leader>i :PlugInstall<cr>
nnoremap <leader><leader>u :PlugUpdate<cr>
nnoremap <leader><leader>c :PlugClean<cr>

" 分屏窗口移动
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l

" 复制当前选中到系统剪切板
vmap <leader><leader>y "+y

" 将系统剪切板内容粘贴到vim
nnoremap <leader><leader>p "+p

" 打开文件自动定位到最后编辑的位置
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | execute "normal! g'\"" | endif

" 主题设置
"set background=dark
"let g:onedark_termcolors=256
"colorscheme onedark

" airline
let g:airline_theme="onedark"
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1
if !exists('g:airline_symbols')
    let g:airline_symbols = {}
endif
let g:airline_left_sep = ''
let g:airline_left_alt_sep = ''
let g:airline_right_sep = ''
let g:airline_right_alt_sep = ''

" cpp-mode
nnoremap <leader>y :CopyCode<cr>
nnoremap <leader>p :PasteCode<cr>
nnoremap <leader>U :GoToFunImpl<cr>
nnoremap <silent> <leader>a :Switch<cr>
nnoremap <leader><leader>fp :FormatFunParam<cr>
nnoremap <leader><leader>if :FormatIf<cr>
nnoremap <leader><leader>t dd :GenTryCatch<cr>
xnoremap <leader><leader>t d :GenTryCatch<cr>

" change-colorscheme
nnoremap <silent> <F9> :PreviousColorScheme<cr>
inoremap <silent> <F9> <esc> :PreviousColorScheme<cr>
nnoremap <silent> <F10> :NextColorScheme<cr>
inoremap <silent> <F10> <esc> :NextColorScheme<cr>
nnoremap <silent> <F11> :RandomColorScheme<cr>
inoremap <silent> <F11> <esc> :RandomColorScheme<cr>
nnoremap <silent> <F12> :ShowColorScheme<cr>
inoremap <silent> <F12> <esc> :ShowColorScheme<cr>

" prepare-code
let g:prepare_code_plugin_path = expand($HOME . "/.vim/plugged/prepare-code")

" vim-buffer
nnoremap <silent> <c-p> :PreviousBuffer<cr>
nnoremap <silent> <c-n> :NextBuffer<cr>
nnoremap <silent> <leader>d :CloseBuffer<cr>
nnoremap <silent> <leader>D :BufOnly<cr>

" vim-edit
nnoremap Y :CopyText<cr>
nnoremap D :DeleteText<cr>
nnoremap C :ChangeText<cr>
nnoremap <leader>r :ReplaceTo<space>

" nerdtree
nnoremap <silent> <leader>n :NERDTreeToggle<cr>
let g:NERDTreeFileExtensionHighlightFullName = 1
let g:NERDTreeExactMatchHighlightFullName = 1
let g:NERDTreePatternMatchHighlightFullName = 1
let g:NERDTreeHighlightFolders = 1         
let g:NERDTreeHighlightFoldersFullName = 1 
let g:NERDTreeDirArrowExpandable='▷'
let g:NERDTreeDirArrowCollapsible='▼'

" YCM
" 如果不指定python解释器路径,ycm会自己搜索一个合适的(与编译ycm时使用的python版本匹配)
" let g:ycm_server_python_interpreter = '/usr/bin/python2.7'
let g:ycm_confirm_extra_conf = 0 
let g:ycm_error_symbol = '✗'
let g:ycm_warning_symbol = '✹'
let g:ycm_seed_identifiers_with_syntax = 1 
let g:ycm_complete_in_comments = 1 
let g:ycm_complete_in_strings = 1 
let g:ycm_collect_identifiers_from_tags_files = 1
let g:ycm_semantic_triggers =  {
            \   'c' : ['->', '.','re![_a-zA-z0-9]'],
            \   'objc' : ['->', '.', 're!\[[_a-zA-Z]+\w*\s', 're!^\s*[^\W\d]\w*\s',
            \             're!\[.*\]\s'],
            \   'ocaml' : ['.', '#'],
            \   'cpp,objcpp' : ['->', '.', '::','re![_a-zA-Z0-9]'],
            \   'perl' : ['->'],
            \   'php' : ['->', '::'],
            \   'cs,java,javascript,typescript,d,python,perl6,scala,vb,elixir,go' : ['.'],
            \   'ruby' : ['.', '::'],
            \   'lua' : ['.', ':'],
            \   'erlang' : [':'],
            \ }
nnoremap <leader>u :YcmCompleter GoToDeclaration<cr>
" 已经使用cpp-mode插件提供的转到函数实现的功能
" nnoremap <leader>i :YcmCompleter GoToDefinition<cr> 
nnoremap <leader>o :YcmCompleter GoToInclude<cr>
nnoremap <leader>ff :YcmCompleter FixIt<cr>
nmap <F5> :YcmDiags<cr>

" tagbar
let g:tagbar_width = 30
nnoremap <silent> <leader>t :TagbarToggle<cr>

" incsearch.vim
map /  <Plug>(incsearch-forward)
map ?  <Plug>(incsearch-backward)
map g/ <Plug>(incsearch-stay)

" vim-easymotion
let g:EasyMotion_smartcase = 1
map <leader>w <Plug>(easymotion-bd-w)
nmap <leader>w <Plug>(easymotion-overwin-w)

" nerdtree-git-plugin
let g:NERDTreeGitStatusIndicatorMapCustom = {
            \ "Modified"  : "✹",
            \ "Staged"    : "✚",
            \ "Untracked" : "✭",
            \ "Renamed"   : "➜",
            \ "Unmerged"  : "═",
            \ "Deleted"   : "✖",
            \ "Dirty"     : "✗",
            \ "Clean"     : "✔︎",
            \ 'Ignored'   : '☒',
            \ "Unknown"   : "?"
            \ }

" LeaderF
nnoremap <leader>f :LeaderfFile .<cr>
let g:Lf_WildIgnore = {
            \ 'dir': ['.svn','.git','.hg','.vscode','.wine','.deepinwine','.oh-my-zsh'],
            \ 'file': ['*.sw?','~$*','*.bak','*.exe','*.o','*.so','*.py[co]']
            \}
let g:Lf_UseCache = 0

" ack
nnoremap <leader>F :Ack!<space>

" echodoc.vim
let g:echodoc_enable_at_startup = 1

" tabular
nnoremap <leader>l :Tab /\|<cr>
nnoremap <leader>= :Tab /=<cr>

" vim-smooth-scroll
noremap <silent> <c-u> :call smooth_scroll#up(&scroll, 0, 2)<CR>
noremap <silent> <c-d> :call smooth_scroll#down(&scroll, 0, 2)<CR>
noremap <silent> <c-b> :call smooth_scroll#up(&scroll*2, 0, 4)<CR>
noremap <silent> <c-f> :call smooth_scroll#down(&scroll*2, 0, 4)<CR>

" gv
nnoremap <leader>g :GV<cr>
nnoremap <leader>G :GV!<cr>
nnoremap <leader>gg :GV?<cr>

" 加载自定义配置
if filereadable(expand($HOME . '/.vimrc.custom.config'))
    source $HOME/.vimrc.custom.config
endif

还有一键化配置:可以自动化补全。

git clone https://github.com/chxuan/vimplus.git ~/.vimplus

cd ~/.vimplus

./install.sh #不加sudo

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值