【问题标题】:Emacs tab between buffers缓冲区之间的 Emacs 选项卡
【发布时间】:2011-05-07 04:47:11
【问题描述】:

有没有办法在缓冲区之间切换而不必经过 缓冲区列表,还是写我要切换到的缓冲区的名称?更具体地说,我想知道 emacs 是否可以像在记事本 ++ 中那样在缓冲区之间切换标签

【问题讨论】:

标签: emacs elisp


【解决方案1】:

Emacs 22.1 及更高版本 supports previous-buffer (C-x <left arrow>) 和 next-buffer (C-x <right arrow>) 命令。

可以使用this script 将这两个命令添加到旧版 Emacsen。

【讨论】:

  • 是的,请参阅我回答的第一个链接中的Switching Between Two Recently Used Buffers 部分。
【解决方案2】:

我从来没有经常使用 Cx Cx ,因为如果我想循环过去,我发现重复它们很麻烦不止一个缓冲区,所以我刚刚编写了几个函数让你继续使用 切换到next/previous-buffer > 如果最后一个命令也是 next/previous-buffer 命令。

例如Cx 将带您返回三个缓冲区,向前一个,然后再次向后。

我假设 通常绑定到 forward/backward-word,并明确地将它们称为后备。

(defun my-forward-word-or-buffer-or-windows (&optional arg)
  "Enable <C-left> to call next-buffer if the last command was
next-buffer or previous-buffer, and winner-redo if the last
command was winner-undo or winner-redo."
  (interactive "p")
  (cond ((memq last-command (list 'next-buffer 'previous-buffer))
         (progn (next-buffer)
                (setq this-command 'next-buffer)))
        ((memq last-command (list 'winner-redo 'winner-undo))
         (progn (winner-redo)
                (setq this-command 'winner-redo)))
        (t ;else
         (progn (forward-word arg)
                (setq this-command 'forward-word)))))

(defun my-backward-word-or-buffer-or-windows (&optional arg)
  "Enable <C-left> to call previous-buffer if the last command
was next-buffer or previous-buffer, and winner-undo if the last
command was winner-undo or winner-redo."
  (interactive "p")
  (cond ((memq last-command (list 'next-buffer 'previous-buffer))
         (progn (previous-buffer)
                (setq this-command 'previous-buffer)))
        ((memq last-command (list 'winner-redo 'winner-undo))
         (progn (winner-undo)
                (setq this-command 'winner-undo)))
        (t ;else
         (progn (backward-word arg)
                (setq this-command 'backward-word)))))

(global-set-key (kbd "<C-left>") 'my-backward-word-or-buffer-or-windows)
(global-set-key (kbd "<C-right>") 'my-forward-word-or-buffer-or-windows)

【讨论】:

    【解决方案3】:

    (我自己使用 Icicles 进行缓冲区切换,但是...)

    如果你想多次重复前面的命令,只需使用 Cx zzzzzz... 在这种情况下,例如 Cx left Cx zzz...

    如果这太麻烦,请按照其他人的建议将 (next|previous)-buffer 绑定到其他可重复的键。

    但可重复键的需求量很大。如果你不想浪费任何东西,你甚至可以将这样的命令放在前缀键上,这样,例如,你可以这样做,例如,Cx left left left... 这是一个技巧这样做(取自 Bookmark+ 代码):

    (defun my-repeat-command (命令) “重复命令。” (let ((repeat-message-function 'ignore)) (setq last-repeatable-command 命令) (重复无))) (defun my-next-whatever-repeat (arg) ; `C-x right' “跳到第N个——下一个。 N 默认为 1,表示下一个。 简单的‘C-u’意味着从头开始(不重复)。” (交互式“P”) (需要'重复) (my-repeat-command 'next-whatever)) (define-key ctl-x-map [right] 'my-next-whatever-repeat

    【讨论】:

      【解决方案4】:

      虽然以下建议确实使用了缓冲区列表、Ivy(或 Helm)和 evil,但我认为在使用例如太空机。 当然,这些命令可以适应您的个人配置(vanilla Emacs)

      (evil-global-set-key 'motion (kbd "<C-tab>") 'ivy-switch-buffer)
      (evil-global-set-key 'insert (kbd "<C-iso-lefttab>") 'ivy-switch-buffer)
      (define-key ivy-mode-map (kbd "<C-tab>") 'ivy-next-line-and-call)
      (define-key ivy-mode-map (kbd "<C-iso-lefttab>") 'ivy-previous-line-and-call)
      

      或者对于 Helm 的等价物

      (evil-global-set-key 'motion (kbd "<C-tab>") 'helm-buffers-list)
      (evil-global-set-key 'motion (kbd "<C-iso-lefttab>") 'helm-buffers-list)
      (define-key helm-map (kbd "<C-tab>") 'helm-follow-action-forward)
      (define-key helm-map (kbd "<C-iso-lefttab>") 'helm-follow-action-backward)
      

      最后一个命令的键字符串在我的键盘上表示Ctrl-Shift-tab。您可以找到与C-h k C-S-tab 一起使用的那个。

      确实,在释放&lt;C-tab&gt; 后,您仍然需要按RETC-l

      对于使用 Helm 的恶意用户,一个可能更好的选择是将helm-buffers-list 绑定到C-jC-k,然后将helm-follow-mode-persistent 设置为t,并在helm-buffers-list 缓冲区中激活helm-follow-modeC-c C-f。现在您可以使用C-jC-k 切换(和预览)缓冲区。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 2010-09-11
        • 2011-03-25
        • 2019-07-05
        • 2011-06-07
        相关资源
        最近更新 更多