Shell's Home

Apr 10, 2012 - 1 minute read - Comments

如何用tabbar插件做emacs的tab定位切换

说明一下,定位切换的意思,是像chromium那样,用Atl-1-9直接切换tab。而不是用上一个下一个慢慢换。另外,是切换buffer,不是切换frame。

以下是实现部分:

;; 全部的buffer都分一组,否则这个修改是没任何意思的

(setq tabbar-buffer-groups-function
      (lambda () (list "All Buffers")))

;; 去掉emacs自带的几个buffer

(setq tabbar-buffer-list-function
      (lambda ()
    (remove-if
     (lambda(buffer)
       (find (aref (buffer-name
            buffer) 0) " *"))
     (buffer-list))))

;; 切换到第N个buffer,1为第一个,负数表示从后数,注意0会出错,这里就不处理了
(defun switch-tabbar (num)
  (let* ((tabs (tabbar-tabs (tabbar-get-tabset "All Buffers")))
     (tab (nth (if (> num 0) (- num 1) (+ (length tabs) num)) tabs)))
    (if tab (switch-to-buffer (car tab)))))

;; 不说废话,绑热键
(global-set-key [(meta 1)] (lambda () (interactive) (switch-tabbar 1)))
(global-set-key [(meta 2)] (lambda () (interactive) (switch-tabbar 2)))
(global-set-key [(meta 3)] (lambda () (interactive) (switch-tabbar 3)))
(global-set-key [(meta 4)] (lambda () (interactive) (switch-tabbar 4)))
(global-set-key [(meta 5)] (lambda () (interactive) (switch-tabbar 5)))
(global-set-key [(meta 6)] (lambda () (interactive) (switch-tabbar 6)))
(global-set-key [(meta 7)] (lambda () (interactive) (switch-tabbar 7)))
(global-set-key [(meta 8)] (lambda () (interactive) (switch-tabbar 8)))
(global-set-key [(meta 9)] (lambda () (interactive) (switch-tabbar 9)))
(global-set-key [(meta )] (lambda () (interactive) (switch-tabbar -1)))