Wie kann ich das übergeordnete Verzeichnis der aktuellen Datei in der Modeline anzeigen?

11

Ich möchte den Speicherort des übergeordneten Verzeichnisses der aktuellen Datei unabhängig vom aktuellen Puffernamen sehen können.

zweiter Planet
quelle
Möglicherweise ist die Verwendung einer eindeutigen Bibliothek die gewünschte Lösung (siehe Gilles Antwort)
alex_1948511

Antworten:

12

Sie können das Moduszeilenformat nach Ihren Wünschen konfigurieren . Wenn Sie das übergeordnete Verzeichnis zusammen mit dem Puffernamen anzeigen möchten (normalerweise der Dateiname für einen Puffer, der eine Datei besucht), ändern Sie mode-line-buffer-identification; Andernfalls fügen Sie einen Eintrag zu hinzu mode-line-format. Es gibt kein integriertes Konstrukt für das "übergeordnete Verzeichnis der aktuellen Datei", daher müssen Sie dieses selbst erstellen , z. B. mit :eval. Hier ist ein Beispiel, das den Verzeichnisnamen nach dem Puffernamen hinzufügt und nichts in Puffern tut, die keine Dateien besuchen (einschließlich Dired). Möglicherweise möchten Sie es mit der Formatierung verfeinern.

(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)))))

Eine andere Methode wäre, eine Variable festzulegen, die den gewünschten Text enthält find-file-hooks. Ich zeige auch, wie Sie Eigenschaften mit dem :propertizeKonstrukt festlegen können .

(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))

Wenn Sie wirklich den Verzeichnisnamen haben möchten, falls Sie mehrere Dateien mit demselben Namen in verschiedenen Verzeichnissen haben, hat Emacs diesen mit der eindeutigen Bibliothek integriert . Wenn es mehrere Puffer mit demselben Namen geben würde, bewirkt diese Bibliothek, dass der Puffername wie file.ext<foo>und file.ext<bar>anstelle von file.extund aussieht file.ext<2>. Sie können das Format durch Anpassen optimieren uniquify-buffer-name-style.

(require 'uniquify)
Gilles 'SO - hör auf böse zu sein'
quelle
9

Ich nehme an, Sie meinen, Sie möchten das Verzeichnis anstelle des Puffernamens sehen.

(setq-default mode-line-buffer-identification
              '(:eval default-directory))

Oder wenn Sie möchten, dass Ihr Home-Verzeichnis abgekürzt wird ~/(anstelle eines absoluten Dateinamens aus dem Stammverzeichnis), dann:

(setq-default mode-line-buffer-identification
              '(:eval (abbreviate-file-name default-directory)))

Oder wenn Sie nur den übergeordneten Verzeichnisnamen als einzelnen Verzeichniskomponentennamen möchten, dann:

(setq-default mode-line-buffer-identification
              '(:eval (file-name-nondirectory
                        (directory-file-name default-directory))))

Oder wenn Sie auch den Puffernamen behalten möchten, wie @Malabarba annimmt, dann:

(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)))))

Der Punkt ist, dass Sie nur den Wert von default-directory(möglicherweise vereinfacht von einem absoluten Namen, wenn Sie möchten) in verwenden müssen mode-line-buffer-identification. Sie können diese Variable nur auf den Verzeichnisnamen oder auf einen Wert setzen, der auch den Puffernamen enthält.

Wenn das, was Sie fragen, alles ist, was Sie wollen, ist es einfach, die Moduszeile so zu konfigurieren default-directory, dass sie die enthält , wie Sie möchten, dass sie angezeigt wird. Hierfür müssen nicht mehrere Bibliotheken geladen werden (was auch der smart-mode-lineFall ist).

Drew
quelle
1
Trotz seiner Formulierung, denke ich , meinte er "zusätzlich zu" nicht "stattdessen". Natürlich könnte ich mich irren.
Malabarba
1
@ Malabarba: Vielleicht. Wenn ja, ist der Unterschied trivial - hinzugefügt.
Drew
7

Sie installieren verwenden smart-mode-line . Es ist so konfiguriert, dass der Dateipfad in der Moduszeile angezeigt wird, wann immer dies relevant ist.

Dunkles Thema

Installieren Sie es einfach und schalten Sie es dann mit ein (sml/setup).

Es hat auch viele Funktionen, um diese Anzeige übersichtlicher zu gestalten. Beispielsweise wird "~ / .emacs.d /" durch ": ED:" ersetzt (und Sie können weitere Ersetzungen konfigurieren).

Malabarba
quelle