From c9f6228370e4302e577ae346cdcd54169fe78fb1 Mon Sep 17 00:00:00 2001 From: We-unite <3205135446@qq.com> Date: Fri, 20 Dec 2024 11:55:11 +0800 Subject: Original commit. vimrc the system vimrc, used to import other config files vimrcs real config files vimrcs/codecmd.vim: set sth about code, such as formatter, head of file, etc. vimrcs/keybind.vim keyboard shortcut vimrcs/match.vim bracket matching vimrcs/myset.vim color scheme and other showoff vimrcs/plugs.vim vim plugin and relative set vimrcs/statusline.vim style of status line --- vimrc | 14 +++++ vimrcs/codecmd.vim | 85 ++++++++++++++++++++++++++++ vimrcs/keybind.vim | 41 ++++++++++++++ vimrcs/match.vim | 15 +++++ vimrcs/myset.vim | 38 +++++++++++++ vimrcs/plugs.vim | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++ vimrcs/statusline.vim | 70 +++++++++++++++++++++++ 7 files changed, 416 insertions(+) create mode 100644 vimrc create mode 100644 vimrcs/codecmd.vim create mode 100644 vimrcs/keybind.vim create mode 100644 vimrcs/match.vim create mode 100644 vimrcs/myset.vim create mode 100644 vimrcs/plugs.vim create mode 100644 vimrcs/statusline.vim diff --git a/vimrc b/vimrc new file mode 100644 index 0000000..0ab3a91 --- /dev/null +++ b/vimrc @@ -0,0 +1,14 @@ +set nocompatible " 关闭兼容模式 + +let vimrcs = { + \ "plugs": "Vundle插件管理及插件内容", + \ "statusline": "状态栏与标签页设置", + \ "codecmd": "代码设置", + \ "keybind": "自己设的快捷键", + \ "match": "符号自动匹配", + \ "myset": "自行设置", + \ } + +for vimrc in keys(vimrcs) + execute "source /etc/vim/vimrcs/".vimrc.".vim" +endfor diff --git a/vimrcs/codecmd.vim b/vimrcs/codecmd.vim new file mode 100644 index 0000000..4fb5ab9 --- /dev/null +++ b/vimrcs/codecmd.vim @@ -0,0 +1,85 @@ +set expandtab " 设置tab键替换为tabstop规定的空格数 +set tabstop=4 " 编辑时tab键占用的空格数 +set shiftwidth=4 " 设置tab的间隔(格式化时) +set softtabstop=4 " 设置退格键退格的空格数,让vim把连续的空格当作一个tab +autocmd FileType asm,nasm,vim,sh,makefile set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab + +set showmatch " 在输入括号时光标会短暂地跳到与之相匹配的括号处 +set nowrap " 设置自动折行 + +set textwidth=500 " 设置自动换行的长度 +set lbr " 设置自动换行 +set foldmethod=syntax " 设置按语法折叠代码 +set nofoldenable " 在打开文件时不要折叠 + +" 自动补全配置 +autocmd FileType python set omnifunc=pythoncomplete#Complete +autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS +autocmd FileType html set omnifunc=htmlcomplete#CompleteTags +autocmd FileType css set omnifunc=csscomplete#CompleteCSS +autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags +autocmd FileType php set omnifunc=phpcomplete#CompletePHP +autocmd FileType c set omnifunc=ccomplete#Complete + +" 要求格式化之后的代码不要移动光标,并且不要删除换行符和空行,保留原来的视图 +autocmd BufReadPost,BufWritePre *.html,*.vim,*.sh,*.py normal! g1G=G`"z +" 在保存时自动使用clang-format格式化代码 +augroup FormatAutocmd + autocmd! + autocmd BufWritePre *.c,*.cpp,*.h :let save_cursor = getpos(".") + autocmd BufWritePre *.c,*.cpp,*.h :normal! ggVG + autocmd BufWritePre *.c,*.cpp,*.h :ClangFormat + autocmd BufWritePost *.c,*.cpp,*.h :call setpos('.', save_cursor) +augroup END +" 定义ClangFormat命令 +command! -nargs=0 ClangFormat :silent %!clang-format -style="{IndentWidth: 4}" +" 映射gg=G到ClangFormat +autocmd FileType c,h,cpp,hpp,cc nnoremap gg=G :ClangFormat + +" 新建.c/.cpp/.sh/.py文件,自动插入文件头 +autocmd BufNewFile *.cpp,*.[ch],*.sh exec ":call SetTitle()" +func SetTitle() + if &filetype == 'sh' + call setline(1,"#!/bin/bash") + call append(line("."), "" ) + call append(line(".")+1, "\##########################################################################" ) + call append(line(".")+2, "\# File Name : ".expand("%")) + call append(line(".")+3, "\# Encoding : utf-8") + call append(line(".")+4, "\# Author : We-unite") + call append(line(".")+5, "\# Email : weunite1848@gmail.com") + call append(line(".")+6, "\# Created Time : ".strftime("%Y-%m-%d %H:%M:%S",localtime())) + call append(line(".")+7, "\##########################################################################" ) + call append(line(".")+8, "") + elseif &filetype =='py' + call setline(1,"#!/usr/bin/env python") + call append(line("."), "" ) + call append(line(".")+1, "\##########################################################################" ) + call append(line(".")+2, "\# File Name : ".expand("%")) + call append(line(".")+3, "\# Encoding : utf-8") + call append(line(".")+4, "\# Author : We-unite") + call append(line(".")+5, "\# Email : weunite1848@gmail.com") + call append(line(".")+6, "\# Created Time : ".strftime("%Y-%m-%d %H:%M:%S",localtime())) + call append(line(".")+7, "\##########################################################################" ) + call append(line(".")+8, "") + else + call setline(1, "/*************************************************************************") + call append(line("."), " > File Name : ".expand("%")) + call append(line(".")+1, " > Encoding : utf-8") + call append(line(".")+2, " > Author : We-unite") + call append(line(".")+3, " > Email : weunite1848@gmail.com ") + call append(line(".")+4, " > Created Time : ".strftime("%Y-%m-%d %H:%M:%S",localtime())) + call append(line(".")+5, " ************************************************************************/") + call append(line(".")+6, "") + if &filetype == 'cpp' + call append(line(".")+7, "#include ") + call append(line(".")+8, "using namespace std;") + call append(line(".")+9, "") + elseif &filetype == 'c' + call append(line(".")+7, "#include ") + call append(line(".")+8, "#include ") + call append(line(".")+9, "") + endif + endif + " 光标移动到文件末尾 + normal G +endfunc diff --git a/vimrcs/keybind.vim b/vimrcs/keybind.vim new file mode 100644 index 0000000..2cb0778 --- /dev/null +++ b/vimrcs/keybind.vim @@ -0,0 +1,41 @@ +" 设置leader为space +let mapleader = "\" +map - dd +map H 0 +map J :exe "normal! ".v:count1*10."j" +map K :exe "normal! ".v:count1*10."k" +vmap J :exe "normal! ".v:count1*10."j" +vmap K :exe "normal! ".v:count1*10."k" +map L $ +nmap c "关闭除当前窗口的所有页面 +nmap :w !sudo tee %L +nmap p "补全路径 +" nmap :tabn +nmap :tabp +nmap :tabnew +" map = :vertical resize +5 +" map - :vertical resize -5 + +nnoremap 1gt +nnoremap 2gt +nnoremap 3gt +nnoremap 4gt +nnoremap 5gt +nnoremap 6gt +nnoremap 7gt +nnoremap 8gt +nnoremap 9gt +nnoremap :tablast + +" 光标在页面间切换 +nnoremap h +nnoremap j +nnoremap k +nnoremap l + +" 复制粘贴 +vnoremap "+y +nnoremap "+p + +" 按下Ctrl+`时,使用:terminal打开终端,显示在当前窗口的下边 +nnoremap :terminal diff --git a/vimrcs/match.vim b/vimrcs/match.vim new file mode 100644 index 0000000..897b3c7 --- /dev/null +++ b/vimrcs/match.vim @@ -0,0 +1,15 @@ +" 各类符号自动匹配 +:inoremap ( ()i +:inoremap ) =ClosePair(')') +:inoremap [ []i +:inoremap ] =ClosePair(']') +:inoremap { {}i +:inoremap } =ClosePair('}') + +function ClosePair(char) + if getline('.')[col('.') - 1] == a:char + return "\" + else + return a:char + endif +endfunction diff --git a/vimrcs/myset.vim b/vimrcs/myset.vim new file mode 100644 index 0000000..19848f0 --- /dev/null +++ b/vimrcs/myset.vim @@ -0,0 +1,38 @@ +set encoding=utf-8 +set fileencoding=utf-8 +set fileencodings=ucs-bom,utf-8,GB18030,cp936,big5,euc-jp,euc-kr,latin1 +set fileformat=unix +set helplang=cn " 帮助中文支持 +set mouse=a " 设置鼠标 +set noeb " 去掉输入错误的提示声音 +set confirm " 在处理未保存或只读文件的时候,弹出确认 +set langmenu=zh_CN.UTF-8 +set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离 +set vb t_vb= " 关闭错误提示声音 + +set rnu " 设置相对行号 +set nu " 设置绝对行号 +" Set cursor shape and color +if &term =~ "xterm" + " INSERT mode + let &t_SI = "\[6 q" . "\]12;blue\x7" + " REPLACE mode + let &t_SR = "\[3 q" . "\]12;black\x7" + " NORMAL mode + let &t_EI = "\[2 q" . "\]12;green\x7" +endif +" 1 -> blinking block 闪烁的方块 +" 2 -> solid block 不闪烁的方块 +" 3 -> blinking underscore 闪烁的下划线 +" 4 -> solid underscore 不闪烁的下划线 +" 5 -> blinking vertical bar 闪烁的竖线 +" 6 -> solid vertical bar 不闪烁的竖线 + +syntax on +set cul +set cuc +set list " 显示tab和空格 +set listchars=tab:>-,trail:- " 设置tab和空格的显示 +colorscheme industry " 设置颜色主题 +autocmd VimEnter * hi CursorLine cterm=NONE ctermbg=darkblue ctermfg=NONE guibg=darkblue guifg=NONE +autocmd VimEnter * hi CursorColumn cterm=NONE ctermbg=darkblue ctermfg=NONE guibg=darkblue guifg=NONE diff --git a/vimrcs/plugs.vim b/vimrcs/plugs.vim new file mode 100644 index 0000000..4d389a3 --- /dev/null +++ b/vimrcs/plugs.vim @@ -0,0 +1,153 @@ +" Vundle插件管理器配置 +set nocompatible " 去除VIM一致性,必须 +filetype off " 必须 + +" 设置包括vundle和初始化相关的运行时路径" +set rtp+=/home/player/useful/bundle/Vundle.vim +call vundle#begin('/home/player/useful/bundle') + +Plugin 'VundleVim/Vundle.vim' " 启用vundle管理插件,必须 +Plugin 'Valloric/YouCompleteMe' " 代码补全插件 +Plugin 'preservim/nerdtree' " 文件目录树插件 +Plugin 'Xuyuanp/nerdtree-git-plugin' " nerdtree git支持 +Plugin 'scrooloose/syntastic' " 语法检查插件 +Plugin 'github/copilot.vim' " GitHub Copilot插件 +Plugin 'voldikss/vim-translator' " 翻译插件 +Plugin 'yegappan/taglist' " taglist插件 +Plugin 'octol/vim-cpp-enhanced-highlight' " C++语法高亮插件,在原生基础上支持STL等 +Plugin 'nathanaelkane/vim-indent-guides' " 缩进线插件 +Plugin 'scrooloose/nerdcommenter' " 注释插件 +" Plugin 'skywind3000/vim-terminal-help' " vim-terminal-help插件 +" Plugin 'neoclide/coc.nvim' " coc.nvim插件 +" Plugin 'Lokaltog/powerline',{'rtp':'powerline/bindings/vim/'} " 状态栏信息插件 + +call vundle#end() +filetype plugin indent on " 加载vim自带和插件相应的语法和文件类型相关脚本,必须 + +" YouCompleteMe +let g:ycm_global_ycm_extra_conf = '/home/player/useful/bundle/YouCompleteMe/.ycm_extra_conf.py' +let g:ycm_python_binary_path = '/usr/bin/python' " python路径 +" let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py' " C family语言的配置文件 +let g:ycm_confirm_extra_conf = 0 " 停止提示是否载入本地ycm_extra_conf文件 +let g:ycm_use_ultisnips_completer = 1 " 默认载入本地ycm_extra_conf文件 +let g:ycm_min_num_of_chars_for_completion = 2 " 从第2个键入字符就开始罗列匹配项 +let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 从注释和字符串中收集标识符 +let g:ycm_complete_in_comments = 1 " 在注释中也可以补全 +let g:ycm_complete_in_strings = 1 " 在字符串中也可以补全 +let g:ycm_enable_fuzzy_match = 1 " 开启模糊匹配 +let g:ycm_seed_identifiers_with_syntax = 1 " 语法关键字补全 +let g:ycm_collect_identifiers_from_tags_files = 1 " 开启 YCM 基于标签引擎 +let g:ycm_key_list_select_completion = ['', ''] " 选择第1项的快捷键(默认为) +let g:ycm_key_list_previous_completion = ['', ''] " 选择前1项的快捷键(默认为) +let g:ycm_autoclose_preview_window_after_completion = 1 " 补全后自动关闭预览窗口 +" let g:ycm_key_invoke_completion = [''] " 主动补全, 默认为 +" let g:ycm_key_list_stop_completion = [''] " 停止显示补全列表防影响视野, 重新弹出 +let g:ycm_semantic_triggers = { + \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'], + \ 'cs,lua,javascript': ['re!\w{2}'], + \ } +" hi PMenu ctermfg=34 ctermbg=21 guifg=darkred guibg=darkblue +" hi PMenuSel ctermfg=21 ctermbg=34 guifg=darkblue guibg=darkred +hi PMenu ctermfg=darkgrey ctermbg=21 guifg=darkred guibg=darkblue +hi PMenuSel ctermfg=yellow ctermbg=34 guifg=darkblue guibg=darkred +nnoremap gdec :YcmCompleter GoToDeclaration +nnoremap gdef :YcmCompleter GoToDefinition +nnoremap gd :YcmCompleter GoToDefinitionElseDeclaration +nnoremap gr :YcmCompleter GoToReferences + +" NERDTree +" autocmd vimenter * NERDTree "进入vim自动打开nerdtree +" 当nerdtree为当前标签页剩余唯一窗口时自动关闭 +autocmd bufenter * if(winnr('$') ==1 && exists('b:NERDTree') && b:NERDTree.isTabTree()) | quit | endif +nmap T :NERDTreeToggle " 开关文件目录树,注意shift+i切换是否显示隐藏文件 +let g:NERDTreeDirArrowExpandable = '+' +let g:NERDTreeDirArrowCollapsible = '-' " 修改树的显示图标 +let g:NERDTreeWinPos='left' " 窗口位置 +let g:NERDTreeSize=10 " 窗口尺寸 +let g:NERDTreeShowLineNumbers=1 " 窗口是否显示行号 +let NERDTreeShowHidden=1 " 显示隐藏文件 +let NERDTreeIgnore = ['\.pyc$', '\.swp', '\.swo', '\.vscode', '__pycache__'] " 过滤: 所有指定文件和文件夹不显示 +autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif " 在每个标签页打开相同的文件树 + +" nerdtree-git-plugin +let g:NERDTreeGitStatusIndicatorMapCustom = { + \ 'Dirty' :'Dty', + \ 'Modified' :'M', + \ 'Staged' :'Sta', + \ 'Untracked' :'U', + \ 'Renamed' :'R', + \ 'Unmerged' :'Umg', + \ 'Deleted' :'X', + \ 'Ignored' :'Ign', + \ 'Clean' :'Cl', + \ 'Unknown' :'?', + \ } +let g:NERDTreeGitStatusShowIgnored = 1 " a heavy feature may cost much more time. default: 0 +let g:NERDTreeGitStatusUntrackedFilesMode = 'all' " a heavy feature too. default: normal + +" vim-terminal-help +" set termwinsize=10*106 +" let g:terminal_key = '' +" 设置光标在终端与编辑器间切换的快捷键 + +" syntastic +" YouCompleteMe插件对该插件支持过于优秀,一般不再需要配置,故废弃 +let g:syntastic_python_checkers=['pylint'] +let g:syntastic_python_pylint_args=['--disable=C0111,R0903,C0301'] +" GNU as汇编语言语法检查,需要安装as86和ld86 +let g:syntastic_asm_checkers=['as86'] +" syntastic end + +" powerline +let laststatus=2 +let g:airlinr_powerline_fonts=1 " 使用官方打过补丁的字体 +let g:Powerline_symbols='fancy' + +" vim-translator +let g:translator_target_lang = 'zh' +let g:translator_source_lang = 'auto' +" let g:translator_default_engines = ['youdao', 'bing', 'google', 'haici'] +let g:translator_default_engines = ['bing'] +let g:translator_history_enable = v:true +let g:translator_window_type = 'popup' " 可选值为 'popup' 和 'preview',默认为 'popup' +" Echo translation in the cmdline +nmap t Translate +vmap t TranslateV +" Display translation in a window +nmap w TranslateW +vmap w TranslateWV +" Close the translation window +nmap c TranslateC +" Replace the text with translation +nmap r TranslateR +vmap r TranslateRV +" Translate the text in clipboard +nmap x TranslateX + +" 进行Taglist的设置 +" map tl Tlist " +let Tlist_Ctags_Cmd='/usr/local/bin/ctags' " 因为我们放在环境变量里,所以可以直接执行 +let Tlist_Use_Right_Window=1 " 让窗口显示在右边,0的话就是显示在左边 +let Tlist_Show_One_File=1 " 让taglist可以同时展示多个文件的函数列表 +let Tlist_File_Fold_Auto_Close=0 " 非当前文件列表折叠隐藏 +let Tlist_Exit_OnlyWindow=1 " 当taglist是最后一个分割窗口时,自动推出vim +let Tlist_Process_File_Always=1 " 是否一直处理tags.1:处理;0:不处理 +let Tlist_Inc_Winwidth=1 " 不是一直实时更新tags,因为没有必要 +" 每隔多少秒更新一次tags,如果为0则不更新 +let Tlist_Update_Time=5 +" 在每个标签页打开相同的函数列表 +autocmd BufWinEnter * if getcmdwintype() == '' | silent TlistUpdate | endif +" 打开新标签页时自动打开函数列表 +autocmd BufWinEnter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.IsTabTree()) | silent TlistToggle | endif + +" vim-indent-guides +let g:indent_guides_enable_on_vim_startup = 1 " 启动时自动开启缩进线 +let g:indent_guides_guide_size = 1 " 缩进线宽度 +let g:indent_guides_start_level = 2 " 从第二级开始显示缩进线 +let g:indent_guides_auto_colors = 1 " 自动颜色 +autocmd VimEnter * :IndentGuidesToggle +highlight IndentGuidesOdd ctermbg=darkgray " 缩进线颜色 +highlight IndentGuidesEven ctermbg=darkgrey " 缩进线颜色 + +" nerdcommenter +map c diff --git a/vimrcs/statusline.vim b/vimrcs/statusline.vim new file mode 100644 index 0000000..6bf42ed --- /dev/null +++ b/vimrcs/statusline.vim @@ -0,0 +1,70 @@ +set guitablabel=%{ShortTabLabel()} +function ShortTabLabel () + let bufnrlist = tabpagebuflist (v:lnum) + let label = bufname (bufnrlist[tabpagewinnr (v:lnum) -1]) + let filename = fnamemodify (label, ':t') + return filename +endfunction + +set tabline=%!MyTabLine() +function MyTabLine() + let s = '' + for i in range(tabpagenr('$')) + " 选择高亮 + if i + 1 == tabpagenr() + let s .= '%#TabLineSel#' + else + let s .= '%#TabLine#' + endif + " 设置标签页号 (用于鼠标点击) + let s .= '%' . (i + 1) . 'T' + " MyTabLabel() 提供完整路径标签 MyShortTabLabel 提供文件名标签 + let s .= ' %{MyShortTabLabel(' . (i + 1) . ')} ' + endfor + " 最后一个标签页之后用 TabLineFill 填充并复位标签页号 + let s .= '%#TabLineFill#%T' + " 右对齐用于关闭当前标签页的标签 + if tabpagenr('$') > 1 + let s .= '%=%#TabLine#%999Xclose' + endif + return s +endfunction + +" 文件名标签 +function MyShortTabLabel(n) + let buflist = tabpagebuflist(a:n) + let label = bufname (buflist[tabpagewinnr (a:n) -1]) + let filename = fnamemodify (label, ':t') + return filename +endfunction +" 完整路径标签 +function MyTabLabel(n) + let buflist = tabpagebuflist(a:n) + let winnr = tabpagewinnr(a:n) + return bufname(buflist[winnr - 1]) +endfunction + +" 状态栏显示git分支 +function! GitBranch() + " 获取当前所在分支名,注意不要保留开头的*和行末的空符号 + let s:branch = system("git branch --no-color 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \\(.*\\)/\\1/' | tr -d '\n' | tr -d ' '") + return strlen(s:branch) ? 'b: '.s:branch.'> ' : '' +endfunction + +set laststatus=2 " 显示状态栏(默认值为 1,无法显示状态栏) +set statusline=%f%m%r%h%w\ >\ %{GitBranch()}%=\ <\ %{&ff},\ %{&fenc}\ <\ %y\ <\ %l,%v\ <\ %p%%\ <\ lines=%L + +function! CurDir() + let curdir = substitute(getcwd(), '/Users/amir/', "~/", "g") + return curdir +endfunction + +" 标签样式 +" TabLineFill tab pages line, where there are no labels +hi TabLineFill term=none +hi TabLineFill ctermfg=DarkGrey +hi TabLineFill guifg=#777777 +" TabLineSel tab pages line, active tab page label +hi TabLineSel term=inverse +hi TabLineSel cterm=none ctermfg=yellow ctermbg=Black +hi TabLineSel gui=none guifg=yellow guibg=Black -- cgit v1.2.3-70-g09d2