Làm thế nào để có được bộ đệm (không chỉ tập tin) để tôn vinh chế độ tự động chế độ?


13

Q: làm thế nào tôi có thể có được bộ đệm mới để tôn vinh ánh xạ auto-mode-alist?

Khi tìm tệp , Emacs so sánh phần mở rộng tệp với auto-mode-alistđể xác định chế độ chính nào sẽ sử dụng cho bộ đệm của tệp. Có cách nào để sử dụng thông tin trong auto-mode-alistđể xác định chế độ cho bộ đệm chưa (chưa) có tệp được liên kết với nó không?

Đó là: nếu tôi mở một bộ đệm mới có tên giống như phần mở rộng tệp, tôi có thể mở nó tự động trong chế độ mong đợi không? Ví dụ: nếu tôi mở một bộ đệm mới a-new-buffer.elchưa được liên kết với một tệp, tôi muốn nó mở ra emacs-lisp-modethay vì ở chế độ mặc định.


2
Chỉ tò mò: Trường hợp sử dụng là gì? IOW, tại sao / khi / trong bối cảnh nào bạn muốn làm điều này? Thông thường, nếu bạn muốn một bộ đệm được liên kết với một tệp và do đó chọn chế độ của nó từ đó auto-mode-alist, bạn làm cho bộ đệm " truy cập " tệp (và điều đó sẽ đảm nhiệm mọi thứ).
vẽ

5
Ví dụ về các trường hợp sử dụng điển hình đối với tôi là: a) orgbộ đệm tạm thời để kiểm tra các chức năng mới mà tôi đang viết để sử dụng org-mode; b) một Rbộ đệm tạm thời để thực hiện một số thao tác thống kê nhanh chóng, vứt đi; c) bộ đệm văn bản tạm thời để soạn email. Trong mỗi trường hợp, tôi không muốn tạo một tệp để truy cập, tôi chỉ muốn một bộ đệm vứt đi mà dù sao cũng mở trong chế độ thích hợp.
Dân

2
Lệnh tập tin quý khách đến thăm như C-x C-flàm không " tạo ra một tập tin để truy cập ". Đó là một sự hiểu lầm cơ bản. Họ chỉ đơn giản là làm chính xác những gì bạn đang tìm kiếm. Đó là chỉ nếu và khi bạn cố gắng để tiết kiệm bộ đệm rằng một tập tin được tạo ra. Nếu bạn không cố lưu bộ đệm, không có tệp nào được tạo. Những gì bạn muốn, từ những gì tôi hiểu cho đến nay, là "truy cập một tệp" (điều này thực sự có nghĩa là mở một bộ đệm trong chế độ thích hợp).
vẽ

8
Giống như Dan, tôi tạo bộ đệm tạm thời mọi lúc mà tôi không muốn liên kết với đường dẫn tệp thực tế. Truy cập một đường dẫn tệp không có thật sẽ hoạt động nhưng có ít nhất một lượng ma sát nhỏ trong việc chọn một thư mục (hoặc chấp nhận thư mục hiện tại). Có thể có các tác dụng phụ khác tùy thuộc vào phần còn lại của cấu hình của bạn: Tự động lưu hành vi? Các nhóm Ibuffer hoặc các dự án phóng được xác định bởi con đường? Ido xác nhận nhắc nhở? Vì bộ đệm dù sao cũng phải có tên, sử dụng tên để đặt chế độ tự động cho bộ đệm tạm thời có ý nghĩa với tôi.
glucas

@Drew, vâng, điều đó có ý nghĩa và sẽ là câu trả lời đơn giản nhất cho câu hỏi này - bạn có thể đăng nó dưới dạng câu trả lời không? Nó xứng đáng được nâng cấp.
Dan

Câu trả lời:


8

Các lệnh truy cập tệp như C-x C-f không tạo tệp để truy cập. Họ làm những gì bạn đang tìm kiếm.

Chỉ khi và khi bạn cố lưu bộ đệm mà tệp được tạo .

Nếu bạn không cố lưu bộ đệm, không có tệp nào được tạo. Những gì bạn muốn, từ những gì tôi hiểu cho đến nay, là " truy cập một tệp " (điều này thực sự có nghĩa là mở một bộ đệm trong chế độ thích hợp).


4
Điều gì sẽ xảy ra nếu bạn có một ngón tay hiếu động liên tục lưu tệp hiện tại cứ sau 3 giây bất kể bạn muốn gì?
Malabarba

