Monday, February 20, 2017

clojure vim 開發環境設置 --- 整合 REPL

開發 clojure ,不免要做的事情自然是不停地調用 REPL 來測試自己寫的函數是否如預期般地執行,而 vim 可以安裝 plugin ,讓這個調用 REPL 的步驟完全留在編輯器內執行。這個開發方式又稱為 live development 。

要設置好這個開發環境,首先要準備幾樣東西:
  1. clojure 的 nREPL
  2. vim 8
在 vim 裡安裝合適的 plugin :
cd ~/.vim/bundle
git clone git://github.com/tpope/vim-fireplace.git
啟用方式:
  1. 在 clojure 的專案資料夾,開啟一個 shell ,啟動 nREPL。指令是 lein repl
  2. 在同一個資料夾,開啟另一個 shell ,啟動 vim 。如此一來, vim 的 fireplace plugin 就會自動與 nREPL 連接了。
文字檔不在 clojure 專案資料夾內時,fireplace 的啟用方式:
  1. 還是一樣啟動 nREPL。指令是 lein repl
  2. 如果文字檔並不是 clj 結尾。需要先讓 vim 知道它是 clojure 的 source code ,下指令
     :set filetype=clojure
  3. 連線到現在已經啟動的 nREP  ,例如下指令
     :Connect nrepl://127.0.0.1:41767
fireplace 的常用指令如下:
求值
  1. 隨便選一個 expression 做 repl     移動標到程式碼上,然後  :Eval 。快速鍵是 cpp 
  2. 指定一段區間的程式碼做 repl      :1,3Eval
  3. 啟動 Clojure Quasi-REPL        cqq
  4. 只打開 Clojure 的 Quasi-REPL   cqc 
在 quickfix 視窗顯示 docstring 或是 source code 
  1. 快捷鍵  K   。        對應 repl 的 (doc ) ,   也可以用 :Doc
  2. 快捷鍵  [d  。        對應 repl 的 (source ), 也可以用 :Source 
在文件裡穿梭 
    1. 快捷鍵  [ ctrl + d  。 跳躍到符號定義的那一行,即使是定義在 jar 檔中。
    2. 快捷鍵  gf  。         語義是 go to file 。 對於 namespace 會產生作用。
    重新載入程式碼
    1. 讓 REPL 重新載入現在的 namespace                                         :Require
    2. 讓 REPL 重新載入現在的 namespace 及其使用的 namespace        :Require!
    程式碼提示 (Omnicomplete)      <C-x><C-o>

    啟動 ClojureScript    :Piggieback [build-id]   // 此處的 build-id 是 keyword 形式
    啟動 ClojureScript 的 REPL 之後,要先
    1.  npx shadow-cljs watch app
    2. 開啟 browser