UPDATE 2015: Emacs 24.4 включает в себя настоящую полноэкранную поддержку Windows с использованием toggle-frame-fullscreen
. Вы можете использовать GNU build для Windows без каких-либо изменений (или, предположительно, любой другой сборки).
Проблема заключается в том, что графический интерфейс пользователя определяет размеры всех символов. Это проблема только в Windows, потому что у вас нет frame-parameter
, который преобразуется в собственный полноэкранный режим, и, таким образом, полноэкранный режим должен выполняться путем калибровки и позиционирования.
Вам нужна EmacsW32 исправленная сборка.
Получить последний установщик (в настоящее время Emacs-24-BzrP110217-EmacsW32-1.58.exe) из этого download page.
Это, используемый в сочетании с чем-то вроде emacs-fullscreen-w32 (для удаления заголовка с помощью Windows API), даст вам полный полноэкранный режим.
Поверьте мне, есть нет другого пути, чтобы избавиться от пробела в Windows.
Лично я не хотел строповки вокруг чьей-то EXE в моем .emacs
репо, поэтому я использую следующий C# программы (который я получил от this bitbucket project):
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 работал так, как вы ожидали, включая сохранение/восстановление положения окна.
Я лично потратил слишком много времени на это, поэтому я надеюсь, что это спасет кого-то еще от тупиков.
Нижняя линия, если вы хотите, чтобы истинный emacs в полноэкранном режиме на Windows, используйте исправления Леннарта. Конструкция GNU и создание Cygwin w32 все увеличивают размер окна до целых символов.