如果存在名为“xyz”的帧,则切换到该帧

时间:2013-07-24 00:52:04

标签: emacs elisp

有人可以给我一个功能,检测是否存在名为“xyz”的帧,如果存在,则切换到该帧。我正在使用frame-cmds为每个框架提供用户定义的名称:http://www.emacswiki.org/emacs/frame-cmds.el

我认为它类似于缓冲区,但我在谷歌上找不到任何东西。这是缓冲函数:

(defun buffer-exists (bufname)
    (not (eq nil (get-buffer bufname))))

(defun lawlist-switch-to-buffer-xyz ()
(interactive)
    (if (buffer-exists "xyz")
        (switch-to-buffer "xyz") ))

这是一篇半相关的帖子:https://superuser.com/questions/358037/emacsclient-create-a-frame-if-a-frame-does-not-exist


编辑(2014年9月15日):修改了函数ido-switch-frame以使frame-to成为一个let-bound变量,并删除了message。删除之前的修改,因为Drew Adams撰写的函数get-a-frameget-frame-nameselect-frame-set-input-focus结合使用时已足够了 - 请参阅下面的答案。

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

可能有更优雅的解决方案,但这可以完成工作:

(defun switch-to-frame (frame-name)
  (interactive "sFrame name:")
  (let ((frames (frame-list)))
    (catch 'break
      (while frames
        (let ((frame (car frames)))
          (if (equal (frame-parameter frame 'name) frame-name)
              (throw 'break (select-frame-set-input-focus frame))
            (setq frames (cdr frames))))))))

答案 1 :(得分:1)

  1. 请求“检测名为”xyz“的帧是否存在的函数”:您已经拥有该函数,因为您说您正在使用frame-cmds.el,这需要frame-fns.el - - 函数get-a-frame就是这样做的。

  2. Icicles 提供multi-command icicle-select-frame,可让您使用完成功能按名称选择框架。