如果我在emacs中运行M-x shell
来获取终端,它会知道自动换行的位置。例如,ls
的输出格式化为适合窗口的列。
我的问题是如果我然后用C-x 3
垂直分割窗口,shell模式仍然认为窗口填满了整个帧。结果是命令输出的丑陋包装。有没有办法让shell模式知道它必须更新屏幕宽度?
编辑:
使用下面的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))
答案 0 :(得分:14)
我参加派对有点晚了,但是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,也许我会提交错误报告。
编辑:如果您以缓冲区本地方式修改window-configuration-change-hook
钩子每个窗口运行一次,而不是每帧一次。
答案 1 :(得分:5)
这是@Christopher Monsanto的答案中稍微改进的调整大小功能。由于零过程,原始的将导致问题。 (例如exit
在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 :(得分:2)
此显示由COLUMNS环境变量决定。在我的设置中,如果我通过
将列设置为80,则在shell模式下正确显示垂直分割后,COLUMNS的值为202。export COLUMNS=80
必须有一种方法对此进行编码,但我没有足够的elisp-fu来做到这一点。如果你宁愿避免麻烦的多项管理自动化。
答案 3 :(得分:0)
尝试 M - x eshell
;它没有这个问题。