Vorrei poter vedere la posizione della directory principale del file corrente, indipendentemente dal nome del buffer corrente.
Vorrei poter vedere la posizione della directory principale del file corrente, indipendentemente dal nome del buffer corrente.
Risposte:
È possibile configurare il formato della linea della modalità come desiderato. Se si desidera mostrare la directory principale insieme al nome del buffer (che di solito è il nome del file, per un buffer che sta visitando un file), modificare mode-line-buffer-identification
; in caso contrario, aggiungere una voce a mode-line-format
. Non esiste un costrutto incorporato per la "directory principale del file corrente", quindi dovrai crearlo tu stesso , ad esempio con :eval
. Ecco un esempio che aggiunge il nome della directory dopo il nome del buffer e non fa nulla nei buffer che non visitano i file (incluso Dired); potresti volerlo perfezionare con la formattazione.
(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)))))
Un altro metodo sarebbe quello di impostare una variabile contenente il testo desiderato find-file-hooks
. Mostrerò anche come è possibile impostare le proprietà con il :propertize
costrutto.
(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))
Se quello che volevi davvero era avere il nome della directory nel caso in cui avessi più file con lo stesso nome in directory diverse, Emacs ha questo incorporato, con la libreria uniquify . Quando ci sarebbero più buffer con lo stesso nome, questa libreria fa apparire il nome del buffer file.ext<foo>
e file.ext<bar>
invece di file.ext
e file.ext<2>
. È possibile ottimizzare il formato personalizzando uniquify-buffer-name-style
.
(require 'uniquify)
Presumo che tu intenda che vuoi vedere la directory invece del nome del buffer.
(setq-default mode-line-buffer-identification
'(:eval default-directory))
O se vuoi abbreviare la tua home directory ~/
(anziché un nome di file assoluto, dalla radice), allora:
(setq-default mode-line-buffer-identification
'(:eval (abbreviate-file-name default-directory)))
Oppure, se si desidera solo il nome della directory principale, come singolo nome del componente della directory, quindi:
(setq-default mode-line-buffer-identification
'(:eval (file-name-nondirectory
(directory-file-name default-directory))))
O se vuoi mantenere anche il nome del buffer, come suppone @Malabarba, allora:
(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)))))
Il punto è che devi solo usare il valore di default-directory
(possibilmente semplificato da un nome assoluto, se vuoi) in mode-line-buffer-identification
. È possibile impostare quella variabile solo sul nome della directory oppure impostarla su un valore che mantiene anche il nome del buffer.
Se quello che chiedi è tutto ciò che desideri, è semplice configurare la riga della modalità in modo da includerla default-directory
, comunque tu voglia che appaia. Non è necessario caricare più librerie per questo (che è ciò che smart-mode-line
fa).
Si installa utilizzare la modalità smart-line . È configurato per visualizzare il percorso del file nella riga della modalità, ogni volta che è rilevante.
Basta installarlo e quindi accenderlo con (sml/setup)
.
Ha anche molte funzionalità per rendere questo display più conciso. Ad esempio, “~ / .emacs.d /” viene sostituito con “: ED:” (e puoi configurare ulteriori sostituzioni).