2013-05-26 7 views
1

Я также столкнулся с этим обсуждением: http://www.reddit.com/r/emacs/comments/15gd16/osx_a_window_sizing_problem/, но я сейчас на Windows (GUI Emacs не имеет такого поведения при работе в Gnome или KDE).GUI Emacs fullscreen не покрывает весь экран

Проблема в том, что окно Emacs не заполняет весь экран. Я пробовал разные шрифты, но не мог найти хорошую комбинацию (фактически, ни один из тех, которые я пробовал, не заполнял весь экран). Итак, я думал ... может быть, кто-нибудь придумал решение? Это действительно выглядит неряшливо, когда какой-то случайный бит другой программы появляется ниже минибуфера.

ответ

3

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 все увеличивают размер окна до целых символов.

0

Это решение проще, чем у harpo, и не разрешает проблему изменения размера Emacs на основе символов вместо разрешения.Преимущество моего решения состоит в том, что вам не нужно перекомпилировать Emacs и что он работает с последними выпусками Emacs (я использую 24.3.)

Я наткнулся на это сообщение, ища решение для него сам , и, видя, что Emacs выпускает привязку к гастролям, устарел, я решил, что постараюсь сделать свое решение самостоятельно.

После некоторых исследований, я обнаружил, что могу создать надежное решение, используя один сценарий AutoHotKey.

Я разместил решение по адресу the Emacs wiki, но я его перепечатаю здесь, если другие люди натыкаются на это сообщение при поиске тех же ключевых слов в Google. Вот мой пост из вики:

я баловался с AutoHotkey скрипт для получения этого работать должным образом, и это мое решение:

SetTitleMatchMode 1; соответствует только началу имени окна WinMaximize, emacs @; emacs @ ссылается на заголовок окна WinSet, Стиль, -0x40000, emacs @; удаляет толстую рамку WinSet, Style, -0x800000, emacs @; удаляет остальную часть границы

Put это в текстовый файл, измените расширение на .ahk и правой мыши и выберите команду компиляции для того, чтобы скомпилировать (вам нужно AutoHotKey установлен). 3-я и 4-я строки отключают толстые границы (WS_THICKFRAME) и границу (WS_BORDER) соответственно. Если это сделано в этом заказе, я не получаю пробелов, где светит фон. В для того, чтобы сделать это автоматически каждый раз, когда вы запускаете Emacs, добавьте в ваши .emacs

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

Где <> и содержимое заменяется именем файла (с расширением) из выполнил скрипт ahk. Убедитесь, что выполненный сценарий находится в вашем пути (поиск изменений переменных окружения в поисковой системе , если вы не знаете, как это сделать). Я использую GNU-дистрибутив Emacs 24.3, используя разрешение 2560x1600 с шрифтом Terminus (размер 9). Я запускаю это на Windows 8.1. Обратите внимание, что я также добавил

(tool-bar-mode -1) 

моего .emacs (который, когда начались проблемы происходят.)

Я экспериментировал с другими шрифтами и различных размерами шрифта. Это кажется надежным.

Смежные вопросы