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.