2011-11-02 4 views
12

Si ejecuto M-x shell en emacs para obtener un terminal, sabe dónde ajustar las líneas automáticamente. Por ejemplo, la salida de ls está formateada en columnas que se ajustan a la ventana correctamente.La pantalla del modo shell Emacs es demasiado ancha después de dividir la ventana

Mi problema es si luego dividir la ventana verticalmente con C-x 3, el modo de shell todavía cree que la ventana ocupa todo el fotograma. El resultado es una envoltura fea de la salida del comando. ¿Hay alguna forma de que el modo shell sepa que tiene que actualizar el ancho de la pantalla?

EDIT:

Usando la respuesta de HN continuación, se me ocurrió con esta revisión:

(defun my-resize-window() 
    "Reset the COLUMNS environment variable to the current width of the window." 
    (interactive) 
    (let ((proc (get-buffer-process (current-buffer))) 
     (str (format "export COLUMNS=%s" (window-width)))) 
    (funcall comint-input-sender proc str))) 

(defun my-shell-mode-hook() 
    (local-set-key "\C-cw" 'my-resize-window)) 

Respuesta

14

Llego un poco tarde a la fiesta, pero COLUMNS no es la forma de hacerlo. He aquí un extracto de mi .emacs:

(defun comint-fix-window-size() 
    "Change process window size." 
    (when (derived-mode-p 'comint-mode) 
    (set-process-window-size (get-buffer-process (current-buffer)) 
         (window-height) 
         (window-width)))) 

(defun my-shell-mode-hook() 
    ;; add this hook as buffer local, so it runs once per window. 
    (add-hook 'window-configuration-change-hook 'comint-fix-window-size nil t)) 

(add-hook 'shell-mode-hook 'my-shell-mode-hook) 

A diferencia de la exportación de columnas cada vez, este método no requieren que se encuentre en fiesta en el momento y no spam de su sesión con indicaciones en blanco. Este código probablemente debería estar en perfecto estado, tal vez presente un informe de error.

EDITAR: Si modifica window-configuration-change-hook en un buffer-local-way , el gancho se ejecuta una vez por ventana, a diferencia de una vez por cuadro.

+0

Esta es una solución realmente útil. Por favor, envíe como un informe de error! –

+1

Gracias por la útil función, sin embargo, causará problemas cuando el proceso sea nulo, así que agregué una comprobación nula antes de configurar el tamaño de la ventana del proceso - [ver mi respuesta] (http://stackoverflow.com/a/20015336/554279) –

2

Esta pantalla está dictada por la variable de entorno COLUMNAS. En mis columnas configuración tiene un valor de 202, después de ls verticales pantallas divididas correctamente en el modo shell si fijo columnas a través de 80

export COLUMNS=80 

Tiene que haber una manera de codificar esto, pero no tengo suficiente elisp-fu para hacer eso. Si prefieres evitar la molestia a largo plazo, esto se logra automágicamente.

http://www.emacswiki.org/emacs/MultiTerm

0

Trate M - xeshell; no tiene este problema

5

Aquí hay una función de cambio de tamaño ligeramente mejorada de la respuesta de @Christopher Monsanto. El original causará un problema debido a un proceso nulo. (Por ejemplo, exit en modo shell)

(defun comint-fix-window-size() 
    "Change process window size." 
    (when (derived-mode-p 'comint-mode) 
    (let ((process (get-buffer-process (current-buffer)))) 
     (unless (eq nil process) 
     (set-process-window-size process (window-height) (window-width)))))) 
+2

(cuando el proceso es más idiomático que (a menos que (proceso n eq) –

Cuestiones relacionadas