Jak wyświetlić katalog nadrzędny bieżącego pliku w modeline?

11

Chciałbym móc zobaczyć lokalizację katalogu nadrzędnego bieżącego pliku, niezależnie od bieżącej nazwy bufora.

secondplanet
źródło
Może pożądanym rozwiązaniem jest użycie biblioteki unikatowej (patrz odpowiedź Gillesa)
alex_1948511

Odpowiedzi:

12

Możesz skonfigurować format linii trybu, jak chcesz. Jeśli chcesz pokazać katalog nadrzędny wraz z nazwą bufora (która jest zwykle nazwą pliku, dla bufora, który odwiedza plik), zmodyfikuj mode-line-buffer-identification; w przeciwnym razie dodaj wpis do mode-line-format. Nie ma wbudowanej konstrukcji dla „katalogu nadrzędnego bieżącego pliku”, więc musisz to zbudować samodzielnie , na przykład za pomocą :eval. Oto przykład, który dodaje nazwę katalogu po nazwie bufora i nie robi nic w buforach, które nie odwiedzają plików (w tym Dired); możesz zawęzić formatowanie.

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

Inną metodą byłoby ustawienie zmiennej zawierającej żądany tekst find-file-hooks. Pokazuję też, jak ustawić właściwości za pomocą :propertizekonstrukcji.

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

Jeśli naprawdę chciałeś mieć nazwę katalogu na wypadek, gdybyś miał wiele plików o tej samej nazwie w różnych katalogach, Emacs ma to wbudowane, z biblioteką unikatową . Gdyby istniało wiele buforów o tej samej nazwie, ta biblioteka powoduje, że nazwa bufora wygląda file.ext<foo>i file.ext<bar>zamiast file.exti file.ext<2>. Możesz dostosować format, dostosowując uniquify-buffer-name-style.

(require 'uniquify)
Gilles „SO- przestań być zły”
źródło
9

Zakładam, że masz na myśli, że chcesz zobaczyć katalog zamiast nazwy bufora.

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

Lub jeśli chcesz, aby Twój katalog domowy był skracany do ~/(zamiast bezwzględnej nazwy pliku, z katalogu głównego), to:

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

Lub jeśli chcesz tylko nazwę katalogu nadrzędnego, jako nazwę pojedynczego elementu katalogu, to:

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

Lub jeśli chcesz zachować również nazwę bufora, jak zakłada @Malabarba, to:

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

Chodzi o to, że wystarczy użyć wartości default-directory(ewentualnie uproszczonej z bezwzględnej nazwy, jeśli chcesz) w mode-line-buffer-identification. Możesz ustawić tę zmienną tylko na nazwę katalogu lub możesz ustawić wartość, która zachowuje również nazwę bufora.

Jeśli potrzebujesz tylko tego, o co prosisz, możesz łatwo skonfigurować linię trybu tak, aby zawierała default-directory, niezależnie od tego , jak chcesz. Nie trzeba w tym celu ładować wielu bibliotek (co się smart-mode-linedzieje).

Rysował
źródło
1
Mimo jego sformułowania myślę, że miał na myśli „oprócz„ nie ”zamiast tego”. Oczywiście mogę się mylić.
Malabarba,
1
@Malabarba: Może. Jeśli tak, różnica jest trywialna - dodano.
Drew,
7

Instalujesz za pomocą linii trybu inteligentnego . Jest skonfigurowany do wyświetlania ścieżki pliku w wierszu trybu, ilekroć jest to istotne.

ciemny schemat

Wystarczy zainstalować, a następnie włączyć za pomocą (sml/setup).

Ma również wiele funkcji, dzięki którym wyświetlanie jest bardziej zwięzłe. Na przykład „~ / .emacs.d /” zostaje zastąpione przez „: ED:” (i można skonfigurować dalsze zamiany).

Malabarba
źródło