標籤:

一些vim個性化配置

最近有人問起k-vim一些配置的問題, 然後把自己很早之前寫的一篇老文刨了出來.

vim 配置網上有很多可以參考的, 但是, 需要有個目標, 就是, 符合自己的需求. 而我更傾向於, 抓住自己的痛點反向去尋找解決方案. 而且, 必須是符合直覺的, 最簡單的方式.

以下老文, 供參考

----------------------

自從2012年將自己的配置發布到github後, 持續性的維護著, 逐步解決一些使用中的痛點, 反直覺的東西, 慢慢形成了現有的配置.

k-vim

n

以下, 就列下, 在k-vim中, 做了哪些配置, 下面這些在 vimrc 中都可以找到

n

首先, 一上來就把leader鍵改掉

n

" 修改leader鍵nlet mapleader = ,nlet g:mapleader = ,n

移動時, 保留到底部的空間

n

" 在上下移動游標時,游標的上方或下方至少會保留顯示的行數nset scrolloff=7n

自定義代碼摺疊toggle

n

" 代碼摺疊自定義快捷鍵 <leader>zznlet g:FoldMethod = 0nmap <leader>zz :call ToggleFold()<cr>nfun! ToggleFold()n if g:FoldMethod == 0n exe "normal! zM"n let g:FoldMethod = 1n elsen exe "normal! zR"n let g:FoldMethod = 0n endifnendfunn

ctrl-n進行相對行號/絕對行號切換

n

" 相對行號: 行號變成相對,可以用 nj/nk 進行跳轉nset relativenumber numbernau FocusLost * :set norelativenumber numbernau FocusGained * :set relativenumbern" 插入模式下用絕對行號, 普通模式下用相對nautocmd InsertEnter * :set norelativenumber numbernautocmd InsertLeave * :set relativenumbernfunction! NumberToggle()n if(&relativenumber == 1)n set norelativenumber numbern elsen set relativenumbern endifnendfuncnnnoremap <C-n> :call NumberToggle()<cr>n

quickfix的使用, 回車跳轉到報錯點, s或v分屏打開

n

" In the quickfix window, <CR> is used to jump to the error under then" cursor, so undefine the mapping there.nautocmd BufReadPost quickfix nnoremap <buffer> <CR> <CR>n" quickfix window s/v to open in split window, ,gd/,jd => quickfix window => open itnautocmd BufReadPost quickfix nnoremap <buffer> v <C-w><Enter><C-w>Lnautocmd BufReadPost quickfix nnoremap <buffer> s <C-w><Enter><C-w>Kn

打開vim, 自動定位到上次最後變更位置

n

