沒穿方服

索引

顯示╱隱藏內文

vim-cycle 1.4.0

14 年前發布 vim-cycle 0.1.0貼文)有得到一些迴響,但後來可能宣傳上被同名 zef/vim-cycle 掩蓋,接著又有 switch.vim 打破限制支援 pattern,繼續用 vim-cycle 的理由就不多了。

今年為了清掉古早 issue,幫專案加了 test,體質提昇後就開始加功能,結果變出了不錯的成果。

新增 regex 選項,大致就是跟 switch.vim 一樣的機制,例如 ruby 的 :bar => 可以變成 bar: ,以往是做不到的。 設定上也可以收割 switch.vim 的豐富資產,只要做一些微調(主要是把 vim dictionary 換成 list)即可。

新增 matcher / changer 定義,也就是「什麼東西要 cycle」「要怎麼 cycle」變成可抽換的,這麼一來 regex 也只是一種變體而已。

於是出現了紀年轉換,可以從民國年、日本元号、泰國佛曆、西元年之間轉換。
還有 naming convention 也被獨立出來,變成跟 regex 不太一樣的思維,比較好維護和擴充。

前陣子新增的 select 介面有時也很實用,將選項列出來用選的,而不是一個一個跳,也支援 telescope 等不同 UI。

錄了 demo 影片(影片有聲音):

歡迎多加利用或宣傳,至少讓類似專案的「類似專案」不要老是忽略我。

以前寫 Rails 的時候,有自己寫一套跑測試的 vim 函數,按 \tl 會在右邊切 tmux pane 跑最接近游標的 it block(RSpec 語法),按 \tj 切在下方、\tw 開新視窗,\t. 則是用最後開的視窗或 pane 跑最後一次跑的測試。

多年後才知道有 vim-test 這個專案,但看起來沒有我寫的好用,就沒關心了。

直到最近嘗試 vim-themis 測試框架,無法直接套以前的工具,才想來研究這個還算熱門的專案。

對應多種語言的 :TestNearest 是最大價值

專案 README 第一行寫著: A Vim wrapper for running tests on different granularities.

各種測試框架被定義為 test runner,例如 ruby 的 minitest、rspec,JS 的 jest、vitest、cypress。 能自動辨識處於哪個環境,然後在編輯特定檔案時(不一定要是測試檔本身),能找到對應測試然後執行,即使 runner 不支援 "Nearest"(只跑最接近游標的、最小粒度的測試)也有機會用搜尋湊出來,然後只測這個範圍。

持續收錄大家的貢獻,支援更多語言和框架,讓我們進入新專案時直接可用,就是它最棒的地方。

執行畫面要開在哪裡:strategy

至於跑測試的介面,例如用 :! 開、用 tmux 開、用 vim-dispatch 開,這些被定義為 strategy

Strategy 就比較貧弱了,雖然提供了 34 種,但這個抽象並沒有提供額外能力(有幾個例外,能支援 quickfix 等),從實作 autoload/test/strategy.vim 可以看見,幾乎每個 strategy 都只是呼叫一個開啟指令就結束了。

最後我是直接指明 custom strategy,接到自己寫的 tmux 功能(暫未公開),才能取得「開在右邊、下面、新視窗、重用」這些能力。

let g:test#custom_strategies = {'tmux_window': function('TmuxTestStrategy')}
let g:test#strategy = 'tmux_window'

定義 g:test#strategy 還有一個好處,就是會跳過載入 autoload/test/strategy.vim,如果你只用其中一個 strategy,實在不必每次吃這個檔。

痛點:非制式的測試

現實世界中,很多專案的測試都有客製化,或者用一個 script 包裝過,例如 ./test/run.shnpm run test,這時候用自動偵測的 runner 去跑反而是偏差的。

vim-test 提供的解法,簡單的狀況是指定 test#{runner}#executable(只改執行指令)或 custom transformation(只微調測試指令),再複雜就需要用到 custom runner 才能解決問題。 Custom runner 已經是在實作一個 runner,所以也會建議寫完貢獻回上游專案。 但就是因為需求處於「一次性的設計」和制式標準之間,所以問題就一直重複下去。

