4

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

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

(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)))))))))
4

3 回答 3

2

我明白你想做什么。以下是我解决此问题的方法:

第1部分

您每天使用的文件应该加书签。原因是当你阅读任何类型的菜单时,你会失去注意力,即使是你描述的那么短。使用书签一段时间后,它变得像触摸打字:您选择缓冲区而不考虑它。

您可以查看此问题 以查看我的系统。我有大约 20 个重要的文件和缓冲区,它们被标记为书签,并且可以通过两次击键访问,例如μ kforkeys.elμ hfor hooks.el。一个很好的奖励是bookmark-bmenu-list显示所有这些东西,所以我可以

  1. 轻松添加/删除书签
  2. 重命名书签(重命名更改绑定)
  3. 它可以用鼠标点击(有时很有用)

bookmark+允许功能书签,所以我 一直org-agenda在. 当然还有书签: source is on和 org-files are on 。μ amagitμ mdiredμ sμ 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 部分

带有字母选项的实际功能已经在我的待办事项列表上一段时间了。当我开始实施它时,我会在这里发帖,或者可能只是从不同的答案中复制解决方案:)

于 2013-07-27T18:39:20.240 回答
1
  1. 这个答案描述了Icicles command icicle-select-frame,它允许您使用完成按名称选择帧。

  2. 还有Icicles命令icicle-other-window-or-frame( C-x o),它结合了命令icicle-select-frameother-frameother-window。它允许您按名称或顺序选择窗口或框架。

    • 没有前缀 arg 或非零数字前缀 arg:如果选定的框架有多个窗口,那么这是 other-window. 否则,它是other-frame

    • 使用零前缀 arg(例如C-0):如果所选框架有多个窗口 icicle-select-window,则将框架中的窗口作为候选。否则(单窗口框架),这是icicle-select-frame.

    • With plain C-u:如果所选框架有多个窗口,那么 icicle-select-window所有可见框架中的窗口都作为候选。否则,这是icicle-select-frame.

于 2013-08-10T05:53:56.900 回答
1

根据操作系统的不同,可能需要在函数末尾使用(select-frame-set-input-focus chosen-frame)而不是select-frame/ 。raise-frame

(defface frame-number-face
  '((t (:background "black" :foreground "red" )))
  "Face for `frame-number-face`."
  :group 'frame-fn)

(defface frame-name-face
  '((t ( :background "black" :foreground "ForestGreen")))
  "Face for `frame-name-face`."
  :group 'frame-fn)

(defun select-frame-number ()
"Select a frame by number -- a maximum of 9 frames are supported."
(interactive)
  (let* (
      choice
      chosen-frame
      (n 0)
      (frame-list (frame-list))
      (total-frames (safe-length frame-list))
      (frame-name-list
        (mapcar
          (lambda (frame) (cons frame (frame-parameter frame 'name)))
          frame-list))
      (frame-name-list-sorted
        (sort
          frame-name-list
          #'(lambda (x y) (string< (cdr x) (cdr y)))))
      (frame-number-list
        (mapcar
          (lambda (frame)
            (setq n (1+ n))
            (cons n (cdr frame)))
          frame-name-list-sorted))
      (pretty-list
        (mapconcat 'identity
          (mapcar
            (lambda (x) (concat
              "["
              (propertize (format "%s" (car x)) 'face 'frame-number-face)
              "] "
              (propertize (format "%s" (cdr x)) 'face 'frame-name-face)))
            frame-number-list)
          " | "))  )
    (message "%s" pretty-list)
    (setq choice (read-char-exclusive))
    (cond
      ((eq choice ?1)
        (setq choice 1))
      ((eq choice ?2)
        (setq choice 2))
      ((eq choice ?3)
        (setq choice 3))
      ((eq choice ?4)
        (setq choice 4))
      ((eq choice ?5)
        (setq choice 5))
      ((eq choice ?6)
        (setq choice 6))
      ((eq choice ?7)
        (setq choice 7))
      ((eq choice ?8)
        (setq choice 8))
      ((eq choice ?9)
        (setq choice 9))
      (t
        (setq choice 10)))
    (setq chosen-frame (car (nth (1- choice) frame-name-list-sorted)))
    (when (> choice total-frames)
      (let* (
          (debug-on-quit nil)
          (quit-message
            (format "You must select a number between 1 and %s." total-frames)))
        (signal 'quit `(,quit-message ))))
    (select-frame chosen-frame)
    (raise-frame chosen-frame)
    chosen-frame))

例子

于 2014-11-14T03:49:50.980 回答