Tự động kích hoạt các chế độ nhỏ trong chế độ cơ bản


8

Theo thiết kế, fundamental-modexương trần là các chế độ chính khác được cho là xuất phát từ cái này.

Từ trang thông tin (elisp) Major Modes, chúng tôi có:

Đây là lệnh chế độ chính cho chế độ Cơ bản. Không giống như các lệnh chế độ khác, nó không chạy bất kỳ hook chế độ nào (* lưu ý Quy ước chế độ chính: :), vì bạn không cần phải tùy chỉnh chế độ này.

Vì lý do đó,

  • Chúng tôi không có một fundamental-mode-hook.
  • Cũng my-minor-modekhông được kích hoạt CHỈ trong bộ đệm chế độ chính này, cảm hứng có (global-my-minor-mode 1)trong cấu hình của tôi.

Dưới đây sẽ hoạt động nhưng chỉ khi tôi gõ thủ công M-x fundamental-mode:

(add-hook 'after-change-major-mode-hook #'my-minor-mode)

Nó không giúp ích gì trong trường hợp dưới đây khi fundamental-modebộ đệm (* abcd *) được tạo theo mặc định:

(with-current-buffer (get-buffer-create "*abcd*")
  (insert "Hello world"))

Tại sao tôi muốn kích hoạt chế độ nhỏ trong fundamental-mode?

Tôi muốn giữ các ràng buộc khóa tùy chỉnh trong bản đồ chế độ nhỏ của mình. Tôi có chế độ nhỏ này được bật trên toàn cầu (nhưng nó không được kích hoạt chỉ trong fundamental-modebộ đệm).

Đây là một trường hợp sử dụng làm cho câu hỏi này ở đây. Khi thực hiện M-x esup( esupgói), nó tạo ra một *esup-log*bộ đệm với fundamental-modechế độ chính. Nhưng mỗi lần tôi cần kích hoạt chế độ nhỏ của mình theo cách thủ công để sử dụng các ràng buộc thuận tiện của mình.

Tôi muốn kích hoạt my-minor-modemột cách thực sự toàn cầu, fundamental-modehoặc không.

Cập nhật 1:

Đây là định nghĩa chế độ nhỏ của tôi : modi-mode.

Cập nhật 2:

Dựa trên nhận xét của @npostavs , tôi đã xem xét những gì khác nhau giữa chế độ nhỏ của tôi modi-modeoverride-global-modetrong use-package/bind-key.el. Và hóa ra giá trị init của chế độ của tôi là nilvà đó override-global-modet.

Nếu tôi thay đổi giá trị init của chế độ của mình thành t, nó cũng sẽ được bật trong bộ đệm chế độ cơ bản! Nhưng hành động (global-modi-mode 1)không kết thúc với cùng một kết quả. Có lạ không? Có lẽ là một lỗi?


Một chế độ liên kết khóa tùy chỉnh tương tự sẽ được bật trong fundamental-modebộ đệm cho tôi, vì vậy có lẽ vấn đề nằm ở định nghĩa chế độ của bạn. override-global-mode
npostavs

@npostavs Cảm ơn. Tôi sẽ xem lại cách use-packagethực hiện điều đó.
Kaushal Modi

@npostavs Vui lòng kiểm tra câu hỏi đã cập nhật .. hóa ra tôi đang gặp vấn đề này đơn giản vì giá trị init của chế độ của tôi là nil; nhưng tôi cho phép nó trên toàn cầu.
Kaushal Modi

1
Trong buffer.c, có vẻ như get-buffer-createchạy buffer-list-update-hookở phần cuối của chức năng của nó, có lẽ bạn có thể gắn chức năng của riêng mình với các điều kiện cho cái móc đó?
luật

1
Emacs sử dụng bộ đệm tạm thời "nội bộ" cho tất cả các mục đích (ví dụ: thực hiện chuyển đổi hệ thống mã hóa cho I / O sang / từ một tệp hoặc quá trình có thể sử dụng bộ đệm tạm thời). Những bộ đệm này sử dụng chế độ cơ bản và tôi nghĩ đúng là chúng không kích hoạt chế độ nhỏ của bạn. Đối với các bộ đệm khác, quy tắc đối với tôi là: nếu bạn muốn xem bộ đệm này (ngoài mục đích gỡ lỗi) thì có lẽ không nên sử dụng chế độ cơ bản.
Stefan

Câu trả lời:


4

Cách duy nhất tôi có thể nhận được một chế độ nhỏ được bật theo mặc định trong fundamental-modebộ đệm là đặt giá trị init của chế độ nhỏ đó thành t.

(define-minor-mode my-minor-mode
 "My minor mode"
 :init-value t)

