vim-配置教程+源码
概念
前言
- 放弃鼠标,提高效率,这只是 vim 的标配目标
- 定制自己的编辑器,提高效率 + 花里胡哨的入门时本文目标
- IDE相对于编辑器
- 最大的优势在于其集成了编译、调试、智能补全、语法高亮、工程管理等软件开发工具和环境
- 而这些Vim都可以通过其强大丰富的插件扩展来完成
- 不建议直接拷贝本文源码,除非真的忍不住
参考链接
vim 优点
- 模式编辑器
- 高度可扩展
- 高度可定制
vim 配置
- 这里提一下 neovim 有兴趣的可以了解下。
- 原理:最终还是根据 .vimrc 来配置 vim
vim 配置方法一
- 参考Github:vimrc
- 简略步骤:(linux)
- 在 home 目录创建 .vim_runtime 文件夹
- 运行命令
git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
- 运行命令
sh ~/.vim_runtime/install_awesome_vimrc.sh
- 在 .vimrc 文件和 .vim_runtime 目录配置 vim。
- 简略步骤:(linux)
vim 配置方法二
- 直接配置 .vimrc
自动添加文件头
- 一下为识别 .sh 文件并添加相应文件头信息的源码
- 其它文件,.c .h .md 等等都可以参考以下源码
"==============================================================================
" filetype 文件识别,添加文件头
"==============================================================================
filetype on
autocmd BufNewFile *.sh exec ":call SetSHTitle()"
""定义函数SetTitle,自动插入文件头
func SetSHTitle()
call setline(1, "/** @file ".expand("%"))
call append(line(".")+0, " * @brief 简要说明")
call append(line(".")+1, " * @details 详细说明")
call append(line(".")+2, " * @author lzm")
call append(line(".")+3, " * @date ".strftime("%Y-%m-%d %H:%M:%S")) "创建时间
call append(line(".")+6, " *")
call append(line(".")+7," */")
call append(line(".")+8,"")
call append(line(".")+9,"#!/bin/sh")
call append(line(".")+10, "")
endfunc
- 效果图
一般设置
- 按喜好设置+屏蔽
"==============================================================================
" set 一般设置
"==============================================================================
set nocompatible "不兼容vi
syntax enable "语法高亮使能
syntax on "语法高亮开启
set hlsearch "开启高亮搜索
set incsearch "输出字符串的同时进行搜索
set ignorecase "搜索时忽略大小写
set ruler "右下角的状态栏下显示光标的坐标
set showcmd "显示normal模式下的命令
set number "显示行号
set relativenumber "相对行号
set cmdheight=1 "命令行高度为1行"
set noshowmode "不显示'-- insert --' 等
set autoindent "自动缩进
set smartindent "智能缩进
set cindent "c语言缩进
set pastetoggle=<F4> "系统paste
set mouse=i "仅在insert mode 下可使用mouse
set autoread "当文件在外部被改变时, vim自动载入
set showmatch "显示匹配的括号
set matchtime=0 "显示匹配的括号的时间,单位:十分之一秒
set t_Co=256 "vim配色为256色
set cursorline "高亮当前光标行
set cursorcolumn "高亮当前光标列
autocmd InsertEnter * se cul
set shortmess=atI
set scrolloff=3 "光标移动到buffer的顶部和底部时保持3行距离
set laststatus=2 "指定什么时候对最后一个窗口显示状态条, 2表示永远有
set cinoptions=g0,:0,N-s,(0 "设置C/C++语言的具体缩进方式, unkown
set tabstop=4 "读取到文件的\t时,解释的空白长度
set softtabstop=4 "在编辑动作(按tab或backspace键)时,所输入或删除的空白长度
set shiftwidth=4 "自动缩进时的空白长度
set expandtab "将tab转换成space,文件中存储的将会是space
set smarttab
" set list "显示tab键为^I, 行为显示$
set listchars=tab:>-,trail:- "tab显示为">---" 行尾多余的空白字符显示为"-"
set history=1000 "命令历史个数
set langmenu=en_US.UTF-8 "菜单语系
set helplang=en "使用中文文档cn,英文则为en
set autowrite "自动保存, 否则切换buffer,文件后会会提示没有保存
set magic "匹配正则表达式时(\m):除了$.*^之外其他正则表达式的元字符都要加反斜杠\
set confirm "总是出现确认选项,如执行:qa等命令时
set nobackup "vim当覆盖一个文件时不保留一个备份
set noswapfile "不使用交换空间
set wildmenu "补全相关,unkown
set completeopt=longest,menu "显示补全列表
set backspace=indent,eol,start "indent将4个空格缩进当缩进删除,eol删除到上一行
set report=0 "当使用:commands命令时,总是报告文件的那一行被改变过
set fillchars=vert:\ ,stl:\ ,stlnc:\ "设置多窗口时的窗口间分割线
" set iskeyword+=. "追加.为判断一个word
set termencoding=utf-8 "终端使用的字符编码
set encoding=utf8 "vim内部buffer使用的字符编码
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030 "依次判断文件字符编码
" set foldmethod=indent "基于缩进的折叠
set foldmethod=syntax "基于语法的折叠
set nofoldenable "启动 vim 时关闭折叠代码
" set nowrap "禁止折行
set viminfo+=n~/.cache/vim/.viminfo
let $BASH_ENV="~/.bash_aliases" "增加外部命令的alias
let mapleader = "," "修改<leader>键为','
vnoremap <leader>y "+y
filetype plugin on "根据文件类型读取插件
filetype indent on "使用缩进文件
" 标签跳转快捷键,在gnome-terminal中无效
" normal no recursive map
" insert no recursive map
nnoremap <C-c> :tabclose<cr>
nnoremap <C-x> :tabonly<cr>
nnoremap <C-k> :tabs<cr>
nnoremap <C-n> :tabnew<cr>
nnoremap <C-h> :tabprevious<cr>
nnoremap <C-l> :tabnext<cr>
" 光标闪烁,在插入模式下为‘|’,在norrmal 模式下为方块
" 若要不闪烁,则将改为后面的数字
let &t_SI = "\<Esc>[5 q" " 6
let &t_SR = "\<Esc>[3 q" " 4
let &t_EI = "\<Esc>[1 q" " 2
插件 **
在 linux 平台下操作
注意 :采用插件时,需要对所使用的插件要有所了解,防止一般设置与插件设置冲突
- 如
imap <C-h> <LEFT>
和Plugin 'jiangmiao/auto-pairs'
imap <C-h> <LEFT>
- 是在编辑模式时,ctrl+h 为左方向键
Plugin 'jiangmiao/auto-pairs'
- 在编辑模式时,会把 ctrl+h 映射为删除键,使得最终效果会为删除
- 解决方法,注释掉就可以了
- 如
采用 Vundle 管理插件
- 安装 Vundle
- 运行命令
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
即可
- 运行命令
- 插件类型及运用
- Github上的插件
- 使用格式:
Plugin 'vim-scripts/插件仓库名'
- 例子:
Plugin 'tpope/vim-fugitive'
- 使用格式:
- Github上 vim-scripts 仓库的插件
- 使用格式:
Plugin '插件名称'
- 实际上是
Plugin 'vim-scripts/插件仓库名'
只是此处的用户名可以省略
- 实际上是
- 例子:
Plugin 'L9'
- 使用格式:
- 由Git支持但不再github上的插件仓库
- 使用格式:
Plugin 'git clone 后面的地址''
- 例子:`Plugin 'git://git.wincent.com/command-t.git'
- 使用格式:
- 本地的Git仓库(例如自己的插件)
- 使用格式:
Plugin 'file:///+本地插件仓库绝对路径''
- 例子:
Plugin 'file:///home/gmarik/path/to/plugin'
- 使用格式:
- 插件在仓库的子目录中.
- 使用格式:正确指定路径用以设置runtimepath.
- 例子:插件在sparkup/vim目录下 :
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
- 如果已经安装过这个插件,可利用以下格式避免命名冲突
- 例子:L9:
Plugin 'ascenator/L9', {'name': 'newL9'}
- 例子:L9:
- Github上的插件
- 安装 Vundle
插件管理源码
"==============================================================================
" Vundle start 插件管理
"==============================================================================
"filetype off " 必须的
" 设置包括vundle和初始化相关的runtime path
" 例子+格式开始==================================================
" 插件的命令放在vundle#begin和vundle#end之间.
" 1.Github上的插件
" 格式为 Plugin '用户名/插件仓库名'
"Plugin 'tpope/vim-fugitive'
" 2.来自 http://vim-scripts.org/vim/scripts.html 的插件
" Plugin '插件名称' 实际上是 Plugin 'vim-scripts/插件仓库名' 只是此处的用户名可以省略
"Plugin 'L9'
" 3.由Git支持但不再github上的插件仓库 Plugin 'git clone 后面的地址'
"Plugin 'git://git.wincent.com/command-t.git'
" 4.本地的Git仓库(例如自己的插件) Plugin 'file:///+本地插件仓库绝对路径'
"Plugin 'file:///home/gmarik/path/to/plugin'
" 5.插件在仓库的子目录中.
" 正确指定路径用以设置runtimepath. 以下范例插件在sparkup/vim目录下
"Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" 6.安装L9,如果已经安装过这个插件,可利用以下格式避免命名冲突
"Plugin 'ascenator/L9', {'name': 'newL9'}
" 例子+格式END ==================================================
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin() " 必须 插件开始==================================================
Plugin 'VundleVim/Vundle.vim' " 必须 让vundle管理插件版本
Plugin 'Yggdroot/indentLine' "缩进指示线
"Plugin 'suan/vim-instant-markdown' " markdown实时浏览
Plugin 'vim-airline/vim-airline' "美观界面,powerline
"Plugin 'fatih/vim-go'
" 由Git支持但不再github上的插件仓库 Plugin 'git clone 后面的地址'
Plugin 'L9'
Plugin 'terryma/vim-multiple-cursors' " 多光标输入
Plugin 'jiangmiao/auto-pairs' "自动补全括号对。输入`[`, 会自动输入']' "<c-h> 会被映射为 <DELETE>,如需用到,可以注释掉
"Plugin 'tpope/vim-commentary' "注释插件:gcc
Plugin 'scrooloose/nerdtree' "目录树
Plugin 'Valloric/YouCompleteMe'
"Plugin 'rdnetto/YCM-Generator' "YouCompleteMe 配置生成器
"Plugin 'vim-scripts/SQLComplete.vim'
"Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} "html 快捷键
Plugin 'Valloric/MatchTagAlways' "html, xml显示匹配标签:<leader>%
Plugin 'docunext/closetag.vim' "html, xml闭合标签,<C-_> 不起作用
Plugin 'godlygeek/tabular' "文本对齐::Tab /= 、 :Tab /|
"Plugin 'tpope/vim-fugitive' "在vim中可以执行简单git命令
Plugin 'tpope/vim-surround' "方便修改增加括号对
Plugin 'tpope/vim-repeat'
Plugin 'tpope/vim-endwise' "在c中补全#if中的#endif等
Plugin 'ctrlpvim/ctrlp.vim' "搜索文件<C-f>
Plugin 'majutsushi/tagbar' "显示ctags
Plugin 'octol/vim-cpp-enhanced-highlight' "C++增强高亮
"Plugin 'vim-airline/vim-airline-themes' "美观界面,powerline
"Plugin 'ryanoasis/vim-devicons' "美化界面
"Plugin 'gorodinskiy/vim-coloresque' "颜色,如 blue #00f
"Plugin 'will133/vim-dirdiff' "可以比较目录
Plugin 'haya14busa/incsearch.vim' "同时高亮匹配所有的字符
Plugin 'mhinz/vim-startify' "终端运行直接运行vim时显示的菜单界面
Plugin 'mileszs/ack.vim' "ag命令
Plugin 'davidhalter/jedi-vim' "python
"Plugin 'Shougo/echodoc.vim' "显示命令参数
filetype plugin indent on " 必须 加载vim自带和插件相应的语法和文件类型相关脚本
call vundle#end() " 必须 插件END ==================================================
"filetype plugin on " 忽视插件改变缩进
映射
- 热键映射
"==============================================================================
" nerdtree
"==============================================================================
map <F2> :NERDTreeToggle<CR>
imap <F2> <ESC> :NERDTreeToggle<CR>
"autocmd vimenter * if !argc() | NERDTree | endif
"autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif
"ctrl+h 为左方向键
imap <C-h> <LEFT>
"ctrl+l 为右方向键
imap <C-l> <RIGHT>
"ctrl+k 为上方向键
imap <C-k> <UP>
"ctrl+j为下方向键
imap <C-j> <DOWN>
"ctrl+d为删除键
imap <C-d> <DELETE>
YouCompleteMe 插件
- YouCompleteMe 插件配置
"==============================================================================
" YouCompleteMe
"==============================================================================
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py' "全局配置文件
let g:ycm_confirm_extra_conf = 0 "加载配置文件时不需要手动确认
let g:ycm_error_symbol = '✗' "error 符号
let g:ycm_warning_symbol = '' "warning符号
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_key_invoke_completion = '<C-n>' "更改手动触发补全按键,默认<C-space>
let g:ycm_collect_identifiers_from_tags_files = 1 "开启基于tag的补全
let g:ycm_key_list_select_completion = ['<Down>'] "取消'<Tab>'
" let g:ycm_auto_trigger = 0 "不会自动补全, 需要按下<C-n>
" let g:ycm_semantic_triggers = {}
" let g:ycm_semantic_triggers.c = ['->', '.', ' ', '(', '[', '&',']']
nnoremap <leader>u :YcmCompleter GoToDeclaration<CR> "跳到声明处
nnoremap <leader>o :YcmCompleter GoToDefinition<CR> "跳到定义处
nnoremap <leader>i :YcmCompleter GoToInclude<CR> "跳到头文件
"nmap <F5> :YcmDiags<CR> "自定义快捷键<F5>显示警告和错误的信息
"let g:ycm_add_preview_to_completeopt = 1 "关闭打开一个窗口显示预览
"let g:ycm_autoclose_preview_window_after_completion = 0 "即自动关闭预览窗口
"let g:ycm_autoclose_preview_window_after_insertion = 1 "自动关闭预览窗口在回到normal模式后
"let g:ycm_cache_omnifunc = 0 "每次重新生成匹配项,禁止缓存匹配项
" tagbar
let g:tagbar_ctags_bin = '/usr/bin/ctags'
let g:tagbar_width = 30
map <F3> :TagbarToggle<CR>
imap <F3> <ESC> :TagbarToggle<CR>
" cpp_class_scope_highlight
let g:cpp_class_scope_highlight = 1
let g:cpp_experimental_template_highlight = 1
let c_no_curly_error = 1
" colorscheme
"colorscheme default
" colorscheme monokai
"let g:solarized_termcolors=256
"set background=light "设置深色的背景色, 该命令需要在systax enable后调用
"colorscheme solarized "设置色彩方案为solarized
其它配置
- 其它配置
"==============================================================================
" Other
"==============================================================================
let g:airline#extensions#tabline#enabled = 1
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
vim-配置教程+源码的更多相关文章
- MyEclipse如何配置Struts2源码的框架压缩包
1.MyEclipse如何配置Struts2源码的框架压缩包 如本机的Struts2框架压缩包路径为:D:\MyEclipseUserLibraries\struts\struts-2.3.15.3- ...
- 【陪你系列】5 千字长文+ 30 张图解 | 陪你手撕 STL 空间配置器源码
大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub https://github.com/rongweihe/MoreT ...
- Ubuntu14 搭载vim环境查看源码
首先是下载完整的vim74,然后编译安装.遗憾的是当编译时,没有开启图形界面. 在安装新版本的Vim之前,你需要卸载原来安装的老版本Vim,依次在终端下执行下列命令: sudo apt-get rem ...
- Vim+Taglist+Ctags(源码阅读).
终于搞定了,之前弄那么两天配置,都不成功. 需要软件: ctags taglist 1,ctags. 1)说明: 这个我就不演示了,我的RedHat5.5本身就有ctags. 2)验证ctags是否已 ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- CYQ.Data.Orm.DBFast 新增类介绍(含类的源码及新版本配置工具源码)
前言: 以下功能在国庆期就完成并提前发布了,但到今天才有时间写文介绍,主要是国庆后还是选择就职了,悲催的是上班的地方全公司都能上网,唯独开发部竟不让上网,是个局域网. 也不是全不能上,房间里有三台能上 ...
- 配置iDempiere源码开发环境
你需要一个较为快速通畅的互联网连接来下载源代码! 安装软件: OS: Windows Server 2008 R2 SP1 x64 英文版 Database: Oracle 11G R2 x64 英文 ...
- Log4Net 日志配置[附带源码]
前述 园子里有许多人对log4net这款开源的日志记录控件有很多介绍.在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少查阅资料的时间.利用log4net可以方便地将日志信息记录 ...
- Openfire开发配置,Openfire源码配置,OpenFire二次开发配置
1.下载源码:http://www.igniterealtime.org/downloads/source.jsp 2.把源码解压出的openfire_src目录放至eclipse workplace ...
随机推荐
- 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源(二)
之前写过一篇 使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源,在那之后,又陆续想到并实施了几点利用 jsDelivr 进一步加速静态资源加载的措施,新起一篇作为记录和分享. ...
- 048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例--阶乘的累加和 本文知识点:通过案例练习嵌套循环应用 案例练习--阶乘的累加和 案例题目 ...
- C/C++的二分查找
假设有一种温度传感器,已经测得它的电压和温度的对应关系,将电压值以ADC转换后的数字量的值表示,形成温度-AD值的对照表,如下. 大致成一条反比关系的曲线. ADC的底层驱动已经写好,对外有一个接口可 ...
- 什么是ICD文件
ICD就是IED Capability Description的简称,中文为IED能力描述文件.其中 IED是Intelligent Electronic Device的简称,是智能电子设备 智能电子 ...
- K8S-kubeadm-集群证书续签
ETCD证书 自签证书颁发机构(CA) ca.crt ca.key etcd集群中相互通信事业的客户端证书 peer.crt peer.key pod中定义Liveness探针事业的客户端证书 hea ...
- git-代码分支管理
1. git代码分支管理 DEV SIT UAT PET PRE PRD PROD常见环境英文缩写含义 英文缩写 英文 中文 DEV development 开发 SIT System Int ...
- 第4天 | 12天搞定Python,基础语法(下)
为了方便你的学习,减轻负重,我特意将基础语法分成上下两部分.希望你喜欢这种方式,如果不喜欢,你可以跟我说,反正我是不会改的,哈哈~~. 如果上部分,你还没看的话,先去看<第4天 | 12天搞定P ...
- 【线段树分治】Dash Speed
代码的美妙 #include <bits/stdc++.h> %:pragma GCC optimize(3) using namespace std; const int maxn=7e ...
- 【贪心算法】HDU 5747 Aaronson
题目大意 vjudge链接 给你一个n,m,求解满足等式x0+2x1+4x2+...+2mxm=n的x0~xm的最小和(xi为非负整数) 数据范围 0≤n,m≤109 思路 n和m都在int范围内,所 ...
- git reset 与 git revert的区别?
一,git reset的功能: 该命令修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本, 说明: 修改后,push到远程仓库时需要使用"git push -f"提 ...