標籤:

給VIM添加REPL

給VIM添加REPL

來自專欄 vimer

REPL: 讀取-求值-輸出」循環(英語:Read-Eval-Print Loop,簡稱REPL)是一個簡單的,互動式的編程環境。

python作為一個動態語言,REPL在開發過程中起到了很大的作用。

可是一直以來用vim寫python沒有一個很好的,簡便的提供repl功能。也有類似的插件,比如vim-slime,但是它已經很久沒有更新並且使用起來需要tmux非常的複雜。

最近發現vim8提供了terminal功能和通訊方式。我使用這個功能實現了一個vim的repl插件。


sillybun/vim-repl?

github.com圖標

所以為了使得這個插件的功能可用,你要確定:

  1. vim版本是8.0及以上
  2. 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中發送代碼:

  1. 在Normal模式下:按`<leader>w`,游標所在行(包括一個最後的回車)便會輸入到REPL中。
  2. 在Visual模式下:按`<leader>w`,對應的所有行(包括最後的回車)便會輸入到REPL中。

如果在使用的過程中有什麼問題或者建議歡迎在評論區評論。

Todo

  1. 提供暫時隱藏repl的功能
  2. 提供對gdb,pdb的支持(暫時想不到辦法)

推薦閱讀:

VIM學習筆記 滾動屏幕
Vim 在插入模式下怎麼用 hjkl 控制方向?
Vim Tips #3: Vim 命令的模式
VIM學習筆記 查找文本
vim 裡面怎麼清空一行的內容而不刪除一行?

TAG:Vim | Python |