1、vim 更新
Ubuntu 已经自带了 vim,但不一定是最新版本,如果需要使用最新版本,可以自助升级。
查看 vim 的安装版本:
vim --version
更新 vim
sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt upgrade
附:vim 卸载命令
sudo apt remove vim
sudo add-apt-repository --remove ppa:jonathonf/vim
2、vim 配置
"
" Author: Frank
" Create Date: 2019-02-24
"
" NOTE: Only use the config which you know its meaning.
"
"********************************************************************************
" 插件管理
"********************************************************************************
" 插件管理使用 Vundle
" 插件管理使用独立的配置文件 .vimrc.bundles,放置在 .vim 目录
if filereadable(expand("~/.vim/.vimrc.bundles"))
source ~/.vim/.vimrc.bundles
endif
"********************************************************************************
" 基本设置
"********************************************************************************
" 启动时不显示援助乌干达儿童的提示
set shortmess=atI
" 开启语法高亮功能
syntax enable
" 开启语法高亮
syntax on
" 关闭 vi 一致性模式,避免以前版本的一些bug和局限
set nocompatible
" 去掉输入错误的提示声音
set noerrorbells
" 关闭使用可视响铃代替呼叫
set novisualbell
" 置空错误铃声的终端代码
set t_vb=
" 高亮显示当前行
set cursorline
" 总是显示光标位置
set ruler
" 在状态栏显示正在输入的命令
set showcmd
" 命令行的高度
set cmdheight=2
" 总是显示状态栏
set laststatus=2
" 状态行显示的内容
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
" <ESC> 键响应时间
set ttimeoutlen=0
" 显示括号配对,当键入“]”“)”时,高亮度显示匹配的括号
set showmatch
" 配对括号高亮时选中的括号显示黄色
hi MatchParen ctermbg=Yellow guibg=lightblue
" 允许光标出现在最后一个字符的后面
set virtualedit=block,onemore
" 光标键跨行
set whichwrap+=<,>,h,l
" 文件修改之后自动读入
set autoread
" 自动保存
set autowrite
" 退出 Vim 之后内容显示在终端屏幕
set t_ti= t_te=
" vim 中可以使用鼠标
set mouse=v
" 选择模式使用鼠标
set selectmode=mouse,key
" 共享剪贴板
set clipboard+=unnamed
" 开启行号显示
set number
" 显示相对行号,便于 nj/nk 跳转
set relativenumber number
" 插入模式显示绝对行号,普通模式显示相对行号
autocmd InsertEnter * :set norelativenumber number
autocmd InsertLeave * :set relativenumber
" vim 打开文件,光标定位到上次退出的位置
if has("autocmd")
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif
"********************************************************************************
" 主题设置
"********************************************************************************
" GUI 模式浅色背景,终端模式深色背景
if has('gui_running')
set background=light
else
set background=dark
endif
" 主题设置为 solarized
colorscheme solarized
"colorscheme molokai
"********************************************************************************
" 编码设置
"********************************************************************************
" 帮助语言首选
set helplang=cn
" 菜单使用的语言
set langmenu=zh_CN.UTF-8
" Vim 所工作的终端的字符编码方式
set termencoding=utf-8
" Vim 内部使用的字符编码方式
set encoding=utf8
" Vim 启动时会按照 fileencodings 所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,
" 并且将 fileencoding 设置为最终探测到的字符编码方式
set fileencodings=ucs-bom,utf8,gbk,cp936,gb2312,gb18030
" 文件输入输出使用的格式,默认为 UNIX 格式
set fileformats=unix,dos
"********************************************************************************
" 搜索配置
"********************************************************************************
" 高亮显示搜索结果
set hlsearch
" 输入搜索时,同时高亮部分的匹配
set incsearch
" 搜索时忽略大小写
set ignorecase
" 搜索时尝试smart,即模式中有大写字母时不忽略大小写
set smartcase
"********************************************************************************
" 缓存配置
"********************************************************************************
" 历史记录条数
set history=2000
" 不备份
set nobackup
" 禁止生成临时文件
set noswapfile
" 文件在 vim 之外修改过,自动重新读入
set autoread
" 自动保存
set autowrite
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 取消备份
set nobackup
" 禁止生成临时文件
set noswapfile
" 创建撤销文件, 在关闭文件后再次打开时还可以撤销上次的更改
if v:version >= 730
set undofile " 把撤销信息写入一个文件里
set undodir=~/.vim/vim_undo/ " 撤销文件的保存位置
endif
" 最多可以撤销的改变个数
set undolevels=1000
" 保存缓冲区重载撤销的最大行数(number of lines to save for undo)
set undoreload=10000
"********************************************************************************
" 代码排版
"********************************************************************************
" 自适应不同语言的智能缩进
filetype indent on
" 自动缩进
set autoindent
" 使用 C/C++ 语言的自动缩进方式
set cindent
" C/C++ 语言的具体缩进方式
set cinoptions=g0,:0,N-s,(0
" 智能选择对齐方式
set smartindent
" 当一行字符超过窗口宽度时,禁止换行显示
set nowrap
" 当打开换行显示时,在空格处换行
set linebreak
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 打开断行模块对亚洲语言支持
" m 表示允许在两个汉字之间断行, 即使汉字之间没有出现空格
" B 表示将两行合并为一行的时候, 汉字与汉字之间不要补空格
set formatoptions+=mB
" <Tab> 占用空格数
set tabstop=4
" 编辑时 <Tab> 占用的空格数
set softtabstop=4
" 自动缩进时步进的空格数
set shiftwidth=4
" 插入 <Tab> 时使用 ‘shiftwidth’
set smarttab
" 缩进列数对齐到 shiftwidth 的整数倍
set shiftround
" 用空格替换 <Tab>
set expandtab
" 使用 <Backspace> 正常处理indent,eol,start等
set backspace=2
" 横向滚动的最少列数
set sidescroll=10
" 光标离窗口上下边界 5 行时窗口自动滚动
set scrolloff=5
" 变更 <Tab> 和空格的显示方式为 >- 和 -
:set listchars=tab:>-,trail:-,space:.
" 显示行尾空格,标记为红色, 插件功能已存在,此处注释掉
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s\+$/
" 字符之间的像素行数
set linespace=0
"********************************************************************************
" 新建文件
"********************************************************************************
" 新建 .c, .h, .sh, .java .py 文件时,自动插入文件头
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java,*.py exec ":call SetTitle()"
" 定义函数 SetTitle,自动插入文件头
function SetTitle()
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, "")
else
call setline(1, "/**")
call append(line("."), " * Copyright (C) 2019-2019 XXX Technology Co., Ltd. All rights reserved."))
call append(line(".")+1, " * "))
call append(line(".")+2, " * File Name: ".expand("%"))
call append(line(".")+3, " * Author: Frank")
call append(line(".")+4, " * Mail: FrankWork@163.com")
call append(line(".")+5, " * Created Time: ".strftime("%Y-%m-%d %H:%M"))
call append(line(".")+6, " */")
call append(line(".")+7, "")
endif
if &filetype == 'c'
call append(line(".")+8, "#include <stdio.h>")
call append(line(".")+9, "")
elseif &filetype == 'java'
call append(line(".")+8,"public class ".expand("%:r"))
call append(line(".")+9,"")
endif
if expand("%:e") == 'cpp'
call append(line(".")+8, "#include <iostream>")
call append(line(".")+9, "using namespace std;")
call append(line(".")+10, "")
elseif expand("%:e") == 'h'
call append(line(".")+8, "#ifndef _".toupper(expand("%:r"))."_H")
call append(line(".")+9, "#define _".toupper(expand("%:r"))."_H")
call append(line(".")+10, "")
call append(line(".")+11, "#ifdef __cplusplus")
call append(line(".")+12, "extern \"C\"")
call append(line(".")+13, "{")
call append(line(".")+14, "#endif")
call append(line(".")+15, "")
call append(line(".")+16, "")
call append(line(".")+17, "")
call append(line(".")+18, "#ifdef __cplusplus")
call append(line(".")+19, "}")
call append(line(".")+20, "#endif")
call append(line(".")+21, "")
call append(line(".")+22, "#endif /* _".toupper(expand("%:r"))."_H */")
call append(line(".")+23, "")
endif
" 新建文件后,自动定位到文件末尾
autocmd BufNewFile * normal G
endfunc
"********************************************************************************
" 键盘配置
"********************************************************************************
" 定义 <leader> 键
let mapleader = ";"
let g:mapleader = ";"
" ************************************************************
" <F1> ~ <F12> 配置
" <F1> 打开 vim 帮助,保留
" <F2> 打开/关闭行号显示
nnoremap <F2> :call NumberToggle()<CR>
function! NumberToggle()
if (&relativenumber == &number)
set relativenumber! number!
elseif (&number)
set number!
else
set relativenumber!
endif
set number?
endfunc
" <F3> 打开/关闭自动换行
nnoremap <F3> :set wrap! wrap?<CR>
" <F4> 打开/关闭鼠标功能
nnoremap <F4> :call MouseToggle()<CR>
" 鼠标功能开关函数
function! MouseToggle()
" if empty(&mouse)
if (&mouse == 'a')
set mouse=v
else
set mouse=a
endif
endfunc
" <F6> 打开/关闭 <Tab> 和空格显示
nnoremap <F6> :set list! list?<CR>
" <F7> 打开/关闭空格替换<Tab>
nnoremap <F7> :set expandtab! expandtab?<CR>
" ************************************************************
" 命令行模式增强,ctrl-a 到行首,ctrl-e 到行尾
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
" 插入模式增强,ctrl-a 到行首,ctrl-e 到行尾
imap <C-a> <Esc>^
imap <C-e> <Esc>$
" Ctrl-n 打开/关闭相对行号显示
nnoremap <C-n> :call RelativenumberToggle()<CR>
function RelativenumberToggle()
if (&relativenumber == 1)
set norelativenumber number
else
set relativenumber
endif
endfunc
" ************************************************************
" 插件相关快捷键
" <leader>nt 打开 nerdree 窗口,在左侧栏显示
nnoremap <leader>nt :NERDTreeToggle<CR>
" ************************************************************
" 使用大写字母 H、L 替换行首行尾符号
noremap H ^
noremap L $
" 把 <Tab> 替换成 4 个空格
nnoremap tt :%s/\t/ /g<CR>
" 删除行尾多余空格
nnoremap cl :%s/\s\+$//g<CR>:w<CR>
"********************************************************************************
" 编译调试
"********************************************************************************
" <F5> 编译运行
map <F5> :call CompileRunGcc()<CR>
function CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!g++ % -o %<"
exec "!time ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -std=c++11 -o %<"
exec "!time ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
elseif &filetype == 'python'
exec "!time python3 %"
endif
endfunc
" <F8> gdb调试
map <F8> :call Rungdb()<CR>
function Rungdb()
exec "w"
exec "!g++ % -std=c++11 -g -o %<"
exec "!gdb ./%<"
endfunc