分享一下我是如何切换 buffer 的吧

来源:互联网 发布:ug编程和pm编程那个累 编辑:程序博客网 时间:2024/06/05 23:46

原文: http://www.newsmth.net/bbscon.php?bid=573&id=103634

;; -------------------------------------------------------------------

;; buffer
;; -------------------------------------------------------------------
(defconst buffer-name-filter-fixed
  '("*scratch*"
    "*Apropos*"
    "*Messages*"
    "*Backtrace*"
    "*Completions*"
    "*compilation*"
    "*Help*"
    "*Popup Help*"
    ".newsrc-dribble"
    "*gnus trace*")
  "This is the fixed part of the buffer name list,
to which you don't want to switch by
 `switch-to-next-desirable-buffer',
 `switch-to-previous-desirable-buffer', and
 `get-next-satisfied-buffer'.

   这个是 `buffer-name-filter' 过滤器的固定部分,
`buffer-name-filter' 是你用下列命令不想切换到的
buffer name 的列表,这些命令有:
 `switch-to-next-desirable-buffer',
 `switch-to-previous-desirable-buffer',以及
 `get-next-satisfied-buffer'.")

(defvar buffer-name-filter buffer-name-filter-fixed
  "This is the buffer name list to which you
don't want to switch by
 `switch-to-next-desirable-buffer',
 `switch-to-previous-desirable-buffer', and
 `get-next-satisfied-buffer'.

   这个过滤器是一个你用下列命令不想切换到的
buffer name 的列表,这些命令有:
 `switch-to-next-desirable-buffer',
 `switch-to-previous-desirable-buffer',以及
 `get-next-satisfied-buffer'.")

(defun desirable-buffer (buffer)
  "Return t if BUFFER's name is in the buffer-name-filter,
otherwise return nil."
  (not (member (buffer-name buffer) buffer-name-filter)))

(defun undesirable-buffer (buffer)
  "Return t if BUFFER's name is NOT in the buffer-name-filter,
otherwise return nil."
  (member (buffer-name buffer) buffer-name-filter))

(defun get-next-satisfied-buffer (list test &optional buffer visible-ok frame)
  "Search LIST for a valid buffer to display in FRAME.
FILTER filters the buffer name that is in the FILTER.
Return nil when all buffers in LIST are undesirable for display,
otherwise return the first suitable buffer in LIST.

Here, the \"test\" argument is a function symbol,
that test a buffer is satisfied some condition or not.

Buffers not visible in windows are preferred to visible buffers,
unless VISIBLE-OK is non-nil.
If the optional argument FRAME is nil, it defaults to the selected frame.
If BUFFER is non-nil, ignore occurrences of that buffer in LIST."
  ;; This logic is more or less copied from other-buffer.
  (setq frame (or frame (selected-frame)))
  (let ((pred (frame-parameter frame 'buffer-predicate))
        found buf)
    (while (and (not found) list)
      (setq buf (car list))
      (if (and (not (eq buffer buf))
               (buffer-live-p buf)
               (or (null pred) (funcall pred buf))
               (not (eq (aref (buffer-name buf) 0) ?\s))
               (or visible-ok (null (get-buffer-window buf 'visible)))
               (funcall test buf))
          (setq found buf)
        (setq list (cdr list))))
    (car list)))

;; -------------------------------------------------------------------
(defun switch-to-next-desirable-buffer ()
  "Switch to the next desirable buffer in cyclic order,
whose name is NOT in the `buffer-name-filter' list.

切换到下一个名字不在 `buffer-name-filter' 列表中的 buffer."
  (interactive)
  (let ((buffer (current-buffer))
        (next-desirable-buffer
         (get-next-satisfied-buffer (buffer-list) 'desirable-buffer
                                    (current-buffer)
                                    t)))
    (if (not (null next-desirable-buffer))
        (progn (switch-to-buffer next-desirable-buffer)
               (bury-buffer buffer))
      (message "Current buffer is the only desirable buffer."))))

(defun switch-to-previous-desirable-buffer ()
  "Switch to the previous desirable buffer in cyclic order,
whose name is NOT in the `buffer-name-filter' list.

切换到上一个名字不在 `buffer-name-filter' 列表中的 buffer."
  (interactive)
  (let ((previous-desirable-buffer
         (get-next-satisfied-buffer (nreverse (buffer-list)) 'desirable-buffer
                                    (current-buffer)
                                    t)))
    (if (not (null previous-desirable-buffer))
        (switch-to-buffer previous-desirable-buffer)
      (message "Current buffer is the only desirable buffer."))))

;; -------------------------------------------------------------------
(defun switch-to-next-undesirable-buffer ()
  "Switch to the next desirable buffer in cyclic order,
whose name is JUST in the `buffer-name-filter' list.

切换到下一个名字在 `buffer-name-filter' 列表中的 buffer."
  (interactive)
  (let ((buffer (current-buffer))
        (next-desirable-buffer
         (get-next-satisfied-buffer (buffer-list) 'undesirable-buffer
                                    (current-buffer)
                                    t)))
    (if (not (null next-desirable-buffer))
        (progn (switch-to-buffer next-desirable-buffer)
               (bury-buffer buffer))
      (message "Current buffer is the only undesirable buffer."))))

(defun switch-to-previous-undesirable-buffer ()
  "Switch to the previous desirable buffer in cyclic order,
whose name is JUST in the `buffer-name-filter' list.

切换到上一个名字在 `buffer-name-filter' 列表中的 buffer."
  (interactive)
  (let ((previous-desirable-buffer
         (get-next-satisfied-buffer (nreverse (buffer-list)) 'undesirable-buffer
                                    (current-buffer)
                                    t)))
    (if (not (null previous-desirable-buffer))
        (switch-to-buffer previous-desirable-buffer)
      (message "Current buffer is the only undesirable buffer."))))

;; -------------------------------------------------------------------
;; 把 dired 的 buffer 全都加入到 desirable buffer 的过滤器里去
;; -------------------------------------------------------------------
(add-hook 'dired-mode-hook
          '(lambda ()
             (setq buffer-name-filter
                   (append buffer-name-filter (list (buffer-name))))))

;; -------------------------------------------------------------------
;; 把键盘上的 WinKey 和 AppsKey 利用起来。
;; 参见 http://xahlee.org/emacs/emacs_hyper_super_keys.html
;; setting the PC keyboard's various keys to
;; Super or Hyper, for emacs running on Windows.
;; -------------------------------------------------------------------
(setq w32-pass-lwindow-to-system nil
      ;; w32-pass-rwindow-to-system nil
      w32-pass-apps-to-system nil
      w32-lwindow-modifier 'super ; Left Windows key

      ;; w32-rwindow-modifier 'super ; Right Windows key
      w32-apps-modifier 'hyper) ; Menu key
;; -------------------------------------------------------------------

;; -------------------------------------------------------------------
;; window & buffer 相关的快捷键
;; -------------------------------------------------------------------
(global-set-key (kbd "<s-up>")    'switch-to-next-undesirable-buffer)
(global-set-key (kbd "<s-down>")  'switch-to-previous-undesirable-buffer)
(global-set-key (kbd "<s-left>")  'switch-to-next-desirable-buffer)
(global-set-key (kbd "<s-right>") 'switch-to-previous-desirable-buffer)
;; -------------------------------------------------------------------
;; 定义 left-&right-fringe 的鼠标快捷键
;; -------------------------------------------------------------------
(define-prefix-command 'left-fringe-map)
(global-set-key (kbd "<left-fringe>") 'left-fringe-map)
(define-key left-fringe-map (kbd "<wheel-up>") 'switch-to-previous-desirable-buffer)
(define-key left-fringe-map (kbd "<wheel-down>") 'switch-to-next-desirable-buffer)
;; -------------------------------------------------------------------
(define-prefix-command 'right-fringe-map)
(global-set-key (kbd "<right-fringe>") 'right-fringe-map)
(define-key right-fringe-map (kbd "<wheel-up>") 'switch-to-previous-undesirable-buffer)
(define-key right-fringe-map (kbd "<wheel-down>") 'switch-to-next-undesirable-buffer)
原创粉丝点击