Tôi không rõ lắm về tất cả các biến thể của các biến cục bộ đệm, ngay cả sau khi đọc tất cả tài liệu và một loạt các bài đăng ở đây trên SX.
Dưới đây là tóm tắt những hiểu biết của tôi:
(defvar foo ..)
khai báo một biến động cho tập tin Nhưng biến là (1) không được biết đến với các tệp khác trừ khi chúng cũng bao gồm một defvar
câu lệnh và (2) biến là phạm vi toàn cầu, không phải là bộ đệm cục bộ.
(make-variable-buffer-local foo)
sau phần defvar
trên cho trình biên dịch và mọi người khác biết rằng biến foo sẽ được coi là bộ đệm cục bộ ở mọi nơi nó được đặt, khi nó được đặt. Vì vậy, mẫu này là phong cách tốt để khai báo một biến bộ đệm cục bộ, đặt cả hai câu lệnh back-to-back trong tệp.
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
Để thuận tiện, (defvar-local xxx ...)
mẫu có thể được sử dụng dưới dạng một dòng, thay cho hai dòng trên:
(defvar-local xxx ...) ;make xxx buffer local everywhere
Khi được khai báo như trên, biến xxx có thể được sử dụng như bất kỳ biến nào khác trong các câu lệnh setq.
Nếu tôi chỉ muốn có một phiên bản duy nhất của biến đệm cục bộ đã là biến động toàn cục, tôi sẽ sử dụng các khai báo sau. Biến thứ nhất khai báo biến động phạm vi toàn cầu và câu lệnh thứ hai chỉ tạo một phiên bản của phiên bản đệm cục bộ của biến đó, trong bộ đệm hiện tại:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
Bây giờ cho các câu hỏi khám phá của tôi (tất cả các câu hỏi trên là những câu hỏi ngầm về việc sự hiểu biết của tôi có đúng không).
Khi đặt giá trị của các biến, tôi có thể sử dụng setq
hoặc
setq-local
. Khi nào nên setq-local
sử dụng? Tại sao?
Điều gì xảy ra nếu tôi sử dụng setq-local
trên các vars đệm cục bộ, hoặc các vars không đệm cục bộ?
Được setq-local
yêu cầu cho một defvar-local
biến khai báo?
Liệu setq-local
một defvar
biến được khai báo bình thường có biến nó thành một biến cục bộ không? (Nói cách khác, setq-local
bằng cách nào đó có tương đương với một (make-variable-local xxx)
tuyên bố?
(setq-local VAR VALUE)
chỉ là viết tắt cho (set (make-local-variable VAR) VALUE)
, mà (và vẫn là) một thành ngữ phổ biến.