[VIM] VIM 更新與配置

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: [email protected]")
        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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章