Bagaimana saya bisa menampilkan direktori induk dari file saat ini di modeline?

11

Saya ingin dapat melihat lokasi direktori induk file saat ini, terlepas dari nama buffer saat ini.

rencana kedua
sumber
Mungkin menggunakan pustaka uniquify adalah solusi yang diinginkan (lihat jawaban Gilles)
alex_1948511

Jawaban:

12

Anda dapat mengonfigurasi format garis mode sesuai keinginan. Jika Anda ingin menampilkan direktori induk bersama dengan nama buffer (yang biasanya merupakan nama file, untuk buffer yang mengunjungi file), ubah mode-line-buffer-identification; jika tidak, tambahkan entri ke mode-line-format. Tidak ada konstruksi bawaan untuk "direktori induk dari file saat ini", jadi Anda harus membuatnya sendiri , misalnya dengan :eval. Berikut adalah contoh yang menambahkan nama direktori setelah nama buffer, dan tidak melakukan apa pun dalam buffer yang tidak mengunjungi file (termasuk Dired); Anda mungkin ingin memperbaikinya dengan format.

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

Metode lain adalah mengatur variabel yang berisi teks yang Anda inginkan find-file-hooks. Saya juga menunjukkan bagaimana Anda dapat mengatur properti dengan :propertizekonstruk.

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

Jika yang Anda inginkan adalah memiliki nama direktori seandainya Anda memiliki banyak file dengan nama yang sama di direktori yang berbeda, Emacs memiliki built in ini, dengan pustaka uniquify . Ketika akan ada beberapa buffer dengan nama yang sama, pustaka ini menyebabkan nama buffer terlihat seperti file.ext<foo>dan file.ext<bar>bukannya file.extdan file.ext<2>. Anda dapat menyempurnakan format dengan menyesuaikan uniquify-buffer-name-style.

(require 'uniquify)
Gilles 'SANGAT berhenti menjadi jahat'
sumber
9

Saya berasumsi maksud Anda bahwa Anda ingin melihat direktori alih-alih nama buffer.

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

Atau jika Anda ingin direktori home Anda disingkat ~/(alih-alih nama file absolut, dari root), maka:

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

Atau jika Anda hanya ingin nama direktori induk, sebagai nama komponen-direktori tunggal, maka:

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

Atau jika Anda ingin menyimpan juga nama buffer, seperti anggapan @Malabarba, maka:

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

Intinya adalah bahwa Anda hanya perlu menggunakan nilai default-directory(mungkin disederhanakan dari nama absolut, jika Anda mau) di mode-line-buffer-identification. Anda bisa mengatur variabel itu hanya nama direktori, atau Anda bisa mengaturnya ke nilai yang menyimpan juga nama buffer.

Jika yang Anda tanyakan adalah yang Anda inginkan, mudah untuk mengkonfigurasi garis mode untuk memasukkan default-directory, namun Anda ingin itu muncul. Tidak perlu memuat banyak pustaka untuk ini (yang smart-mode-lineartinya).

Drew
sumber
1
Terlepas dari kata-katanya, saya pikir maksudnya "selain" bukan "sebagai gantinya. Tentu saja, saya bisa saja salah.
Malabarba
1
@Malabarba: Mungkin. Jika demikian, perbedaannya adalah sepele - tambah.
Drew
7

Anda menginstal menggunakan smart-mode-line . Ini dikonfigurasi untuk menampilkan jalur file di mode-line, kapan pun itu relevan.

tema gelap

Cukup instal, lalu hidupkan dengan (sml/setup).

Ini juga memiliki banyak fitur untuk membuat tampilan yang lebih ringkas. Misalnya, “~ / .emacs.d /” diganti dengan “: ED:” (dan Anda dapat mengonfigurasi penggantian lebih lanjut).

Malabarba
sumber