Подтвердить что ты не робот

Экран режима оболочки Emacs слишком широк после разбиения окна

Если я запустил M-x shell в emacs, чтобы получить терминал, он знает, где автоматически обматывать строки. Например, вывод ls отформатирован в столбцы, которые соответствуют окну должным образом.

Моя проблема в том, что если я затем разбиваю окно по вертикали на C-x 3, shell-mode все равно думает, что окно заполняет весь кадр. Результатом является уродливая упаковка выходных команд. Есть ли способ позволить shell-mode знать, что он должен обновлять ширину экрана?

EDIT:

Используя HN ответ ниже, я придумал это исправление:

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

Ответ 1

Я немного опаздываю на вечеринку, но COLUMNS - это не способ сделать это. Вот отрывок из моего .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)

В отличие от экспорта COLUMNS каждый раз, этот метод не требует, чтобы вы были в bash на данный момент, и это не спам вашей сессии с пустым приглашения. Эта код, вероятно, должен быть в самом comint, возможно, я напишу отчет об ошибке.

EDIT: если вы изменяете window-configuration-change-hook в локальном буфере крючок запускается один раз за окно, в отличие от одного кадра.

Ответ 2

Вот немного улучшенная функция изменения размера из ответа @Christopher Monsanto. Первоначальная проблема вызовет проблему из-за процесса nil. (например, exit в режиме оболочки)

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

Ответ 3

Этот дисплей продиктован переменной окружения COLUMNS. В моей установке COLUMNS имеет значение 202, после вертикального разделения ls отображается правильно в режиме оболочки, если я устанавливаю столбцы на 80 через

export COLUMNS=80

Должен быть способ закодировать это, но для этого мне недостаточно elisp-fu. Если вы предпочитаете избегать многопользовательских проблем, это автоматически выполняется.

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

Ответ 4

Попробуйте M - x eshell; он не имеет этой проблемы.