【问题标题】:If frame named "xyz" exists, then switch to that frame如果存在名为“xyz”的帧,则切换到该帧
【发布时间】:2013-07-24 00:52:04
【问题描述】:

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

我想它类似于缓冲区,但我在 Google 上找不到任何东西。这里是缓冲函数:

(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 绑定变量,并删除了 message。删除了以前的编辑,因为 Drew Adams 编写的函数 get-a-frameget-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)))))))))

【问题讨论】:

    标签: emacs elisp


    【解决方案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))))))))
    

    【讨论】:

    • 非常感谢这个有用的功能。我尝试设置(message "%s" frames) | (message "%s" frame-list),但收到错误消息。 frame-list 不是交互式的,并且在搜索 *.el Emacs 源文件时不会作为函数出现。有什么方法可以返回所有框架名称的打印显示列表,以帮助我决定要切换到哪个框架?
    • 好吧,更近一步——(message "%s" frames) 没有抛出错误消息——它实际上返回了一个包含每个帧名称的长字符串。现在我只需要从长字符串中剔除短帧名称 -- (#<frame FRAME-NAME 0x105083fc0>
    • @lawlist 将响应作为单独的 cmets 输入,这样它们就不会出现在一个巨大的不可读的段落中:1) frame-list 是一个函数,而不是一个变量,这就是为什么 (message %s frame-list) 会打印一个关于它的错误不是变量(将来,当您收到错误消息时,请将其复制到此处;这是有用的信息)。您需要(message %s (frame-list)) 才能看到调用它的结果。
    • @lawlist 2) 您在 Emacs lisp 源代码中没有看到 frame-list 的原因是它是用 C 实现的。您可以通过 @987654331 获取有关任何函数的信息(包括它的实现位置) @,例如,C-h f frame-list
    • @lawlist 3) (frame-list) 返回框架对象列表。您的message 显示每个框架对象的打印表示,这与其名称不同。要获取 frame 的名称,请使用 (frame-parameter frame 'name)。要获取每一帧的名称,可以使用(mapcar (lambda (frame) (frame-parameter frame 'name)) (frame-list))
    【解决方案2】:
    1. 写下您对“检测是否存在名为“xyz”的框架的函数的请求:您已经拥有了,因为您说您正在使用frame-cmds.el,这需要frame-fns.el --- 函数@ 987654326@ 就是这样做的。

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

    【讨论】:

    • 感谢您的帖子——我会在接下来的几天内查看它们——非常感谢!
    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2017-02-25
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多