Sự khác biệt giữa setq và setq-default trong Emacs Lisp


89

Tôi có một câu hỏi về Emacs Lisp. Sự khác biệt giữa setqsetq-default là gì?

Các hướng dẫn cho biết setq có hiệu lực trong bộ đệm cục bộ trong khi setq-default ảnh hưởng đến tất cả các bộ đệm.

Ví dụ: nếu tôi đã viết (setq a-var a-vars-value) trong init.el , tôi thấy sau khi khởi động Emacs và mở một bộ đệm mới, a-var cũng ở đó và giá trị của nó là a-vars-value . Tôi nghĩ rằng nó không được cho là ở đó. Có vẻ như không có sự khác biệt giữa setqsetq-default .

Có điều gì đó sai với sự hiểu biết của tôi?

Ví dụ:

  1. Tôi đã viết (setq hello 123) trong tệp init.el và tôi chạy abuffer emacs trong shell, sau đó tôi nhập "hello Cx Ce" , nó hiển thị "123". Điều tương tự cũng xảy ra khi tôi chạy điều này trong tất cả các bộ đệm mới.

  2. Tôi đã viết (setq tab-width 4) trong tệp init.el. Khi tôi chạy Cx Ce theo chiều rộng tab , nó hiển thị "8" (Chế độ hiện tại là 'Văn bản'). Tuy nhiên, khi tôi sử dụng (setq-default tab-width 4) , nó hiển thị "4". Tôi không thể giải thích hiện tượng này.

Câu trả lời:


100

Một số biến trong Emacs là "bộ đệm-cục bộ", nghĩa là mỗi bộ đệm được phép có một giá trị riêng cho biến đó ghi đè mặc định chung. tab-widthlà một ví dụ điển hình về biến cục bộ đệm.

Nếu một biến là bộ đệm cục bộ, thì hãy setqđặt giá trị cục bộ của nó trong bộ đệm hiện tại và setq-defaultđặt giá trị mặc định chung.

Nếu một biến được không đệm cục bộ, sau đó setqsetq-defaultlàm điều tương tự.

Trong trường hợp 2 của bạn, hãy (setq tab-width 4)đặt giá trị cục bộ của bộ đệm tab-widththành 4 trong bộ đệm hiện tại, để giá trị mặc định chung tab-widthvẫn là 8, vì vậy khi bạn đánh giá tab-widthtrong một bộ đệm khác không có giá trị cục bộ, bạn thấy rằng 8. Sau đó, khi bạn đặt giá trị mặc định thành 4, bộ đệm đó sẽ chọn nó, vì nó vẫn không có giá trị cục bộ.


khi tôi (đặt chiều rộng tab là 4) và đánh giá nó, nó luôn là 8 trong mọi bộ đệm. Tôi không biết tại sao. Có vẻ như nó không có hiệu lực. Nhưng khi tôi sử dụng (set-default tab-width 4), nó có hiệu lực trong mọi bộ đệm. Tôi cũng không biết tại sao :(
ruanhao

(setq tab-width 4)có hiệu lực trong vùng đệm nơi bạn đã đánh giá biểu thức; nếu bạn đánh giá nó trong *scratch*bộ đệm thì hãy kiểm tra giá trị của nó trong bộ đệm đó.
tripleee

tab-widthlà một biến cục bộ đệm. Vì vậy, khi bạn (setq tab-width 4), nó chỉ được đặt thành 4 trong bộ đệm hiện tại. Tất cả các bộ đệm khác giữ lại một tab-widthmặc định chung, 8. Khi bạn (setq-default tab-width 4), bạn đang thay đổi mặc định chung tab-widththành 4, vì vậy bây giờ mọi bộ đệm chưa được định nghĩa tab-widthđều có mặc định mới đó.
dfan

3
Đúng. Xem danh sách Trình tự hành động của emacs khi khởi động . Đọc file init là bước 12, và đưa lên bộ đệm ban đầu là bước 23.
dfan

1
@ruanhao Nếu bạn (setq tab-width 4) trong init.el, thì nó sẽ chỉ áp dụng cho bộ đệm đó (init.el). Nếu bạn muốn thay đổi này áp dụng cho tất cả các vùng đệm mới, thì (setq-default tab-width 4) sẽ thực hiện điều này. Ngoài ra, nếu bạn muốn tạo chế độ cho một loại tệp cụ thể, bạn có thể muốn sử dụng (setq tab-width 4) để không ghi đè mặc định chung.
Hemm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.