沒穿方服

索引

顯示╱隱藏內文

寫個 script 在 shell 透過 rhino.jar 跑 fulljslint.js,在 Vim 也寫個 function 呼叫它,於是可以用 quickfix window 除錯。

就像有個超級不吝指教的真人陪你寫程式

  • 在 Windows 上沒用。
  • 不使用 jslint.vim。 雖然跨系統、放 jslintrc 設定檔等作法很棒,但是 1) 即時檢查和 highlight 標錯的顯示方式都不是我要的,甚至有點惱人。 2) 想試試直接用大師寫的 fulljslint.js,在 Vim 以外的地方可能也較好整合。
  • 不使用 javaScriptLint.vim,因為 JavaScript Lint 不是 JSLint 啊,跟這主題無關。
  • 使用 Rhino 當 JavaScript engine,因為最好裝。
    不過它的 JavaScript 版本只實作到 1.7(Firefox 2 的程度)所以像 JSON 就不能直接吃,要多 include 個 JSON2.js
  • 具體用到的檔案:
    • ~/bin/jslint (唯一實際被叫的指令,內容主要是 java -cp rhino.jar …)
    • ~/scripts/fulljslint.js (即 Douglas Crockford 的 fulljslint.js)
    • ~/scripts/jslint.js (由官網的 rhino.js(現已移除)修改而來,連接 fulljslint 和 rhino)
    • ~/scripts/json2.js
    • ~/scripts/rhino.jar
  • 修改錯誤訊息的格式,改成跟 closure compiler 相似,就不必再調 Vim 的 errorformat。
  • 目前 JSLint 用的預設 option 直接寫在呼叫 fulljslint.js 用的 script(jslint.js)裡。
  • 在 shell 中呼叫的指令是 jslint file.js '{"extraOptionKey":value}'。 extraOption 可以用來蓋掉預設選項。
  • 在 Vim 中呼叫的指令是 :JSLint

取得檔案

工作滿一年

  • 還經常冒出剛找到工作的爽爽心情
    • 回家在公車上會忍不住偷笑。(不過可以搭公車的這間倒了……)
    • 從洗手間走回辦公室也莫名地樂。
    • 應該是同事都很夢幻的緣故。
  • 剛開始還覺得上班跟自己在家做的事差不多,就是有錢拿
    • 久了技術有進步,不過作品都不能表達自己,這麼說也就沒什麼了不起的事。
    • 所以不上班也可能更好。
  • 某些場合還是會發現自己的缺點
    • 以前發現的、不能改的就當作人格特質,所以年紀到了就不該有新的缺點才是。
    • 這時發現技術不能解決的問題就毀了。

此外未滿七個月就拿不到失業救濟金這回事,也是難得的爛經驗。

左邊會顯示 mark 位置

在沒有規則的位置間移動

雖然 ``ga 等跳轉指令有不少,但是要跳到沒特殊意義的位置——例如「剛剛有看到,不過具體看到什麼完全沒印象」——這種情形除了 mark 應該也沒有更好的解了。

於是用 mamb、……放了幾個 mark,結果更難用:

  1. 視覺上看不見哪兒有 mark,所以不知道某 mark 的位置,比方 `b 會跳到哪裡去。
    事實上按了 ` 之後,就會卡在不知道要按哪個字母。
  2. 不知道哪些 mark 已經用過,例如下 md 的時候要擔心會不會蓋掉舊的。
    事實上按了 m 之後,就會卡在不知道要按哪個字母。

ShowMarks plugin

ShowMarks 會利用 sign column(在行號左邊的一欄,預設不會有)顯示 mark 的位置。雖然是很老的 plugin,不過先進替代品從缺,功能也冇問題,就用吧。

唯一不滿是用了 CursorHold autocmd 在閒置時自動開啟(如果開啟檔案後,突然畫面左邊冒出一條 bar,就是這功能),所以 fork 一份 bootleq/ShowMarks,加上 let g:showmarks_auto_toggle=0 即關閉它。

wokmarks.vim plugin