Lưu ý rằng chỉ cần bật ON ở chế độ nhỏ được toàn cầu hóa (xem C-h i g (elisp) Defining Minor Modes) với giá trị init nil không làm điều tương tự. Trong trường hợp này, một fundamental-modebộ đệm sẽ được tạo với chế độ nhỏ này bị vô hiệu hóa.


Tất nhiên, ở trên sẽ chỉ hoạt động nếu bạn kiểm soát nguồn chế độ nhỏ. Đối với tất cả các chế độ nhỏ khác đi kèm với các gói khác nhau, nếu bạn muốn bật chế độ nhỏ theo mặc định trong fundamental-modebộ đệm, bạn sẽ cần phải làm

(setq-default the-minor-mode t)

1
Tôi nghĩ đối với các chế độ nhỏ khác bạn có thể làm (setq-default 'the-minor-mode t)để có được hiệu quả tương tự.
npostavs

Điểm tốt! Tôi sẽ cập nhật câu trả lời (loại bỏ trích dẫn đó). Cảm ơn!
Kaushal Modi

Nếu bạn đã thêm vào (setq-default modi-mode 1)chức năng turn-on-modi-mode(setq-default modi-mode nil) to the function tắt chế độ modi, thì bạn sẽ tiến thêm một bước để thực sự kích hoạt và vô hiệu hóa chế độ trên toàn cầu.
nispio

@nispio Đó là một điểm tốt. Tôi chưa cần phải làm điều này. Nhưng bây giờ tôi biết tôi cần phải làm gì nếu tôi cần chuyển chế độ nhỏ của mình trong bộ đệm chế độ cơ bản.
Kaushal Modi

2

Không sử dụng fundamental-mode - ít nhất là không tương tác. Bạn hiếm khi muốn ở trong fundamental-mode. Hầu như luôn luôn có một cái gì đó tốt hơn.

Toàn bộ vấn đề fundamental-modekhông có xử lý chế độ chính thông thường (móc, v.v.). Bạn có thể nghĩ fundamental-modegiống như một lớp trừu tượng.

Nếu một số gói đặt bạn vào một bộ đệm trong fundamental-modeđó thì hãy làm những gì bạn cần làm để ngăn chặn điều này - sử dụng một số chế độ khác cho nó.

Xem xét tùy chỉnh major-mode để nó mặc định cho một cái gì đó khác hơn fundamental-mode. (Tôi sử dụng indented-text-mode.)


Trước đây có default-major-modeđiều này, mà tôi nghĩ là rõ ràng hơn một chút, nhưng họ đã quyết định từ chối điều đó (tất nhiên nó vẫn hoạt động).

default-major-mode is a variable defined in `C source code`.
Its value is indented-text-mode

  This variable is obsolete since 23.2;
  use `major-mode' instead.

Documentation:
Value of `major-mode` for new buffers.

Tôi không sử dụng fundamental-mode. Mấu chốt của vấn đề là khi bất kỳ gói nào sử dụng get-buffer-createđể tạo bộ đệm tạm thời, bộ đệm đó sẽ được tạo với fundamental-modechế độ chính. Trong các bộ đệm đó, chế độ nhỏ của tôi sẽ không được bật theo mặc định (vì giá trị init của nó là không; mặc dù tôi đã bật nó trên toàn cầu).
Kaushal Modi

Vài gói như vậy tôi có thể liệt kê : esup,keyfreq
Kaushal Modi

Gói chỉ gọi get-buffer-createkhông làm gì để thiết lập chế độ chính (hoặc bất kỳ chế độ nhỏ nào). Có nên (cho gói trong câu hỏi)? Nếu cần, xem xét liên hệ với người bảo trì gói. Nếu không, hãy xem xét tự bật chế độ chính hoặc phụ ưa thích của bạn. IOW, nếu đó là về những gì bạn muốn, và không phải những gì gói nên thiết lập nói chung, thì tùy thuộc vào bạn để thiết lập nó theo cách bạn muốn.
vẽ

Tôi tò mò muốn biết lý do tại sao điều này bị hạ cấp.
Drew

@Drew vì nó không giải quyết được vấn đề. OP tuyên bố rõ ràng rằng các chế độ khác đang tạo bộ đệm ở chế độ cơ bản và giải pháp đề xuất của bạn là không sử dụng chế độ cơ bản.
nispio

0

Hàm get-buffer-createđược định nghĩa trong buffer.cvà ở cuối hàm đó, nó gọi hàm buffer-list-update-hook. Một hook như vậy có thể được sử dụng để chạy một chức năng tùy chỉnh, nhưng có thể cần thêm một số điều kiện để ngăn chức năng tùy chỉnh bắn vào những khoảnh khắc không phù hợp bất cứ khi nào hook đó được gọi bởi các chức năng khác.

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.