как получить буфер для файла, указанного в командной строке?

Предположим, что я вызываю EMACS (24.3.1) всегда с одним именем файла для посещения. Как получить буфер для этого файла во время запуска .EMACS? Я попробовал, и функция (current-buffer) вернет буфер scratch .

4

3 ответы

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

Однако это не будет работать в вашем файле .emacs , потому что буфер для просматриваемого файла пока недоступен. Вместо этого вы можете добавить код в свой .emacs файл, чтобы добавить что-то вроде выше в emacs-startup-hook , который запускается после обработки аргументов командной строки. Например, этот код увеличивает привязку для установки переменной с именем cmd-line-file-buffer в буфер просматриваемого файла:

(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
добавлено

Существует две проблемы: файл .emacs загружается слишком рано, и в запущенном экземпляре Emacs есть несколько буферов, даже сразу после запуска.

Первый вопрос решается путем помещения вашего кода в emacs-startup-hook , как указано в других ответах. Вторая проблема решается путем игнорирования любых буферов, у которых нет связанных файлов:

(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
добавлено

Я думаю, это связано с тем, что файл инициализации загружается и запускается до загрузки загружаемого файла. Вы можете использовать hook после -load-functions для запуска кода сразу после загрузки файла для загрузки. Например, поместите это в свой файл инициализации:

(add-hook 'after-load-functions (lambda (f) (setq my-buffer (current-buffer))))
0
добавлено