wokmarks.vim 提供不必記憶 mark 名稱(例:a-z)的操作。指令會變成 Prev、Next、Set、Toggle、Kill 這樣的感覺;另外設置 mark、在 mark 間移動時也會在狀態列顯示訊息。

具體設定

gist: 738007 - [vimrc] ShowMarks and wokmarks.vim- GitHub

完成後,看到有感覺的行就按 mm 放標記(sign column 會自動開啟),覺得這行沒用就按 mm 取消標記,想瀏覽標過的地方就按 mjmk 前後移動。若新開的檔案沒有顯示任何標記,就按 momt 顯示。

限制

因為使用 Vim 本身的 mark,所以 mark 總數有限(a-zA-Z,其中大寫的又不適合單一檔案使用)。

如果真的需要 26 個以上,也有一些 plugin 會另行記錄標記資訊,不過「不用 Vim 的 mark」是否比較好,就要考慮一下了。

煩惱許久的需求—— git difftool, open all diff files immediately, not in serial - Stack Overflow。具體狀況是:用 git-difftool 呼叫 vimdiff 看變更,會重複「2 files to edit ~ 自動進入 Vim 比較一個檔案 ~ 手動離開 Vim」這個流程,有 10 個(變更的)檔案就會重複 10 次,而且中間不知道怎麼停下來……

原文的解法我沒試成功,而是靠之前寫的 function,加上在 .zshrc 裡設定:

alias gitdiffall='vim -p `git diff --name-only` -c "tabdo GitDiff" -c "tabfirst"'

之後只要輸入指令 gitdiffall 即可。

檔案改到一半發現自己失憶,忘記改了哪些東西,只好跟上次 git push 的狀態比較看看了。

正統作法是在 shell 下指令 git diff,或下 git difftool 用 vimdiff 分割視窗顯示,如下圖,前者在檔案多時容易快速概觀,但單一檔案時還是 vimdiff 方便。

狀況單純的話也很好用 缺點是一次只 diff 一個檔案

目前看到兩個插件 hypergitvcscommand 都可以在 Vim 裡直接顯示 diff 結果,前者是 git-diff 型式,後者是 vimdiff 型式(取出舊版內容,再切割視窗作 vimdiff)。我的需求比較接近後者,但又不想裝整支 vcscommand,於是擅自取出原始碼,改寫進 vimrc。

用到的 git 指令

  • git rev-parse --show-prefix
    若指令來自 git 的子目錄,輸出該目錄對 .git 的相對路徑。
  • git log -1 --format=format:%s\ %n%h' -- '%an' -- '%ai\ '('%ar') HEAD
    顯示 HEAD 所在的一條 log,輸出格式為 [主題] \n[hash 縮寫] -- [作者] -- [日期] ([相對日期]),
    例如 fefe3c8 -- bootleq -- 2010-08-30 18:14:37 +0800 (13 hours ago)
  • git show HEAD:some_path/some_file
    顯示 HEAD 中 some_file 的檔案內容。

原始碼

gist: 558647 - [.vimrc] git diff.

功能說明

  • GitDiff 指令

    輸入 :GitDiff 即可切割視窗顯示目前檔案的 HEAD 版本,可加一個參數指定更早的 HEAD,例如 :GitDiff 99 取得 HEAD~99 版本。顯示後會進入 diff 模式。另外可用 echo t:git_diff_info 顯示該 commit 的簡易資訊。
    GitDiff t:git_diff_info 顯示
    註:指令取的 HEAD~ 並無限制「有變更當前檔案」所以可能往前跳好幾個 HEAD 也看不出變化。
  • MyDiffOff 指令

    因為預設的 :diffoff 指令可能會把本來的 foldmethod 等 diff 相關選項蓋掉,所以改用 :MyDiffOff 來關閉 diff。
    不過也只是設回我的預設值,沒有真的建立暫存/重設機制。
  • GitDiffOff 指令

    進入 :GitDiff 後,用 :GitDiffOff 快速恢復到原始狀態。(目前只支援從兩視窗的狀態復原)