¿Cómo puedo mostrar el directorio principal del archivo actual en la línea de modelo?

11

Me gustaría poder ver la ubicación del directorio principal del archivo actual, independientemente del nombre del búfer actual.

segundo planeta
fuente
Tal vez usar la biblioteca uniquify es la solución deseada (ver la respuesta de Gilles)
alex_1948511

Respuestas:

12

Puede configurar el formato de línea de modo como lo desee. Si desea mostrar el directorio principal junto con el nombre del búfer (que generalmente es el nombre del archivo, para un búfer que está visitando un archivo), modifique mode-line-buffer-identification; de lo contrario, agregue una entrada a mode-line-format. No hay una construcción incorporada para el "directorio padre del archivo actual", por lo que deberá construirla usted mismo , por ejemplo con :eval. Aquí hay un ejemplo que agrega el nombre del directorio después del nombre del búfer y no hace nada en los búferes que no están visitando archivos (incluido Dired); es posible que desee refinarlo con el formato.

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

Otro método sería establecer una variable que contenga el texto que desea find-file-hooks. También muestro cómo puede establecer propiedades con la :propertizeconstrucción.

(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 lo que realmente deseaba era tener el nombre del directorio en caso de que tuviera varios archivos con el mismo nombre en diferentes directorios, Emacs lo tiene incorporado, con la biblioteca sin clasificar . Cuando habría varios búferes con el mismo nombre, esta biblioteca hace que el nombre del búfer se vea como file.ext<foo>y en file.ext<bar>lugar de file.exty file.ext<2>. Puede ajustar el formato personalizando uniquify-buffer-name-style.

(require 'uniquify)
Gilles 'SO- deja de ser malvado'
fuente
9

Supongo que quiere decir que desea ver el directorio en lugar del nombre del búfer.

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

O si desea abreviar su directorio de inicio ~/(en lugar de un nombre de archivo absoluto, desde la raíz), entonces:

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

O si solo desea el nombre del directorio principal, como un solo nombre de componente de directorio, entonces:

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

O si desea mantener también el nombre del búfer, como supone @Malabarba, entonces:

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

El punto es que solo necesita usar el valor de default-directory(posiblemente simplificado de un nombre absoluto, si lo desea) en mode-line-buffer-identification. Puede establecer esa variable solo en el nombre del directorio, o puede establecerla en un valor que mantenga también el nombre del búfer.

Si lo que pide es todo lo que desea, es simple configurar la línea de modo para incluir el default-directory, sin embargo, desea que aparezca. No es necesario cargar varias bibliotecas para esto (que es lo que smart-mode-linehace).

Dibujó
fuente
1
A pesar de su redacción, creo que quiso decir "además de" no "en su lugar". Por supuesto, podría estar equivocado.
Malabarba
1
@Malabarba: Quizás. Si es así, la diferencia es trivial: se agrega.
Dibujó
7

Instala el uso de línea de modo inteligente . Está configurado para mostrar la ruta del archivo en la línea de modo, siempre que sea relevante.

tema oscuro

Simplemente instálelo y luego enciéndalo con (sml/setup).

También tiene muchas características para hacer que esa pantalla sea más concisa. Por ejemplo, “~ / .emacs.d /” se reemplaza con “: ED:” (y puede configurar reemplazos adicionales).

Malabarba
fuente