2013-08-11 40 views
57

Tôi có câu hỏi về Emacs Lisp. Sự khác nhau giữa setqsetq-default là gì? Tôi rất bối rối về nó.Sự khác biệt giữa setq và setq-default trong Emacs Lisp

Tutorials nói setq có hiệu lực trong đệm địa phương khi setq mặc định ảnh hưởng đến tất cả các bộ đệm.

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

Có vấn đề gì với hiểu biết của tôi không?

Cảm ơn bạn rất nhiều.

Ví dụ:
1) Tôi đã viết (setq chào 123) trong init.el tập tin, và tôi chạy emacs abuffer trong vỏ, sau đó tôi đầu vào "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 chiều rộng tab C-x C-e, nó hiển thị "8" (Chế độ hiện tại là 'Văn bản'). Tuy nhiên, khi tôi sử dụng (chiều rộng tab mặc định là 4), nó hiển thị "4". Tôi không thể giải thích hiện tượng này.

Trả lời

63

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

Nếu biến là bộ đệm cục bộ, sau đó 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 biến không phải là bộ đệm cục bộ, thì setqsetq-default cũng làm như vậy.

Trong trường hợp của bạn 2, (setq tab-width 4) thiết lập giá trị đệm cục bộ của tab-width-4 trong bộ đệm hiện nay, để lại giá trị mặc định toàn cầu của tab-width vẫn ở mức 8, vì vậy khi bạn đánh giá tab-width trong một bộ đệm khác nhau mà không có giá trị địa phương , bạn thấy rằng 8. Sau đó, khi bạn đặt giá trị mặc định là 4, bộ đệm đó đã chọn nó, vì nó vẫn không có giá trị cục bộ.

+0

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

+0

'(setq tab-width 4)' có hiệu lực trong bộ đệm mà bạn đã đánh giá biểu thức, nếu bạn đánh giá nó trong bộ đệm '* scratch *' sau đó kiểm tra giá trị của nó trong bộ đệm đó – tripleee

+0

'tab-width' là một biến vùng đệ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. 8. Khi bạn '(setq-default tab-width 4)', bạn đang thay đổi mặc định toàn cục của 'tab-width' thành 4, vì vậy bây giờ mọi bộ đệm không tự định nghĩa' tab-width' có mặc định mới – dfan