1

私がやろうとしていることmake-local-variableは、作成されたすべてのバッファーに対して変数が宣言されないことを除いて、非常に似ています(特定のモードに属するもののみ)。これは主にパフォーマンスの問題であり、作成されるオブジェクトは大きくなる可能性があります。さらに重要な(get-buffer-property buffer property-name)のは、特定のバッファーの状態を把握するような関数が必要になることです。

基本的に、私はget-buffer-proccessプロセス以外のものが必要なことを除いて、似たようなものを求めています。

メジャーモードの宣言でそのようなオブジェクトを作成し、そのようなバッファが強制終了されたときにフックでそれらを破棄することは理にかなっていますか、それともそのためのより良い方法がありますか?

これは私がこれまでに持っているものです:

(defun haxe-get-buffer-property (buffer property)
  "Pops to BUFFER, reads the value of the PROPERTY and returns it."
  (let ((result
         (save-excursion
           (pop-to-buffer buffer)
           (symbol-value property))))
    result))
(defmacro haxe-buffer-property (buffer property)
`(haxe-get-buffer-property ,buffer ',property))

(defmacro deflocal (var &rest body)
  (let ((symb var)
        (val (car body))
        (doc (cadr body)))
    `(progn
       (defvar ,symb nil ,doc)
       (unless ,symb (setq ,symb ,val))
       (make-local-variable ',symb))))

しかし、副作用がわからないので、バッファにアクセスする必要があるのは好きではありません。

編集:いくつかのより多くの情報。

何が起こるかというと、ネットワーク接続プロセスと相互作用できる複数のバッファがあります。このプロセスは、バッファーのグループで共有できます(バッファーがこのプロセスを共有することが重要です)が、異なるプロセスが相互に割り当てられている複数のバッファーが同時に存在する場合もあります。プロセス自体に加えて、プロセスの状態(受信したデータの量、送信したデータ、エラーなど)について保存する情報がたくさんあります。同様に、このデータはバッファーのグループで共有する必要があります。

EDIT2:

これは、誰かがそれを必要とする場合に備えて、上記のコードがどうなるかです。

(defmacro deflocal (var &rest body)
  (let ((symb var)
        (val (car body))
        (doc (cadr body)))
    `(progn
       (set (make-local-variable ',symb) ,val)
       (put ',symb 'variable-documentation ,doc))))

(defun haxe-get-buffer-property (buffer property)
  "Pops to BUFFER, reads the value of the PROPERTY and returns it."
  (let ((result
         (with-current-buffer buffer
           (symbol-value property))))
    result))

(defun haxe-set-buffer-property (buffer &rest proplist)
  "Pops to BUFFER and sets properties in parallel, similar to `pset'."
  (let ((result
         (with-current-buffer buffer
           (loop for (property value) on proplist by #'cddr
                 do (set property value)
                 finally (return value)))))
    result))

(defmacro haxe-buffer-pset-property (buffer &rest proplist)
  `(haxe-set-buffer-property
    ,buffer
    ,@(loop for (key value) on proplist by #'cddr
            nconc (list (list 'quote key) value))))
(defalias 'haxe-pbset #'haxe-buffer-pset-property)

(defmacro haxe-buffer-setf-property (buffer &rest proplist)
  `(with-current-buffer ,buffer
     ,@(list (append '(setf) proplist))))
(defalias 'haxe-pbsetf #'haxe-buffer-setf-property)
4

1 に答える 1

2

emacs -qセッションで、私は以下を実行しました:

;; set up a hook to create buffer local variable
(add-hook 'html-mode-hook
      (lambda ()
        (set (make-local-variable 'my-var) "abcd")))

;; find two files, one html and another java    
(find-file-noselect "X.java")
(find-file-noselect "X.html")

;; see the buffer value in html buffer
(progn
  (set-buffer "X.html")
  (message "html:%s" my-var))

;; in java buffer I get error for a void variable
(progn
  (set-buffer "X.java")
  (message "java:%s" my-var))
于 2012-11-14T21:19:32.440 に答える