沒穿方服

索引

顯示╱隱藏內文

升級 Firefox 14 後的不慣

有天在網址列打字搜尋,沒出現想要的結果,就點網址前的 小地球 圖示——以前點它,就會把網址文字框「還原」為現在的 URL——結果點了沒反應?

Awesome bar 搜尋

於是陷入看不見 URL 的狀態…… 查查沒有解答,就不知道怎麼辦了。

(如果懶得看完全文,解答是:按 Esc 就好了)

一直忍到上週才死心面對,順便試試 Mozilla 的 Add-on Builder,結果完成一個小元件 Reset URL by Globe(未上 AMO,但 Builder 頁面即可下載 .xpi)。

Add-on Builder 初試樂趣

動手時間變很短,反而都在讀文件、想像、解謎; 寫寫直接在瀏覽器上測試,不用存檔也不用重開,感覺創造過程沒什麼干擾。

不過 Add-on SDK 已支援的東西還是跟傳統 XUL overlay 元件有點距離,寫複雜點的功能大概就沒這麼爽了。


準備開始,先了解問題

第一想知道 Firefox 為什麼改變。 很快查到 Site identity UI updates | Mozilla UX,原來 Firefox 14 把網址列的 favicon 改成一顆 site identity 按鈕——就是憑證合法時顯示綠色掛鎖,沒憑證時一律顯示小地球(其實我覺得比較像鳥頭)的按鈕—— 免得使用者看到奇怪的 favicon 誤以為是安全/不安全的網站。

要做 add-on? 初步想法

至於為什麼「點擊時復原」消失就沒查到了,說不定只是漏掉,回報一下就會加回去了;
但因為是玩 Add-on Builder 的機會,就沒多想,草草動手了。

猜測復原網址的實作應該還在,只是點地球的時候少了事件觸發而已。 所以只要在 click 事件加幾行 code 就行了吧。

先看 DOM 結構

跟改網頁一樣,想調整某個元件,總要先了解它的構造。 這時方便的工具是 DOM Inspector,只要先選 File → Inspect Chrome Document → 隨便選一個文件,再點工具列上的 Inspect 按鈕,就會開啟類似 Firebug 檢測器的功能,在瀏覽器視窗點想觀察的部份,節點就會在 DOM Inspector 中展開了。

File → Inspect Chrome Document → 隨便選一個文件
實際點選小地球,展開的是一個 xul:hbox 元素。
點到的元素(xul:hbox)在 DOM Inspector 中展開了

讀原始碼,看行為實作

再來就直接爬 code,不必把整個原始碼抓下來,利用 MXR (Mozilla Cross-Reference) 網站就行了。

搜尋過程省略,最後找到幾處:

  • browser.xul#550textbox#urlbar 就是網址列所在,上面有個 ontextreverted 事件,看來就是「復原」功能。
  • urlbarBindings.xml#226 有前述事件 handler handleRevert 的實作。
    裡面的註解 //(前略)was scrolling when they hit escape 也透露一個我不知道的用法 —— 想復原 Awesome Bar 的輸入,只要按 Esc 就好了, 早知道這招,也許就不必寫這個 add-on 了……

開始寫啦……

第一次玩,亂寫一通,後來才發現驚人事實—— revision 是公開的啊! 每次亂存檔都會被別人翻到,真是一件很糗的事啊。

總之照著 SDK 文件的 guide 就能寫出能動的元件了。 具體也就是找到小地球,幫他綁上 click 事件,請他被按的時候 gURLBar.handleRevert 而已。

我主要碰到的問題是:不知道如何存取 XPCOM 的 nsIDOMWindow(好讓我直接取用 window.gURLBar)。現階段 sdk/windows 拿不到它,只好用 unstable 的 sdk/window/utils,兩個混在一起用,最後成果也實在不太靠譜。


記憶體用量 好像有點多?

因為文章寫得有點久,所以這元件也用了一個禮拜了。
about:addons-memory 看來,這支小小 add-on 經常性地佔用不少記憶體,有空要再檢查一下。

