2

有人可以给我一个函数来检测是否存在名为“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. 删除了以前的编辑,因为get-a-frameget-frame-nameDrew Adams 编写的函数结合使用时就足够了select-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)))))))))
4

2 回答 2

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))))))))
于 2013-07-24T02:18:48.733 回答
1
  1. 写下您对“检测是否存在名为“xyz”的框架的函数的请求:您已经拥有了,因为您说您正在使用frame-cmds.el,这需要frame-fns.el --- 函数get-a-frame就是这样做的.

  2. Icicles提供了multi-command icicle-select-frame,它允许您使用完成按名称选择帧。

于 2013-08-10T05:40:43.297 回答