English: https://realpython.com/blog/python/vim-and-python-a-match-made-in-heaven/#vundle
在Ubuntu 16.04 LTS 下用Vim 打造自己的Python IDE https://www.jianshu.com/p/bc19b91354ef
問題總結: http://blog.csdn.net/jeff_liu_sky_/article/details/53955888
【Vim】使用map自定義快捷鍵: https://www.jianshu.com/p/8ae25a680ed7
本文由編程派-EarlGrey翻譯,原文出自realpython,是Vim的愛好者專門針對利用Sublime Text 3設置Python IDE一文所寫。譯者本人也是依照Sublime Text那篇文章配置的開發環境,但一直對Vim作爲神器的美名非常仰慕,又看到了一篇這麼全面的配置文章,覺得有必要翻譯過來與大家分享,想必可以省卻很多自己研究如何配置的時間。
譯文鏈接:http://codingpy.com/article/vim-and-python-match-in-heaven/
個人站點剛上線不久,歡迎大家訪問,提出寶貴意見。
我注意到,有人在realpython.com宣揚Sublime Text 3。作爲公司的資深開發人員(呃,也就是老古董),我覺得有義務介紹一個真正的Python開發環境給大家——我要推薦的當然就是Vim了。不錯,Vim編輯器無處不在,速度快,從來不會崩潰。並且,它能做任何事情!
不過,不利之處也有,就是Vim配置起來很讓人頭疼。但是,別擔心,本文將告訴你如何配置一個強大的Vim環境,專門用於天天搗鼓Python開發。
下面是最終效果預覽。
如果想充分地利用好本文,你應該對如何使用Vim和它的命令模式至少有一個基本的瞭解。如果你是初學者,你可以通過vim-adventure或者openvim網站學習。在繼續閱讀本文之前,請花點時間瀏覽那兩個網站的內容。
安裝
因爲許多Unix衍生系統已經預裝了Vim,我們首先要確認編輯器是否成功安裝:
vim --version
如果已經安裝了,你應該看到類似下面的文字:
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Nov 5 2014 21:00:28)
Compiled by [email protected]
Normal version without GUI. Features included (+) or not (-):
-arabic +autocmd -balloon_eval -browse +builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
-conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs
-dnd -ebcdic -emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path
+find_in_path +float +folding -footer +fork() -gettext -hangul_input +iconv
+insert_expand +jumplist -keymap -langmap +libcall +linebreak +lispindent
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape
-mouse_dec -mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse
+mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype
+path_extra -perl +persistent_undo +postscript +printer -profile +python/dyn
-python3 +quickfix +reltime -rightleft +ruby/dyn +scrollbind +signs
+smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary
+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title
-toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo
+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
-xterm_clipboard -xterm_save
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -D_FORTIFY_SOURCE=0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipe
Linking: gcc -arch i386 -arch x86_64 -o vim -lncurses
在這一步,你要確保已經滿足以下兩點要求:
- Vim編輯版本應該大於7.3。
- 支持Python語言。在所選編輯器的功能中,確保你看到了
+python
。
如果滿足上述要求,接下來可以安裝Vim擴展了。如果不滿足,則需要安裝/升級。
OS X
如果沒有Homebrew,建議馬上安裝,並運行:
brew update
brew install vim
Unix衍生系統
Debian或Ubuntu系統,可以使用下面的代碼:
sudo apt-get remove vim-tiny
apt-get update
apt-get install vim
如果是其他版本的Linux系統,請查閱相應版本包管理器的文檔。不清楚的話,可以先閱讀這篇文章:安裝Vim
Windows
Windows系統下安裝Vim有很多種方法。請查閱官方文檔。
驗證安裝
確保你已經安裝了7.3版本以上、支持Python的Vim編輯器。你可以再次運行vim --version
進行確認。如果你想知道Vim中使用的Python版本,你可以在編輯器中運行:python import sys; print(sys.version)
。
2.7.6 (default, Sep 9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)]
這行命令會輸出你的編輯器當前的Python版本。如果報錯,那麼你的編輯器就不支持Python語言,需要重裝或重新編譯。
Vim編輯器安裝完成後,我們來看看如何將其設置爲Python開發的強大環境。
Vim擴展
Vim本身能夠滿足開發人員的很多需求,但是它的可擴展性也極強,並且已經有一些殺手級的擴展,可以讓Vim擁有“現代”集成開發環境的特性。所以,你所需要的第一件東西就是一個好用的擴展管理器。
Vim的擴展通常也被成爲bundle或插件。
Vundle
Vim有多個擴展管理器,但是我們強烈推薦Vundle。你可以把它想象成Vim的pip。有了Vundle,安裝和更新包這種事情不費吹灰之力。
我們現在來安裝Vundle:
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
該命令將下載Vundle插件管理器,並將它放置在你的Vim編輯器bundles文件夾中。現在,你可以通過.vimrc配置文件來管理所有擴展了。
將配置文件添加到你的用戶的home文件夾中:
touch ~/.vimrc
接下來,把下來的Vundle配置添加到配置文件的頂部:
set nocompatible " 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 'gmarik/Vundle.vim'
" Add all your plugins here (note older versions of Vundle used Bundle instead of Plugin)
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
這樣,你就完成了使用Vundle前的設置。之後,你就可以在配置文件中添加希望安裝的插件,然後打開Vim編輯器,運行下面的命令:
:PluginInstall
這個命令告訴Vundle施展它的魔法——自動下載所有的插件,併爲你進行安裝和更新。
對於Windows用戶,請查閱Windows安裝指南。
開始打造IDE吧
本文不可能列舉Vim的全部功能,只能快速介紹一些Vim自帶的強大功能,它們對於Python開發來說是非常有用的。
扔掉鼠標
或許,Vim編輯器最重要的功能就是它不要求使用鼠標(除了GUI版本外)。一開始,你可能會覺得這是個非常糟糕的做法,但是隻要你投入時間——是的,這很花時間——學習快捷組合鍵,就可以大幅提升工作流的速度。
分割佈局(Split Layouts)
使用:sv <filename>
命令打開一個文件,你可以縱向分割佈局(新文件會在當前文件下方界面打開),使用相反的命令:vs <filename>
, 你可以得到橫向分割佈局(新文件會在當前文件右側界面打開)。
你還可以嵌套分割佈局,所以你可以在分割佈局內容再進行分割,縱向或橫向都可以,直到你滿意爲止。衆所周知,我們開發時經常需要同時查看多個文件。
專業貼士:記得在輸入完:sv
後,利用tab補全功能,快速查找文件。
專業貼士:你還可以指定屏幕上可以進行分割佈局的區域,只要在.vimrc
文件中添加下面的代碼即可:
set splitbelow
set splitright
專業貼士:想要不使用鼠標就切換分割佈局嗎?只要將下面的代碼添加到.vimrc
文件中,你就可以通過快捷組合鍵進行切換。
"split navigations
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>
組合快捷鍵:
Ctrl-j
切換到下方的分割窗口Ctrl-k
切換到上方的分割窗口Ctrl-l
切換到右側的分割窗口Ctrl-h
切換到左側的分割窗口
換句話說, 按Ctrl
+Vim的標準移動鍵,就可以切換到指定窗口。
等等,
nnoremap
是什麼意思?——簡單來說,nnoremap
將一個組合快捷鍵映射爲另一個快捷鍵。一開始的n
,指的是在Vim的正常模式(Normal Mode)下,而不是可視模式下重新映射。基本上,nnoremap <C-J> <C-W><C-j>
就是說,當我在正常模式按下<C-J>時,進行<C-W><C-j>操作。更多信息請看這裏。
緩衝區(Buffers)
雖然Vim支持tab操作,仍有很多人更喜歡緩衝區和分割佈局。你可以把緩衝區想象成最近打開的一個文件。Vim提供了方便訪問近期緩衝區的方式,只需要輸入:b <buffer name or number>
,就可以切換到一個已經開啓的緩衝區(此處也可使用自動補全功能)。你還可以通過ls
命令查看所有的緩衝區。
專業貼士: 在:ls
命令輸出的最後,Vim會提示“敲擊Enter繼續查看”,這時你可以直接輸入:b <buffer name>
,立即選擇緩衝區。這樣可以省掉一個按鍵操作,也不必去記憶緩衝區的名字。
代碼摺疊(Code Folding)
大多數“現代”集成開發環境(IDE)都提供對方法(methods)或類(classes)進行摺疊的手段,只顯示類或方法的定義部分,而不是全部的代碼。
你可以在.vimrc
中添加下面的代碼開啓該功能:
" Enable folding
set foldmethod=indent
set foldlevel=99
這樣就可以實現,但是你必須手動輸入za
來摺疊(和取消折疊)。使用空格鍵會是更好的選擇。所以在你的配置文件中加上這一行命令吧:
" Enable folding with the spacebar
nnoremap <space> za
現在你可以輕鬆地隱藏掉那些當前工作時不需要關注的代碼了。
第一個命令,set foldmethod=ident
會根據每行的縮進開啓摺疊。但是這樣做會出現超過你所希望的摺疊數目。但是別怕,有幾個擴展就是專門解決這個問題的。在這裏,我們推薦SimplyFold。在.vimrc
中加入下面這行代碼,通過Vundle進行安裝:
Plugin 'tmhedberg/SimpylFold'
不要忘記執行安裝命令:
:PluginInstall
專業貼士: 希望看到摺疊代碼的文檔字符串?
let g:SimpylFold_docstring_preview=1
Python代碼縮進
當然,想要代碼摺疊功能根據縮進情況正常工作,那麼你就會希望自己的縮進是正確的。這裏,Vim的自帶功能無法滿足,因爲它實現不了定義函數之後的自動縮進。我們希望Vim中的縮進能做到以下兩點:
- 首先,縮進要符合PEP8標準。
- 其次,更好地處理自動縮進。
PEP8
要支持PEP8風格的縮進,請在.vimrc
文件中添加下面的代碼:
au BufNewFile,BufRead *.py
\ set tabstop=4
\ set softtabstop=4
\ set shiftwidth=4
\ set textwidth=79
\ set expandtab
\ set autoindent
\ set fileformat=unix
這些設置將讓Vim中的Tab鍵就相當於4個標準的空格符,確保每行代碼長度不超過80個字符,並且會以unix格式儲存文件,避免在推送到Github或分享給其他用戶時出現文件轉換問題。
另外,對於全棧開發,你可以設置針對每種文件類型設置au
命令:
au BufNewFile,BufRead *.js, *.html, *.css
\ set tabstop=2
\ set softtabstop=2
\ set shiftwidth=2
自動縮進
自動縮進有用,但是在某些情況下(比如函數定義有多行的時候),並不總是會達到你想要的效果,尤其是在符合PEP8標準方面。我們可以利用indentpython.vim插件,來解決這個問題:
Plugin 'vim-scripts/indentpython.vim'
標示不必要的空白字符
我們希望避免出現多餘的空白字符。可以讓Vim幫我們標示出來,使其很容易發現並刪除。
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/
這會將多餘的空白字符標示出來,很可能會將它們變成紅色突出。
支持UTF-8編碼
大部分情況下,進行Python開發時你應該使用UTF-8編碼,尤其是使用Python 3的時候。確保Vim設置文件中有下面的命令:
set encoding=utf-8
自動補全
支持Python自動補全的最好插件是YouCompleteMe。我們再次使用Vundle安裝:
Bundle 'Valloric/YouCompleteMe'
YouCompleteMe插件其實底層使用了一些不同的自動補全組件(包括針對Python開發的Jedi),另外要安裝一些C庫才能正常工作。插件官方文檔提供了很好的安裝指南,我就不在這裏重複了。切記跟隨文檔的步驟進行安裝。
安裝完成後,插件自帶的設置效果就很好,但是我們還可以進行一些小的調整:
let g:ycm_autoclose_preview_window_after_completion=1
map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR>
上面的第一行確保了在你完成操作之後,自動補全窗口不會消失,第二行則定義了“轉到定義”的快捷方式。
支持Virtualenv虛擬環境
上面“轉到定義”功能的一個問題,就是默認情況下Vim不知道virtualenv虛擬環境的情況,所以你必須在配置文件中添加下面的代碼,使得Vim和YouCompleteMe能夠發現你的虛擬環境:
"python with virtualenv support
py << EOF
import os
import sys
if 'VIRTUAL_ENV' in os.environ:
project_base_dir = os.environ['VIRTUAL_ENV']
activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
EOF
這段代碼會判斷你目前是否在虛擬環境中編輯,然後切換到相應的虛擬環境,並設置好你的系統路徑,確保YouCompleteMe能夠找到相應的site packages文件夾。
語法檢查/高亮
通過安裝syntastic插件,每次保存文件時Vim都會檢查代碼的語法:
Plugin 'scrooloose/syntastic'
還可以通過這個小巧的插件,添加PEP8代碼風格檢查:
Plugin 'nvie/vim-flake8'
最後,讓你的代碼變得更漂亮:
let python_highlight_all=1
syntax on
配色方案
配色方案可以和你正在使用的基礎配色共同使用。GUI模式可以嘗試solarized方案, 終端模式可以嘗試Zenburn方案:
Plugin 'jnurmine/Zenburn'
Plugin 'altercation/vim-colors-solarized'
接下來,只需要添加一點邏輯判斷,確定什麼模式下使用何種方案就可以了:
if has('gui_running')
set background=dark
colorscheme solarized
else
colorscheme Zenburn
endif
Solarized方案同時提供了暗色調和輕色調兩種主題。要支持切換主題功能(按F5)也非常簡單,只需添加:
call togglebg#map("<F5>")
文件瀏覽
如果你想要一個不錯的文件樹形結構,那麼NERDTree是不二之選。
Plugin 'scrooloose/nerdtree'
如果你想用tab鍵,可以利用vim-nerdtree-tabs插件實現:
Plugin 'jistr/vim-nerdtree-tabs'
還想隱藏.pyc文件?那麼再添加下面這行代碼吧:
let NERDTreeIgnore=['\.pyc$', '\~$'] "ignore files in NERDTree
超級搜索
想要在Vim中搜索任何文件?試試ctrlP插件吧:
Plugin 'kien/ctrlp.vim'
正如插件名,按Ctrl+P就可以進行搜索。如果你的檢索詞與想要查找的文件相匹配的話,這個插件就會幫你找到它。哦,對了——它不僅僅可以搜索文件,還能檢索標籤!更多信息,可以觀看這個Youtube視頻。
顯示行號
開啓顯示行號:
set nu
Git集成
想要在Vim中執行基本的Git命令?vim-fugitive插件則是不二之選。
Plugin 'tpope/vim-fugitive'
請看Vimcasts的這部視頻,瞭解更多情況。
Powerline狀態欄
Powerline是一個狀態欄插件,可以顯示當前的虛擬環境、Git分支、正在編輯的文件等信息。
這個插件是用Python編寫的,支持諸如zsh、bash、tmux和IPython等多種環境。
Plugin 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}
請查閱插件的官方文檔,瞭解配置選項。
系統剪貼板
通常Vim會忽視系統剪貼板,而使用自帶的剪貼板。但是有時候你想從Vim之外的程序中剪切、複製、粘貼文本。在OS X平臺上,你可以通過這行代碼訪問你的系統剪貼板:
set clipboard=unnamed
Shell開啓Vim編輯模式
最後,當你熟練掌握了Vim和它的鍵盤快捷方式之後,你會發現自己經常因爲shell中缺乏相同的快捷鍵而懊惱。沒關係,大部分的shell程序都有Vi模式。在當前shell中開啓Vi模式,你只需要在~/.inputrc
文件中添加這行代碼:
set editing-mode vi
現在,你不僅可以在shell中使用Vim組合快捷鍵,還可以在Python解釋器以及任何利用GNU Readline程序的工具(例如,大多數的數據庫shell)中使用。現在,你在什麼地方都可以使用Vim啦!
結語
Vim的設置到這裏就差不多了(至少對於Python開發來說是這樣的)。當然,開源世界裏還有大量你可以使用的其他擴展,以及本文中所提到插件的替代品。你最喜愛的擴展是什麼?你又是如何將Vim設置符合你喜好的?
這是我本人的Vim配置文件鏈接。你有沒有自己的設置代碼?請與我們分享!
謝謝!
資源
- Vim Tutor是Vim自帶的程序,安裝結束之後,只要在命令行輸入
vimtutor
即可,程序將會用Vim編輯器教你如何使用Vim。 - Vimcasts是一系列的高階視頻教程,內容涉及許多Vim的功能。
- Vim官方文檔
- Open Vim
- 笨辦法學Vimscript是學習vimscript的極好材料。
全文結束
網友評論精選
譯者也按照本文的步驟,在Vagrant虛擬機上嘗試了Vim設置,但是可惜在YouCompleteMe插件那遇到了些問題,沒有繼續配置下去。在原文頁,我也發現一些網友留言,說根據本文的建議進行了設置,但是碰到了問題。最後,譯者從中摘取了部分,供大家參考。
Wei-Hao Lin
The commands in "Python Indentation" keep throwing "e518: unknown option: set", so i altered it and it works fine as following:
au BufNewFile,BufRead *.py
\ set tabstop=4 |
\ set softtabstop=4 |
\ set shiftwidth=4 |
\ set textwidth=79 |
\ set expandtab |
\ set autoindent |
\ set fileformat=unix |
au BufNewFile,BufRead *.js,*.html,*.css
\ set tabstop=2 |
\ set softtabstop=2 |
\ set shiftwidth=2 |
**Konstantin Gagarin **
change powerline to airlineand add powerline fonts.
**Ruslan Kiianchuk **
It seems like the hack with Python virtualenv can be solved with plugin without the need to pollute vimrc with Python code: https://github.com/jmcantrell/vim-virtualenv
作者:EarlGrey
鏈接:https://www.jianshu.com/p/bc19b91354ef
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
在Ubuntu 16.04 LTS 下用Vim 打造自己的Python IDE 問題總結
原文英文地址:https://realpython.com/blog/python/vim-and-python-a-match-made-in-heaven/
原文中文地址:http://www.jianshu.com/p/bc19b91354ef
安裝過程遇到的問題及解決方案
1. 按照步驟安裝之前
原作者並沒有給出安裝 https://github.com/amix/vimrc 的步驟,只是給了一個鏈接,所以這個首先要配置上,它是別人vim的一個配置。
2. Python 代碼縮進問題
以下是原作者在~/.vimrc中的設置方法:
au BufNewFile,BufRead *.py
\ set tabstop=4
\ set softtabstop=4
\ set shiftwidth=4
\ set textwidth=79
\ set expandtab
\ set autoindent
\ set fileformat=unix
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
按照步驟設置過程中遇到如下問題:
Error detected while processing BufRead Auto commands for "*.py":
E518: Unknown option: set
- 1
- 2
原因分析:如果自動縮進的 set 設置有多項並且在多行,每一項後面要用空格加豎線分割|
(最後一項除外)
解決辦法網址:http://stackoverflow.com/questions/36741450/vim-setting-error-under-bufread/36742908
最後調整如下:
au BufNewFile,BufRead *.py
\ set tabstop=4 |
\ set softtabstop=4 |
\ set shiftwidth=4 |
\ set textwidth=79 |
\ set expandtab |
\ set autoindent |
\ set fileformat=unix
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3. 標示不必要的空白字符出現的問題
以下是原作者在~/.vimrc中的設置方法:
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/
- 1
設置過程中遇到的問題:
E28: No such highlight group name: BadWhitespace
- 1
原因分析:提前沒有對BadWhitespace
進行聲明
解決辦法網址:http://stackoverflow.com/questions/11087041/gvim-to-custom-highlight-group-in-vimrc-not-working
最後調整如下:
"Flagging Unnecessary Whitespace
highlight BadWhitespace ctermbg=red guibg=darkred
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/
- 1
- 2
- 3
4. 安裝YouCompleteMe
原配置方法:
Bundle 'Valloric/YouCompleteMe'
- 1
這段代碼要放在~/.vimrc
中的。
安裝過程中問題:
ERROR: some folders in /home/jeff/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party are empty; you probably forgot to run:
git submodule update --init --recursive
- 1
- 2
按問題說明執行:
git submodule update --init --recursive
- 1
這個過程比較漫長,要有耐心。也可以按照以下鏈接安裝 http://www.linuxidc.com/Linux/2015-07/120352.htm
5. 轉到定義快捷方式不起作用
原配置方法:
let g:ycm_autoclose_preview_window_after_completion=1
map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR>
- 1
- 2
這裏的leader
是指自己自定義vim組合快捷鍵的時候的第一個鍵,原作者是空格鍵,你要看一下自己的leader
快捷鍵是哪一個,如果你第一步安裝成功了,那麼mapleader
應該是逗號,
,然後再用map命令看一下g是否已經被用了
:map
- 1
最後我的配置把g 調整成了q:
let g:ycm_autoclose_preview_window_after_completion=1
map <leader>q :YcmCompleter GoToDefinitionElseDeclaration<CR>
- 1
- 2
6. 配色方案中出現的問題
原作者有一段代碼如下:
if has('gui_running')
set background=dark
colorscheme solarized
else
colorscheme Zenburn
endif
- 1
- 2
- 3
- 4
- 5
- 6
結果配置過程報錯如下:
Error detected while processing /home/jeff/.vimrc:
line 512:
E14: Invalid address
line 513:
E185: Cannot find color scheme 'Zenburn'
- 1
- 2
- 3
- 4
- 5
這個有點搞笑,最後發現竟然是大小寫的原因,把代碼中的Zenburn
修改成zenburn
即可。
修改如下:
if has('gui_running')
set background=dark
colorscheme solarized
else
colorscheme zenburn
endif
- 1
- 2
- 3
- 4
- 5
- 6
最終效果如下(前提是對vim命令比較熟悉):
map簡介
map是一個映射命令,將常用的很長的命令映射到一個新的功能鍵上。map是Vim強大的一個重要原因,可以自定義各種快捷鍵,用起來自然得心應手。
映射的種類
有五種映射存在:
- 用於普通模式: 輸入命令時。
- 用於可視模式: 可視區域高亮並輸入命令時。
- 用於操作符等待模式: 操作符等待中 ("d","y","c" 等等之後)。
- 用於插入模式: 也用於替換模式。
- 用於命令行模式: 輸入 ":" 或 "/" 命令時。
幾種模式的介紹
Normal Mode
也就是最一般的普通模式,默認進入vim之後,處於這種模式。Visual Mode
一般譯作可視模式,在這種模式下選定一些字符、行、多列。
在普通模式下,可以按v進入。Insert Mode
插入模式,其實就是指處在編輯輸入的狀態。普通模式下,可以按i進入。Select Mode
選擇模式。用鼠標拖選區域的時候,就進入了選擇模式。和可視模式不同的是,在這個模式下,選擇完了高亮區域後,敲任何按鍵就直接輸入並替換選擇的文本了。和windows下的編輯器選定編輯的效果一致。普通模式下,可以按gh進入。Command-Line/Ex Mode
命令行模式和Ex模式。兩者略有不同,普通模式下按冒號(:)進入Command-Line模式,可以輸入各種命令,
使用vim的各種強大功能。普通模式下按Q進入Ex模式,其實就是多行的Command-Line模式。
命令的組合
同Vim下的其他命令一樣,命令的名字往往由好幾段組成。前綴作爲命令本身的修飾符,微調命令的效果。
對於map而言,可能有這麼幾種前綴:
- nore
表示非遞歸。
遞歸的映射。其實很好理解,也就是如果鍵a被映射成了b,c又被映射成了a,如果映射是遞歸的,那麼c就被映射成了b。- n
表示在普通模式下生效- v
表示在可視模式下生效- i
表示在插入模式下生效- c
表示在命令行模式下生效
普通模式的映射命令
map
命令格式::map {lhs} {rhs}
其含義是,在:map作用的模式中把鍵系列 {lhs} 映射爲 {rhs},{rhs}可進行映射掃描,也就是可遞歸映射。
舉例::map td :tabnew .<cr>
含義:在其作用模式(普通、可視、操作符)下,輸入td等價於輸入 :tabnew . <cr>。而普通模式下輸入:tabnew . <cr>就是打開當前目錄
如果再定義綁定 :map ts td,就是指在其作用模式下輸入ts等價於td,也就是打開當前目錄。不過如果沒有特殊需要,一般不建議遞歸映射。
noremap
:noremap和:map命令相對,作用模式和命令格式都相同,只不過不允許再對{rhs}進行映射掃描,也就是{lhs}定義後的映射就是{rhs}的鍵序列,不會再對{rhs}鍵序列重新解釋掃描。它一般用於重定義一個命令,當然如果:map不需要遞歸映射的話,建議使用:noremap
比如::noremap ts td
它的意思是在其作用模式下,輸入ts就是輸入td,但是和:map不同的是,此時td再不會做進一步掃描解釋。雖然之前已經定義了td,但是不會對td再做掃描。
unmap
:unmap是對應取消:map綁定的{lhs},作用模式相同,命令格式 :unmap {lhs}。
例如::unmap td
就是取消在其作用模式中td的綁定,比如之前td被綁定爲:tabnew .<cr>,此時此綁定消失。
mapclear
:mapclear時對應取消所有:map綁定的,慎用!
只用於普通模式的
:nmap
:nmap是:map的普通模式板,也就是說其綁定的鍵只作用於普通模式。
例如:
:nmap td :tabnew .<cr> 和 :map td :tabnew .<cr> 在普通模式下等效
:nnoremap
:nnorempa和:nmap的關係和:noremap和:map的關係一樣,只是:nmap的非遞歸版
:nunmap
:nunmap和:nmap的關係和:unmap和:map的關係一樣,取消:nmap的綁定。
:nmapclear
:nmapclear是對應取消所有:map綁定的,慎用!
另外
{rhs} 之前可能顯示一個特殊字符:
- 表示它不可重映射
& 表示僅腳本的局部映射可以被重映射
@ 表示緩衝區的局部映射
到這一步你可以輕鬆的長吸一口氣,因爲相關的命令已經都瞭解了,記不住沒關係,可以隨時:help map一下。
鍵表
<k0> - <k9> 小鍵盤 0 到 9
<S-...> Shift+鍵
<C-...> Control+鍵
<M-...> Alt+鍵 或 meta+鍵
<A-...> 同 <M-...>
<Esc> Escape 鍵
<Up> 光標上移鍵
<Space> 插入空格
<Tab> 插入Tab
<CR> 等於<Enter>
特殊參數
有些特殊參數必須映射命令的後邊,在其他任何參數的前面。
<buffer>
<buffer>如果這些映射命令的第一個參數是<buffer>,映射將只侷限於當前緩衝區(也就是你此時正編輯的文件)內。比如:
:map <buffer> ,w /a<CR>
它的意思時在當前緩衝區裏定義鍵綁定,“,w”將在當前緩衝區裏查找字符a。同樣你可以在其他緩衝區裏定義:
:map <buffer> ,w /b<CR>
比如我經常打開多個標籤(:tabedit),想要在各自標籤裏定義",w"鍵綁定,那麼你只要在每個標籤頁裏分別定義就可,其作用域也只在各自的標籤裏。同樣要清除這些緩衝區的鍵綁定也要加上<buffer>參數,比如:
:unmap <buffer> ,w
:mapclear <buffer>
<silent>
<silent>是指執行鍵綁定時不在命令行上回顯,比如:
:map <silent> ,w /abcd<CR>
你在輸入,w查找abcd時,命令行上不會顯示/abcd,如果沒有<silent>參數就會顯示出來。
<special>
<special>一般用於定義特殊鍵怕有副作用的場合。比如:
:map <special> <F12> /Header<CR>
<expr>
<expr>. 如果定義新映射的第一個參數是<expr>,那麼參數會作爲表達式來進行計算,結果使用實際使用的<rhs>,例如:
:inoremap <expr> . InsertDot()
這可以用來檢查光標之前的文本並在一定條件下啓動全能 (omni) 補全。
一個例子:
let counter = 0
inoremap <expr> <C-L> ListItem()
inoremap <expr> <C-R> ListReset()
func ListItem()
let g:counter += 1
return g:counter . '. '
endfunc
func ListReset()
let g:counter = 0
return ''
endfunc
在插入模式下,CTRL-L插入順序的列表編號,並返回;CTRL-R復位列表編號到0,並返回空。
<unique>
<unique>一般用於定義新的鍵映射或者縮寫命令的同時檢查是否該鍵已經被映射,如果該映射或者縮寫已經存在,則該命令會失敗
<Leader>和mapleader變量
mapleader變量對所有map映射命令起效,它的作用是將參數<leader>替換成mapleader變量的值,比如:
:map <Leader>A oanother line<Esc>
如果mapleader變量沒有設置,則用默認的反斜槓代替,因此這個映射等效於:
:map \A oanother line<Esc>
意思時輸入\A鍵時,在下一行輸入another line並返回到普通模式。
如果設置了mapleader變量,比如:
let mapleader = ","
那麼就等效於:
:map ,A oanother line<Esc>
<LocalLeader>和maplocalleader變量
<LocalLeader>和<Leader>類似,只不過它只作用於緩衝區。
因此在設置mapleader和maplocalleader時最好區分開,不要出現衝突。
轉載請註明作者Jason Ding及其出處
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
Github博客主頁(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354進入我的博客主頁
作者:JasonDing
鏈接:https://www.jianshu.com/p/8ae25a680ed7
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。