• 作成:

Emacsのdocker.elでイメージ名が見切れてしまうのを解決

問題

EmacsのDocker関連パッケージまとめ - ncaq で書いたように、 Emacsには良いDockerクライアントがあるのですが、問題があります。

その問題はイメージ名の表示が短いため、 AWSにpushしたイメージなどが全く見分けられないことです。

docker-imageの実行結果の様子

他の設定を参考にして解決はしますが

レイアウトを定義しているのはtabulated-listなので他で弄ってる所を参考にすれば問題なさそうですね。

(leaf tabulated-list
  :config
  ;; パッケージの名前などの幅を大きくとる
  (define-derived-mode package-menu-mode tabulated-list-mode "Package Menu"
    "Major mode for browsing a list of packages.
Letters do not insert themselves; instead, they are commands.
\\<package-menu-mode-map>
\\{package-menu-mode-map}"
    (setq tabulated-list-format
          [("Package" 35 package-menu--name-predicate)
           ("Version" 15 package-menu--version-predicate)
           ("Status"  10 package-menu--status-predicate)
           ("Description" 10 package-menu--description-predicate)])
    (setq tabulated-list-padding 1)
    (setq tabulated-list-sort-key (cons "Status" nil))
    (tabulated-list-init-header)))

モンキーパッチやめよう

待てよこれよく見たらモンキーパッチでは?

私のEmacsに起きてた怪現象であるパッケージリストを2回開かないとパッケージ更新が受け取れない問題って、このモンキーパッチが原因なのでは?

削除してみよう。解決しました。

hookで変更して解決

元の変数がカスタム不能になっているのでモンキーパッチをやめて解決する方法はhookでいじることですね。

しかし、 tabulated-list-format

[("Package" 20 package-menu--name-predicate)
 ("Version" 13 package-menu--version-predicate)
 ("Status" 10 package-menu--status-predicate)
 ("Archive" 10 package-menu--archive-predicate)
 ("Description" 0 package-menu--description-predicate)]

のようなデータ構造になっていますが適当に弄って良いものなのでしょうか。

専用の変更する関数がありそう? なかったっぽいです。

既存の変更しているコードを参考にしてみましょう。

(defun tabulated-list-widen-current-column (&optional n)
  "Widen the current tabulated-list column by N chars.
Interactively, N is the prefix numeric argument, and defaults to
1."
  (interactive "p")
  (let ((start (current-column))
        (nb-cols (length tabulated-list-format))
        (col-nb 0)
        (total-width 0)
        (found nil)
        col-width)
    (while (and (not found)
                (< col-nb nb-cols))
      (if (> start
             (setq total-width
                   (+ total-width
                      (setq col-width
                            (cadr (aref tabulated-list-format
                                        col-nb))))))
          (setq col-nb (1+ col-nb))
        (setq found t)
        (setf (cadr (aref tabulated-list-format col-nb))
              (max 1 (+ col-width n)))
        (tabulated-list-print t)
        (tabulated-list-init-header)))))

うおお何だこの超手続き的なコードは。

重要な部分だけ取り出すと、

(setf (cadr (aref tabulated-list-format col-nb))
              (max 1 (+ col-width n)))

ですね。

なので、

(leaf docker
  :ensure t
  :custom (docker-container-shell-file-name . "/bin/bash")
  :init
  (defun docker-image-mode-setup ()
    "イメージ名の幅を広く取ります。"
    (setf (cadr (aref tabulated-list-format 0)) 100))
  :hook
  (docker-image-mode-hook . docker-image-mode-setup))

で解決しました。実行中ならリフレッシュとかが必要なのかもしれませんが、描画前なので雑代入でも問題ないのでしょう。

ついでにpackage.elで起きてた問題も解決。