如何在Windows启动时最大化Emacs窗口?

45
这真的让我抓狂:我希望Emacs在启动时能够最大化到屏幕分辨率。理想情况下,我想要一个跨平台(Windows和Linux)的解决方案,适用于任何屏幕分辨率,但是即使在仅有的Windows XP上使用硬编码大小也无法实现。

以下是我尝试过的方法:

  1. 使用适当的高度/宽度设置initial-frame-alist
  2. 设置default-frame-alist
  3. (仅限Windows) 通过 (w32-send-sys-command 61488) 发送消息给Emacs窗口,让其最大化
  4. 尝试了在某处找到的这个函数:

    (defun toggle-fullscreen ()
      "toggles whether the currently selected frame consumes the entire display
    or is decorated with a window border"
      (interactive)
      (let ((f (selected-frame)))
        (modify-frame-parameters 
         f
         `((fullscreen . ,(if (eq nil (frame-parameter f 'fullscreen)) 
                              'fullboth
                            nil))))))
    
    尝试在我的初始化文件的开头和结尾使用上述方法,以尝试消除其他初始化内容的干扰。不幸的是,以上方法都无效!对于其中一些方法,我可以看到我的emacs窗口在恢复到较小的默认大小之前正确地重新调整大小。如果我在初始化后运行上面的方法,emacs窗口确实可以正确调整大小。这到底是怎么回事?[附言:这里有其他SO问题,但没有一个答案有效]更新:答案让我想到,我的初始化文件中的其他东西可能会导致问题。而且确实是这样!经过一些尝试和错误,我找到了罪魁祸首。如果我注释掉以下行,一切都可以完美地工作:
    (tool-bar-mode -1)
    

    工具栏和最大化窗口有什么关系?

    现在的问题是:如何在我的init文件中禁用工具栏(毕竟,Emacs的工具栏很丑,占用了宝贵的屏幕空间)并最大化窗口?难道工具栏会影响窗口大小吗?

    澄清一下,(tool-bar-mode -1) 可以关闭工具栏,但这行代码会影响Emacs窗口的最大化。因此,如果我尝试将最大化窗口和关闭工具栏的功能放在一起,最大化部分就会失败;如果注释掉工具栏部分,则最大化部分将正常工作。不管我使用什么解决方案(在我列出的4个解决方案中选择),都无济于事。


    解决方案:(或者至少对我现在有效的方法)

    这可能是Emacs的一个bug。解决方法是通过注册表禁用工具栏,而不是在.emacs文件中。将以下内容保存为 .reg 文件,并在Windows资源管理器中执行该文件:

    Windows Registry Editor Version 5.00
    
    [HKEY_CURRENT_USER\Software\GNU\Emacs]
    "Emacs.Toolbar"="-1"
    

    (这个解决方案是OtherMichael建议的工作版本)。


你是通过快捷方式还是命令行启动emacs的? - Sean Bright
我使用runemacs.exe包装器启动它,如果我理解正确,在Windows上只是启动emacs二进制文件而没有命令行提示。如果你要建议-geometry选项,那对我来说没有用,因为我有太多的地方独立启动emacs并带有其他选项,改变所有这些选项以包括-geometry选项是不切实际的... - polyglot
本来想建议使用“-fs”,但实际上与实用性相同。 - Sean Bright
15个回答

25

我在一年前在这里找到了一个答案,解释说你必须操纵注册表才能正确地执行某些操作:

要让Emacs最大化,将以下行添加到您的~/.emacs文件末尾:

(w32-send-sys-command 61488)
如果你不想要Emacs工具栏,可以在你的~/.emacs文件中添加一行(tool-bar-mode -1) [注意:原始页面上值为0],但这种情况下Emacs将无法完全最大化 - 工具栏占用的空间将会丢失。你需要在注册表中禁用工具栏才能恢复它:
[HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs\Emacs.Toolbar]
@="0"
如果您在EmacsWiki中查看W32SendSys命令代码,您会发现61488最大化当前框架

我已经在我的.emacs文件中有w32-send-sys-command,并且它只在我没有在我的.emacs文件的某个地方指定(tool-bar-mode -1)时才起作用。尽管关闭工具栏的注册表技巧对我不起作用... - polyglot
经过一些尝试,我发现Emacs不是创建一个键,而是将Emacs.Toolbar作为Emacs键内的值进行响应。此外,该值应为-1。然后,终于!我在我的问题中发布了一个可行的解决方案作为更新。 - polyglot
我仔细检查了一下,虽然原始页面确实写着(tool-bar-mode 0),但我的.emacs文件中写的是(tool-bar-mode -1),已经更新。然而,我的注册表数值仍然是0,而不是-1。唔。 - Michael Paulukonis
我希望我能给你双倍的赞!!非常感谢!!它不仅在启动时有效,而且可以在每次“make-frame”之后调用。这对于在OSX上的Parallels来说是完美的。我太高兴了!! - lawlist

13

这是对我有效的最简单的解决方法:

(w32-send-sys-command #xf030)
(add-hook 'window-setup-hook (lambda () (tool-bar-mode -1)))

啊,直接在_emacs中设置变量对我没有用,但是通过window-setup-hook设置它们可以。谢谢。 - J. Peterson

12

各位,emacs -mm有什么问题吗?

这将完全最大化启动Emacs。将其放在快捷方式中,这实际上取决于您使用的窗口管理器;我自己只是在我的.*shrc中进行别名设置。

另外,我实际上以一种方式启动Emacs,如果它已经启动,则所选文件只会作为新缓冲区在我的现有Emacs会话中打开:

if [ "$(pidof emacs)" ] ; then
    emacsclient "$@"
else
    emacs -mm "$@"
fi
我把这个放在了~/bin/e中,并通过"e"启动Emacs。 我在文件管理器中右键单击一个文本文件,选择“使用其他程序打开”,然后输入“e”,现在我只需双击文件,它们就会在同一个会话中整洁地打开。 一切都很顺利和Lispy :)

1
在我看来,这绝对是最容易的选择。 - sma

10

在X.org上,系统调用是(因为您最初要求跨平台解决方案):

(defun x11-maximize-frame ()
  "最大化当前帧(至全屏)"
  (interactive)
  (x-send-client-message nil 0 nil "_NET_WM_STATE" 32 '(2 "_NET_WM_STATE_MAXIMIZED_HORZ" 0))
  (x-send-client-message nil 0 nil "_NET_WM_STATE" 32 '(2 "_NET_WM_STATE_MAXIMIZED_VERT" 0)))

谢谢!这对我很有效。(使用Xubuntu。)当我将命令绑定到按钮并重复按下它时,框架会在三种状态之间循环:正常、最大化和一些奇怪的状态,它比正常状态高一点,但不是尽可能高。但这只是一个小问题。 - Teemu Leisti

5

Emacs 24.5.1 (i686-pc-mingw32)上,它可以可靠地运行:

(add-to-list 'initial-frame-alist '(fullscreen . maximized))

3
另一种解决此类问题的方法是在它们之间添加延迟。
(menu-bar-mode -1)
(tool-bar-mode -1)
(tooltip-mode -1)
(scroll-bar-mode 1)

并且设置框架-*函数。例如:

 (tool-bar-mode -1)
 (when window-system
  (run-at-time (format "%d sec" 1) nil '(lambda () (set-frame-position (selected-frame) 1 1)))
  (run-at-time (format "%d sec" 2) nil '(lambda () (set-frame-width (selected-frame) 150 t)))
  (run-at-time (format "%d sec" 3) nil '(lambda () (set-frame-height (selected-frame) 60 t)))
  )

在使用 set-frame-* 函数时,也很重要要添加适当的延迟!


3

首先,感谢您提供(tool-bar-mode -1)的错误提示;这为我节省了很多麻烦!我宁愿将所有内容都保存在.emacs文件中(不进行注册表修改),因此,如果您在最大化之前打开工具栏,然后再关闭它,您就可以很好地实现最大化:

(defun maximize-current-frame () "Resizes the current frame to fill the screen"
    (interactive)
    ;; There is a bug in tool-bar-mode that prevents it from being
    ;; maximized, so turn it on before maximizing.
    ;; See https://dev59.com/qnRA5IYBdhLWcg3wzhbZ)
    (tool-bar-mode 1)
    (w32-send-sys-command 61488)
    (tool-bar-mode -1)
)

2

我遇到了一个看起来很有用的命令(toggle-frame-maximized),它可以在Linux和Windows上工作。

我在设置好所有内容后将其放在init文件的末尾,假设在设置结束时一切都没有被最大化,就像变魔术一样,它就可以工作了。


1
我发现(set-frame-parameter nil 'fullscreen 'maximized)可以使框架最大化,而且不会在编辑器已经最大化的情况下意外取消最大化。这就是(toggle-frame-maximized)所调用的。 - ptd

1

嘿 - 不错的函数!感谢您的发布

我认为它可能不起作用是因为你在 init 文件的其他地方有类似以下代码的东西。默认的框架属性是在框架创建之后应用的。我删除了大小和位置元素,您的功能可以在 Emacs 启动时正常工作。

   (setq default-frame-alist
     (list
      (cons 'left                 350)
      (cons 'top                  0)
      (cons 'width                80)
      (cons 'height               45)
     ......

1
大家好。Emacs 23.3.1,以下代码无效。因为(menu-bar-mode -1)也会导致窗口不全屏。
(w32-send-sys-command #xf030)
(add-hook 'window-setup-hook (lambda () (tool-bar-mode -1)))

我在Emacs维基上搜索,找到了一个可用的方法。

http://www.emacswiki.org/emacs/FullScreen#toc3

MS Windows

如果您使用的是 MS Windows,且想要使用“真正的全屏模式”,即摆脱顶部标题栏等,请参阅暗室模式网站上的 w32-fullscreen。

或者,可以在此处获取修补程序,该程序可使全屏帧参数在 Windows 上真正进入全屏模式。

要获得最大化的窗口,可以使用:(w32-send-sys-command #xf030)

注意!如果您希望 Emacs 启动时最大化,请将此代码放入您的 .emacs 文件中:

(defun jbr-init ()
  "Called from term-setup-hook after the default
terminal setup is
done or directly from startup if term-setup-hook not
used.  The value
0xF030 is the command for maximizing a window."
  (interactive)
  (w32-send-sys-command #xf030)
  (ecb-redraw-layout)
  (calendar)
)
(setq term-setup-hook 'jbr-init)
(setq window-setup-hook 'jbr-init)

嗨~我找到了解决最终问题的方法。全屏错误与启动时间延迟有关。你可以在你的全屏函数中添加以下代码,例如:(w32-send-sys-command 61488) (sleep-for 0.2) ;;延迟2秒,它在emacs 23.3.1中有效,好的! - zw963
另一种更优雅的方式是:(run-with-idle-timer 0 nil 'maximize-frame),当运行 maximize-frame 函数时,它会空闲 0 秒,这将使您的框架可以正确地最大化。 - zw963

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接