回答:
必要に応じて、モードラインフォーマットを設定できます。親ディレクトリをバッファー名(通常、ファイルを訪問しているバッファーの場合はファイル名です)とともに表示する場合は、を変更しmode-line-buffer-identification
ます。それ以外の場合は、エントリをに追加しmode-line-format
ます。「現在のファイルの親ディレクトリ」には組み込みの構成要素がないため、たとえばを使用して、自分で作成する必要があります:eval
。以下は、バッファ名の後にディレクトリ名を追加し、ファイルを訪問していないバッファ(Diredを含む)では何もしない例です。書式設定を使用して調整することをお勧めします。
(defun mode-line-buffer-file-parent-directory ()
(when buffer-file-name
(concat "[" (file-name-nondirectory (directory-file-name (file-name-directory buffer-file-name))) "]")))
(setq-default mode-line-buffer-identification
(cons (car mode-line-buffer-identification) '((:eval (mode-line-buffer-file-parent-directory)))))
別の方法は、必要なテキストを含む変数を設定することですfind-file-hooks
。また、:propertize
コンストラクトを使用してプロパティを設定する方法も示します。
(defvar buffer-file-parent-directory nil
"Parent directory of the current directory.
This variable is nil if the current buffer isn't visiting a file.")
(make-variable-buffer-local 'buffer-file-parent-directory)
(put 'buffer-file-parent-directory 'permanent-local t)
(defconst mode-line-buffer-file-parent-directory
'(:propertize (list buffer-file-parent-directory "/") face mode-line-buffer-id))
(defun set-buffer-file-parent-directory ()
(when buffer-file-name
(setq buffer-file-parent-directory
(file-name-as-directory (file-name-nondirectory (directory-file-name (file-name-directory buffer-file-name)))))))
(add-hook 'find-file-hook 'set-buffer-file-parent-directory)
(let ((list mode-line-format))
(while (not (eq (car list) 'mode-line-buffer-identification))
(setq list (cdr list)))
(setcdr list (cons (car list) (cdr list)))
(setcar list 'mode-line-buffer-file-parent-directory))
異なるディレクトリに同じ名前のファイルが複数ある場合にディレクトリ名を付けることが本当に必要だった場合、Emacsには、uniquifyライブラリが組み込まれています。同じ名前を持つ複数のバッファが存在することになる場合には、このライブラリが見えるようにバッファ名を起こしfile.ext<foo>
とfile.ext<bar>
の代わりに、file.ext
とfile.ext<2>
。をカスタマイズして、フォーマットを微調整できuniquify-buffer-name-style
ます。
(require 'uniquify)
バッファ名の代わりにディレクトリを見たいという意味だと思います。
(setq-default mode-line-buffer-identification
'(:eval default-directory))
または、ホームディレクトリを~/
(絶対ファイル名ではなく、ルートから)省略形にしたい場合は、次のようにします。
(setq-default mode-line-buffer-identification
'(:eval (abbreviate-file-name default-directory)))
または、単一のディレクトリコンポーネント名として親ディレクトリ名のみが必要な場合:
(setq-default mode-line-buffer-identification
'(:eval (file-name-nondirectory
(directory-file-name default-directory))))
または、@ Malabarbaが想定しているように、バッファ名も保持したい場合は、次のようにします。
(setq-default mode-line-buffer-identification
(let ((orig (car mode-line-buffer-identification)))
`(:eval (cons (concat ,orig (abbreviate-file-name default-directory))
(cdr mode-line-buffer-identification)))))
重要なのは、の値default-directory
(必要に応じて、絶対名から簡略化されている可能性があります)を使用する必要があるだけですmode-line-buffer-identification
。その変数をディレクトリ名だけに設定することも、バッファ名も保持する値に設定することもできます。
質問したい内容でよければ、モード行をに含めるように設定するのは簡単default-directory
ですが、を表示させたいだけです。これのために複数のライブラリーをロードする必要はありません(これがsmart-mode-line
機能します)。
インストールはsmart-mode-lineを使用し ます。 必要に応じて、ファイル行をモード行に表示するように構成されています。
インストールして、でオンにしてください(sml/setup)
。
また、その表示をより簡潔にする多くの機能があります。たとえば、「〜/ .emacs.d /」は「:ED:」に置き換えられます(さらに置換を構成できます)。