Geçerli dosya adını minibuffer'a koy


12

Etkin dosya arabelleğinin dosya adını bir komuta nasıl ekleyebilirim?

Bir dosya adı gerektiren bir komutu çağırdığımda, genellikle bir dosya arabelleğinden yapıyorum ve komutu minibuffer'a yazarken bu dosyanın adını istiyorum .

C-xMinibuffer'da bir komut satırı oluştururken yazabileceğim bir varsayım arıyorum .

Geçerli arabellek adlı bir dosya olsa da Lorem Ipsum.txt, ben şunu yazın:

M-x grep RET 'foo' SPC C-x … RET

M-xgrepREThediyeler bir minibuffer için isteyen grepkomutu. Yanıt olarak, regex desen argümanını ( 'foo') yazdım ve dosya adı argümanını ( C-x) ekledim . Bu minibuffer şu şekilde sonuçlanacak:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

Mevcut komutta hangi mevcut komut bu gibi dosya adını alır? Varsayılan anahtar bağlaması nedir?


3
Kimseden bahsedilmediğine şaşırdım M-n. Her yerde çalışmaz, ancak birçok yerde çalışır. Ayrıca, selamladığınız için, biraz daha etkileşimli olan lgrep ve rgrep'i beğenebilirsiniz.
Malabarba

Yanıtlar:


18

Mevcut komutta hangi mevcut komut bu gibi dosya adını alır?

Maalesef bunun için hazır bir komut yok, ancak birini aşağıdaki gibi yapabiliriz:

(defun name-of-the-file ()
  "Gets the name of the file the current buffer is based on."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

Sihir, minibuffer tarafından seçilen pencere fonksiyonundadır; minibuffer etkinleştirilmeden önce son tamponu seçerek doğru olanı yapar. Aksi takdirde, sadece buffer-file-name kullanmak bize dosya adını minibuffer'a getirmez. İlginç bir şekilde, aynı işlev dosya adını eklemek için normal bir arabellek veya minibuffer'da kullanılabilir. Özel bir tedaviye gerek yoktur.

Varsayılan anahtar bağlaması nedir?

Hiçbiri yoktur, ancak uygun olanı seçebilir ve aşağıdaki gibi atayabilirsiniz:

(global-set-key (kbd "C-c f") 'name-of-the-file)

Yukarıdaki lisp kodu satırlarını init.el dosyanıza koyun.

Bu, en önemsiz durumlarda çalışır, ancak bu işlevi çağırırken aktif olduğunuz modlarla hangi çakışmaların olabileceğini tahmin etmek zordur.

Tampon, sıfırlama tamponu gibi geçerli bir dosya adını ziyaret etmiyorsa ne olur? Sonra bu hata yankı alanında gösterilir:

name-of-the-file: Wrong type argument: char-or-string-p, nil

Kısayolu çağırmadan önce uygun bir dosya adına sahip geçerli bir arabellek seçmek bu tür hataları önler.

Yukarıdaki gibi başka çözümler de vardır, ancak bunlar genellikle herhangi bir çatışma için istisnaları veya geçersiz kılmaları nasıl ele aldıkları konusunda farklılık gösterir. Örneğin, bazıları bu işlevi yalnızca belirli modlarda kullanılabilir hale getirmek için mod kancaları kullanır.


Bunun çalışması için bence şart enable-recursive-minibuffers.
Dieter.Wilhelm

Komutun sadece (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function minibuffer'da kullanılması gerekiyorsa C-c b, geçerli tampon adını eklediğim, bağlandığım tampon adı` yerine aşağıdaki bağlama kullanılabilir .
Dov Grobgeld

2

dired-xKlavye kısayolunu kullanırken C-x C-jbağlı dired-jump. Böylece dosya ara belleğinizden doğru satır satırına girersiniz ve dosya adını ile kopyalayabilirsiniz w. Ve sonra mini tampona yapıştırabilirsiniz.

Dosya adının yazılmasını hafifletmek için başka bir olasılık, standart Emacs mini arabellek dosyasının tamamlanmasıdır. Dosya adınızın ilk karakterlerini ve ardından SEKME'yi yazmanız yeterlidir.


1
Geçerli komut satırındaki dosyanın adını w(command dired-copy-filename-as-kill) komutunu kullanarak kopyalayabilirsiniz .
Drew

-1

Soru, mevcut bir Emacs komutunun bunu yapmasını ister.

Daha önce belirtildiği gibi:

Maalesef bunun için hazır bir komut yok

ki bu sorunun cevabı ortaya çıkıyor.


Kullanım durumunuzu hafifletmenin yolları vardır ve diğerleri ısmarlama kodlama çözümleri önerdi, bu yüzden ifadenizin doğru olmadığını düşünüyorum. Özel olarak hazır Emacs'ın yolunu sormadınız !
Dieter.Wilhelm

Bu amaçla özel olarak mevcut bir komut istedim, bu yüzden evet bu cevap doğru.
bignose
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.