超輕量級純文字介面 REPL 類語言 IDE

自由布魯斯發表於2016-05-30

超輕量級純文字介面 REPL 類語言 IDE

目錄

  • 介紹
  • 特性
  • 實現原理
  • 安裝外掛
  • 配置方法
  • 使用說明
  • 其他資訊

介紹

這是基於 Vim + Tmux 快速定製的一個針對 REPL 類程式語言的超輕量級開發環境, 不需要任何 GUI, 執行於純粹的文字介面, 所以響應速度很快, 而且對於系統的要求很低, 在一些記憶體有限的舊電腦上也可以流暢地執行.

原本的目標是搭建一個可以流暢執行於 Raspberry Pi 2 的超輕量級 Common Lisp 除錯開發環境, 使用者可以通過 SSH 登入到樹莓派上進行不受限制的開發, 最大限度地利用樹莓派的硬體計算能力, 而不需要啟動任何型別的 視窗.

後來發現本整合環境可以支援任何一種擁有 REPL 機制的程式語言, 如 Clojure, Racket, Schema 以及 Lua 等多種語言.

環境需求: 需要安裝好 vimtmux.

技能要求: 需要使用者熟悉基本的 vi 操作, 熟悉一般的 tmux 操作.

本專案git.oschina.net倉庫

特性

優點:

  • 方便
  • 超輕量級
  • 高度可定製
  • 響應速度最快
  • 使用超級流暢
  • 支援結對程式設計
  • 執行資源需求最少
  • 可執行於記憶體有限的舊電腦
  • 全平臺支援:Linux|Win32|OSX
  • 支援任意擁有命令列 REPL 機制的語言
  • 支援快捷鍵從程式碼編輯區傳送程式碼到REPL區進行除錯

缺點:

  • Emacs 下的 Slime 相比快捷鍵支援的除錯命令比較少

實現原理

利用了 tmux 可以在在不同視窗|皮膚間傳輸|接收資料的能力

安裝外掛

需要為 vim 按順序依次安裝如下外掛:

必需安裝:

pathogen
rainbow-parentheses
vim-slime

可選安裝:

vim-clojure-static

安裝 pathogen:

首先為 vim 安裝 pathogen 外掛, 有了它可以超級簡單地安裝設定其他外掛.

分別建立 ~/.vim/bundle, ~/.vim/autoload 目錄

cd ~/.vim
mkdir bundle
mkdir autoload

把 pathogen.vim 檔案下載到 autoload 目錄下

cd ~/.vim/autoload
wget https://tpo.pe/pathogen.vim

安裝 rainbow-parenthesesvim-slime :

進入 ~/.vim/bundle/ 目錄, 克隆 rainbow-parenthesesvim-slime 即可, 剩餘的 pathogen 會自動為你安裝:

cd ~/.vim/bundle/
git clone https://github.com/kien/rainbow_parentheses.vim
git clone https://github.com/jpalardy/vim-slime

安裝 vim-clojure-static

跟上面的步驟一樣:

cd ~/.vim/bundle/
git clone https://github.com/guns/vim-clojure-static   

接下來要對上述外掛進行配置, 下面會詳細介紹如何配置.

配置方法

需要分別對 vimtmux 進行配置, 主要是修改位於 ~/ 目錄下的 .vimrc.tmux.conf 這兩個檔案.

下面是配置好的檔案, 把你原來的這兩個檔案做一個備份, 然後把這兩個檔案直接克隆到你的 ~/ 目錄下.

.vimrc

execute pathogen#infect()  
syntax on
syntax enable
set number
set autoindent
filetype plugin indent on

“ vim-slime  options
“ Clojure options.
let g:slime_target = "tmux"
let g:slime_paste_file = "$HOME/.slime_paste"

“ rainbow_parentheses options
autocmd Syntax clojure RainbowParenthesesLoadRound
autocmd BufEnter *.clj RainbowParenthesesToggle
autocmd BufLeave *.clj RainbowParenthesesToggle

let g:rbpt_colorpairs = [
    \ ['magenta',     'purple1'],
    \ ['cyan',        'magenta1'],
    \ ['green',       'slateblue1'],
    \ ['yellow',      'cyan1'],
    \ ['red',         'springgreen1'],
    \ ['magenta',     'green1'],
    \ ['cyan',        'greenyellow'],
    \ ['green',       'yellow1'],
    \ ['yellow',      'orange1'],
    \ ]