" 打開自動定位到最後編輯的位置, 需要確認 .viminfo 當前用戶可寫nif has("autocmd")n au BufReadPost * if line(""") > 1 && line(""") <= line("$") | exe "normal! g"" | endifnendifn

幹掉方向鍵, 強迫自己使用hjkl

n

" 關閉方向鍵, 強迫自己用 hjklnmap <Left> <Nop>nmap <Right> <Nop>nmap <Up> <Nop>nmap <Down> <Nop>n

swap換行展示時, 使用hjkl體驗更好

n

"Treat long lines as break lines (useful when moving around in them)n"se swap之後,同物理行上線直接跳nnnoremap k gknnnoremap gk knnnoremap j gjnnnoremap gj jn

F鍵區的映射

n

" F2 行號開關,用於滑鼠複製代碼用n" 為方便複製,用<F2>開啟/關閉行號顯示:nfunction! HideNumber()n if(&relativenumber == &number)n set relativenumber! number!n elseif(&number)n set number!n elsen set relativenumber!n endifn set number?nendfuncnnnoremap <F2> :call HideNumber()<CR>nn" F3 顯示可列印字元開關nnnoremap <F3> :set list! list?<CR>n" F4 換行開關nnnoremap <F4> :set wrap! wrap?<CR>nnset pastetoggle=<F5> " when in insert mode, press <F5> to go ton " paste mode, where you can paste mass datan " that wont be autoindentednn" disbale paste mode when leaving insert modenau InsertLeave * set nopastenn" F6 語法開關,關閉語法可以加快大文件的展示nnnoremap <F6> :exec exists(syntax_on) ? syn off : syn on<CR>n

分屏窗口切換時, 直接使用ctrl-h/j/k/l

n

" 分屏窗口移動, Smart way to move between windowsnmap <C-j> <C-W>jnmap <C-k> <C-W>knmap <C-h> <C-W>hnmap <C-l> <C-W>ln

多窗口編輯時, 臨時放大某個窗口, 編輯完再切回原來的布局

n

" Is better way to zoom windows in Vim than ZoomWin?n" Zoom / Restore window.nfunction! s:ZoomToggle() abortn if exists(t:zoomed) && t:zoomedn execute t:zoom_winrestcmdn let t:zoomed = 0n elsen let t:zoom_winrestcmd = winrestcmd()n resizen vertical resizen let t:zoomed = 1n endifnendfunctionncommand! ZoomToggle call s:ZoomToggle()nnnoremap <silent> <Leader>z :ZoomToggle<CR>n

分號映射為冒號, 省得要進入命令模式需要按shift

n

" Map ; to : and save a million keystrokes 用於快速進入命令行nnnoremap ; :n

H和L跳轉到行首行末, 實在不想按0和$, 太遠

n

" Go to home and end using capitalized directionsnnoremap H ^nnoremap L $n

命令行模式快捷鍵, ctrl-a/e跳轉到行首行尾

n

" 命令行模式增強,ctrl - a到行首, -e 到行尾ncnoremap <C-j> <t_kd>ncnoremap <C-k> <t_ku>ncnoremap <C-a> <Home>ncnoremap <C-e> <End>n

空格進入搜索

n

" 搜索相關n" Map <Space> to / (search) and Ctrl-<Space> to ? (backwards search)nmap <space> /n" 進入搜索Use sane regexes"nnnoremap / /vnvnoremap / /vn

搜索時, 進入下一個上一個始終放在屏幕中間

n

" Keep search pattern at the center of the screen.nnnoremap <silent> n nzznnnoremap <silent> N Nzznnnoremap <silent> * *zznnnoremap <silent> # #zznnnoremap <silent> g* g*zzn

leader-/ 關閉掉上次搜索的高亮

n

" 去掉搜索高亮nnoremap <silent><leader>/ :nohls<CR>n

交換#和*, #更近

n

" switch # *nnnoremap # *nnnoremap * #n

Python 寫入注釋#號時, 不每次都跳到行首

n

" for # indent, python文件中輸入新行時#號注釋不切回行首nautocmd BufNewFile,BufRead *.py inoremap # X<c-h>#n

buffer切換相關, 使用不多

n

" 切換前後buffernnnoremap [b :bprevious<cr>nnnoremap ]b :bnext<cr>n" 使用方向鍵切換buffernnoremap <left> :bp<CR>nnoremap <right> :bn<CR>n

tab操作….看個人喜好, 不過自從用了crtlspace之後, 逐漸很少用了

n

" tab 操作n" Alternative tab navigationn" Switching to a particular tab in VIMnn" tab切換nmap <leader>th :tabfirst<cr>nmap <leader>tl :tablast<cr>nnmap <leader>tj :tabnext<cr>nmap <leader>tk :tabprev<cr>nmap <leader>tn :tabnext<cr>nmap <leader>tp :tabprev<cr>nnmap <leader>te :tabedit<cr>nmap <leader>td :tabclose<cr>nmap <leader>tm :tabm<cr>nn" normal模式下切換到確切的tabnnoremap <leader>1 1gtnnoremap <leader>2 2gtnnoremap <leader>3 3gtnnoremap <leader>4 4gtnnoremap <leader>5 5gtnnoremap <leader>6 6gtnnoremap <leader>7 7gtnnoremap <leader>8 8gtnnoremap <leader>9 9gtnnoremap <leader>0 :tablast<cr>nn" Toggles between the active and last active tab "n" The first tab is always 1 "nlet g:last_active_tab = 1n" nnoremap <leader>gt :execute tabnext . g:last_active_tab<cr>n" nnoremap <silent> <c-o> :execute tabnext . g:last_active_tab<cr>n" vnoremap <silent> <c-o> :execute tabnext . g:last_active_tab<cr>nnnoremap <silent> <leader>tt :execute tabnext . g:last_active_tab<cr>nautocmd TabLeave * let g:last_active_tab = tabpagenr()nn" 新建tab Ctrl+tnnnoremap <C-t> :tabnew<CR>ninoremap <C-t> <Esc>:tabnew<CR>n

選中後, 調整縮進, 可能需要多次調整, 默認調整一次後退出了選中, 需要再次選.

n

這個變更, 保證調整縮進後, 還是選中狀態

n

" 調整縮進後自動選中,方便再次操作nvnoremap < <gvnvnoremap > >gvn

複製動作的變更, Y, 複製到行末

n

" y$ -> Y Make Y behave like other capitalsnmap Y y$nn" 複製選中區到系統剪切板中nvnoremap <leader>y "+yn

選中全部/選中段落

n

" select allnmap <Leader>sa ggVG"nn" select blocknnnoremap <leader>v V`}n

保存, 沒許可權的時候

n

" w!! to sudo & write a filencmap w!! w !sudo tee >/dev/null %n

使用kj, 替換ESC

n

" kj 替換 Escninoremap kj <Esc>n

調整Ctrl-e/y滾動

n

" 滾動Speed up scrolling of the viewport slightlynnnoremap <C-e> 2<C-e>nnnoremap <C-y> 2<C-y>n

快捷保存和退出leader-q/w

n

" Quickly close the current windownnnoremap <leader>q :q<CR>nn" Quickly save the current filennnoremap <leader>w :w<CR>n

交換

n

" 交換 `, 使得可以快速使用跳到marked位置nnnoremap `nnnoremap ` n

變更U, 撤銷重做的時候更快

n

" remap U to <C-r> for easier redonnnoremap U <C-r>n

保存文件時, 自動移除多餘空格

n

" 保存python文件時刪除多餘空格nfun! <SID>StripTrailingWhitespaces()n let l = line(".")n let c = col(".")n %s/s+$//en call cursor(l, c)nendfunnautocmd FileType c,cpp,java,go,php,javascript,puppet,python,rust,twig,xml,yml,perl autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()n

shell和python文件新建時, 自動插入行頭

n

" 定義函數AutoSetFileHead,自動插入文件頭nautocmd BufNewFile *.sh,*.py exec ":call AutoSetFileHead()"nfunction! AutoSetFileHead()n "如果文件類型為.sh文件n if &filetype == shn call setline(1, "#!/bin/bash")n endifnn "如果文件類型為pythonn if &filetype == pythonn call setline(1, "#!/usr/bin/env python")n call append(1, "# encoding: utf-8")n endifnn normal Gn normal on normal onendfuncn

自定義一些高亮的關鍵字

n

" 設置可以高亮的關鍵字nif has("autocmd")n " Highlight TODO, FIXME, NOTE, etc.n if v:version > 701n autocmd Syntax * call matchadd(Todo, Wzs(TODO|FIXME|CHANGED|DONE|XXX|BUG|HACK))n autocmd Syntax * call matchadd(Debug, Wzs(NOTE|INFO|IDEA|NOTICE))n endifnendifn

其他一些設置

n

" 啟動的時候不顯示那個援助索馬利亞兒童的提示nset shortmess=atInn" 設置 退出vim後,內容顯示在終端屏幕, 可以用於查看和複製, 不需要可以去掉n" 好處:誤刪什麼的,如果以前屏幕打開,可以找回nset t_ti= t_te=nn" 滑鼠暫不啟用, 鍵盤黨....nset mouse-=ann" 回車即選中當前項, 慎用ninoremap <expr> <CR> pumvisible() ? "<C-y>" : "<CR>"n

推薦閱讀:

Vim到底可以配置得多漂亮?
有哪些完整的 Vim 視頻教程?
有哪些編程必備的 Vim 配置?

TAG:Vim | vimrc |