vim配置分享(win+mac+Ubuntu三平臺)適合刷題做oj練習題

vim配置(win+mac+Ubuntu三平臺)

我的Github

本人是一名大二的學生, 使用vim有一年半了, 整理的這些配置, 有一些是之前學長留下的, 有一些是我自己上網查重新配置的。
適合人羣:使用c++/java 刷題、做OJ題目的人。以及ACM競賽選手。
本文不會介紹如何使用vim。
主要是介紹vimrc中具體配置。

macOS

mac中的vim有在終端裏的vim和GUI界面的macvim。 對應的就有vimrcgvimrc兩個配置文件。 大部分配置都是通用的, 有一些不通用的配置在之後的文中我會註明。
首先我們要知道的幾點:

  1. vimrcgvimrc先編譯, 即使你在使用macvim, 系統也會讀取vimrc的配置(插件部分會受到這個的影響)。
  2. 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

基本設置就是這些了, 重要的部分是一鍵編譯。

一鍵編譯

    一鍵編譯我在vimrcgvimrc中是有一些區別的, 主要原因是:
在終端中, 當我們編譯的時候, 會從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

這裏要說的就是 配置中有cleartime這兩個功能。
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章