echo Impossible|sed 's/Im/To be /'

February 13, 2017

Emacs - fixed problem ansi-term work with top/less/more

Emacs - fixed problem ansi-term work with top/less/more

一直以來我在 Emacs 的 ansi-term 模式下使用 top/less/more 時一直有頂端少了幾行的問題。如下圖所示:

ansi-term problem

今天有空追查了 term.el 後才終於搞懂問題。由於之前設訂了行距,致使 term 的行數計算錯誤導致,其設定如下:

(setq-default line-spacing 5) ;; 修改行距

解決的方式有二個可供選擇,(1) 設定 term-mode-hook 在啟動 term-mode 時把當時 term buffer 行距設為 0 ,這應該是最簡便的解法,在 init.el 加入以下設定:

(add-hook 'term-mode-hook (function (lambda () (setq line-spacing 0))))

(2) 覆寫 term-check-size function 協助校正終端機高度 (term-height)。這樣作可以保有修改行距的權力, 但校正值的選擇我目前用嘗試錯誤的方法自行測試校正,高度校正值我是用 window-text-height 與行距的比例來作調整,事實上這個算式需包含字高的設定才行。

(defun term-check-size (process)
  (let ((height-adjust (/ (window-text-height) 5))) ;; Modify 5, range is 5~40, Please try and error.
    (when (or (/= term-height (window-text-height))
          (/= term-width (term-window-width)))
      (term-reset-size (- (window-text-height)  height-adjust) (term-window-width))
      (set-process-window-size process term-height term-width))))

方法各有優缺點,不熟 emacs-lisp 建議用方法(1)。

ansi-term ok

Posted by Lloyd Huang in on February 13, 2017