【问题标题】:How to maximize Emacs on Windows at startup?如何在启动时在 Windows 上最大化 Emacs?
【发布时间】:2010-10-23 08:22:07
【问题描述】:

这让我发疯了:我只是想让 Emacs 最大化我在启动时拥有的任何屏幕分辨率。理想情况下,我喜欢适用于任何屏幕分辨率的跨平台(Windows 和 Linux)解决方案,但我什至无法让它在具有硬编码尺寸的 Window XP 上运行。

这是我尝试过的:

  1. 使用适当的高度/宽度设置初始帧列表
  2. 设置默认框架列表
  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))))))
    
  5. 在我的 init 文件的开头和结尾都尝试了上述方法,以试图消除其他 init 事物的干扰。

不幸的是,以上都不起作用!对于上述某些情况,我可以看到我的 emacs 窗口在一瞬间正确调整大小,然后恢复为较小的默认大小。如果我在初始化后运行上述方法,emacs 窗口会正确调整大小。这到底是怎么回事?

[附注还有其他关于此的 SO 问题,但没有一个答案有效]


更新:

答案让我认为我的 init 文件中的其他内容导致了问题。确实如此!经过一番尝试和错误,我找到了罪魁祸首。如果我注释掉以下行,一切正常:

(tool-bar-mode -1)

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

所以现在的问题是:如何禁用工具栏(毕竟,emacs 的工具栏很丑,占用宝贵的屏幕空间)并在我的 init 文件中最大化窗口?工具栏干扰窗口大小可能是一个错误?

澄清:(tool-bar-mode -1) 关闭工具栏,但这条线会干扰 Emacs 窗口的最大化。因此,如果我尝试将功能最大化窗口并关闭工具栏,则最大化部分将失败;如果工具栏部分被注释掉,那么最大化部分就可以了。我使用什么解决方案(在我列出的 4 个中)甚至都无关紧要。


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

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

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\GNU\Emacs]
"Emacs.Toolbar"="-1"

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

【问题讨论】:

  • 您是通过快捷方式还是从命令行启动 emacs?
  • 我使用 runemacs.exe 包装器启动它,如果我理解正确,它只是在 Windows 上启动 emacs 二进制文件而无需命令行提示。如果您要建议 -geometry 选项,那对我没有用,因为我有太多地方可以独立启动 emacs 和其他选项,并且将它们全部更改为包含 -geometry 选项是不切实际的......
  • 本来打算建议-fs,但在实用性方面有相同的区别。

标签: emacs elisp


【解决方案1】:

我发现 an answer a year-or-so back 解释说你必须操纵注册表才能做正确的事情:

要启动 Emacs 最大化放置这一行 在 ~/.emacs 文件的末尾:

(w32-send-sys-command 61488)

如果你不想要 Emacs 工具栏 您可以添加行 (tool-bar-mode -1) [注意:原始页面上的值为 0] 到您的 ~/.emacs 文件,但 Emacs 不会 在这种情况下完全最大化 - 真正的 工具栏占用的空间是 丢失。您必须禁用工具栏 在注册表中取回它:

[HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs\Emacs.Toolbar]
@="0"

如果您查看 EmacsWiki 下的 W32SendSys command-codes,您会发现 61488最大化当前帧

【讨论】:

  • 我的 .emacs 文件中已经有了 w32-send-sys-command,并且只有在我的 .emacs 文件中没有指定 (tool-bar-mode -1) 时它才有效。不过,关闭工具栏的注册表技巧对我不起作用...
  • 经过一番修改后,我发现 Emacs 不会创建一个键,而是将 Emacs.Toolbar 作为 Emacs 键中的一个值来响应。该值也应为-1。然后瞧,终于!我在我的问题中发布了一个可行的解决方案作为更新。
  • 我仔细检查过,虽然原始页面确实显示 (tool-bar-mode 0),但我的 .emacs 有 (tool-bar-mode -1);现在反映在上面。但是,我的注册表值仍然是 0,而不是 -1。嗯。
  • 我希望我能给予双赞!!!!非常感谢你!!!它不仅在启动时有效,而且可以在每个make-frame 之后调用。这非常适合 OSX 上的 Parallels。我好开心!!!
【解决方案2】:

这是对我有用的最简单的修复方法:

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

【讨论】:

  • 啊,直接在 _emacs 中设置变量对我不起作用,但通过 window-setup-hook 设置它们可以。谢谢。
【解决方案3】:

兄弟们,怎么了

emacs -mm?

这会启动 Emacs 完全最大化。把它放在你的快捷方式中,它真的取决于你使用的窗口管理器;我自己只是在我的.*shrc 中使用别名。

