沒穿方服

封存

顯示╱隱藏內文

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 輸出的樣子