كيفية الحصول على المخزن المؤقت للملف المحدد في سطر الأوامر؟

لنفترض أنني أتحدث عن EMACS (24.3.1) دائمًا مع اسم ملف واحد فقط لزيارته. كيف يمكنني الحصول على المخزن المؤقت لهذا الملف أثناء وجوده في .EMACS عند بدء التشغيل؟ لقد حاولت ذلك والوظيفة (الحالية العازلة) سيعود بلدي الصفر العازلة.

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
وأضاف

أعتقد أن هذا بسبب تحميل ملف init وتشغيله قبل تحميل الملف لزيارته. يمكنك استخدام هوك بعد -load-functions لتشغيل الكود بعد تحميل الملف لزيارته. على سبيل المثال ، ضع هذا في ملف init الخاص بك:

(add-hook 'after-load-functions (lambda (f) (setq my-buffer (current-buffer))))
0
وأضاف