Vim一些實用技巧

Vim中的幾種模式

  • 正常模式normal
    正常模式下輸入esc可返回到正常模式
  • 命令模式command
    正常模式下輸入:或者/進入命令模式
  • 插入模式insert
    正常模式下按下i鍵進入插入模式
  • 可視模式visual
    可視模式是選中一塊區域進行操作(刪除/替換/複製/粘貼/改變大小寫等)。
    在正常模式下按v(小寫)進入字符文本, 按V(大寫)進入行文本,按ctrl+v進入塊文本
    在visual模式下d進行刪除, y進行復制, p進行粘貼, r進行文本替換, gu轉換爲小寫, gU轉化爲大寫, g~大小寫互換。
    塊模式下在行首插入(如多行註釋): 進入塊模式後可通過o/O ( 這裏是字母o的大小寫 ) 來切換角)輸入shift+i進入編輯模式,然後輸入#按下兩次ESC鍵即可神奇的看見所選擇的所有行行首都有#
    塊模式下在行尾插入: 只需將上面的i改爲a即可。

Vim光標移動

正常模式下
h 左移, j 下移, k 上移, l 右移, 0 行首, $ 行尾
當然方向鍵也是可以的。

Vim中的Split Layouts(分割佈局)

  • 輸入 :help split 查看幫助(以冒號開頭的都是命令模式下執行的,後面不再贅述)
    :sp filename 水平分割
    :vs filename 垂直分割
    ctrl w 方向鍵(方向鍵也可用hjkl代替)可切換窗口

  • 調整垂直分屏的寬度
    :vertical res[ize] N:vertical resize 80

    • 實時調整當前窗口寬度
      ctrl w > 向右加寬(寬度默認加1)
      ctrl w N > 向右加寬N
      ctrl w <同理
    • 將當前窗口移動到最左邊 ctrl w H 最右邊 ctrl w L.
  • 調整水平分屏的高度
    :res[ize] N:res 40

    • 實時調整當前屏的高度 ctrl w + 調高默認加1 ctrl w N + 調低ctrl w -同理
    • 將當前窗口移動到最頂端 ctrl w K 最底端 ctrl w J

vim在系統剪切板的複製與粘貼

vim有很多registers(寄存器)可通過:reg查看,:help registers查看registers幫助。
輸入:reg查看vim裏的寄存器

  • 寄存器的簡單使用
    "1y 表示把選取內容複製到數字寄存器1
    "ap 表示粘貼字母a寄存器內容

從vim裏拷貝內容後無法粘貼到vim之外的其他地方是由於在vim裏拷貝(如通過yy命令)的內容是放在一個寄存器裏,和系統剪切板是不同的地方,"+寄存器纔是和系統剪切板相聯繫的。
執行vim --version|grep "clipboard" 如果是加號就表示支持否則不支持,即輸入:reg看不到"+寄存器
如下圖所示當前的vim就不支持clipboard
查看當前vim是否支持clipboard
引用官方文檔的一句話

  1. Selection and drop registers "*, "+ and "~
    Use these registers for storing and retrieving the selected text for the GUI.
    See quotestar and quoteplus. When the clipboard is not available or not
    working, the unnamed register is used instead. For Unix systems the clipboard
    is only available when the +xterm_clipboard feature is present. {not in Vi}

講述vim的複製粘貼(包括系統剪切板)

Linux命令行下實用的命令

ctrl a 將光標快速移動到行首
ctrl e 將光標快速移動到行尾
ctrl r 在歷史命令中查找,連續執行可以一直向上查找帶關鍵字的命令
ctrl w 快速刪除光標附近前面的一個詞(以空格隔開)(用backspace一個個刪除太慢了)
ctrl u 刪除命令行上光標到行首所有已經輸入的字符
ctrl k 刪除命令行上光標到行尾所有已經輸入的字符
Esc b 跳到上一個單詞,Esc f 跳到下一個單詞。d表示backward,f表示forward
ctrl y 粘貼ctrl wctrl uctrl k 刪除的文本
cd - 會將當前目錄切換到上一次所在目錄(注意是上一次,在進入到某個深層的目錄後不小心返回到其他目錄時很有用)
ctrl l 清空當前屏幕, 效果等同於clear

!(驚歎號)的秒用
  1. ![number] 可以執行歷史命令
    此處的number特指通過history命令輸出的序號(省了人工查找的時間,特別是命令很長的時候)
  2. 表示邏輯非
    如刪除jar以外的文件可執行rm -rf !(*.jar)。但是必須要在Bash下開啓extglob。
    Bash下extglob的開啓關閉 shopt -s/-u extglob-s表示打開 -u表示關閉 可執行shopt |grep "extglob"查看是否打開。