記憶體用量 5.14 MB

年假讀書心得

過年期間,某研究生準備了近 10 公斤的硬書,我閒著就讀了幾本,按閱讀順:

  1. 蕭沆《解體概要》(只讀了頭尾)
  2. 傅柯《外邊思維
  3. 佛洛姆《愛的藝術
  4. 巴舍拉《空間詩學》(沒讀完)

起先我設了一個問題:自己周圍有個小圈圈,想要打消它,讓所有人不分你我。

讀書反省還沒有答案,但收穫不少。


「外邊」還是可以著墨的

小時候可以對一個畫面、一組用字、一場天象,心裡產生莫大迴響; 但後來覺得很膚淺,因為說不上來,而且大家都會;拿這樣虛的東西為志業,不如學數學,最後改行寫程式。

這個敏銳的感受力,或讓想像奔馳的能力,就這麼容易被輕視,直到想起它可以被使用,或被訓練。但它到底是什麼呢?

類似佛教講的「空」,除去偏執後,還有個空在那兒;文字有機會喚起它,但無法辯證 —— 這個特性充滿陷阱、極易誤解。

《外邊思維》卻用平易近人 (?) 的方式探究這種概念,尤其以文學為主題 —— 當語言的主體「我」消失時,文學空間才儼然浮現 —— 的論述與實例最為精彩,全書幾乎都圍繞此處講解。

得知技術上有更接近「外邊」境界的實作(當時有這樣的實驗文學)讓我振奮, 確實在藝術方面,怎麼分辨俗氣的作品,我也會看它是否打斷我們通往空間的道路。

但我終究還不能掌握這個新詞,不像看著作品驚歎「這東西真是太外邊了」——那麼明朗。

我的愛情觀可能不如大學生

《愛的藝術》則是一本暢銷書,講的是成熟的愛。 我發現我對各種愛的看法還算高竿,唯獨「情愛」的認知很幼稚(沒想過),關鍵字是「承諾」最令我疑惑。

工程師淪為打字員就是有害

書中另一重點是資本主義的過度消費與生產,正是喪失愛的能力的原因; 社會結構不改變,工作就會單調,人就會膚淺。

童年我看別人的冷漠,總會連結到都市的夜景,覺得他們麻痺了。 現在我對大眾娛樂、垃圾資訊更展現仇視的態度,自己雖然也覺得不太健康,但讀到這好像又合情合理了。

沒讀完的兩本

總結這些書,其實都在同領域,內容互通,只是研究力道的分配有異。 如果繼續追問我的問題正不正當(確實很懷疑),那可以把《解體概要》讀完,只是應該不會有答案。

《空間詩學》對「詩意」的說明很豐富,嚴謹的「不是什麼」應該能避免自己思考誤踩地雷,但後面動手解「家屋」的重頭戲我反而沒耐心看。

培養有思緒潛能的人

又讀這些書總是感歎:為什麼你們都不懂呢?

這問題也有讀到幾個線索:沒辦法孤獨,沒有脫線不經心的瘋狂,工作太重、太枯燥。


插圖

外邊思維,可惜已絕版,這是研究生借來的

Tmux 1.7 新增的 bracketed paste mode 支援,可以讓 Vim 分辨現在是 tmux 貼上而不是手動打字。

引用 Bracketed Paste Mode | dodaの日記 | スラッシュドット・ジャパン(稍有修改):

