cum se obține tampon pentru fișierul specificat pe linia de comandă?

Să presupunem că invocăm întotdeauna EMACS (24.3.1) cu un singur nume de fișier pentru a vizita. Cum obțin memoria tampon pentru acel fișier în timpul pornirii .EMACS? Am încercat și funcția (buffer-ul curent) va întoarce tamponul meu zero .

4

3 răspunsuri

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

Cu toate acestea, acest lucru nu va funcționa în fișierul de pornire .emacs , deoarece tamponul pentru fișierul vizitat nu este încă disponibil. În schimb, puteți adăuga un cod în fișierul .emacs pentru a adăuga ceva de genul de mai sus la emacs-startup-hook , care se execută după manipularea argumentelor liniei de comandă. De exemplu, acest cod mărește cârligul pentru a seta o variabilă numită cmd-line-file-buffer-ul la tamponul fișierului vizitat:

(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
adăugat

Există două probleme de rezolvat: fișierul .emacs este încărcat prea devreme și există mai multe tampoane într-o instanță în execuție a Emacs, chiar și după pornire.

Prima problemă este rezolvată prin plasarea codului în emacs-startup-hook , așa cum sa subliniat în celelalte răspunsuri. A doua problemă este rezolvată prin ignorarea tampoanelor care nu au fișiere asociate:

(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
adăugat

Cred că acest lucru se întâmplă deoarece fișierul init este încărcat și rulat înainte ca fișierul de vizitat să fie încărcat. Puteți utiliza cârlig după -load-functions pentru a rula codul imediat după încărcarea fișierului de vizitat. De exemplu, puneți acest lucru în fișierul de inițializare:

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