匹配模式如下

?(pattern-list) - 所給模式匹配0次或1次; 
*(pattern-list) - 所給模式匹配0次以上包括0次;
+(pattern-list) - 所給模式匹配1次以上包括1次; 
@(pattern-list) - 所給模式僅僅匹配1次;
!(pattern-list) - 不匹配括號內的所給模式。

!還有其他的用處,但是經過考查暫不適用我,故不在此處繼續討論。

Linux中的&& || ()

cmd1 && cmd2 當cmd1執行成功(返回0表示成功)時才執行cmd2
cmd1 || cmd2 當cmd1執行失敗(返回1表示失敗)時才執行cmd2
(cmd1; cmd2; cmd3; ...) 命令組合
下面命令就是 如果dir_name文件夾存在就不創建構否則就創建

dir_name=/root/def
[ -d $dir_name ] && echo "$dir_name aleady exists." || (echo "$dir_name does not exist."; mkdir -p $dir_name)

vim中常用實用的技巧

  • vimdiff 比較兩個文件的不同
    vimdiff file1 file2
    ]c 跳到下一個不同點
    [c 跳到上一個不同點
    do 將另一個窗口的內容obtain到當前窗口
    dp 將當前窗口的內容paste到另一個窗口
  • dip 可以刪除所有臨近的空白行
  • :g/^\s*$/d 可以刪除當前文檔中的所有空白行
  • :nohl 清除vim搜索後的高亮
  • zz 重繪屏幕並把當前行顯示在窗口正中間使用(結合set cursorline很好用)
  • zt 將當前光標所在行移到窗口的頂端
  • zb 將當前光標所在行移到窗口的底部
  • ctrl r % 在插入模式下可將當前文件名輸入到文件中
  • :r filename 讀取某個文件並將文件內容插入到當前光標後
  • nl 移動光標到當前行的第n列
  • d$ 刪除當前光標到本行行尾的所有內容 $移動光標到行尾
  • d0 刪除當前光標到本行行首的所有內容 0移動光標到行首
  • xp 調換Vim當前光標之後的兩個字符的順序
  • ra 修改當前光標所在字符爲a
  • :saveas filename 另存爲文件
  • x(小寫)刪除光標後的字符,X(大寫)刪除光標前的字符
  • A 在當前行後添加 I 在當前行首添加 ----對應的小寫i和a
  • 輸入 o/O 將在光標的下方/上方打開新的一行並進入插入模式
  • 許多改變文本的命令都由一個操作符和一個動作構成 operator [number] motion其中number是可選的,motion代表操作符的操作對象,有如下三個
    • w - 從當前光標當前位置直到下一個單詞起始處,不包括它的第一個字符。
    • e - 從當前光標當前位置直到單詞末尾,包括最後一個字符。
    • $ - 從當前光標當前位置直到當前行末。
      例如d2w就表示從當前光標刪除2個單詞
      如果不加operator就表示移動光標2w表示光標向前移動2個單詞
  • 互換兩行*(多行同理),使用dd+p的組合命令的方式,
a)this line is a.
b)this line is b.