1
@Malabarba: Thật ra, tôi có ngón tay đó! ;-) Có lẽ hầu hết những người già của chúng ta đều làm như vậy - một thói quen bắt đầu trở lại khi mọi thứ sụp đổ mọi lúc. Nhưng dù sao, tôi chỉ làm những gì tôi đề xuất: chỉnh sửa trong bộ đệm tệp đã truy cập. Nếu bộ nhớ cơ hoạt động quá mức của tôi cản trở và cố gắng lưu, thì hãy là: hoặc tôi nhấn nđể không lưu hoặc (thường) tôi chỉ lưu bộ đệm. Và sau đó tôi ném tập tin đã tạo ... hoặc không.)
vẽ

1
@Malabarba Chính xác là để ngăn chặn sự lộn xộn của các tệp tạm thời, tôi đã bắt đầu sử dụng bộ đệm cào cụ thể ở chế độ chính. Nếu vết xước xứng đáng với một tập tin, bạn luôn có thể lưu nó như một lần sau.
Kaushal Modi

1
@kaushalmodi: Không có gì chống lại bộ đệm dành riêng cho chế độ của bạn, nhưng một " mớ hỗn độn của tệp tạm thời " dễ dàng được dọn sạch như một bộ đệm . ;-) Và ngón tay hiếu động trong bộ đệm cào dành riêng cho chế độ cũng có cùng một vấn đề, có lẽ - giống như trong *scratch*: bạn được nhắc lưu khi ngón tay đó tự động chạm vào C-x C-s.
vẽ

9

Nếu đã sử dụng giải pháp của Juri Linkov trong nhiều năm.

Tôi tạo bộ đệm tạm thời với một cái gì đó như C-x b test.org C-j. Các major-modeđược xác định bằng cách mở rộng tập tin qua auto-mode-alist.

;; http://thread.gmane.org/gmane.emacs.devel/115520/focus=115794
(setq-default major-mode
              (lambda () (if buffer-file-name
                          (fundamental-mode)
                            (let ((buffer-file-name (buffer-name)))
                          (set-auto-mode)))))

Để kiểm tra hiệu quả bạn có thể thử (prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org")) => org-mode. Trong sạch emacs -q, bài kiểm tra sẽ trở lại fundamental-mode.


1
Điều đó rất thông minh! Nó cũng gọn gàng hơn advicetùy chọn tôi đang sử dụng. Không chắc chắn tôi đang làm theo những gì (prog1...)phần này dành cho, nhưng (setq-default major-mode ...)phần này khá hay.
Dân

1
Hãy xem trang web Emacs của Juri . Các prog1-test chỉ cho thấy rằng bạn có được những mong đợi major-modekhi chuyển sang một bộ đệm. Eval setq-defaultmột phần và chạy thử nghiệm. Nó sẽ trở lại org-mode mà không có setq-defaultnó sẽ trở lại fundamental-mode.
rasmus

Đây là cách thanh lịch hơn so với hook-list-update-hook của tôi. Cảm ơn!
glucas

đây phải là câu trả lời được chấp nhận, vì nó thực sự trả lời câu hỏi thay vì cho chúng tôi biết lý do tại sao chúng tôi sai khi hỏi nó :)
Shlomi

6

Tìm ra một cách dựa trên lời khuyên bằng cách sử dụng các ý tưởng xuất phát từ ý kiến ​​của @ Drew và câu trả lời của @ glucas mà tôi sẽ ghi lại ở đây trong trường hợp chúng hữu ích cho bất kỳ ai.

Phiên bản ngắn: sử dụng afterlời khuyên để truy vấn xem bộ đệm có tên tệp liên quan hay không, đặt tạm thời nếu không, sau đó để phần còn lại của set-auto-modemáy móc xử lý các chi tiết. Sau một chút thử nghiệm (không mở rộng), nó dường như chỉ hoạt động tốt.

Đối với ido-switch-buffervà vani switch-to-buffer, hai bit của lời khuyên sẽ là:

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

(defadvice switch-to-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

Tôi thấy tùy chọn này hữu ích ở find-fileđiểm mà @Drew đã nêu ra vì các ngón tay của tôi có thể vượt lên trước bộ não của tôi: bộ nhớ cơ thường sẽ đưa tôi vào lãnh thổ chuyển sang bộ đệm trước khi nó hoàn toàn find-filelàm điều tôi cần. Bây giờ, cả hai tùy chọn có sẵn.

CẬP NHẬT: lỗi nhỏ nhưng có khả năng gây khó chịu trong đoạn mã trên: nó sẽ chạy lại hook chế độ trên bộ đệm mỗi khi bạn chuyển sang nó. Sau đây cung cấp cho nó một tên tệp thực sự ra khỏi /tmpthư mục và tránh vấn đề đó:

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (setq buffer-file-name (concat "/tmp/" (buffer-name)))
    (set-auto-mode t)))

