モードラインで現在のファイルの親ディレクトリを表示するにはどうすればよいですか?


11

現在のバッファ名に関係なく、現在のファイルの親ディレクトリの場所を確認できるようにしたいと思います。


多分、uniquifyライブラリを使用するのが望ましいソリューションです(Gillesの回答を参照)
alex_1948511

回答:


12

必要に応じて、モードラインフォーマットを設定できます。親ディレクトリをバッファー名(通常、ファイルを訪問しているバッファーの場合はファイル名です)とともに表示する場合は、を変更し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.extfile.ext<2>。をカスタマイズして、フォーマットを微調整できuniquify-buffer-name-styleます。

(require 'uniquify)

9

バッファ名の代わりにディレクトリを見たいという意味だと思います。

(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機能します)。


1
彼の言葉遣いにもかかわらず、彼は「代わりに」ではなく「に加えて」を意味したと思います。もちろん、私は間違っている可能性があります。
Malabarba 2014年

1
@マラバルバ:たぶん。もしそうなら、違いはささいなことです-追加されました。
2014年

7

インストールはsmart-mode-lineを使用し ます 必要に応じて、ファイル行をモード行に表示するように構成されています。

暗いテーマ

インストールして、でオンにしてください(sml/setup)

また、その表示をより簡潔にする多くの機能があります。たとえば、「〜/ .emacs.d /」「:ED:」に置き換えられます(さらに置換を構成できます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.