let g:rbpt_max =9

“ vim-clojure-static options
let g:clojure_syntax_keywords = {
    \ 'clojureMacro': ["defproject", "defcustom"],
    \ 'clojureFunc': ["string/join", "string/replace"]
    \ }

.tmux.conf

# ##############################################################
# Global settings.
#

# Switch the prefix to Ctrl-a since Ctrl-b interferes with Vim.
# set -g prefix C-a
# unbind C-b

# Change the default input delay in order to improve Vim
# performance.
set -sg escape-time 1

# Number windows and panes starting at 1 so that we can jump to
# them easier.
# 設定 tmux 視窗序號從 1 開始, 設定 tmux 皮膚序號從 1 開始
set -g base-index 1
set -g pane-base-index 1

# vi mode.
set -g mode-keys vi
set -g status-keys vi

# 256-color mode.
set -g default-terminal "screen-256color"

# ##############################################################
# Key bindings.
#

# Reload .tmux.conf with "r".
# 修改 tmux 配置後載入新配置檔案的快捷鍵為: Ctrl-b r
bind r source-file ~/.tmux.conf \; display "Reloaded!"

# Split windows with a more visual set of characters.
bind | split-window -h
bind - split-window -v

# Select panes with vi-style movement commands.
# 使用 h j k l 選擇皮膚, 也可以用上下左右箭頭來選擇
# 具體快捷鍵為: Ctrl-b h -> 左邊皮膚
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Resize panes with vi-style movement commands.
# 調整皮膚大小
# 具體快捷鍵為: 
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

使用說明

程式設計例項:

假設我們準備試驗 Common Lisp 開發環境, 具體的實現是 CLISP.

  • 啟動 tmux, 在當前視窗建立兩個皮膚(pane), 快捷鍵為: C-b c, 也就是: Ctrl-b c;
  • 在 1 號皮膚裡用 vi 編輯一個名為 test.lisp 的檔案;
  • 在 2 號皮膚內啟動一個 REPL, 例如: clisp.

補充: C-b q 可以檢視當前視窗所有皮膚的編號

現在就可以進行 Common Lisp 程式碼除錯了, 游標放在程式碼編輯區(切換皮膚的快捷鍵為 C-b o), 輸入一段程式碼,如下:

(+ 123 245)

游標保持在括號內, 進入 vi 命令模式, 輸入快捷鍵 C-c C-c, 首次執行此命令, 會要求設定目標, 提示輸入內容如下:

tmux socket name: default `回車`
tmux target pane: `:2.2`    

:2 表示 2 號視窗, .2 表示2號視窗的第2個皮膚

這樣就會把表示式 (+ 123 245) 傳送到 2 號皮膚的 REPL, 馬上就會被求值

預設的快捷鍵繫結:

  C-c C-c 把編輯區游標所在處的程式碼段落髮送到 REPL 區        
  C-c v 重新設定傳送目標, 需要按照提示輸入:

提示資訊如下:

tmux socket name: default 回車
tmux target pane: :2.2

":" 單獨輸入一個冒號表示當前視窗,當前皮膚, 這是合理的預設值;
":i" 冒號跟一個數字 i 表示第 i 個視窗, 當前皮膚;
":i.j" 冒號 數字i 小數點 數字 j 表示第 i 個視窗,第 j 個皮膚;
"h:i.j" 如果前面再加一個 h, h 表示 tmuxh 號會話, h 可能是會話名,也可能是數字, 後面的含義不變.

一些有用的快捷鍵

  • vim 的快捷鍵(命令狀態下輸入):

C-f 和 C-b 向後或向前翻頁
C-p 和 C-n vi自帶的簡單自動補全

  • tmux的快捷鍵:

C-b r 修改 .tmux.conf 檔案後快速載入
C-b 數字 跳轉到數字對應視窗
C-b 空格鍵 調整視窗的皮膚佈局
C-b |C-b " 新建皮膚跟當前皮膚左右分佈(水平分佈)
C-b -C-b % 新建皮膚跟當前皮膚上下分佈(垂直分佈)

其他資訊

本專案參考瞭如下文件:

相關文章