Có vẻ tốt, và làm sạch hành trình câu trả lời của tôi đã tích lũy qua một vài lần lặp lại. :-) Tôi sẽ chỉ nhắc lại ở đây rằng nếu bạn không muốn đặt đường dẫn tệp thực tế vì một số lý do, bạn có thể sử dụng biến bộ đệm cục bộ để tránh đặt chế độ nhiều lần.
glucas

5

Các set-auto-modechức năng thiết lập chế độ dựa trên các tập tin liên quan đến một bộ đệm. Đây là một hàm tạm thời đặt buffer-file-nametừ tên bộ đệm để đặt chế độ:

(defun my/set-buffer-mode (buffer &optional again)
  "Set the mode for BUFFER from the name.  
When called repeatedly for the same buffer only set the mode the first
time, unless the optional argument AGAIN is specified.
Does nothing if the buffer is associated with a file."

  (with-current-buffer buffer
    (when again (kill-local-variable 'my/buffer-mode-set))
    (unless (or buffer-file-name 
            (local-variable-p 'my/buffer-mode-set))
      (let ((buffer-file-name (buffer-name)))
        (set-auto-mode t)
        (setq-local my/buffer-mode-set t)))))

Bạn có thể chạy nó khi bộ đệm được đổi tên bằng lời khuyên:

(defadvice rename-buffer (after my/rename-update-mode activate)
  (my/set-buffer-mode (current-buffer) 'again))

Tôi không chắc chắn về nơi tốt nhất để kết nối điều này để ảnh hưởng đến bộ đệm mới. Ở đây tôi đang sử dụng buffer-list-update-hook, nhưng điều đó được gọi trong nhiều trường hợp hơn chúng ta cần.

(add-hook 'buffer-list-update-hook
      '(lambda ()
         (my/set-buffer-mode (car (buffer-list)))))

Câu trả lời trên đã được sửa đổi để giải quyết một số vấn đề. Cụ thể, tôi đã quay lại sử dụng buffer-list-update-hookchange-major-mode-hookkhông được gọi với bộ đệm hiện tại dự kiến. Đối với bản ghi, có thể có ý nghĩa hơn khi tư vấn chức năng bộ đệm chuyển đổi của bạn như @Dan thực hiện trong câu trả lời của mình.
glucas

3

Bạn có thể sử dụng bộ đệm * cào * cho mục đích tạo bộ đệm tạm thời có cùng chế độ chính với tệp mà bạn có thể đang làm việc.

Đây là một câu trả lời SE emacs có thể giải quyết vấn đề của bạn:

Làm cách nào tôi có thể nhanh chóng chuyển đổi giữa một tệp và bộ đệm * Scratch * có cùng chế độ chính?

Các câu hỏi và câu trả lời tham khảo đều được đăng bởi tôi. Câu trả lời trong hàm thực hiện như sau:

  • Nếu bạn đang làm việc ở chế độ X chính trong một tệp, việc gọi hàm này sẽ tạo một bộ đệm cào mới được gọi *scratch-X-mode*nếu nó chưa tồn tại và chuyển sang bộ đệm mới được tạo này.
  • Nếu *scratch-X-mode*đã tồn tại, nó chỉ đơn giản chuyển sang bộ đệm đó.
  • Gọi lại chức năng này trong khi trong bộ đệm đầu đó sẽ đưa bạn trở lại bộ đệm tệp mà bạn đang làm việc ban đầu.

0

Có một số câu trả lời tốt ở đây nhưng tôi muốn thêm một điều nữa. Emacs có rất nhiều tính năng và thường có một số cách để làm một cái gì đó. Bạn có thể thêm các thẻ ở đầu bất kỳ tệp nào cho biết emacs loại gì, bất kể phần mở rộng. Ví dụ: thêm điều này:

# -*-Python-*-

Ở đầu một tệp sẽ cho emacs biết đó là tệp Python ngay cả khi không có .pyphần mở rộng. Lưu ý rằng #ở đầu dòng là một nhận xét kiểu Python. Đối với các loại tệp khác nhau, bạn có thể sử dụng các ý kiến ​​khác nhau. Ví dụ: để chỉ định tệp Lisp bạn sử dụng ;để bắt đầu một dòng nhận xét và đặt chế độ trong các emacs như thế này:

; -*- mode: Lisp;-*-

Xem Chỉ định biến tệpchọn chế độ tệp .


Có, nhưng câu hỏi ở đây là cụ thể về việc tạo một bộ đệm tạm thời mới (ví dụ với switch-buffer) và để chế độ tự động được đặt thành một cái gì đó khác fundamental-mode.
glucas
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.