Komut satırında belirtilen dosya için arabellek nasıl alınır?

EMACS'ı (24.3.1) her zaman ziyaret edeceğim tek bir dosya adıyla çağırdığımı varsayalım. .EMACS başlangıcımdayken bu dosya için arabelleği nasıl alabilirim? Denedim ve işlev (current-buffer) scratch arabamı döndürecek.

4

3 cevap

You can use the variable command-line-args to get a list of elements making up the command line used to invoke emacs. If your command line consists of just two elements — "emacs" and the filename to visit — you can get the buffer associated with the file visited like this:

(get-buffer (file-name-nondirectory (cadr command-line-args)))

Ancak, bu .emacs başlangıç ​​dosyanızda çalışmaz, çünkü ziyaret edilen dosyanın arabelleği henüz hazır değildir. Bunun yerine, .emacs dosyanıza, kod satırı komutları ele alındıktan sonra çalıştırılan emacs-startup-hook 'a yukarıdaki gibi bir şey eklemek için kod ekleyebilirsiniz. Örneğin, bu kod ziyaret edilen dosyanın arabelleğine cmd satırı dosya arabelleği adlı bir değişken ayarlamak için kancayı artırır:

(add-hook 'emacs-startup-hook
      (lambda ()
        (if (= 2 (length command-line-args))
            (setq cmd-line-file-buffer
                  (get-buffer (file-name-nondirectory (cadr command-line-args)))))))
1
katma

Çözülmesi gereken iki sorun vardır: .emacs dosyası çok erken yüklenmiştir ve başlangıçtan hemen sonra bile çalışan bir Emacs örneğinde birden çok arabellek vardır.

İlk sorun, diğer yanıtlarda belirtildiği gibi kodunuzu emacs-startup-hook 'a koyarak çözülür. İlişkili dosyalar olmayan arabellekleri yok sayarak ikinci sorun çözülür:

(defun my-file-buffers ()
  (remove nil
          (mapcar #'(lambda (buffer) (and (buffer-file-name buffer) buffer))
                  (buffer-list))))

(add-hook 'emacs-startup-hook
          #'(lambda ()
              (message "The following buffers are interesting today: %s"
                       (my-file-buffers))))
1
katma

Bunun nedeni, init dosyasının yüklenecek dosya yüklenmeden önce yüklenip çalıştırılmasıdır. Sonrasında kanca 'nı kullanabilirsiniz. -load işlevlerini , ziyaret edilecek dosya yüklendikten sonra kod çalıştırmak için. Örneğin, bunu init dosyanıza koyun:

(add-hook 'after-load-functions (lambda (f) (setq my-buffer (current-buffer))))
0
katma