Linux公社论坛

 找回密码
 注册
查看: 65|回复: 0

[教程分享] Linux Vim 编辑器配置

[复制链接]

0

主题

0

听众

1

积分

新手上路

Rank: 1

xiaochengchuang 发表于 2020-2-12 23:43:56 |显示全部楼层
分析一个自己常用的Linux vimrc的配置:
效果图如下:



vimrc详细配置见下方:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"前置配置  
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"#配置参考链接:
"#https://blog.csdn.net/shy19910509/article/details/80701126
"#https://blog.csdn.net/klarclm/article/details/7932558
"#https://linux.cn/article-3330-1.html
"#https://blog.csdn.net/wen_fei/article/details/83025237


"#在使用该脚本前需要输入以下命令配置插件
"sudo apt-get install vim vim-scripts vim-doc
"#我们在sudo apt-get install vim vim-scripts vim-doc时,一般会自动安装上vim-addons。若未安装可通过sudo apt-get install vim-addon-manager手动安装。
"vim-addons install omnicppcomplete
"vim-addons install taglist
"vim-addons install winmanager
"vim-addons install minibufexplorer
"sudo apt-get install ctags
"sudo apt-get install cscope

"#vim中文帮助文档tar包下载地址:
"#http://sourceforge.net/projects/vimcdoc/files/vimcdoc/
"#解压后其中有个doc文件夹, 将其中的内容全部复制到~/.vim/doc, 或者vim安装目录下的doc目录中, 此时vim中的help信息已经是中文的了.

"#echofunc可以在命令行中提示当前输入函数的原型。
"#echofunc下载地址:http://www.vim.org/scripts/script.php?script_id=1735
"#下载完成后,把echofunc.vim文件放到 ~/.vim/plugin文件夹中

"#ctrlp使用
"#github: 原始https://github.com/kien/ctrlp.vim, 使用的是国人改进版本 https://github.com/ctrlpvim/ctrlp.vim



""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"以下开始vim的配置  
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"Vim颜色主题
"colorscheme torte
"colorscheme murphy
"colorscheme desert
"colorscheme desert
"colorscheme elflord
"colorscheme ron

"编码相关
"set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"set termencoding=utf-8
"set encoding=utf-8
"set fileencodings=ucs-bom,utf-8,cp936
"set fileencoding=utf-8



""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"显示相关  
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"启动的时候不显示那个援助乌干达儿童的提示
"set shortmess=atI

"输入的命令显示出来,看的清楚些
set showcmd

"显示标尺
set ruler

"命令行(在状态行下)的高度,设置为1
"set cmdheight=1

"状态行显示的内容
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}

"启动显示状态行(1),总是显示状态行(2)
set laststatus=2

"启动显示vim工作模式
set showmode

"允许折叠
set foldenable

"手动折叠
set foldmethod=manual

"背景使用黑色
"set background=dark

"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set nocompatible

"显示中文帮助
"if version >= 603
"        set helplang=cn
"        set encoding=utf-8
"endif



"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新文件标题
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"新建.c,.h,.sh,.java文件,自动插入文件头
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()"
"定义函数SetTitle,自动插入文件头
func SetTitle()
        "如果文件类型为.sh文件
        if &filetype == 'sh'
                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, "\#!/bin/bash")
                call append(line(".")+6, "")
        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 &filetype == 'cpp'
                call append(line(".")+6, "#include<iostream>")
                call append(line(".")+7, "using namespace std;")
                call append(line(".")+8, "")
        endif
        if &filetype == 'c'
                call append(line(".")+6, "#include<stdio.h>")
                call append(line(".")+7, "")
        endif
        "        if &filetype == 'java'
        "                call append(line(".")+6,"public class ".expand("%"))
        "                call append(line(".")+7,"")
        "        endif
        "新建文件后,自动定位到文件末尾
        autocmd BufNewFile * normal G
endfunc



""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>

"映射全选+复制 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G

"选中状态下 Ctrl+c 复制
vmap <C-c> "+y

"C,C++ 按F5编译运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
        exec "w"
        if &filetype == 'c'
                exec "!g++ % -o %<"
                exec "! ./%<"
        elseif &filetype == 'cpp'
                exec "!g++ % -o %<"
                exec "! ./%<"
        elseif &filetype == 'java'
                exec "!javac %"
                exec "!java %<"
        elseif &filetype == 'sh'
                :!./%
        elseif &filetype == 'py'
                exec "!python %"
                exec "!python %<"
        endif
endfunc

"C,C++的调试
map <F8> :call Rungdb()<CR>
func! Rungdb()
        exec "w"
        exec "!g++ % -g -o %<"
        exec "!gdb ./%<"
endfunc



""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"实用设置
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"设置当文件被改动时自动载入
set autoread

"quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>

"代码补全
set completeopt=preview,menu

"允许插件  
filetype plugin on

"共享剪贴板  
set clipboard+=unnamed

"自动保存
set autowrite

" 不要使用vi的键盘模式,而是vim自己的
set nocompatible

" 去掉输入错误的提示声音
set noeb

" 在处理未保存或只读文件的时候,弹出确认
set confirm

" 自动缩进
set autoindent
set cindent

" Tab键的宽度
set tabstop=4

" 统一缩进为4
set softtabstop=4
set shiftwidth=4

" 不设置到达多少字符自动换行
set textwidth=0

