按编号或字母在帧之间切换

时间:2013-07-27 18:04:12

标签: 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)))))))))

2 个答案:

答案 0 :(得分:1)

  1. This answer描述了 Icicles 命令icicle-select-frame,它允许您使用完成按名称选择框架。

  2. 还有冰柱命令icicle-other-window-or-frameC-x o),它结合了命令icicle-select-frameother-frame和{{1 }}。它允许您按名称或顺序选择窗口或框架。

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

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

    • 使用普通icicle-select-frame: 如果所选框架有多个窗口,那么这就是 C-u所有可见帧的窗口为。{1}} 候选人。否则,这是icicle-select-window

答案 1 :(得分: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))

Example