在不同但并非不相关的说明中,我实际上启动 Emacs 的方式是,如果它已经启动,则所选文件只是在我现有的 Emacs 会话中作为新缓冲区打开:

if [ "$(pidof emacs)" ] ; then
    emacsclient "$@"
else
    emacs -mm "$@"
fi

我把它放在一个 ~/bin/e 中,然后用“e”启动 Emacs。 我在文件管理器中右键单击一个文本文件,选择“用另一个程序打开”并输入“e”,现在我只需双击文件,它们都在同一个会话中整齐地打开。

所有的东西都是桃子和口齿不清的:)

【讨论】:

  • 这是迄今为止我认为最简单的选择。
【解决方案4】:

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

(defun x11-maximize-frame ()
  "Maximize the current frame (to full screen)"
  (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。)当我将命令绑定到一个按钮并重复按下它时,帧在三种状态之间循环:正常、最大化和一些奇怪的状态,它比正常高一点,但不是尽可能高。但这是一个小问题。
【解决方案5】:

这在Emacs 24.5.1 (i686-pc-mingw32) 上可靠运行:

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

【讨论】:

    【解决方案6】:

    首先,感谢您提供有关 (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 http://stackoverflow.com/questions/815239/how-to-maximize-emacs-on-windows-at-startup)
        (tool-bar-mode 1)
        (w32-send-sys-command 61488)
        (tool-bar-mode -1)
    )
    

    【讨论】:

      【解决方案7】:

      解决此类问题的另一种方法是延迟

      (menu-bar-mode -1)
      (tool-bar-mode -1)
      (tooltip-mode -1)
      (scroll-bar-mode 1)
      

      和 set-frame-* 函数。例如:

       (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-* 函数之间设置延迟!

      【讨论】:

        【解决方案8】:

        我遇到了一个似乎可以工作的命令(toggle-frame-maximized),它在 Linux 和 Windows 上都可以工作。

        我只是在设置完所有内容后将它放在我的 init 文件的末尾附近,并假设在设置结束时所有内容不会被最大化,瞧,它可以工作了。

        【讨论】:

        • 我发现(set-frame-parameter nil 'fullscreen 'maximized) 会使框架最大化,而不会意外取消最大化已经最大化的编辑器。这就是(toggle-frame-maximized) 所调用的。
        【解决方案9】:

        嘿 - 不错的功能!感谢发帖

        我认为它可能不适合您,因为您的代码看起来像 在您的 init 文件中的其他位置之后。正在应用默认框架列表 创建框架后。我删除了 size 和 position 元素,你可以正常工作 在启动 emacs 时效果很好。

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

        【讨论】:

          【解决方案10】:

          如果您真的想在没有窗口镶边(标题栏和最大/最小/关闭按钮)的情况下全屏运行 Emacs,请尝试以下模式。这对我在 XP SP3 上的 Emacs 23.3.1 有效。

          http://www.martyn.se/code/emacs/darkroom-mode/

          【讨论】:

            【解决方案11】:

            每一个。 emacs 23.3.1,blow 代码无效。因为 (menu-bar-mode -1) 会导致 windows 不 也全屏。

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

            我搜索 Eamcs wiki,找到一个可用的方法。

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

            微软视窗

            如果您使用的是 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 中可以使用,ok!
            • 另一种更优雅的方式:(run-with-idle-timer 0 nil 'maximize-frame),当运行maximize-frame函数时,它会空闲0秒,这会让你的frame可以正确最大化
            【解决方案12】:
            (defun resize-frame ()
            "Set size"
            (interactive)
            (set-frame-width (selected-frame) 110)
            (set-frame-height (selected-frame) 33)
            (set-frame-position (selected-frame) 0 1))
            

            以下是我的 .emacs 文件中调用的最后一个函数,它设置屏幕的高度和宽度,它在 debian 和 mac os x 上的 emacs 22 和 emacs 23 上都有效。根据您的屏幕设置高度和宽度数字。

            【讨论】:

              【解决方案13】:

              要禁用工具栏,请添加行

              (tool-bar-mode nil)
              

              到您的自定义文件(通常是根目录中的 .emacs)。

              【讨论】:

              • 我想你误解了我的问题。 (tool-bar-mode nil) 和 (tool-bar-mode -1) 做同样的事情,并且 (tool-bar-mode -1) 正是我的 .emacs 文件中的内容,它是 Emacs 的原因没有正确最大化。
              【解决方案14】:

              emacs-full-screen-win32 项目会帮助你:)

              【讨论】:

                【解决方案15】:

                emacswiki 的以下 sn-p 对我来说效果很好: (添加到您的启动配置文件)

                (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)
                

                【讨论】:

                  猜你喜欢
                  • 2011-12-07
                  • 1970-01-01
                  • 2017-02-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-06-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多