nasıl otomatik mod-alist onurlandırmak için tamponlar (sadece dosyaları değil) almak için?


13

S: Haritalamayı onurlandırmak için nasıl yeni tamponlar alabilirim auto-mode-alist?

Bir dosyayı bulurken Emacs auto-mode-alist, dosyanın arabelleği için hangi büyük modun kullanılacağını belirlemek için dosya uzantısını karşılaştırır . auto-mode-alistİçinde bir dosya bulunmayan (henüz) bir arabellek modunu belirlemek için bu bilgiyi kullanmanın bir yolu var mı ?

Yani, adı bir dosya uzantısı gibi görünen yeni bir arabellek açarsam, beklenen modda otomatik olarak açılmasını sağlayabilir miyim? Örneğin, a-new-buffer.elhenüz bir dosyayla ilişkilendirilmemiş yeni bir arabellek açacak olsaydım emacs-lisp-mode, varsayılan modda değil de açılmasını istiyorum .


2
Sadece merak ediyorum: Kullanım durumu nedir? IOW, bunu neden / ne zaman / hangi bağlamda yapmak istiyorsunuz? Genellikle, bir tamponun bir dosya ile ilişkilendirilmesini ve bu nedenle modunun içinden alınmasını auto-mode-alististiyorsanız, arabelleğin dosyayı " ziyaret etmesini " sağlarsınız (ve bu her şeyi halleder).
Drew

5
Benim için tipik kullanım durumlarına örnekler: a) orgkullanım için yazdığım yeni işlevleri test etmek için geçici bir arabellek org-mode; b) Rhızlı, atma istatistiki manipülasyonlar yapmak için geçici bir tampon; c) bir e-posta oluşturmak için geçici bir metin arabelleği. Her durumda, ben do not ziyaret için bir dosya oluşturmak istiyorum, ben sadece bir kullanılıp atılan bu yine uygun modunda açılır tampon istiyorum.
Dan

2
Gibi Dosya ziyaret komutlar C-x C-fdo not " ziyareti bir dosya oluşturmak ". Bu temel bir yanlış anlamadır. Sadece tam olarak aradığınızı yaparlar. Öyle sadece size deneyin ve ne zaman olursa tampon kaydetmek bir dosya oluşturulur alır söyledi. Arabelleği kaydetmeye çalışmazsanız, dosya oluşturulmaz. Şimdiye kadar anladığım kadarıyla, "bir dosyayı ziyaret etmek" (bu gerçekten uygun modda bir tampon açmak anlamına gelir) istediğiniz.
Drew

8
Dan gibi, her zaman gerçek bir dosya yolu ile ilişkilendirmek istemediğim geçici arabellekler oluşturuyorum. Sahte dosya yolunu ziyaret etmek işe yarayacaktır, ancak bir dizin seçerken (veya geçerli dizini kabul ederken) en az küçük bir sürtünme vardır. Yapılandırmanızın geri kalanına bağlı olarak başka yan etkiler olabilir: Otomatik kaydetme davranışı? Ardıç grupları mı yoksa patikaya göre belirlenen mermi projeleri? Ido onayı ister mi? Arabellekler yine de bir isme sahip olmaları gerektiğinden, geçici bir arabellek için modu otomatik olarak ayarlamak için ismi kullanmak benim için anlamlı.
glucas

@ Çekti, evet, bu mantıklı ve bu sorunun en basit cevabı olurdu - cevap olarak gönderebilir misiniz lütfen? Yükseltmeyi hak ediyor.
Dan

Yanıtlar:


8

Gibi dosya ziyaret komutları ziyaret etmek C-x C-f için bir dosya oluşturmayın . Aradığınızı yapıyorlar.

Yalnızca bir dosyanın oluşturulduğu arabelleği kaydetmeye çalıştığınızda ve olduğunda .

Arabelleği kaydetmeye çalışmazsanız, dosya oluşturulmaz. Şimdiye kadar anladığım kadarıyla, " bir dosyayı ziyaret etmek " (bu gerçekten uygun modda bir tampon açmak anlamına gelir) istediğiniz.


4
İstediğiniz ne olursa olsun, geçerli dosyayı her 3 saniyede bir sürekli kaydeden hiperaktif bir parmağınız varsa ne olur?
Malabarba