先對a)進行dd操作,刪除的行會保存在vim的一個寄存器裏,然後在b)進行p操作就會將兩行對調

  • ce 改變文本直到一個單詞的末尾,不僅僅是刪除了一個單詞,它也進入插入模式了,c命令也符合operator [number] motion,如c$就是刪除當前光標到行尾的所有字符並進入插入模式
  • ctrl g 顯示當前文件狀態信息
    gg 跳至文件第一行
    :num 跳至文件第num行
    num然後輸入G 也是跳至文件第num行
    G 跳至文件最後一行
  • 搜索相關
    • / 字符 會向後搜索字符 n表示下一個 N表示反向的上一個
    • ? 字符 會向前搜索字符
      要回到您之前的位置按 ctrl o。重複按可以回退更多步。ctrl i 會跳轉到較新的位置
  • 配對括號的查找,輸入 % 可以查找配對的括號 )、]、}
  • 替換命令
    • :s/thee/the 該命令只改變當前光標所在行的第一個匹配串
    • :s/thee/the/g 該命令則是替換當前光標所在行的所有匹配串
    • :#,#s/old/new/g 其中 #,# 代表的是替換操作的若干行中首尾兩行的行號。
    • :%s/old/new/g 則是替換整個文件中的每個匹配串。
    • :%s/old/new/gc 會找到整個文件中的每個匹配串,並且對每個匹配串提示是否進行替換。
      c會在替換前進行提示
  • vim內執行外部命令的方式
    輸入 :! 然後緊接着輸入一個外部命令可以執行該外部命令。如 :!pwd :!python -V
    所有的外部命令都可以以這種方式執行,包括帶命令行參數的那些。所有的 : 命令都必須以敲 <回車> 鍵結束。
  • :w FILENAME 可將當前 VIM 中正在編輯的文件保存到名爲 FILENAME 的文件中,當前文件還是處於修改的狀態。如果是用 :saveas FILENAME 那麼會另存爲 FILENAME並且還原當前文件的原始狀態。
  • 保存文件的部分內容
    按V進入visual模式的行文本,選擇完後輸入:會在屏幕底部出現:'<,'>
    然後輸入w filename 即完整命令是:'<,'>w filename
  • :r FILENAME向當前文件中插入另外的文件的內容,還可以讀取外部命令的輸出 如 :r !pwd
  • 輸入大寫的 R 可連續替換多個字符(進入到替換模式,按ESC退出)
  • s 刪除光標所在字符並進入插入模式,前面可以接數字如5s刪除連續的5個字符並進入插入模式
  • S 刪除光標所在行並進入插入模式,前面可以接數字如5S刪除連續的5行並進入插入模式
  • vim也有自己的教學教程,在linux命令行下輸入vimtutor即可觀看30分鐘左右的教程,默認是英文版的,如果vim支持中文會自動變成中文版教程

vim插件管理器vundle

vundle託管在GitHub上,是vim的插件管理器,還有另一個插件管理器vim_plug,但個人就選擇了vundle作爲vim的插件管理器了。
安裝步驟如下,默認所有的配置插件就放在~/.vim/bundle目錄下。

  1. git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
  2. 將下面的內容放入到~/.vimrc文件(沒有則新建)裏。".vimrc文件裏是註釋的意思。如下內容也可從github上找到
set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'
" plugin from http://vim-scripts.org/vim/scripts.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
Plugin 'file:///home/gmarik/path/to/plugin'
" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList       - lists configured plugins
" :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
  1. 執行vim命令然後執行:PluginInstall
    或者在linux命令行下執行vim +PluginInstall +qall

至此就安裝好了vundle,接下來就開始安裝你所需要的vim插件吧

vimrc文件裏的配置及說明

  • 所有的Plugin配置如Plugin 'tmhedberg/SimpylFold'都需要放在call vundle#end()前面,每個插件具體的相關配置如修改映射鍵位可放在後面(下文有示例)
  • vim裏可設置鍵位映射map,具體規則如下
    在map命令前加上前綴可以組合成幾種不同的命令,表示在不同的Vim模式下生效。
    n 在普通模式 (normal) 下生效。
    i 在插入模式 (insert) 下生效。
    v 在可視化模式 (visual) 下生效。
    c 在命令模式 (command-line) 下生效。
    o 在命令等待時 (operator pending) 生效,比如輸入d之後會等待輸入下一個字符,可能是d或者數字
    un 刪除鍵的映射。
    nore 非遞歸 (non-recursive),意思是將a 映射爲b,b映射爲c,輸入a的時候不會被映射爲c,而只會映射爲b。
    以上前綴可以組合使用,比如 nnoremap,nunmap,vnoremap 等。不帶前綴的map命令默認對 normal 模式和 visual 模式生效。
    Vim :map 默認是遞歸映射模式。
    例如nnoremap U <C-r>就將U映射爲ctrl r的操作,即U等效於vim裏的撤銷操作
  • 常用配置
" 在編輯模式下按F12來切換粘貼模式避免粘貼文本時格式錯誤(是由於自動縮進導致的)
set pastetoggle=<F12>

" 顯示相關
" F2來切換是否顯示行號
nnoremap <F2> :set nu! nu?<CR>
set nowrap "超過窗口寬度的行不自動迴繞顯示
set ruler " 顯示當前行號和列號
syntax on " 打開語法高亮顯示
set encoding=utf-8

" 啓用鼠標(此處註釋掉了)
" set mouse=a
" set selection=exclusive
" set selectmode=mouse,key

" 顯示空格和Tab鍵
set listchars=tab:>-,trail:-
" set list/nolist 來查看製表符和空格

" 自動縮進
set autoindent
set cindent

" vim查找配置
set hlsearch    " highlight searches "
set incsearch   " do incremental searching, search as you type "
set ignorecase  " ignore case when searching "
set smartcase   " no ignorecase if Uppercase char present "

