すでにコメントで回答したように、Emacsが長い行の再表示で非常に遅くなることはよく知られている問題です。それを修正することは非常に良いことですが、正しく実行するには多くの考えが必要です。このドキュメントのセクション6.3に基づいてどのように達成できるのか考えています
(基本的に、現在のバッファに視覚的な行情報を保存し、空白の挿入、プロパティの表示、ウィンドウの変更などで更新してから、その情報を使用します常にスキャンすることを避けるためにコードを再表示します)が、Cの内部構造を十分に理解していないため、それを実行できません。
ただし、回避策があります。最も明白なものは、表示関連のパラメーターの調整(たとえば、グラフィカルなEmacsインスタンスでの視覚的な行の切り捨ての有効化、非グラフィカルなEmacsを使用した自動化、Bidi機能の無効化など)と、ファイルコンテンツの前処理です。あまり目立たないのは、ファイルを実際に後処理することです。実際に行を切り詰めたり、行が実際よりも短く見えるようにするテキストプロパティを追加したりします。これをより興味深い答えに変えるために、comint
派生オプションでのみ機能する以前のオプションのかなりいハックを紹介します。
(defun my-comint-shorten-long-lines (text)
(let* ((regexp "^\\(.\\{80\\}\\).*?$")
(shortened-text (replace-regexp-in-string regexp "\\1" text)))
(if (string= shortened-text text)
text
(propertize shortened-text 'help-echo text))))
(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)
これはmy-comint-shorten-long-lines
、多くの行で構成されている可能性がある文字列を受け取り、その中の任意の行を80文字以上の長さで置き換える関数を定義します。フックとして使用すると、
表示される前にcomint-preoutput-filter-functions
すべてのcomint
出力がフィルタリングされます。
ただし、このハックの表現にはかなり深刻な弱点があります。基本的なフォント化が行われているモード(などM-x ielm
)では、文字列の一部である行を喜んで切り取り、次の引用符が文字列として表示されるまですべてをフォント化します!それは私たちが望んでいるものではなく、もう少し正規表現を習得することで修正できます(ただし、おそらくPythonのような言語のREPL内で壊れるでしょう)。ここで、短縮出力も強調表示しましょう。
(defun my-comint-shorten-long-lines (text)
(let* ((regexp "^\\(.\\{80\\}\\).*?\\(\"?\\)$")
(shortened-text (replace-regexp-in-string regexp "\\1\\2" text)))
(if (string= shortened-text text)
text
(propertize shortened-text 'font-lock-face 'shadow 'help-echo text))))
(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)
それは少し良いですが、それでもstillいです。find /
inのようなものの出力にカーソルを合わせるのM-x shell
は魅力的ではありません(すべての出力ではなく、短縮されていない行のみを表示するのが理想です)。さらに、入ってくるテキストがバッチに変換されないことも保証されていません。このすべては、一時バッファーで処理ステップを実行することで悲鳴を上げますが、演習(または潜在的なブログ投稿として作成者)として読者に残されます。