給VIM添加REPL
來自專欄 vimer
REPL: 讀取-求值-輸出」循環(英語:Read-Eval-Print Loop,簡稱REPL)是一個簡單的,互動式的編程環境。
python作為一個動態語言,REPL在開發過程中起到了很大的作用。
可是一直以來用vim寫python沒有一個很好的,簡便的提供repl功能。也有類似的插件,比如vim-slime,但是它已經很久沒有更新並且使用起來需要tmux非常的複雜。
最近發現vim8提供了terminal功能和通訊方式。我使用這個功能實現了一個vim的repl插件。
sillybun/vim-repl
所以為了使得這個插件的功能可用,你要確定:
- vim版本是8.0及以上
- vim要支持terminal
檢查:
vim --version | grep terminal" 需要出現:+terminal
這個插件的功能是在vim中打開一個terminal,然後在文件中可以通過快捷鍵把選中的文本扔給terminal中進行執行。
目前這個插件支持任何文件的REPL,不過需要用戶進行制定具體執行的REPL,比如python文件運行python等等(請看最後部分:如何指定REPL程序)。
具體功能如下:
比如編輯這個python文件。
如果運行下面的命令:
:REPLToggle
便可以打開repl窗口:
然後按shift+V進入Visual Mode並選中文本,按<leader>w(在我的電腦上<leader>是空格,所以就是空格+w),便可以將python代碼直接扔到repl裡面進行執行。如果在Normal Mode按<leader>w,會把當前行扔到repl中執行。
如果此時運行下面的命令,便會關閉repl窗口。
:REPLToggle
安裝方式:
Plugin sillybun/vim-repl
推薦配置:
nnoremap <leader>r :REPLToggle<Cr>
可選參數,等號後面是默認值(None表示沒有預設值):
let g:rep_width = None "窗口寬度let g:rep_height = None "窗口高度let g:sendtorepl_invoke_key = "<leader>w" "傳送代碼快捷鍵,默認為<leader>wlet g:repl_position = 0 "0表示出現在下方,1表示出現在上方,2在左邊,3在右邊let g:repl_stayatrepl_when_open = 0 "打開REPL時是回到原文件(1)還是停留在REPL窗口中(0)
下面是重點了:
如何指定REPL程序
g:repl_program定義了對應的文件類型調用REPL時會打開的程序。比如如果你是使用zsh而不是bash,就直接把下面的的bash替換為zsh放到.vimrc文件中。如果在這個字典中沒有找到對應的文件類型,則會執行default對應的程序。如果沒有default項,則會執行bash。
let g:repl_program = { "python": "python", "default": "bash" } .
如何指定退出命令
不同的程序的退出命令是不一樣的,有的是quit(), 有的是q等等。為了能夠使得正常退出REPL,用戶需要提供正確的退出方式,在字典g:repl_exit_commands中定義。
let g:repl_exit_commands = { "python": "quit()", "bash": "exit", "zsh": "exit", "default": "exit", }
在退出時,首先會給REPL一個<ctrl-C>中斷信號,如果檢查到還沒有退出,則在REPL中輸入兩個回車,然後輸入 退出命令+回車。
使用方法:
如何打開REPL:
:REPLToggle
如何退出REPL:
:REPLToggle
如何向REPL中發送代碼:
- 在Normal模式下:按`<leader>w`,游標所在行(包括一個最後的回車)便會輸入到REPL中。
- 在Visual模式下:按`<leader>w`,對應的所有行(包括最後的回車)便會輸入到REPL中。
如果在使用的過程中有什麼問題或者建議歡迎在評論區評論。
Todo
- 提供暫時隱藏repl的功能
- 提供對gdb,pdb的支持(暫時想不到辦法)
推薦閱讀:
※VIM學習筆記 滾動屏幕
※Vim 在插入模式下怎麼用 hjkl 控制方向?
※Vim Tips #3: Vim 命令的模式
※VIM學習筆記 查找文本
※vim 裡面怎麼清空一行的內容而不刪除一行?