From 06d2d621fc31e303114bb25baee3c5c0b0ac287c Mon Sep 17 00:00:00 2001 From: chxuan <787280310@qq.com> Date: Sun, 10 Apr 2016 10:43:26 +0800 Subject: [PATCH] Update vimplus --- .vimrc | 377 +++++++++++++++++++++++++++++++++++++++++++++ .ycm_extra_conf.py | 195 +++++++++++++++++++++++ 2 files changed, 572 insertions(+) create mode 100644 .vimrc create mode 100644 .ycm_extra_conf.py diff --git a/.vimrc b/.vimrc new file mode 100644 index 00000000..a3eb5d8a --- /dev/null +++ b/.vimrc @@ -0,0 +1,377 @@ +set sw=4 +set ts=4 +set et +set smarttab +set smartindent +set lbr +set fo+=mB +set sm +set selection=inclusive +set wildmenu +set mousemodel=popup + +"syntastic相关 +let g:syntastic_python_checkers=['pylint'] +let g:syntastic_php_checkers=['php', 'phpcs', 'phpmd'] +"golang +"Processing... % (ctrl+c to stop) +let g:fencview_autodetect=0 +set rtp+=$GOROOT/misc/vim + +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" 显示相关 +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +syntax on +set cul "高亮光标所在行 +set cuc +set shortmess=atI " 启动的时候不显示那个援助乌干达儿童的提示 +set go= " 不要图形按钮 +"color desert " 设置背景主题 +color ron " 设置背景主题 +"color torte " 设置背景主题 +"set guifont=Courier_New:h10:cANSI " 设置字体 +"autocmd InsertLeave * se nocul " 用浅色高亮当前行 +autocmd InsertEnter * se cul " 用浅色高亮当前行 +set ruler " 显示标尺 +set showcmd " 输入的命令显示出来,看的清楚些 +"set whichwrap+=<,>,h,l " 允许backspace和光标键跨越行边界(不建议) +set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离 +set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "状态行显示的内容 +set laststatus=2 " 启动显示状态行(1),总是显示状态行(2) +"set foldenable " 允许折叠 +""set foldmethod=manual " 手动折叠 +set nocompatible "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 +" 显示中文帮助 +if version >= 603 + set helplang=cn + set encoding=utf-8 +endif +" 自动缩进 +set autoindent +set cindent +" Tab键的宽度 +set tabstop=4 +" 统一缩进为4 +set softtabstop=4 +set shiftwidth=4 +" 使用空格代替制表符 +set expandtab +" 在行和段开始处使用制表符 +set smarttab +" 显示行号 +set number +" 历史记录数 +set history=1000 +"搜索逐字符高亮 +set hlsearch +set incsearch +"语言设置 +set langmenu=zh_CN.UTF-8 +set helplang=cn +" 总是显示状态行 +set cmdheight=2 +" 侦测文件类型 +filetype on +" 载入文件类型插件 +filetype plugin on +" 为特定文件类型载入相关缩进文件 +filetype indent on +" 保存全局变量 +set viminfo+=! +" 带有如下符号的单词不要被换行分割 +set iskeyword+=_,$,@,%,#,- +" 字符间插入的像素行数目 + +"markdown配置 +au BufRead,BufNewFile *.{md,mdown,mkd,mkdn,markdown,mdwn} set filetype=mkd +au BufRead,BufNewFile *.{go} set filetype=go +au BufRead,BufNewFile *.{js} set filetype=javascript +"rkdown to HTML +nmap md :!~/.vim/markdown.pl % > %.html +nmap fi :!firefox %.html & +nmap \ \cc +vmap \ \cc + +"将tab替换为空格 +nmap tt :%s/\t/ /g + + + +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +"""""新文件标题 +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +"新建.c,.h,.sh,.java文件,自动插入文件头 +autocmd BufNewFile *.cpp,*.[ch],*.sh,*.rb,*.java,*.py exec ":call SetTitle()" +""定义函数SetTitle,自动插入文件头 +func SetTitle() + "如果文件类型为.sh文件 + if &filetype == 'sh' + call setline(1,"\#!/bin/bash") + call append(line("."), "") + elseif &filetype == 'python' + call setline(1,"#!/usr/bin/env python") + call append(line("."),"# coding=utf-8") + call append(line(".")+1, "") + + elseif &filetype == 'ruby' + call setline(1,"#!/usr/bin/env ruby") + call append(line("."),"# encoding: utf-8") + call append(line(".")+1, "") + +" elseif &filetype == 'mkd' +" call setline(1," ") + else + call setline(1, "/*************************************************************************") + call append(line("."), " > File Name: ".expand("%")) + call append(line(".")+1, " > Author: ") + call append(line(".")+2, " > Mail: ") + call append(line(".")+3, " > Created Time: ".strftime("%c")) + call append(line(".")+4, " ************************************************************************/") + call append(line(".")+5, "") + endif + if expand("%:e") == 'cpp' + call append(line(".")+6, "#include") + call append(line(".")+7, "using namespace std;") + call append(line(".")+8, "") + endif + if &filetype == 'c' + call append(line(".")+6, "#include") + call append(line(".")+7, "") + endif + if expand("%:e") == 'h' + call append(line(".")+6, "#ifndef _".toupper(expand("%:r"))."_H") + call append(line(".")+7, "#define _".toupper(expand("%:r"))."_H") + call append(line(".")+8, "#endif") + endif + if &filetype == 'java' + call append(line(".")+6,"public class ".expand("%:r")) + call append(line(".")+7,"") + endif + "新建文件后,自动定位到文件末尾 +endfunc +autocmd BufNewFile * normal G + + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +"键盘命令 +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +:nmap :Tlist +" shift tab pages +map :tabp +map :tabn +map! zzi +map! , +map ggVG$"+y +map gg=G +map w +imap , +imap +imap +" 选中状态下 Ctrl+c 复制 +"map "*pa +imap "*pa +imap ^ +imap $ +vmap "+y +set mouse=v +"比较文件 +nnoremap :vert diffsplit + + +"代码格式优化化 + +map :call FormartSrc() + +"定义FormartSrc() +func FormartSrc() + exec "w" + if &filetype == 'c' + exec "!astyle --style=ansi -a --suffix=none %" + elseif &filetype == 'cpp' || &filetype == 'hpp' + exec "r !astyle --style=ansi --one-line=keep-statements -a --suffix=none %> /dev/null 2>&1" + elseif &filetype == 'perl' + exec "!astyle --style=gnu --suffix=none %" + elseif &filetype == 'py'||&filetype == 'python' + exec "r !autopep8 -i --aggressive %" + elseif &filetype == 'java' + exec "!astyle --style=java --suffix=none %" + elseif &filetype == 'jsp' + exec "!astyle --style=gnu --suffix=none %" + elseif &filetype == 'xml' + exec "!astyle --style=gnu --suffix=none %" + else + exec "normal gg=G" + return + endif + exec "e! %" +endfunc +"结束定义FormartSrc + + +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +""实用设置 +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +if has("autocmd") + autocmd BufReadPost * + \ if line("'\"") > 0 && line("'\"") <= line("$") | + \ exe "normal g`\"" | + \ endif +endif +"当打开vim且没有文件时自动打开NERDTree +autocmd vimenter * if !argc() | NERDTree | endif +" 只剩 NERDTree时自动关闭 +autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif + +" 设置当文件被改动时自动载入 +set autoread +" quickfix模式 +autocmd FileType c,cpp map :w:make +"代码补全 +set completeopt=preview,menu +"允许插件 +"filetype plugin on +"共享剪贴板 +"set clipboard+=unnamed +"自动保存 +set autowrite +"set ruler " 打开状态栏标尺 +"set cursorline " 突出显示当前行 +set magic " 设置魔术 +set guioptions-=T " 隐藏工具栏 +set guioptions-=m " 隐藏菜单栏 +""set foldcolumn=0 +""set foldmethod=indent +""set foldlevel=3 +" 不要使用vi的键盘模式,而是vim自己的 +set nocompatible +" 去掉输入错误的提示声音 +set noeb +" 在处理未保存或只读文件的时候,弹出确认 +set confirm +"禁止生成临时文件 +set nobackup +set noswapfile +"搜索忽略大小写 +set ignorecase + + + + +set linespace=0 +" 增强模式中的命令行自动完成操作 +set wildmenu +" 使回格键(backspace)正常处理indent, eol, start等 +set backspace=2 +" 允许backspace和光标键跨越行边界 +set whichwrap+=<,>,h,l +" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位) +set mouse=a +set selection=exclusive +set selectmode=mouse,key +" 通过使用: commands命令,告诉我们文件的哪一行被改变过 +set report=0 +" 在被分割的窗口间显示空白,便于阅读 +set fillchars=vert:\ ,stl:\ ,stlnc:\ +" 高亮显示匹配的括号 +set showmatch +" 匹配括号高亮的时间(单位是十分之一秒) +set matchtime=1 +" 光标移动到buffer的顶部和底部时保持3行距离 +set scrolloff=3 +filetype plugin indent on +"打开文件类型检测, 加了这句才可以用智能补全 +set completeopt=longest,menu + +set iskeyword+=. +set termencoding=utf-8 +set encoding=utf8 +set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030 + +autocmd FileType python set omnifunc=pythoncomplete#Complete + +" +"ctrlp设置 +" +set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.png,*.jpg,*.gif " MacOSX/Linux +set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe,*.pyc,*.png,*.jpg,*.gif " Windows + +let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$' +let g:ctrlp_custom_ignore = '\v\.(exe|so|dll)$' +let g:ctrlp_extensions = ['funky'] + +let NERDTreeIgnore=['\.pyc'] + +set nocompatible " be iMproved, required +filetype off " required + +" set the runtime path to include Vundle and initialize +set rtp+=~/.vim/bundle/Vundle.vim +call vundle#begin() +" alternatively, pass a path where Vundle should install plugins +"call vundle#begin('~/some/path/here') + +" let Vundle manage Vundle, required +Plugin 'VundleVim/Vundle.vim' +Plugin 'L9' +Plugin 'jiangmiao/auto-pairs' +Plugin 'scrooloose/nerdcommenter' +Plugin 'scrooloose/nerdtree' +Bundle 'tpope/vim-fugitive' +Bundle 'rstacruz/sparkup', {'rtp': 'vim/'} +Bundle 'Yggdroot/indentLine' +Bundle 'FuzzyFinder' +Bundle 'https://github.com/wincent/command-t.git' +Bundle 'vim-scripts/a.vim' +Bundle 'vim-scripts/DoxygenToolkit.vim' +Bundle 'vim-scripts/SQLComplete.vim' +Bundle 'vim-scripts/txt.vim' +Bundle 'Valloric/YouCompleteMe' + +" All of your Plugins must be added before the following line +call vundle#end() " required +filetype plugin indent on " required +" To ignore plugin indent changes, instead use: +"filetype plugin on +" +" Brief help +" :PluginList - lists configured plugins +" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate +" :PluginSearch foo - searches for foo; append `!` to refresh local cache +" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal +" +" see :h vundle for more details or wiki for FAQ +" Put your non-Plugin stuff after this line + + +"列出当前目录文件 +map :NERDTreeToggle +imap :NERDTreeToggle + +"C/C++语言显示if、while等语句块花括号竖线 +let g:indentLine_char = '┊' + +"Doxygen配置 +let g:DoxygenToolkit_authorName="highway-9, 787280310@qq.com" +let s:licenseTag = "Copyright(C)\" +let s:licenseTag = s:licenseTag . "For free\" +let s:licenseTag = s:licenseTag . "All right reserved\" +let g:DoxygenToolkit_licenseTag = s:licenseTag +let g:DoxygenToolkit_briefTag_funcName="yes" +let g:doxygen_enhanced_color=1 +let g:DoxygenToolkit_commentType="Qt" + +"YCM配置 +let g:ycm_confirm_extra_conf = 0 "打开vim时不再询问是否加载ycm_extra_conf.py配置 +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_cache_omnifunc = 0 "每次重新生成匹配项,禁止缓存匹配 +let mapleader = "j" +nnoremap i :YcmCompleter GoToInclude +nnoremap j :YcmCompleter GoToDeclaration +nnoremap k :YcmCompleter GoToDefinition +"nnoremap :YcmCompleter GoToDefinitionElseDeclaration +"nnoremap p :YcmCompleter GoToImplementationElseDeclaration +nmap :YcmDiags diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py new file mode 100644 index 00000000..93eb593c --- /dev/null +++ b/.ycm_extra_conf.py @@ -0,0 +1,195 @@ +# This file is NOT licensed under the GPLv3, which is the license for the rest +# of YouCompleteMe. +# +# Here's the license text for this file: +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or +# distribute this software, either in source code form or as a compiled +# binary, for any purpose, commercial or non-commercial, and by any +# means. +# +# In jurisdictions that recognize copyright laws, the author or authors +# of this software dedicate any and all copyright interest in the +# software to the public domain. We make this dedication for the benefit +# of the public at large and to the detriment of our heirs and +# successors. We intend this dedication to be an overt act of +# relinquishment in perpetuity of all present and future rights to this +# software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +# For more information, please refer to + +import os +import ycm_core + +# These are the compilation flags that will be used in case there's no +# compilation database set (by default, one is not set). +# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR. +flags = [ +'-Wall', +'-Wextra', +'-Werror', +# '-Wc++98-compat', +'-Wno-long-long', +'-Wno-variadic-macros', +'-fexceptions', +'-DNDEBUG', +# You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM +# source code needs it. +'-DUSE_CLANG_COMPLETER', +# THIS IS IMPORTANT! Without a "-std=" flag, clang won't know which +# language to use when compiling headers. So it will guess. Badly. So C++ +# headers will be compiled as C headers. You don't want that so ALWAYS specify +# a "-std=". +# For a C project, you would set this to something like 'c99' instead of +# 'c++11'. +'-std=c++11', +# ...and the same thing goes for the magic -x option which specifies the +# language that the files to be compiled are written in. This is mostly +# relevant for c++ headers. +# For a C project, you would set this to 'c' instead of 'c++'. +'-x', +'c++', + +# c/c++ include path +'-isystem', +'/usr/include', +'-isystem', +'/usr/include/c++/4.8.2', +'-isystem', +'/usr/local/include', + +#'-isystem', +# This path will only work on OS X, but extra paths that don't exist are not +# harmful +#'/System/Library/Frameworks/Python.framework/Headers', +#'-isystem', +#'../llvm/include', +#'-isystem', +#'../llvm/tools/clang/include', +#'-I', +#'.', +#'-I', +#'./ClangCompleter', +#'-isystem', +#'./tests/gmock/gtest', +#'-isystem', +#'./tests/gmock/gtest/include', +#'-isystem', +#'./tests/gmock', +#'-isystem', +#'./tests/gmock/include', +] + + +# Set this to the absolute path to the folder (NOT the file!) containing the +# compile_commands.json file to use that instead of 'flags'. See here for +# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html +# +# You can get CMake to generate this file for you by adding: +# set( CMAKE_EXPORT_COMPILE_COMMANDS 1 ) +# to your CMakeLists.txt file. +# +# Most projects will NOT need to set this to anything; you can just change the +# 'flags' list of compilation flags. Notice that YCM itself uses that approach. +compilation_database_folder = '' + +if os.path.exists( compilation_database_folder ): + database = ycm_core.CompilationDatabase( compilation_database_folder ) +else: + database = None + +SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ] + +def DirectoryOfThisScript(): + return os.path.dirname( os.path.abspath( __file__ ) ) + + +def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): + if not working_directory: + return list( flags ) + new_flags = [] + make_next_absolute = False + path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ] + for flag in flags: + new_flag = flag + + if make_next_absolute: + make_next_absolute = False + if not flag.startswith( '/' ): + new_flag = os.path.join( working_directory, flag ) + + for path_flag in path_flags: + if flag == path_flag: + make_next_absolute = True + break + + if flag.startswith( path_flag ): + path = flag[ len( path_flag ): ] + new_flag = path_flag + os.path.join( working_directory, path ) + break + + if new_flag: + new_flags.append( new_flag ) + return new_flags + + +def IsHeaderFile( filename ): + extension = os.path.splitext( filename )[ 1 ] + return extension in [ '.h', '.hxx', '.hpp', '.hh' ] + + +def GetCompilationInfoForFile( filename ): + # The compilation_commands.json file generated by CMake does not have entries + # for header files. So we do our best by asking the db for flags for a + # corresponding source file, if any. If one exists, the flags for that file + # should be good enough. + if IsHeaderFile( filename ): + basename = os.path.splitext( filename )[ 0 ] + for extension in SOURCE_EXTENSIONS: + replacement_file = basename + extension + if os.path.exists( replacement_file ): + compilation_info = database.GetCompilationInfoForFile( + replacement_file ) + if compilation_info.compiler_flags_: + return compilation_info + return None + return database.GetCompilationInfoForFile( filename ) + + +def FlagsForFile( filename, **kwargs ): + if database: + # Bear in mind that compilation_info.compiler_flags_ does NOT return a + # python list, but a "list-like" StringVec object + compilation_info = GetCompilationInfoForFile( filename ) + if not compilation_info: + return None + + final_flags = MakeRelativePathsInFlagsAbsolute( + compilation_info.compiler_flags_, + compilation_info.compiler_working_dir_ ) + + # NOTE: This is just for YouCompleteMe; it's highly likely that your project + # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR + # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT. + try: + final_flags.remove( '-stdlib=libc++' ) + except ValueError: + pass + else: + relative_to = DirectoryOfThisScript() + final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) + + return { + 'flags': final_flags, + 'do_cache': True + }