2

この議論にも出くわしました: http://www.reddit.com/r/emacs/comments/15gd16/osx_a_window_sizing_problem/しかし、私は現在 Windows を使用しています (GUI Emacs は、Gnome またはKDE)。

問題は、Emacs のウィンドウが画面全体に表示されないことです。さまざまなフォントを試しましたが、適切な組み合わせが見つかりませんでした (実際、どのフォントも画面いっぱいに表示されませんでした)。それで、私は考えていました...多分、誰かがこれに対する解決策を思いつきましたか? 別のプログラムのランダムなビットがミニバッファーの下に表示されると、本当にずさんに見えます。

4

2 に答える 2

4

UPDATE 2015 : Emacs 24.4 には、Windows を使用した真のフルスクリーン サポートが含まれていますtoggle-frame-fullscreen。Windows 用の GNU ビルドを変更せずに使用できます (または、おそらく他のビルドも)。


問題は、GUI がウィンドウを文字単位でサイズ変更することです。これは Windows のみの問題です。これは、frame-parameterネイティブ フルスクリーンに変換される がなく、サイズ変更と配置によってフルスクリーン モードを実現する必要があるためです。

EmacsW32パッチが適用されたビルドが必要です。

このダウンロード ページから最新のインストーラー (現在は Emacs-24-BzrP110217-EmacsW32-1.58.exe) を入手してください。

これをemacs-fullscreen-w32 (Windows API を使用してタイトルバーを削除する) などと組み合わせて使用​​すると、真のフルスクリーンが得られます。

Windows のギャップを解消する 方法は他にありません。

個人的には、自分のリポジトリで誰かの EXE をいじるのが好きではなかった.emacsので、次の C# プログラムを使用します (この bitbucket プロジェクトから取得しました)。

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace toggleTitle
{
    class Program
    {
        // Constants from WinUser.h
        const int GWL_STYLE = -16;
        const int GWL_EXSTYLE = -20;

        const int SW_MAXIMIZE = 3;

        const uint WS_CAPTION = 0x00C00000;
        const uint WS_BORDER = 0x00800000;
        const uint WS_SIZEBOX = 0x000040000;

        // Imports from user32.dll
        [DllImport("User32", CharSet = CharSet.Auto)]
        private static extern int SetWindowLong(IntPtr hWnd, int Index, int Value);

        [DllImport("User32", CharSet = CharSet.Auto)]
        private static extern int GetWindowLong(IntPtr hWnd, int Index);

        [DllImport("user32.dll")]
        private static extern int ShowWindow(int hwnd, int command);


        // -- main functions
        static int GetWindowStyle(int hwnd) {
            return GetWindowLong(new IntPtr(hwnd), GWL_STYLE);
        }

        static void ToggleWindowCaption(int hwnd) {
        IntPtr intPtrHWND = new IntPtr(hwnd);
            int currentStyle = GetWindowStyle(hwnd);
            int newStyle = currentStyle ^ (int) WS_CAPTION;
            newStyle = newStyle ^ (int)WS_BORDER;
            newStyle = newStyle ^ (int)WS_SIZEBOX;
            SetWindowLong(intPtrHWND, GWL_STYLE, newStyle);
            WinApi.SetWinFullScreen(intPtrHWND);
            //ShowWindow(hwnd, SW_MAXIMIZE);
        }

        static List<Process> FindWindows(Regex regexpToMatch) {
            List<Process> results = new List<Process>();
            foreach (Process win in Process.GetProcesses()) {
                if (regexpToMatch.IsMatch(win.MainWindowTitle)) {
                    results.Add(win);
                }
            }
            return results;
        }

        static void Main(string[] args) {
            System.Console.WriteLine("== toggle windows ==");
            if (args.Length < 1) {
                Console.WriteLine("Usage: togglecaption <hwnd>");
                return;
            }
            int windowHwnd = Int32.Parse(args[0]);

            foreach (Process proc in Process.GetProcesses()) {
                if (proc.MainWindowHandle == new IntPtr(windowHwnd)) {
                    System.Console.WriteLine(proc.MainWindowTitle);
                    Console.WriteLine("Toggled WS_CAPTION on: " + proc.MainWindowTitle);
                    ToggleWindowCaption(windowHwnd);
                    return;
                }
            }

            Console.WriteLine("hwnd not found. Exiting.");
        }
    }

    public class WinApi
    {
        [DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
        public static extern int GetSystemMetrics(int which);

        [DllImport("user32.dll")]
        public static extern void
        SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,
                     int X, int Y, int width, int height, uint flags);        

        private const int SM_CXSCREEN = 0;
        private const int SM_CYSCREEN = 1;
        private static IntPtr HWND_TOP = IntPtr.Zero;
        private const int SWP_SHOWWINDOW = 64; // 0×0040
        private const int SWP_NOSIZE = 1;
        private const int SWP_NOMOVE = 2;

        public static int ScreenX
        {
            get { return GetSystemMetrics(SM_CXSCREEN);}
        }

        public static int ScreenY
        {
            get { return GetSystemMetrics(SM_CYSCREEN);}
        }

        public static void SetWinFullScreen(IntPtr hwnd)
        {
            SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE);
            SetWindowPos(hwnd, HWND_TOP, 0, 0, ScreenX + 7, ScreenY + 7, SWP_SHOWWINDOW | SWP_NOMOVE);
        }
    }
}

