vim配置(win+mac+Ubuntu三平臺)
本人是一名大二的學生, 使用vim有一年半了, 整理的這些配置, 有一些是之前學長留下的, 有一些是我自己上網查重新配置的。
適合人羣:使用c++/java 刷題、做OJ題目的人。以及ACM競賽選手。
本文不會介紹如何使用vim。
主要是介紹vimrc中具體配置。
macOS
mac中的vim有在終端裏的vim和GUI界面的macvim。 對應的就有vimrc
和gvimrc
兩個配置文件。 大部分配置都是通用的, 有一些不通用的配置在之後的文中我會註明。
首先我們要知道的幾點:
vimrc
比gvimrc
先編譯, 即使你在使用macvim
, 系統也會讀取vimrc
的配置(插件部分會受到這個的影響)。gvimrc
的配置會覆蓋vimrc
.
基礎部分
這一部分主要是一些默認配置, 主要是有一些是學長留下來的, 我也沒有具體再去研究。
vimrc和gvimrc通用(不通用後面有標註)。
set backspace=indent,eol,start
set nu ai ci si sts=4 ts=4 sw=4 mouse=a " 縮進設置
set number " 顯示行號
set ruler
set scrolloff=3 " 光標移動到buffer的頂部和底部時保持3行距離
colorscheme desert " 設置主題, 個人很喜歡這個主題
set lines=35 "窗口多長,下爲多寬
set columns= 80
" 語言以及編碼設置 當時一股腦複製進來的,解決win中代碼打開亂碼問題。
set langmenu=zh_CN.UTF-8
scriptencoding utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set laststatus=2 " 命令行(在狀態行下)的高度,默認爲1,這裏是2
set guifont=Menlo:h15 "字體和大小
set transparency=10
"透明度 這個只能在gvimrc中配置,macvim中可以使用。在vimrc裏配置會報錯,終端中不可用。
set cursorline " 突出顯示當前行
:cd /Users/zong/code/vimcode " 初始化保存路徑, 不配置這個的話默認保存在home中。
" 可以通過 pwd命令查看當前路徑 和cd命令修改路徑
因爲在終端中無法使用快捷鍵全選複製粘貼, y和p也不能和系統剪貼板共享, 所以就需要再加幾行配置來解決。
"複製粘貼控制
nmap<C-A> ggvG
vmap<C-C> "*y
nmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa
基本設置就是這些了, 重要的部分是一鍵編譯。
一鍵編譯
一鍵編譯我在vimrc
和gvimrc
中是有一些區別的, 主要原因是:
在終端中, 當我們編譯的時候, 會從vim返回到bash中取執行, 在終端中接着之前的顯示, 終端之前的殘留信息個人感覺會影響閱讀。而在macvim中, 我們編譯的時候, 是直接在最下面顯示的, 每次編譯運行都只有這一次的信息。這裏我研究了有一陣子, 所以打算詳說說這一部分。
vimrc一鍵編譯
nmap<F3> : vs %<.in <CR>
"自動生成並打開.in文件, 方便放入輸入數據。
nmap<F4> : !clear && time ./%< < %<.in <CR>
"直接運行c++程序並讀入.in中的數據
nmap<F5> : !clear && time java %< < %<.in <CR>
"直讀入.in中的數據並運行java程序並讀入.in中的數據
nmap<F6> : vs %<.out <CR>
" 打開.out
map <F9> :call InitCompile()<CR> "識別代碼種類並編譯
func! InitCompile()
if &filetype == 'c'
exec "!clear && g++ % -o %<"
elseif &filetype == 'cpp'
exec "!clear && g++ % -o %<"
elseif &filetype == 'java'
exec "!javac %"
elseif &filetype == 'sh'
:!./%
endif
endfunc
map <F10> :call CompileRunGcc()<CR> "識別代碼種類並運行"
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!time ./%<"
elseif &filetype == 'cpp'
exec "!time ./%<"
elseif &filetype == 'java'
exec "!time java %<"
elseif &filetype == 'sh'
:!./%
endif
endfunc
這裏要說的就是 配置中有clear
和 time
這兩個功能。
1. clear
是清空終端中之前的顯示, 我個人覺着這樣看編譯結果以及答案的時候方便一些。
2. time
用來顯示程序運行的時間。
gvimrc一鍵編譯
對應的gvimrc中就不需要clear
了, 其他的基本相同。
nmap<F3> : vs %<.in <CR>
nmap<F4> :call XX() <CR>
func! XX()
exec "w"
exec "!time ./%< < %<.in"
endfunc
nmap<F5> : !time java %< < %<.in <CR>
nmap<F6> : vs %<.out <CR>
map <F9> :call InitCompile()<CR>
func! InitCompile()
if &filetype == 'c'
exec "!g++ % -o %<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
elseif &filetype == 'java'
exec "!javac %"
elseif &filetype == 'sh'
:!./%
endif
endfunc
map <F10> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!time ./%<"
elseif &filetype == 'cpp'
exec "!time ./%<"
elseif &filetype == 'java'
exec "!time java %<"
elseif &filetype == 'sh'
:!./%
endif
endfunc
windows
基礎部分
syntax on
set backspace=indent,eol,start
set nu si ci ai mouse=a sw=4 sts=4 ts=4
set hlsearch incsearch
colorscheme desert " 主題
set guifont=Consolas:h14 " 字體
set report=0 showmatch cursorline
set guioptions-=m
set guioptions-=T
set lines=40 "窗口多長,下爲多寬
set columns=100
set scrolloff=3 " 光標移動到buffer的頂部和底部時保持3行距離
:cd E:\vimcode " 初始化路徑, 自行修改
set autoindent "自動縮進
set smartindent "智能縮進
" 這兩個不知道有沒有用, 沒有實際感受。
因爲在win下面編碼模式默認是GBK編碼, 爲了解決有時候UTF-8的亂碼問題, 需要修改編碼模式。
"語言設置
set encoding=utf-8
set termencoding=utf-8
language messages zh_cn.utf-8
快捷鍵複製粘貼
"複製粘貼控制
nmap<C-A> ggvG
vmap<C-C> "*y
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa
一鍵編譯
windows平臺time
命令就沒用了, 所以還沒有找到顯示時間的方法。
nmap<F3> : vs %<.in <CR> " 自動創建並打開.in文件方便放入input數據.
nmap<F4> : ! %< < %<.in <CR> " 運行c++程序並讀入.in中的數據
nmap<F5> : ! java %< < %<.in <CR> " 運行java程序並讀入.中的數據
nmap<F6> : vs %<.out <CR> " 打開.out
map <F9> :call InitCompile()<CR> " 識別文件類型並且編譯
func! InitCompile()
exec "w"
if &filetype == 'c'
exec "!g++ % -o %<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
elseif &filetype == 'java'
exec "!javac %"
elseif &filetype == 'sh'
:!./%
endif
endfunc
map <F10> :call CompileRunGcc()<CR> " 識別文件類型並運行程序
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "! %<"
elseif &filetype == 'cpp'
exec "! %<"
elseif &filetype == 'java'
exec "! java %<"
elseif &filetype == 'sh'
:!./%
endif
endfunc
Ubuntu
Ubuntu的配置跟mac的vimrc就大同小異了, 基本是完全相同的。 讀者可以自行修改嘗試。 而且我剛使用Ubuntu沒多長時間, 以後再慢慢更新。
偷懶必備
就是一鍵頭文件, 平時做題的時候很方便。 我配置到F2鍵和F1鍵, F2是開始時間, F1用來記錄結束時間。
"按<F2>自動生成代碼設置
if !exists("*SetTitlea")
map <F2> :call SetTitlea()<CR>
func SetTitlea()
let l = 0
let l = l + 1 | call setline(l,'/**********************************************')
let l = l + 1 | call setline(l,' *Author* :ZZZZone')
let l = l + 1 | call setline(l,' *Created Time* : '.strftime('%c'))
let l = l + 1 | call setline(l,'')
"let l = l + 1 | call setline(l,'**Problem**:')
"let l = l + 1 | call setline(l,'**Analyse**:')
"let l = l + 1 | call setline(l,'**Get**:')
"let l = l + 1 | call setline(l,'**Code**:')
let l = l + 1 | call setline(l,'*********************************************/')
let l = l + 1 | call setline(l,'')
let l = l + 1 | call setline(l,'#include <cstdio>')
let l = l + 1 | call setline(l,'#include <cstring>')
let l = l + 1 | call setline(l,'#include <iostream>')
let l = l + 1 | call setline(l,'#include <algorithm>')
let l = l + 1 | call setline(l,'#include <vector>')
let l = l + 1 | call setline(l,'#include <queue>')
let l = l + 1 | call setline(l,'#include <set>')
let l = l + 1 | call setline(l,'#include <map>')
let l = l + 1 | call setline(l,'#include <string>')
let l = l + 1 | call setline(l,'#include <cmath>')
let l = l + 1 | call setline(l,'#include <cstdlib>')
let l = l + 1 | call setline(l,'#include <ctime>')
let l = l + 1 | call setline(l,'#include <stack>')
let l = l + 1 | call setline(l,'using namespace std;')
let l = l + 1 | call setline(l,'typedef pair<int, int> PII;')
let l = l + 1 | call setline(l,'typedef long long LL;')
let l = l + 1 | call setline(l,'typedef unsigned long long ULL;')
let l = l + 1 | call setline(l,'')
let l = l + 1 | call setline(l,'inline void OPEN(string s){')
let l = l + 1 | call setline(l,' freopen((s + ".in").c_str(), "r", stdin);')
let l = l + 1 | call setline(l,' freopen((s + ".out").c_str(), "w", stdout);')
let l = l + 1 | call setline(l,'}')
let l = l + 1 | call setline(l,'')
let l = l + 1 | call setline(l,'int main()')
let l = l + 1 | call setline(l,'{')
let l = l + 1 | call setline(l,' return 0;')
let l = l + 1 | call setline(l,'}')
endfunc
endif
"完成時間
if !exists("*FinishTime")
map<F1> : call FinishTime()<CR>
func FinishTime()
let l = 4 | call setline(l,' *Ended Time* : '.strftime('%c'))
endfunc
endif