" vim Tab製表符設置
set expandtab   " expand tabs to spaces "
set smarttab    " 表示插入 Tab 時使用 shiftwidth
set shiftround  " 表示縮進列數對齊到 shiftwidth 值的整數倍
set tabstop=4   " Tab鍵的寬度
set softtabstop=4 " 統一縮進爲4
set shiftwidth=4

" vim縮進配置
set autoindent smartindent
set cindent

" vim顯示當前光標位置  0可跳轉到行首 $可跳轉到行尾 輸入:linenumer可跳轉到指定行
" set cursorcolumn
set cursorline

" vim文件類型設置 新建py/sh文件時會自動創建文件頭
autocmd BufNewFile *.sh,*.py exec ":call AutoSetFileHead()"
function! AutoSetFileHead()
    call append(0, '#**********************************************')
    call append(1, '#')
    call append(2, '#      Filename: '.expand("%"))
    call append(3, '#')
    call append(4, '#        Author: WangTian')
    call append(5, '#   Description: ---')
    call append(6, '#        Create: '.strftime("%Y-%m-%d %H:%M:%S"))
    call append(7, '# Last Modified: '.strftime("%Y-%m-%d %H:%M:%S"))
    call append(8, '#')
    call append(9, '#**********************************************')
    call append(10, '')

    " .sh "
    if &filetype == 'sh'
    ¦   call append(11, "\#!/bin/bash")
    endif
    ¦   ¦
    " python "
    if &filetype == 'python'
    ¦   call append(11, "\# !/usr/bin/env python")
    ¦   call append(12, "\# encoding: utf-8")
    endif

    normal G
    normal o
    normal o
endfunc

" H移動到行首 L移動到行尾
nnoremap H ^
nnoremap L $
" u撤銷上次操作 ctrl+r取消撤銷 將ctrl+r改爲U
nnoremap U <C-r>

" vim內一鍵執行Python代碼"
map <F5> :call PRUN()<CR>
func! PRUN()
    exec "w"
    if &filetype == 'python'
    ¦   exec "!python %"
    endif
endfunc

vim中的實用插件

代碼摺疊插件SimpylFold

SimpylFold託管在Github上,項目名就是SimpylFold(不是拼寫錯誤)
.vimrc文件合適的地方寫上Plugin 'tmhedberg/SimpylFold'然後執行安裝即可(與vundle安裝步驟3一致,下同,不再贅述)
.vimrc文件增加如下配置

" Enable folding
set foldmethod=indent
set foldlevel=99
" 用空格摺疊或打開代碼"
nnoremap <space> za
" let g:SimpylFold_docstring_preview=1

zo 打開摺疊 zO 遞歸地打開摺疊
zc 摺疊代碼 zC 遞歸地摺疊代碼
za 摺疊/打開代碼 zA 遞歸地摺疊/打開代碼
故此處我就只映射了za爲空格鍵,這樣就能按空格鍵摺疊或打開代碼了,很方便。
更詳細的使用說明請去GitHub中查看。
SimpylFold強烈建議使用FastFold由於Vim的摺疊默認是很慢的。個人喜好,SimpylFold於我暫時夠用了。

Also strongly recommend using FastFold due to Vim's folding being extremely slow by default

圖示如下
摺疊前
摺疊後

模糊搜索插件CtrlP

Ctrlp託管在GitHub上,注意該搜索插件是在整個系統內搜索不是在當前編輯的文件裏搜索關鍵字。
.vimrc文件合適的地方寫上Plugin 'ctrlpvim/ctrlp.vim'然後執行安裝即可。
然後在vim編輯文件時在normal模式下輸入:Ctrlp或者敲命令ctrl p就可開啓,如下圖所示。
在這裏插入圖片描述
如果想更改快捷鍵,可在.vimrc文件添加如下配置

let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'

更詳細的使用說明請去GitHub中查看。

python代碼自動補全插件jedi-vim

jedi-vim託管在GitHub上,是一款非常好用的python代碼自動補全插件,YouCompleteMe也是很好用的python代碼自動補全插件,只不過YouCompleteMe需要vim版本必須至少是7.4.1578,否則就只能源碼重新編譯vim了,所以我這裏就直接用jedi-vim插件了,後面再嘗試YouCompleteMe
jedi-vim需要vim支持python,可通過vim --version|grep python查看
vim支持python
.vimrc文件合適的地方寫上Plugin 'davidhalter/jedi-vim'然後執行安裝即可。
.vimrc文件增加如下配置,修改觸發自動補全的配置,默認是ctrl space,會與輸入法快捷鍵衝突

