Mevcut dosyanın üst dizinini modelde nasıl görüntüleyebilirim?


11

Geçerli arabellek adından bağımsız olarak geçerli dosyanın üst dizininin konumunu görmek istiyorum.


Belki benzersiz kütüphane kullanmak istenen bir çözümdür (bakınız Gilles cevap)
— alex_1948511

Yanıtlar:


12

Mod satırı biçimini istediğiniz gibi yapılandırabilirsiniz . Üst dizini arabellek adıyla (bir dosyayı ziyaret eden bir arabellek için genellikle dosya adıdır) birlikte göstermek istiyorsanız, değiştirin mode-line-buffer-identification; aksi halde, bir giriş ekleyin mode-line-format. “Geçerli dosyanın üst dizini” için yerleşik bir yapı yoktur , bu nedenle örneğin kendiniz oluşturmanız gerekir :eval. Burada arabellek adından sonra dizin adını ekleyen ve dosyaları ziyaret etmeyen arabelleklerde (Dired dahil) hiçbir şey yapmayan bir örnek verilmiştir; biçimlendirme ile hassaslaştırmak isteyebilirsiniz.

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

Başka bir yöntem, istediğiniz metni içeren bir değişken ayarlamaktır find-file-hooks. :propertizeYapı ile özellikleri nasıl ayarlayabileceğinizi de göstereceğim .

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

Eğer gerçekten istediğiniz farklı dizinlerde aynı ada sahip birden fazla dosya olması durumunda dizin ismine sahip olsaydı, Emacs bunu benzersiz kütüphaneyle birlikte içeriyor . Aynı ada sahip birden tamponlar olacağını, bu kütüphane gibi görünmek için tampon adını neden olur file.ext<foo>ve file.ext<bar>yerine file.extve file.ext<2>. Özelleştirerek biçime ince ayar yapabilirsiniz uniquify-buffer-name-style.

(require 'uniquify)

9

Arabellek adı yerine dizini görmek istediğinizi varsayalım .

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

Veya ana dizininizin ~/(mutlak dosya adı yerine kökten) kısaltılmasını istiyorsanız , o zaman:

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

Veya yalnızca üst dizin adını, tek bir dizin bileşeni adı olarak istiyorsanız, o zaman:

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

Veya @Malabarba'nın varsaydığı gibi arabellek adını da tutmak istiyorsanız, o zaman:

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

Mesele şu ki, sadece değerini default-directory(isterseniz mutlak bir addan basitleştirilmiş) kullanmanız gerekir mode-line-buffer-identification. Bu değişkeni yalnızca dizin adına veya arabellek adını da koruyan bir değere ayarlayabilirsiniz.

İstediğiniz tek şey varsa, mod satırını default-directorygörünmesini istediğiniz şekilde içerecek şekilde yapılandırmak kolaydır . Bunun için birden fazla kitaplık yüklemeye gerek yoktur (bu ne smart-mode-lineyapar).


1
İfadesine rağmen bence "yerine" değil "demekti. Tabii ki yanlış olabilirim.
— Malabarba

1
@Malabarba: Belki. Eğer öyleyse, fark önemsizdir - eklendi.
— Drew

7

Yüklemek kullanmak akıllı mod-line . İlgili olduğunda dosya yolunu mod satırında görüntüleyecek şekilde yapılandırılmıştır.

karanlık tema

Sadece kurun ve ardından ile açın (sml/setup).

Ayrıca bu ekranı daha özlü hale getirmek için birçok özelliğe sahiptir. Örneğin, “~ / .emacs.d /” “: ED:” ile değiştirilir (ve daha fazla değişiklik yapılandırabilirsiniz).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.