タブの移動をキーボードで

マウスを使わずにタブを並べ替える方法。

Firefox
デフォルト
  1. どうにかしてタブバーにフォーカス。「ctrl+KTab」が最短?
    • ctrl+Up / ctrl+Left
    • ctrl+Down / ctrl+Right
    • ctrl+Home
    • ctrl+End
    • で動かす。
カスタム
  • gBrowser.moveTabForward()
  • gBrowser.moveTabBackward()
  • gBrowser.moveTabToStart()
  • gBrowser.moveTabToEnd()
  • keyconfig 等で設定。
xyzzy

そんな機能見当たらなかったので http://xyzzy.s53.xrea.com/wiki/index.php?cmd=read&page=tips%2F%A5%D0%A5%C3%A5%D5%A5%A1%A5%D0%A1%BC%A4%CE%CA%C2%A4%D3%BD%E7%A4%F2%CA%D1%A4%A8%A4%EB を参考に書いてみた。

(defun buffer-bar-swap-fore () (interactive)
  (let* ((sbf (selected-buffer))
         (bfl (butlast (buffer-list :buffer-bar-order t)))
         (pos (position sbf bfl)))
    (when (< 0 pos)
      (set-buffer (car bfl))
      (let ((*buffer-bar-selected-buffer-to-first* t))
        (dolist (b (cons sbf (reverse (subseq bfl 0 (1- pos)))))
          (set-buffer b)
          #0=(refresh-screen 0)))
      (set-buffer sbf)
      #0#)))
(global-set-key '(#\M-C-Left) 'buffer-bar-swap-fore)

(defun buffer-bar-swap-aft () (interactive)
  (let* ((sbf (selected-buffer))
         (bfl (butlast (buffer-list :buffer-bar-order t)))
         (pos (position sbf bfl))
         (len (length bfl)))
    (when (< pos (1- len))
      (set-buffer (car (last bfl)))
      (let ((*buffer-bar-selected-buffer-to-first* t))
        (dolist (b `(,sbf ,(nth (1+ pos) bfl) ,@(reverse (subseq bfl 0 pos))))
          (set-buffer b)
          #0=(refresh-screen 0)))
      (set-buffer sbf)
      #0#)))
(global-set-key '(#\M-C-Right) 'buffer-bar-swap-aft)

いちいち再描画するせいでたくさん開いてるとちらつきが酷い。
もっといいやり方求む。