Chciałbym móc zobaczyć lokalizację katalogu nadrzędnego bieżącego pliku, niezależnie od bieżącej nazwy bufora.
Chciałbym móc zobaczyć lokalizację katalogu nadrzędnego bieżącego pliku, niezależnie od bieżącej nazwy bufora.
Odpowiedzi:
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ą :propertize
konstrukcji.
(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.ext
i file.ext<2>
. Możesz dostosować format, dostosowując uniquify-buffer-name-style
.
(require 'uniquify)
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-line
dzieje).
Instalujesz za pomocą linii trybu inteligentnego . Jest skonfigurowany do wyświetlania ścieżki pliku w wierszu trybu, ilekroć jest to istotne.
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).