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,我们通过该网站,可以得到较为全面的插件:
(就是在卸载的时候有点卸不干净)
补充:这个挺全的
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