emacs - 如何仅循环那些处于给定主要模式(例如 Python-mode )的缓冲区?

标签 emacs elisp

如何仅循环那些处于给定主要模式(例如 Python-mode )的缓冲区?

目前我正在使用 C-X-左/右箭头,但这些也显示了各种不相关(即非源代码)缓冲区,知道如何将缓冲区切换限制为仅特定类型的缓冲区(具有给定的缓冲区类型)主要模式)?

最佳答案

我找不到现成的东西。不过,制定合适的命令并不难。

(defun buffer-mode-alist ()
  "Returns a list of (<buffer-name> . <major-mode>) pairs."
  (let ((all-buffers (buffer-list))
    (rv nil))
    (while all-buffers
      (let* ((this (car all-buffers))
         (name (buffer-name this)))
    (setq all-buffers (cdr all-buffers))
    (when name
      (setq rv (cons (cons name (with-current-buffer this major-mode)) rv)))))
    rv))

(defun buffers-with-major-mode (the-major-mode)
  (let ((buffer-alist (buffer-mode-alist))
    (rv nil))
    (while buffer-alist
      (let ((this (car buffer-alist)))
    (setq buffer-alist (cdr buffer-alist))
    (if (eql (cdr this) the-major-mode)
        (setq rv (cons (car this) rv)))))
    (sort rv #'string<)))

(defun spin-buffers (buffer-list current)
  (cond ((not (member current buffer-list)) buffer-list)
        ((string= current (car buffer-list)) buffer-list)
        (t (spin-buffers (append (cdr buffer-list)
                                 (list (car buffer-list)))
                         current))))

(defvar next-buffer-mode nil)

(defun choose-next-buffer-mode (mode)
  "Ask for what major mode should be used as a selector for next-buffer-with-mode."
  (interactive "aMajor Mode: ")
  (setq next-buffer-mode mode))

(defun next-buffer-with-mode (set)
  "Switches to the 'next' buffer with a given mode. If the mode is not set,
require it to be set, by calling choose-next-buffer-mode. If any prefix
argument is passed, also call choose-next-buffer-mode."
  (interactive "P")
  (when (or (not next-buffer-mode)
        set)
    (call-interactively 'choose-next-buffer-mode))
  (let ((buffers (spin-buffers (buffers-with-major-mode next-buffer-mode)
                   (buffer-name))))
    (when (cdr buffers)
      (switch-to-buffer (cadr buffers)))))

(defun prev-buffer-with-mode (set)
  "Switches to the 'previous' buffer with a given mode. If the mode is not set,
require it to be set, by calling choose-next-buffer-mode. If any prefix
argument is passed, also call choose-next-buffer-mode."
  (interactive "P")
  (when (or (not next-buffer-mode)
        set)
    (call-interactively 'choose-next-buffer-mode))
  (let ((buffers (spin-buffers (buffers-with-major-mode next-buffer-mode)
                   (buffer-name))))
    (when buffers
      (switch-to-buffer (car (last buffers))))))

关于emacs - 如何仅循环那些处于给定主要模式(例如 Python-mode )的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35501695/

相关文章:

emacs - 在 emacs 中运行 Chicken计划

c++ - Emacs 自动完成功能无法正常工作

dynamic - 当 "parent"缓冲区具有我绑定(bind)的同名局部变量时,为什么 with-temp-buffer 中的代码会提示 void 变量?

emacs - 如何配置 Emacs 以专用计算器窗口?

emacs - 突出显示缓冲区修改

emacs - 在左上角初始化 Emacs

emacs - 更好地控制Emacs窗口

emacs - 在 Emacs 中,keyboard-escape-quit 不破坏其他窗口的最佳方法是什么?

string - 检查字符串是否以 Emacs Lisp 中的后缀结尾

emacs - Emacs Lisp 中的动态变量