" Ref http://slashdot.jp/journal/506765/Bracketed-Paste-Mode
" - Use tmux 1.7 `paste-buffer -p` to paste
" - Use <F11> and tmux `send-keys "\e[201~"` for pastetoggle
if &term =~ "xterm" && exists('$TMUX')
  let &t_ti = &t_ti . "\e[?2004h"
  let &t_te = "\e[?2004l" . &t_te
  let &pastetoggle = "\e[201~"
  map <F11> <Esc>[201~
  imap <F11> <Esc>[201~

  function! XTermPasteBegin(ret)
    set paste
    return a:ret
  endfunction

  map <special> <expr> <Esc>[200~ XTermPasteBegin("i")
  imap <special> <expr> <Esc>[200~ XTermPasteBegin("")
  cmap <special> <Esc>[200~ <nop>
  cmap <special> <Esc>[201~ <nop>
endif

\e[?2004h\e[?2004l 是啟用括弧貼上模式的控制碼,即 XTerm Control Sequences 中的
P s = 2 0 0 4 → Set bracketed paste modeP s = 2 0 0 4 → Reset bracketed paste mode

Tmux 1.7 的 paste-buffer 指令新增了 -p 選項,會在貼上文字前加 ESC[200~、後加 ESC[201~ 控制碼。 (參考 SF.net SVN: tmux:[2712] trunk

利用這兩個控制碼設定 mapping,就能自動調整 'paste' 的狀態了。

不過這個 pastetoggle 會把原本的設定蓋掉,變得無法一鍵切換 'paste'
將就方案是在 tmux 設定,例如我原本是用 <F11>,就加上 bind F11 send-keys "\e[201~"

預設的 :TOhtml 會生成整個 HTML document,我只要其中的 <pre>...</pre> 部分而已,於是寫了一層 function 處理,原功能則改名 TOhtmlDoc。

最近發現這 function 失效,似乎是 TOhtml 在七月有變更,原輸出 <pre> 會變成 <pre id='vimCodeElement'>

修正後 script 如下:

let g:html_no_progress = 0
let g:html_use_css = 1
let g:html_ignore_conceal = 0
let g:html_pre_wrap = 0
let g:html_use_xhtml = 0
function! s:to_html(line1, line2)
  let save_number = get(g:, 'html_number_lines', -1)
  let g:html_number_lines = 0
  call tohtml#Convert2HTML(a:line1, a:line2)
  setlocal buftype=nofile bufhidden=hide noswapfile nobuflisted
  call search("<pre[^<]*>")
  normal! dit
  %delete _
  let @" = '<pre>' . substitute(@", '\v^\n\s*', '', '') . '</pre>'
  call setline(1, split(@", '\n'))
  if save_number > -1
    let g:html_number_lines = save_number
  else
    unlet g:html_number_lines
  endif
endfunction
command! -range=% TOhtml :call <SID>to_html(<line1>, <line2>)
command! -range=% TOhtmlDoc :call tohtml#Convert2HTML(<line1>, <line2>)

之前 keitheis 提到比 ack 更快的 Ag (the_silver_searcher),已經成為我 search 的首選了。

ack > grep 我不以為然,但 ag 用起來就真的時髦又開心。 也不是因為快,就是指令符合懶惰需求,且沒有一些不解意圖的設計。


從 source 安裝比較實用

真正感到 stable 也是最近的事而已,所以正式 release 前,就直接 builing from source 吧,地雷可能比較少。

(version 0.14pre) 近期漂亮開發進展:

  1. #98 Files with non-english characters are trait as binary files
    修正特定檔案——例如中文較多的 html——誤判為 binary file 而被略過的問題。
  2. #110 Remove a leading "./" before printing by AndrewRadev
    移除輸出前頭的 ./ 顯示,較接近 ack/grep 行為。
  3. #90 Make colors configurable
    輸出色彩(path、line-number、match 部分)終於可以設定了。

我的設定

因為 Ag 還不支援設定檔,所以設定就是 .zshrc 裡的 alias 爾。
輸出調成類似 grep 的樣子。 再來個 agjs alias 專門搜專案中未壓縮的 JavaScript。

() {
  local common='noglob ag --nobreak --nogroup --noheading --smart-case --depth=27'
  local colors='--color-path 35 --color-line-number 32 --color-match "1;31"'
  alias ag=$common' '$colors
  alias agjs=$common' '$colors' -G public/javascripts/.*-(debug|src).js'
}

擷圖:

ag 輸出的樣子