2011-11-02 15 views
12

Se eseguo M-x shell in emacs per ottenere un terminale, esso sa dove avvolgere le linee automaticamente. Ad esempio, l'output di ls viene formattato in colonne che si adattano correttamente alla finestra.La visualizzazione in modalità shell di Emacs è troppo ampia dopo aver diviso la finestra

Il mio problema è se poi divido la finestra verticalmente con C-x 3, la modalità shell continua a pensare che la finestra riempia l'intero fotogramma. Il risultato è brutto involucro di output di comando. C'è un modo per far sapere a shell-mode che deve aggiornare la larghezza dello schermo?

EDIT:

Utilizzando la risposta di HN di seguito, mi si avvicinò con questa correzione:

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

risposta

14

Sono un po 'in ritardo per la festa, ma COLUMNS non è il modo per farlo. Ecco un estratto dal mio .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 differenza di esportazione COLONNE ogni volta, questo metodo non richiede di essere in bash in questo momento e non lo spam la sessione con i richiami vuoti. Questo codice dovrebbe essere probabilmente in comint stesso, forse scriverò un bug report.

MODIFICA: Se si modifica window-configuration-change-hook in un buffer locale a , l'hook viene eseguito una volta per finestra, anziché una volta per fotogramma.

+0

Questa è una soluzione davvero utile. Si prega di inviare come una segnalazione di bug! –

+1

Grazie per la funzione utile, tuttavia causerà problemi quando il processo è zero, quindi ho aggiunto un controllo nullo prima di impostare la dimensione della finestra del processo - [vedi la mia risposta] (http://stackoverflow.com/a/20015336/554279) –

2

Questo display è dettata dalla variabile di ambiente COLONNE. In mie colonne di impostazione ha un valore di 202, dopo ls verticale visualizzata dividere correttamente sul guscio-mode se regolo colonne a 80 tramite

export COLUMNS=80 

Ci deve essere un modo per codificare questo in su ma non ho abbastanza elisp-fu per farlo. Se preferisci evitare la seccatura multipla, gestisci questo automagicamente.

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

0

Prova M - xeshell; non ha questo problema

5

Ecco una funzione di ridimensionamento leggermente migliorata dalla risposta di @Christopher Monsanto. Quello originale causerà un problema a causa del processo nullo. (ad esempio exit in modalità 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

(quando il processo è più idiomatico di (a meno che (processo eq nil) –

Problemi correlati