これは単純な

csc /out:w32toggletitle.exe *.cs

.NET Framework ディレクトリがパスにある場合。

結果の EXE を自分のパスに配置し、次の elisp コードを使用してそれを呼び出します (これもさまざまなソースから変更されています)。

(setq gpc/frame-box-before-fullscreen nil)

(defun toggle-titlebar ()
  "Toggles the titlebar on the current frame (Windows only)."
  (interactive)
  (call-process (dot-emacs "winpatch/bin/w32toggletitle.exe")
                nil nil nil
                (frame-parameter (selected-frame) 'window-id)))

(defun toggle-fullscreen ()
  "Toggle fullscreen."
  (interactive)
  (if (frame-parameter nil 'fullscreen)
      (fullscreen-off)
    (fullscreen-on)))

(defun fullscreen-on ()
  "Makes emacs frame occupy the full screen, even on Windows."
  (interactive)
  (setq gpc/frame-box-before-fullscreen
        `((top . ,(frame-parameter nil 'top))
          (left . ,(frame-parameter nil 'left))
          (width . ,(frame-parameter nil 'width))
          (height . ,(frame-parameter nil 'height))))
  (when (eq window-system 'w32)
    (unless (frame-parameter nil 'fullscreen)
      (toggle-titlebar))
    (w32-send-sys-command 61488))
  (set-frame-parameter nil 'fullscreen 'fullboth))

(defun fullscreen-off ()
  "Restore frame from fullscreen mode (Windows only... I think)"
  (interactive)
  (when (eq window-system 'w32)
    (w32-send-sys-command 61728)
    ;; HACK to test if titlebar is on or off
    (if (frame-parameter nil 'fullscreen)
      (toggle-titlebar)))
  (set-frame-parameter nil 'fullscreen nil)
  (modify-frame-parameters nil gpc/frame-box-before-fullscreen))

私はそれから使用します

(global-set-key (kbd "<f11>") 'toggle-fullscreen)

GUI モードの場合、ウィンドウ位置の保存/復元を含め、F11 が期待どおりに機能するようにします。

私は個人的にこれにあまりにも多くの時間を費やしてきたので、これが他の誰かを行き止まりから救うことを願っています.

要するに、Windows で真の emacs フルスクリーンが必要な場合は、Lennart のパッチを使用してください。GNU ビルドと Cygwin w32 ビルドはすべて、ウィンドウ サイズを文字全体に強制します。

于 2013-05-26T16:47:58.343 に答える
0

このソリューションは harpo のソリューションよりも単純であり、解像度ではなく文字に基づいて Emacs がサイズ変更する問題を解決しません。ただし、私のソリューションの利点は、Emacs を再コンパイルする必要がないことと、Emacs の最近のエディション (私は 24.3 を使用しています) で動作することです。

自分で解決策を探しているときにこの投稿に出くわし、リンクされている Emacs リリース harpo が古くなっているのを見て、自分で解決策を作ろうと思いました。

いくつかの調査の後、単一のAutoHotKeyスクリプトを使用して一見堅牢なソリューションを作成できることがわかりました。

私は解決策をEmacs wikiに投稿しましたが、Google で同じキーワードを検索しているときに他の人がこの投稿に出くわした場合に備えて、ここに再投稿します。これがwikiからの私の投稿です:

これを適切に機能させるために AutoHotKey スクリプトを試してみましたが、これが私の解決策です。

SetTitleMatchMode 1 ; ウィンドウ名 WinMaximize, emacs@ の先頭のみに一致します。emacs@ は、ウィンドウのタイトル WinSet, Style, -0x40000, emacs@ を参照します。WinSet, Style, -0x800000, emacs@ ; 太枠を削除します。残りの境界線を削除します

これをテキスト ファイルに入れ、拡張子を .ahk に変更し、右クリックして [コンパイル] を選択してコンパイルします (AutoHotKey がインストールされている必要があります)。3 行目と 4 行目は、太い境界線 (WS_THICKFRAME) と境界線 (WS_BORDER) をそれぞれ無効にします。この順序で行うと、背景が透けて見える隙間がなくなります。emacs を起動するたびにこれを自動的に行うには、これを .emacs に追加します。

(shell-command "<name of compiled ahk script>")

<> と内容は、コンパイルされた ahk スクリプトのファイル名 (拡張子付き) に置き換えられます。コンパイルされたスクリプトがパスにあることを確認してください (方法がわからない場合は、検索エンジンで環境変数の変更を検索してください)。私は Emacs 24.3 の GNU ディストリビューションを使用しており、Terminus フォント (サイズ 9) で解像度 2560x1600 を使用しています。これを Windows 8.1 で実行しています。私も追加したことに注意してください

(tool-bar-mode -1)

私の.emacsに(問題が発生し始めたときです。)

他のフォントやさまざまなフォント サイズを試しました。これは頑丈そうです。

于 2014-04-14T17:42:04.303 に答える