Comment puis-je afficher le répertoire parent du fichier actuel dans la modélisation?

11

Je voudrais pouvoir voir l'emplacement du répertoire parent du fichier actuel, indépendamment du nom du tampon actuel.

deuxième planète
la source
Peut-être que l'utilisation de la bibliothèque uniquify est la solution souhaitée (voir la réponse de Gilles)
alex_1948511

Réponses:

12

Vous pouvez configurer le format de ligne de mode comme vous le souhaitez. Si vous souhaitez afficher le répertoire parent avec le nom du tampon (qui est généralement le nom du fichier, pour un tampon qui visite un fichier), modifiez mode-line-buffer-identification; sinon, ajoutez une entrée à mode-line-format. Il n'y a pas de construction intégrée pour le «répertoire parent du fichier actuel», vous devrez donc le créer vous-même , par exemple avec :eval. Voici un exemple qui ajoute le nom du répertoire après le nom du tampon et ne fait rien dans les tampons qui ne visitent pas les fichiers (y compris Dired); vous voudrez peut-être l'affiner avec le formatage.

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

Une autre méthode serait de définir une variable contenant le texte souhaité find-file-hooks. Je montre également comment vous pouvez définir des propriétés avec la :propertizeconstruction.

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

Si ce que vous vouliez vraiment, c'était d'avoir le nom du répertoire au cas où vous auriez plusieurs fichiers avec le même nom dans différents répertoires, Emacs l'a intégré, avec la bibliothèque uniquify . Lorsqu'il y aurait plusieurs tampons avec le même nom, cette bibliothèque fait ressembler le nom du tampon à file.ext<foo>et file.ext<bar>au lieu de file.extet file.ext<2>. Vous pouvez affiner le format en personnalisant uniquify-buffer-name-style.

(require 'uniquify)
Gilles 'SO- arrête d'être méchant'
la source
9

Je suppose que vous voulez dire que vous voulez voir le répertoire au lieu du nom du tampon.

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

Ou si vous voulez que votre répertoire personnel soit abrégé en ~/(au lieu d'un nom de fichier absolu, à partir de la racine), alors:

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

Ou si vous ne voulez que le nom du répertoire parent, en tant que nom de composant de répertoire unique, alors:

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

Ou si vous souhaitez conserver également le nom du tampon, comme le suppose @Malabarba, alors:

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

Le fait est que vous avez juste besoin d'utiliser la valeur de default-directory(éventuellement simplifiée à partir d'un nom absolu, si vous le souhaitez) dans mode-line-buffer-identification. Vous pouvez définir cette variable uniquement sur le nom du répertoire, ou vous pouvez la définir sur une valeur qui conserve également le nom du tampon.

Si ce que vous demandez est tout ce que vous voulez, il est simple de configurer la ligne de mode pour inclure le default-directory, mais vous voulez qu'elle apparaisse. Pas besoin de charger plusieurs bibliothèques pour cela (c'est ce qui smart-mode-linefait).

A dessiné
la source
1
Malgré sa formulation, je pense qu'il voulait dire "en plus de" pas "à la place". Bien sûr, je peux me tromper.
Malabarba
1
@Malabarba: Peut-être. Si c'est le cas, la différence est insignifiante - ajoutée.
Drew
7

Vous installez utilisez smart-mode-line . Il est configuré pour afficher le chemin du fichier dans la ligne de mode, chaque fois que cela est pertinent.

Thème sombre

Installez-le, puis allumez-le avec (sml/setup).

Il possède également de nombreuses fonctionnalités pour rendre cet affichage plus concis. Par exemple, «~ / .emacs.d /» est remplacé par «: ED:» (et vous pouvez configurer d'autres remplacements).

Malabarba
la source