有人可以给我一个功能,检测是否存在名为“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-frame
和get-frame-name
与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)))))))))
答案 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)
请求“检测名为”xyz“的帧是否存在的函数”:您已经拥有该函数,因为您说您正在使用frame-cmds.el,这需要frame-fns.el - - 函数get-a-frame
就是这样做的。
Icicles 提供multi-command icicle-select-frame
,可让您使用完成功能按名称选择框架。