gonypage diary

トップ > 2023/06

2023/06/11

20:57 pager-modeを作ってEmacsのバッファ内でログを読んだりできるようにした

最近は業務でもプライベートでも端末内で生活している時間が長く、特に業務ではsshなのでセッション数を増やすのも面倒で可能な限りなんでもEmacs上で済ませたいと思っている。なので、eshellを導入してEmacs内でコンパイルもバージョン管理も済ませるようにしたのだが、これが端末としての互換性はかなりきびしくてlessがまともに動かなく、しょうがないので環境変数PAGERにcatを設定して逃げていた。

それにしてもあまり快適ではないのでもっとよい方法がないのかと思っていたが、Emacs上でテキストファイル内のエスケープシーケンスを色付け表示する方法があるということで、それを使えばよいのではないかと思って実験してみた。

まずは.emacsに以下のように追加してpager-modeを作る:

(define-derived-mode pager-mode fundamental-mode
  "Pager"
  "Pager mode to view texts with ANSI colors."
  (ansi-color-apply-on-region (point-min) (point-max))
  (set-buffer-modified-p nil)
  (define-key pager-mode-map (kbd "SPC") 'scroll-up-command)
  (define-key pager-mode-map "b" 'scroll-down-command)
  (define-key pager-mode-map "q" 'kill-this-buffer))
(add-to-list 'auto-mode-alist '("\\.pager\\'" . pager-mode))

拡張子.pagerで起動するように、ANSIカラーを適用するように、バッファ削除時に確認されないようにする。キーバインドはスペース、B、Qくらいあればよいだろう。

続いてページャコマンドを作る。ここではPythonで書いてemacspagerという名前でパスが通っている場所に置いた:

#! /usr/bin/python3

import os
import sys
import tempfile

if __name__ == "__main__":
    text = ""
    if len(sys.argv) == 1:
        done = False
        while not done:
            try:
                text += input() + "\n"
            except EOFError:
                done = True
    else:
        with open(sys.argv[1]) as file:
            text = file.read()

    fd, file_name = tempfile.mkstemp(".pager", "")
    with os.fdopen(fd, "w") as file:
        file.write(text)
        file.close()

    os.system("emacsclient " + file_name)

やっていることは引数がなければ標準入力を、引数があればそのファイルの内容を一時ファイルに出力し、emacsclientを起動するだけ。

最後に.emacsに環境変数PAGERを設定し、ページャとして使用されるようにする。emacsclientを使用するのでEmacsサーバも起動する必要がある:

(server-start)
(setenv "PAGER" "emacspager")

その後ページャを使用するコマンドを実行すると、その内容がEmacsのバッファ内に開かれるようになる。非常に便利だが、まだエラーハンドリングや大きい文書表示時のパフォーマンスという課題はあるので、追ってそのへんもなんとかしたい。

2023/06/30

21:26 Monthly Update

今月も日記と言いつつ月イチ更新のお時間がやって参りました。皆様いかがお過ごしでしょうか。

今月はなにやってたっけ... NICTオープンハウス2023に行っていた。

というわけでNICTオープンハウス2023を見学中 pic.twitter.com/EfM6Iy8Tbi

— gony(KMS) (@gony) June 24, 2023

無線通信の研究はもうTHz帯の領域に達しているようでびっくりした。直進性の高さなど克服しなければいけない問題もたくさんあるようだけど、そのための研究なのだろう。おもしろかった。

仕事は新年からのお客様と続いている。お役に立てているようでよかった。

COVID-19。モデルナの推計サイトによると感染者数はまだ伸びているようだ。SNSでも感染報告を見かけるようになってきていて、明らかに気をつけないといけないフェーズに入っていると思う。十分な対策を心がけたい。

では、ラーメンで情報量水増しのコーナーです:

事務所ー。ばんごはん食べたら少し片付けやります pic.twitter.com/nbgMwXJMjX

— gony(KMS) (@gony) June 7, 2023

花月嵐でおひる。また変なテンションの限定来たなと思ったがしっかりおいしゅうござった。ほんとに新潟にあるのかは不明 pic.twitter.com/Gt2qEen3Xn

— gony(KMS) (@gony) June 10, 2023

NICTの食堂でおひる。こういう普通のラーメンが食べたい日もある pic.twitter.com/WsaiiYnI6l

— gony(KMS) (@gony) June 24, 2023

ogya- akachannanode ramende ohiru pic.twitter.com/uxjoZfy7QF

— gony(KMS) (@gony) June 26, 2023

今月は意外と食べてないねえ...

Generated by Rui 0.4.3