仅使用模式行制作一个新帧


13

我想创建一个新的框架,其中只包含模式行。特别是没有文件缓冲区。

我为什么需要这个?我使用组织模式的时钟来计时我的工作。组织模式在模式行中显示我正在处理的当前任务的计时器,并实时更新计时器。我使用的不是Emacs,而是其他应用程序,因此当我切换到其他应用程序时(例如,使用浏览器或终端时),我仍然希望能够查看正在运行的计时器。我以为可以创建一个新框架,但是当我现在单击模式行中的计时器时,.org文件将在新框架中打开(该文件已经调整大小以仅显示模式行),而不是跳回到它在第一帧。

这是我的模式行的外观(蓝色条)-这就是我想要的新框架:

在此处输入图片说明

(最终,我将不得不弄清楚如何使新框架始终显示在顶部,但这超出了此问题的范围)

如果相关,我将使用OSX。


1
请注意,我正在研究一些elisp和macruby脚本,这些脚本将在OSX菜单栏中显示组织模式行信息。它为我工作,但我将尝试很好地包装它。
Jordon Biondo

@JordonBiondo-太好了!您的解决方案可能会比我在这里做的还要好。期待它。请保持更新。
Sridhar Ratnakumar

如果您真的感觉自己的回答是“ 很好 ”,则应重新命名并重新陈述您的问题。因为据我所知,他们根本回答您对“ 仅模式行 ” 的框架的要求(而且我怀疑是否会有任何答案)。IOW,如果自从最初提出请求后您放宽了目标,请考虑相应地更新问题。
画了

我同意,看完书后,OP确实似乎有一个特定的问题,但只要求一种解决方案,而不是最佳解决方案。
Jordon Biondo

@Drew-您是否建议任何特定的修改?PythonNut的原始解决方案满足了我的原始请求。请注意,我说“尤其不是文件缓冲区。”,他的解决方案-尽管创建了空缓冲区-不会导致文件缓冲区出现在​​新框架上。
Sridhar Ratnakumar,2015年

Answers:


7

Matthew Piziak的建议扩展JorgenSchäfer 答案将 产生以下摘要

(with-current-buffer (generate-new-buffer "*empty*")
  (make-frame '((minibuffer . nil)
                 (unsplittable . t)
                 (buffer-predicate . (lambda (x) nil))
                 (height . 2)
                 (left-fringe . 0)
                 (right-fringe . 0)
                 (tool-bar-lines . 0)
                 (menu-bar-lines . 0)))
  (set-window-dedicated-p
    (get-buffer-window (current-buffer) t) t))

据我所知,这正确地将窗口锁定为空缓冲区。尝试切换到其他缓冲区将在父框架的现有窗口中打开该缓冲区。


太好了,我已经验证了这个功能。有什么方法可以使新框架继承主框架的字体大小(和字体名称)?另外,可以*empty* All L1 (Fundamental)删除模式行中特定于缓冲区的冗余部分吗?这是我的样子:i.imgur.com/iOLw57c.png
Sridhar Ratnakumar

@SridharRatnakumar幸运的是,剥离多余的模式行信息是微不足道的。我已经修改了我的答案以包括该内容。我不太确定保留字体的意思吗?缓冲区不是空的吗?
PythonNut

我指的是模式行中文本的font属性(不是空缓冲区)。
Sridhar Ratnakumar

嗯,您后面的代码也清除了主机的模式行!如果无法做到这一点,让我们恢复所做的更改,我会接受您的回答(它满足了这个问题)。
Sridhar Ratnakumar

我也注意到了。我已经解决了。执行此操作时,模式行字体不会更改,因此我不确定发生了什么。
PythonNut 2015年

5

这是我能想到的最好的方法:

(with-current-buffer (generate-new-buffer "*empty*")
  (make-frame '((minibuffer . nil)
                (unsplittable . t)
                (buffer-predicate . (lambda (x) nil))
                (height . 2)
                (left-fringe . 0)
                (right-fringe . 0)
                (tool-bar-lines . 0)
                (menu-bar-lines . 0))))

我没有看到一种方法来禁用至少一个带有一个缓冲区的窗口,但是使用此代码段显示的窗口与任何文件都没有关联。在buffer-predicate那里阻止框架被选择是否显示任何(其他)缓冲器,所以如果你能处理一个多余的空行,这应该这样做。


它没有按预期工作。缓冲区仍在新帧中被激活。这是一张动画的gif插图:i.imgur.com/07Q3tcW.gifv
Sridhar Ratnakumar,2015年

2
使用display-buffer-alist可能是解决此问题的方法。
Kaushal Modi 2015年

我不知道为什么org在这里使用不遵循buffer-predicate。使用display-buffer-alist可能确实是一个主意,但是我不知道如何使用它来防止使用特定的框架。
约尔根·谢弗

2
可以解决这个问题set-window-dedicated-p吗?
马修·皮兹亚克

1
buffer-predicate是,根据信息,仅使用的other-buffer功能,即它不能阻止其它功能从帧显示任何缓冲。
politza


3

在OSX菜单栏中显示组织时钟信息的解决方案

这是您指定的问题的替代解决方案:

我使用的不是Emacs,而是其他应用程序,所以当我切换到其他应用程序时(例如,使用浏览器或终端时),我仍然希望能够查看正在运行的计时器。

您可以使用它在osx菜单栏中显示来自org-clock的信息,您几乎总是可以看到该信息。

https://github.com/jordonbiondo/osx-org-clock-menubar在MELPA上可用

请注意,这需要使用macruby。

计时时的样子。

在此处输入图片说明


1
可以使用emacsclient -e "(org-clock-get-clocked-time)"bitbit和bitbar 来完成不依赖于macruby的简单实现:getbitbar.com
mankoff 2016年

太棒了,您应该写下一个解决方案!
Jordon Biondo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.