Як я можу відобразити батьківський каталог поточного файлу у моделі?


11

Я хотів би мати можливість бачити розташування батьківського каталогу поточного файлу, незалежно від поточного імені буфера.


Можливо, використання унікальної бібліотеки є бажаним рішенням (див. Відповідь Гілла)
alex_1948511

Відповіді:


12

Ви можете налаштувати формат рядка режиму за своїм бажанням. Якщо ви хочете показати батьківський каталог разом з іменем буфера (зазвичай це ім'я файлу, для буфера, який відвідує файл), змініть mode-line-buffer-identification; в іншому випадку додайте запис до mode-line-format. Не існує вбудованої конструкції для "батьківського каталогу поточного файлу", тому вам потрібно буде створити це самостійно , наприклад, з :eval. Ось приклад, який додає ім'я каталогу після імені буфера і нічого не робить у буферах, які не відвідують файли (включаючи Dired); ви можете уточнити його за допомогою форматування.

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

Іншим методом було б встановити змінну, що містить текст, який ви хочете find-file-hooks. Я також показую, як ви можете встановити властивості за допомогою :propertizeконструкції.

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

Якщо ви дійсно хотіли - мати ім'я каталогу у випадку, якщо у вас є декілька файлів з однаковим іменем у різних каталогах, Emacs має вбудовану цю програму разом з унікальною бібліотекою . Коли буде кілька буферів з тим самим іменем, ця бібліотека викликає назву буфера таким чином, file.ext<foo>а file.ext<bar>замість file.extі file.ext<2>. Ви можете налагодити формат, налаштовуючи uniquify-buffer-name-style.

(require 'uniquify)

9

Я припускаю, що ви маєте на увазі, що ви хочете бачити каталог замість імені буфера.

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

Або якщо ви хочете, щоб ваш домашній каталог був скорочений ~/(замість абсолютного імені файлу від кореня), тоді:

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

Або якщо ви хочете лише ім'я батьківського каталогу, як одне ім’я компонента каталогу, тоді:

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

Або якщо ви хочете зберегти також ім’я буфера, як @Malabarba припускає, тоді:

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

Справа в тому, що вам просто потрібно використовувати значення default-directory(можливо спрощене з абсолютного імені, якщо ви хочете) в mode-line-buffer-identification. Ви можете встановити цю змінну лише на ім'я каталогу, або ви можете встановити її на значення, яке зберігає також ім’я буфера.

Якщо те, що ви запитуєте, все, що ви хочете, просто налаштувати рядок режиму, щоб він включав default-directory, проте ви хочете, щоб він відображався. Для цього не потрібно завантажувати кілька бібліотек (що і smart-mode-lineробить).


1
Незважаючи на його формулювання, я думаю, що він мав на увазі "на додаток" не "замість". Звичайно, я можу помилитися.
Малабарба

1
@Malabarba: Можливо. Якщо так, різниця тривіальна - додається.
Дрю

7

Ви встановлюєте використання лінії з інтелектуальним режимом . Він налаштований для відображення шляху до файлу в рядку режиму, коли це доречно.

темна тема

Просто встановіть його, а потім увімкніть його (sml/setup).

Він також має багато функцій, щоб зробити цей дисплей більш стислим. Наприклад, "~ / .emacs.d /" замінюється на ": ED:" (і ви можете налаштувати подальші заміни).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.