" 不要用空格代替制表符
"set noexpandtab

" 在行和段开始处使用制表符
set smarttab

" 显示行号
set number

" 历史记录数
set history=300

"禁止生成临时文件
set nobackup
set noswapfile

"搜索忽略大小写
set ignorecase

"搜索逐字符高亮
"set hlsearch
set incsearch

"侦测文件类型
filetype on

"载入文件类型插件
filetype plugin on

"为特定文件类型载入相关缩进文件
filetype indent on

"保存全局变量
set viminfo+=!

"带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-

"字符间插入的像素行数目
set linespace=0

"增强模式中的命令行自动完成操作
set wildmenu

"使回格键(backspace)正常处理indent, eol, start等
set backspace=2

"在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\

"高亮显示匹配的括号
set showmatch

"匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1

"光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3

"为C程序提供自动缩进
set smartindent

"高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile *  setfiletype txt

"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
":inoremap { {<CR>}<ESC>O
":inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
        if getline('.')[col('.') - 1] == a:char
                return "\<Right>"
        else
                return a:char
        endif
endfunction
filetype plugin indent on
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu


""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"插件设置
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"--ctags setting--
" 按下F5重新生成tag文件,并更新taglist
"map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
"imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
set tags=tags
set cscopetag "若有同名,手动选择,否则直接跳转
set tags+=./tags "add current directory's generated tags file
set tags+=/home//dataspace/linux-2.6.34/tags "add new tags file(刚刚生成tags的路径,在ctags -R 生成tags文件后,不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)
set tags+=/usr/include/c++/tags
nmap ts :tselect<cr>

"-- omnicppcomplete setting --
" 按下F3自动补全代码,注意该映射语句后不能有其他字符,包括tab;否则按下F3会自动补全一些乱码
imap <F3> <C-X><C-O>
" 按下F2根据头文件内关键字补全
imap <F2> <C-X><C-I>
set completeopt=menu,menuone " 关掉智能补全时的预览窗口
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
"let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1

"-- Taglist setting --
let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行
let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
let Tlist_Show_One_File=0 "0:让taglist可以同时展示多个文件的函数列表  1:仅当前文件
let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
"是否一直处理tags.1:处理;0:不处理
let Tlist_Process_File_Always=1 "实时更新tags
let Tlist_Inc_Winwidth=0
let Tlist_WinWidth=40
"nmap tl :Tlist<cr>

"-- WinManager setting --
"整合NERDTree
"let g:NERDTree_title='NERD Tree'
"let g:winManagerWindowLayout='NERDTree,TagList'
"function! NERDTree_Start()
"        exec 'NERDTree'
"endfunction
"function! NERDTree_IsValid()
"        return 1
"endfunction

let g:winManagerWindowLayout='TagList,FileExplorer' " 设置我们要管理的插件
let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了,退出vim
let g:winManagerWidth=40 "打开的窗口宽度
nmap wm :WMToggle<cr>

" -- MiniBufferExplorer --
let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l,可以切换到当前窗口的上下左右窗口
let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭头,可以切换到当前窗口的上下左右窗口
"let g:miniBufExplMapCTabSwitchBufs = 1 " 启用以下两个功能:Ctrl+tab移到下一个buffer并在当前窗口打开;Ctrl+Shift+tab移到上一个buffer并在当前窗口打开;ubuntu好像不支持
"let g:miniBufExplMapCTabSwitchWindows = 1 " 启用以下两个功能:Ctrl+tab移到下一个窗口;Ctrl+Shift+tab移到上一个窗口;ubuntu好像不支持
let g:miniBufExplModSelTarget = 1    " 不要在不可编辑内容的窗口(如TagList窗口)中打开选中的buffer

"-- Cscope setting --
"map <F5> :!cscope -Rbq .<CR><CR> :cs add ./cscope.out<CR>
if has("cscope")
        set csprg=/usr/bin/cscope        " 指定用来执行cscope的命令
        set csto=0                        " 设置cstag命令查找次序:0先找cscope数据库再找标签文件;1先找标签文件再找cscope数据库
        set cst                            " 同时搜索cscope数据库和标签文件
        set cscopequickfix=s-,c-,d-,i-,t-,e-    " 使用QuickFix窗口来显示cscope查找结果
        set nocsverb
        if filereadable("cscope.out")    " 若当前目录下存在cscope数据库,添加该数据库到vim
                cs add cscope.out
        elseif $CSCOPE_DB != ""            " 否则只要环境变量CSCOPE_DB不为空,则添加其指定的数据库到vim
                cs add $CSCOPE_DB
        endif
        set csverb
endif
"map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
"imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
" 将:cs find c等Cscope查找命令映射为<C-_>c等快捷键(按法是先按Ctrl+Shift+-, 然后很快再按下c)
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR> :copen<CR><CR>
nmap <C-A-c> :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>

"-- CtrlP setting --
let g:ctrlp_working_path_mode = 0 "设备工作目录为vim当前目录

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

您需要登录后才可以回帖 登录 | 注册

关注Linux公社官方微信,免费领取邀请码。

手机版|Linux公社(LinuxIDC.com)旗下网站【www.linuxidc.net】

GMT+8, 2020-2-24 06:52 , Processed in 0.043003 second(s), 13 queries , Wincache On.

Powered by Discuz! X 3.2

© 2010-2016 Comsenz Inc.

回顶部