去年也有人提出相關議題,其中一步是增加了 generic runner: #820 Add support for generic command runner

後來又有一個想法是單發的 :TestCommand(討論後已 close): #862 Add :TestCommand for one-off tests

目前我還沒想辦法改善,也許要支援一個測試情境本來就難,終究要弄一個 runner 或類似的東西。

實用函數 test#base#nearest_test()

在尋找 Nearest 的實作上,內部函數 test#base#nearest_test() 扮演關鍵角色,也比較難自己刻出來,某方面也是這個 plugin 的精華所在。

維護狀況良好

這個專案已經 11 年了,最初是一位捷克的 ruby 開發者 Janko Marohnić 啟動,現在也有其他人幫忙維護,處理 issue 很快,是健康可靠的專案。

看似簡單的 CopyTabTitleUrl (web extension), 其實有選項「Use Extended Edit Mode 🧪」可以打開實驗性功能,但數量也太膨大了吧🧪🧪🧪,看它 wiki 上的 format 說明,到底是怎麼發展成這個小天地的?

選單成果

我沒有全部看懂,但湊出一個 format 能夠將 URL 中的 fbclidutm_source 等追蹤碼去掉:
${linkSrcUrl.replaceAll('[?&](fbclid|utm_\w+)=[^&#]+','')}


設定介面也很難懂,瘋狂科學家風格

選項畫面

貼圖記錄,十年後可以回來看古代 UI。

分頁群組太過搶眼

Firefox 138 開始支援分頁群組(Tab Groups),預設顯示是在群組下面劃一條線,結果有點太醒目,造成無法一眼辨認「目前分頁」在哪。

自救

我已經好久沒用 userChrome.css,先貼圖,詳細記在後面。

userChrome.css 內容

用法是到 about:config 開啟 toolkit.legacyUserProfileCustomizations.stylesheets,然後到 Profile 資料夾自己新增 chrome/userChrome.css 檔案。

主要策略是用 CSS color-mix() 把預設背景色調暗。 另外有把關閉按鈕拿掉,內容如下:

2026-06-20: Firefox 152 更新了定義,新版為:

.tab-background {
  &:is([selected], [multiselected]) {
    background-color: color-mix(in srgb, var(--tab-background-color-selected) 70%, black) !important;
  }
}

.tabbrowser-tab[selected] .tab-close-button {
  color: white !important;
}
.tabbrowser-tab[selected]:not(:hover) .tab-close-button {
  display: none !important;
}

以下為舊版,已經沒用了。

.tabbrowser-tab[selected] .tab-background {
  background-color: color-mix(in srgb, var(--tab-selected-bgcolor) 70%, black) !important;
}

.tabbrowser-tab[selected] .close-icon {
  color: white !important;
}
.tabbrowser-tab[selected]:not(:hover) .close-icon {
  display: none !important;
}

又寫了一支臉書用的 user script → Facebook 乾淨連結
原始碼也放在 GitHub

連結污染

Facebook 對於外部連結,現在會用迂迴的方式竄改:網頁一開始顯示時,游標滑過連結還能在 tooltip 看到正常 URL,但點下去(不管左鍵、右鍵)或一些互動後,它會即時把連結變成 /l.facebook.com/l.php?u=原網址 這樣的轉址,讓你實際點到的是另一個 URL,這個感覺很噁心。

另外也會對連結附上 ?fbclid=... 這串很長的追蹤參數,要比較嚴謹地分享時,要刻意拿掉它也是很麻煩的。

既存替代方案

瀏覽器套件 ClearURLs 會移除所有網址中的追蹤碼。

差異在於我的 script:

  1. 就是只針對臉書。 utm_source 之類(Google 的追蹤碼)的不予理會
  2. 即時改網頁,而不是點擊連結後才用瀏覽器內部功能處理

立場

我不排斥追蹤,上網也從來不擋廣告。 單純是針對 Facebook。