" 設置ctrl n快捷鍵觸發jedi-vim自動補全(默認是ctrl space)
let g:jedi#completions_command = "<C-N>"

jedi-vim快捷鍵命令
<leader>d 或<leader>g 跳轉到函數定義
<leader>s 找到所有的function/class
<leader>K 展示document
<leader>r 重命名變量(包括函數名)
<leader>n 展示變量用到的地方
:Pyimport os 打開os模塊
默認情況<leader>對應的鍵是\,可通過let mapleader=","修改爲,

多色彩括號匹配插件rainbow_parentheses

rainbow_parentheses託管在GitHub上。很實用,區分度很高。
.vimrc文件合適的地方寫上Plugin 'kien/rainbow_parentheses.vim'然後執行安裝即可。
.vimrc文件增加如下配置

" 多括號彩色插件配置"
let g:rbpt_colorpairs = [
    \ ['brown',       'RoyalBlue3'],
    \ ['Darkblue',    'SeaGreen3'],
    \ ['darkgray',    'DarkOrchid3'],
    \ ['darkgreen',   'firebrick3'],
    \ ['darkcyan',    'RoyalBlue3'],
    \ ['darkred',     'SeaGreen3'],
    \ ['darkmagenta', 'DarkOrchid3'],
    \ ['brown',       'firebrick3'],
    \ ['gray',        'RoyalBlue3'],
    \ ['darkmagenta', 'DarkOrchid3'],
    \ ['Darkblue',    'firebrick3'],
    \ ['darkgreen',   'RoyalBlue3'],
    \ ['darkcyan',    'SeaGreen3'],
    \ ['darkred',     'DarkOrchid3'],
    \ ['red',         'firebrick3'],
    \ ]
let g:rbpt_max = 16
let g:rbpt_loadcmd_toggle = 0
au VimEnter * RainbowParenthesesToggle
au Syntax * RainbowParenthesesLoadRound
au Syntax * RainbowParenthesesLoadSquare
au Syntax * RainbowParenthesesLoadBraces

效果圖如下
在這裏插入圖片描述

縮進指示插件indentLine

indentLine託管在GitHub上,需要vim的版本至少是7.3,對於代碼的縮進格式有很直觀的幫助,便於發現問題。
.vimrc文件合適的地方寫上Plugin 'Yggdroot/indentLine'然後執行安裝即可。
:IndentLinesToggle命令打開/關閉顯示縮進指示線(可tab補全)
Indentline縮進效果圖

括號自動補全插件auto-pairs

auto-pairs託管在GitHub上。
.vimrc文件合適的地方寫上Plugin 'jiangmiao/auto-pairs'然後執行安裝即可。
會自動幫你添加或刪除成對的括號。

python pep8規範插件vim-autopep8

vim-autopep8託管在GitHub上,vim-autopep8插件會自動格式化Python代碼以符合PEP8格式,需要python安裝pep8

  1. pip安裝(用哪個版本的 Python 運行安裝腳本,pip 就被關聯到哪個版本)
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py   # 下載安裝腳本
python get-pip.py    # 運行安裝腳本
  1. 安裝pep8
pip install autopep8

.vimrc文件合適的地方寫上Plugin 'tell-k/vim-autopep8'然後執行安裝即可。
.vimrc文件增加如下配置
設置快捷鍵

" 設置F1爲開啓Autopep8的快捷鍵
autocmd FileType python noremap <buffer> <F1> :call Autopep8()<CR>

使用方法
:Autopep8可以格式化當前代碼
:Autopep8 --range 1 5 或者 :call Autopep8(" --range 1 5") 格式化第一到第五行代碼
:'<,'>Autopep8格式化選中代碼(如進入到visual模式的行文本)
效果圖如下
autopep8效果圖

python flake8語法檢測插件

flak8託管在GitHub上,flak8支持靜態語法檢查和PEP8風格檢查。
.vimrc文件合適的地方寫上Plugin 'nvie/vim-flake8'然後執行安裝即可。
.vimrc文件增加如下配置

" 每次保存py文件都執行flake檢測
autocmd BufWritePost *.py call flake8#Flake8()

默認情況下按F7就會執行flake8語法檢測,如果要修改快捷鍵,增加如下配置修改爲F3

autocmd FileType python map <buffer> <F3> :call flake8#Flake8()<CR>

最後

強烈推薦一個女程序員自己維護的vim教程網站,寫的很好!

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