hoe krijg ik een buffer voor het bestand gespecificeerd op de opdrachtregel?

Laten we aannemen dat ik altijd EMACS (24.3.1) aanroept met slechts één te bezoeken bestandsnaam. Hoe krijg ik de buffer voor dat bestand in mijn .EMACS-startup? Ik heb het geprobeerd en de functie (current-buffer) zal mijn scratch -buffer retourneren.

4

3 antwoord

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

Dit zal echter niet werken in uw .emacs opstartbestand omdat de buffer voor het te bezoeken bestand nog niet beschikbaar is. In plaats daarvan kunt u code toevoegen aan uw .emacs -bestand om zoiets als het bovenstaande toe te voegen aan de emacs-startup-hook , die wordt uitgevoerd nadat de argumenten van de commandoregel zijn afgehandeld. Deze code vergroot bijvoorbeeld de haak om een ​​variabele met de naam cmd-line-file-buffer in te stellen in de buffer van het bestand dat wordt bezocht:

(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
toegevoegd

Er zijn twee problemen die moeten worden opgelost: het .emacs -bestand is te vroeg geladen en er zijn meerdere buffers in een actief exemplaar van Emacs, zelfs vlak na het opstarten.

Het eerste probleem is opgelost door uw code in emacs-startup-hook te plaatsen, zoals aangegeven in de andere antwoorden. Het tweede probleem is opgelost door buffers zonder bijbehorende bestanden te negeren:

(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
toegevoegd

Ik denk dat dit komt omdat het init-bestand is geladen en uitgevoerd voordat het te bezoeken bestand is geladen. U kunt de hook hierna gebruiken -load-functions om code uit te voeren net nadat het te bezoeken bestand is geladen. Plaats dit bijvoorbeeld in uw init-bestand:

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