Come posso visualizzare la directory principale del file corrente nella modeline?


11

Vorrei poter vedere la posizione della directory principale del file corrente, indipendentemente dal nome del buffer corrente.


Forse utilizzare la libreria uniquify è la soluzione desiderata (vedi risposta Gilles)
alex_1948511

Risposte:


12

È 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 :propertizecostrutto.

(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.exte file.ext<2>. È possibile ottimizzare il formato personalizzando uniquify-buffer-name-style.

(require 'uniquify)

9

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-linefa).


1
Nonostante le sue parole, penso che intendesse "oltre a" non "invece". Certo, potrei sbagliarmi.
Malabarba,

1
@Malabarba: Forse. In tal caso, la differenza è banale - ha aggiunto.
Disegnò il

7

Si installa utilizzare la modalità smart-line . È configurato per visualizzare il percorso del file nella riga della modalità, ogni volta che è rilevante.

tema scuro

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.