emacs - 按数字或字母在帧之间切换

标签 emacs elisp

我想创建一个函数,为我提供可供切换到的可用帧的编号或字母选择(1, 2, 3a, b, c),而不是手动输入名称。 Aspell将是我能想到的最接近的例子。

有人可以分享一个如何做到这一点的例子吗?以下函数的第 6 到 14 行即时创建所有可用帧名称的列表。与帧切换相关的附加功能可以找到here

(defun switch-frame (frame-to)
  (interactive  (list (read-string (format "From: (%s) => To: %s.  Select: "
    ;;  From:
    (frame-parameter nil 'name)
    ;;  To:
    (mapcar
      (lambda (frame) "print frame"
        (reduce 'concat
          (mapcar (lambda (s) (format "%s" s))
            (list "|" (frame-parameter frame 'name) "|" )
          )
        )
      )
    (frame-list) )
   )))) ;; end of interactive statement
  (setq frame-from (frame-parameter nil 'name))
  (let ((frames (frame-list)))
    (catch 'break
      (while frames
        (let ((frame (car frames)))
          (if (equal (frame-parameter frame 'name) frame-to)
              (throw 'break (select-frame-set-input-focus frame))
            (setq frames (cdr frames)))))) )
  (message "Switched -- From: \"%s\"  To: \"%s\"." frame-from frame-to) )

编辑 (2014 年 11 月 13 日):这是使用 ido-completing-read 的修改后的函数:
(defun ido-switch-frame ()
(interactive)
  (when (not (minibufferp))
    (let* (
        (frames (frame-list))
        (frame-to (ido-completing-read "Select Frame:  "
          (mapcar (lambda (frame) (frame-parameter frame 'name)) frames))))
      (catch 'break
        (while frames
          (let ((frame (car frames)))
            (if (equal (frame-parameter frame 'name) frame-to)
              (throw 'break (select-frame-set-input-focus frame))
              (setq frames (cdr frames)))))))))

最佳答案

我明白你想做什么。以下是我解决此问题的方法:
第1部分
您每天使用的文件应该加书签。
原因是当你阅读任何类型的菜单时你会失去注意力,
甚至和你描述的一样短。用书签一段时间后,
它变得像触摸打字:您选择缓冲区而不考虑它。
你可以看看这个question
看看我的系统。
我有大约 20 个重要文件和缓冲区已添加书签且可访问
在两次击键中,例如μ k 为 keys.el和 μ h 为 hooks.el .
一个不错的奖励是bookmark-bmenu-list显示所有这些东西,所以我可以

  • 轻松添加/删除书签
  • 重命名书签(重命名更改绑定(bind))
  • 它可以用鼠标点击(有时很有用)
  • bookmark+允许功能书签,所以我有 org-agenda在 μ 上
    magit在 μ m 上。
    当然还有 dired书签:来源在 μ s 和
    org 文件位于 μ g 上。
    第2部分
    对于无法添加书签的文件,我正在使用:
    (ido-mode)
    (setq ido-enable-flex-matching t)
    (global-set-key "η" 'ido-switch-buffer)
    
    这也很快:您只需按一下键即可调用 ido-switch-buffer以及大约 2-3 个字母来找到您需要的缓冲区,以及 RET选择。
    我最近还添加了这个技巧:
    (add-hook 'ido-setup-hook
              (lambda()
                (define-key ido-buffer-completion-map "η" 'ido-next-match)))
    
    有了这个,您可以使用相同的键调用ido-switch-buffer并循环选择。
    第 3 部分
    带有字母选项的实际功能已经在我的待办事项列表上一段时间了
    现在。当我开始实现它时,我会在这里发帖,
    或者也许只是从不同的答案复制解决方案:)

    关于emacs - 按数字或字母在帧之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17900889/

    相关文章:

    emacs - 在守护进程 Emacs 中使用字体列表

    emacs - 在 emacs 中,如何仅突出显示当前帧中的当前行?

    emacs - 如何在 Emacs 模式行中显示总行数

    emacs - 在加载时以缓冲区模式启动 emacs sr-speedbar

    emacs - 如何使任何 emacs 缓冲区中的组织语法链接看起来像组织模式?

    Emacs Clojure 模式制表符缩进在某些情况下很大

    Elisp defadvice 围绕澄清

    regex - 组织议程正则表达式搜索类别

    emacs - Emacs 打印缓冲区的自动换行到 PDF

    Emacs 转到行首,跳过缩进