1
@Malabarba: Aslında o parmağım var! ;-) Belki çoğumuz yaşlı osuruk yapar - bir şeyler her zaman çöktüğünde bir alışkanlık geri aldı. Ama yine de, ben sadece önerdiğim şeyi yapıyorum: bir ziyaret ziyaret dosya tamponda düzenlemek. Aşırı aktif kas hafızam engel olur ve kurtarmaya çalışırsa, öyle olsun: ya nkurtarmak için vurdum ya da (genellikle) sadece tamponu kurtardım. Ve sonra oluşturulan dosyayı atıyorum ... ya da değil.)
Drew

1
@Malabarba Büyük moda özgü çizik tamponlarını kullanmaya başladığım geçici dosyaların dağınıklığını önlemek. Sıfırdan bir dosya gerekiyorsa, dosyayı daha sonra istediğiniz zaman kaydedebilirsiniz.
Kaushal Modi

1
@kaushalmodi: En moda özgü tampon karşı değilim, ama bir " geçici dosyaların dağınıklığı " olarak kolayca olarak temizlenir tamponların dağınıklığı . ;-) Ve moda özgü bir çizik tamponundaki hiperaktif parmak, muhtemelen aynı problemi sunar - olduğu gibi *scratch*: o parmak otomatik olarak vurduğunda kaydetmeniz istenir C-x C-s.
Drew

9

Kullanıyorum varsa Juri Linkov yıllardır 'ın çözüm.

Ben böyle bir şeyle geçici arabellekler oluşturuyorum C-x b test.org C-j. major-modeAracılığıyla dosya uzantısı tarafından belirlenir auto-mode-alist.

;; http://thread.gmane.org/gmane.emacs.devel/115520/focus=115794
(setq-default major-mode
              (lambda () (if buffer-file-name
                          (fundamental-mode)
                            (let ((buffer-file-name (buffer-name)))
                          (set-auto-mode)))))

Efekti test etmek için deneyebilirsiniz (prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org")) => org-mode. Temiz bir emacs -qdurumda test geri dönecektir fundamental-mode.


1
Bu çok zekice! Ayrıca kullandığım adviceseçenekten daha düzenli . Parçanın ne için olduğunu takip ettiğimden emin değilim (prog1...), ama (setq-default major-mode ...)kısmı oldukça güzel.
Dan

1
Juri'nin Emacs sitesine göz atmaktan çekinmeyin . prog1Alacağınız bu -test sadece gösterileri beklenen major-modebir tampon geçerken. Parçayı değerlendirin setq-defaultve testi çalıştırın. O dönecekti org-mode olmadan setq-defaultdönecektir fundamental-mode.
rasmus

Bu, buffer-list-update-hook'umdan çok daha zarif. Teşekkürler!
glucas

Bu, kabul edilen cevap olmalıdır, çünkü bize neden sormak için yanlış olduğumuzu söylemek yerine soruyu cevaplıyor :)
Shlomi

6

@ Drew'un yorumlarından ve @ glucas'ın cevabından gelen ve herkes için yararlı olmaları durumunda kaydedeceğim fikirleri kullanarak tavsiyeye dayalı bir yol buldum.

Kısa sürüm: afterarabellek ilişkili bir dosya adına sahip olup olmadığını sorgulamak için tavsiye kullanın, yoksa geçici olarak bir tane ayarlayın ve sonra set-auto-modemakinenin geri kalanının ayrıntıları halletmesine izin verin . Biraz test yaptıktan sonra (kapsamlı değil), gayet iyi çalışıyor gibi görünüyor.

İçin ido-switch-bufferve vanilya switch-to-buffer, iki tavsiyem bit olacaktır:

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

(defadvice switch-to-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

find-fileParmaklarım beynimin önüne geçebileceğinden @Drew'un yükselttiği noktanın üstünde bu seçeneği yararlı buluyorum : kas hafızası genellikle bana tam olarak gerçekleşmeden önce find-fileihtiyaç duyduğum şeyi yapacak olan geçiş-tampon bölgeye götürecek. Artık her iki seçenek de mevcut.

GÜNCELLEME: yukarıdaki kodda küçük ama potansiyel olarak tahriş edici bir hata: her geçişinizde arabellekteki mod kancasını yeniden çalıştırır. Aşağıdaki /tmpdizine gerçek bir dosya adı verir ve bu sorunu önler:

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (setq buffer-file-name (concat "/tmp/" (buffer-name)))
    (set-auto-mode t)))

İyi görünüyor ve cevabımın birkaç iterasyonda biriktirdiği hamleyi temizliyor. :-) Burada tekrarlayacağım, eğer bir sebepten dolayı gerçek bir dosya yolu ayarlamak istemiyorsanız, modu birden çok kez ayarlamaktan kaçınmak için bir arabellek-yerel değişken kullanabilirsiniz.
glucas

5

set-auto-modeİşlevi, bir tampon ile ilişkili dosyasını temel modunu ayarlar. buffer-file-nameModu ayarlamak için arabellek adından geçici olarak ayarlanan bir işlev şunlardır:

(defun my/set-buffer-mode (buffer &optional again)
  "Set the mode for BUFFER from the name.  
When called repeatedly for the same buffer only set the mode the first
time, unless the optional argument AGAIN is specified.
Does nothing if the buffer is associated with a file."

  (with-current-buffer buffer
    (when again (kill-local-variable 'my/buffer-mode-set))
    (unless (or buffer-file-name 
            (local-variable-p 'my/buffer-mode-set))
      (let ((buffer-file-name (buffer-name)))
        (set-auto-mode t)
        (setq-local my/buffer-mode-set t)))))

Bir arabellek tavsiye kullanılarak yeniden adlandırıldığında bunu çalıştırabilirsiniz:

(defadvice rename-buffer (after my/rename-update-mode activate)
  (my/set-buffer-mode (current-buffer) 'again))

Yeni tamponları etkilemek için bu kanca için en iyi yer hakkında emin değilim. Burada kullanıyorum buffer-list-update-hook, ama ihtiyacımız olandan daha fazla durumda çağrılıyor.

(add-hook 'buffer-list-update-hook
      '(lambda ()
         (my/set-buffer-mode (car (buffer-list)))))

Yukarıdaki cevap bazı sorunlarla başa çıkmak için revize edilmiştir. Özellikle, kullanmaya devam ettim buffer-list-update-hookçünkü change-major-mode-hookbeklenen akım arabelleği ile çağrılmadı. Kayıt için, @Dan'ın cevabında yaptığı gibi, arabellek işlevinizi önermek muhtemelen daha mantıklıdır.
glucas

3

Üzerinde çalışabileceğiniz dosyayla aynı ana moda sahip geçici arabellekler oluşturmak için * scratch * buffer'larını kullanabilirsiniz.

İşte sorununuzu çözebilecek bir emacs SE yanıtı:

Bir dosya ile aynı ana moda sahip bir * scratch * tamponu arasında nasıl hızlı bir şekilde geçiş yapabilirim?

Referans verilen soru ve cevap tarafımdan gönderildi. İşlevdeki cevap aşağıdakileri yapar:

  • Bir dosyada X ana modunda çalışıyorsanız, bu işlevin çağrılması *scratch-X-mode*, henüz yoksa, yeni bir çizik arabelleği oluşturur ve bu yeni oluşturulan arabelleğe geçer.
  • Eğer *scratch-X-mode*zaten var, sadece o tampon geçer.
  • Bu işlevi bu çizik arabelleğindeyken yeniden çağırmak, üzerinde çalıştığınız dosya arabelleğine geri dönmenizi sağlar.

0

Burada bazı iyi cevaplar var ama bir şey daha eklemek istedim. Emacs bir ton özelliğe sahiptir ve genellikle bir şey yapmanın birkaç yolu vardır. Herhangi bir dosyanın üst kısmına, uzantıya bakılmaksızın, emac'lara ne tür olduğunu bildiren etiketler ekleyebilirsiniz. Örneğin, bunu eklemek:

# -*-Python-*-

Bir dosyanın üstünde, emacs'ın .pyuzantı olmadan da bir Python dosyası olduğunu bildirir . Not #satırın başında bir Python tarzı açıklamadır. Farklı dosya türleri için farklı yorumlar kullanabilirsiniz. Örneğin, ;bir açıklama satırı başlatmak ve aşağıdaki gibi emac'larda modu ayarlamak için kullandığınız bir Lisp dosyasını belirtmek için :

; -*- mode: Lisp;-*-

Bkz. Dosya Değişkenlerini Belirleme ve Dosya Modları Seçme .


Evet, ancak buradaki soru özellikle yeni bir geçici tampon (örn. İle switch-buffer) oluşturmak ve modun otomatik olarak başka bir şeye ayarlanmasıyla ilgilidir fundamental-mode.
glucas
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.