在Emacs中自动检测语言

hek*_*ran 3 emacs elisp

如果我在基本模式下的缓冲区中有一个Python(或任何其他语言)文件,是否有一个命令可以让缓冲区自动检测它应该是什么语言并相应切换?

Joe*_*nte 6

简单的答案是:Alt+xnormal-modeEnter

normal-mode is an interactive compiled Lisp function in `files.el'.

(normal-mode &optional find-file)

Choose the major mode for this buffer automatically.
Also sets up any specified local variables of the file.
Uses the visited file name, the -*- line, and the local variables spec.

This function is called automatically from `find-file'.  In that case,
we may set up the file-specified mode and local variables,
depending on the value of `enable-local-variables'.
In addition, if `local-enable-local-variables' is nil, we do
not set local variables (though we do notice a mode specified with -*-.)

`enable-local-variables' is ignored if you run `normal-mode' interactively,
or from Lisp without specifying the optional argument find-file;
in that case, this function acts as if `enable-local-variables' were t.
Run Code Online (Sandbox Code Playgroud)

但是,如果缓冲区中有一些提示(例如#!/bin/python在文件顶部)或缓冲区支持的文件名(如果有的话)有python扩展名(这也有其他方法) ;请参阅上面的定义以及set-auto-mode有关它们的全部内容的更多信息.

如果您知道自己想要的模式,也可以专门设置模式.我的.emacs中有这个:

;;;; ------------------------------------------------------------------------
;;;; --- F3 - multi-purpose prefix keymap
;;;; ------------------------------------------------------------------------
(setq my-F3-keymap (make-sparse-keymap))
(global-set-key [(f3)] my-F3-keymap)


;; --- m -- generic (major) modes ---
(require 'generic)
(require 'generic-x)

;; stolen shamelessly from generic-x Samba mode
(define-generic-mode 'generic-rc-mode
   (list ?#)
   nil
   '(
     ("^\\s-*\\(.+\\)=\\([^\r\n]*\\)"
      (1 'font-lock-variable-name-face)
      (2 'font-lock-type-face))
     )
   (list "\\(/\\.[^/]+rc$\\|\\.rc$\\)" "weblogic[^/\\]*\\.conf\\'" "oc4j[^/\\]*\\.conf\\'" "tomcat[^/\\]*\\.conf\\'")
   nil
   "Generic RC mode.")

(setq my-F3:m-keymap (make-sparse-keymap))
(define-key my-F3-keymap [(m)] my-F3:m-keymap)
 (define-key my-F3:m-keymap [(a)] 'apache-conf-generic-mode)
 (define-key my-F3:m-keymap [(b)] 'bat-generic-mode)
 (define-key my-F3:m-keymap [(f)] 'fundamental-mode)
 (define-key my-F3:m-keymap [(i)] 'ini-generic-mode)
 (define-key my-F3:m-keymap [(j)] 'javascript-generic-mode)
 (define-key my-F3:m-keymap [(J)] 'java-properties-generic-mode)
 (define-key my-F3:m-keymap [(l)] 'emacs-lisp-mode)
  (define-key my-F3:m-keymap [(L)] 'lisp-interaction-mode)
 (define-key my-F3:m-keymap [(n)] 'nxml-mode)
 (define-key my-F3:m-keymap [(p)] 'cperl-mode)
 (define-key my-F3:m-keymap [(r)] 'generic-rc-mode)
 (define-key my-F3:m-keymap [(s)] 'sgml-mode)
 (define-key my-F3:m-keymap [(S)] 'shell-script-mode)
 (define-key my-F3:m-keymap [(t)] 'text-mode)

;; --- M -- generic (minor) modes ---
(setq my-F3:M-keymap (make-sparse-keymap))
(define-key my-F3-keymap [(M)] my-F3:M-keymap)
 (define-key my-F3:M-keymap [(l)] 'longlines-mode)
 (define-key my-F3:M-keymap [(v)] 'view-mode)
 (define-key my-F3:M-keymap [(V)] 'visible-whitespace-mode)
Run Code Online (Sandbox Code Playgroud)

有了它,我可以通过以下方式将我的主要模式设置为具有次模式的查看模式的CPerl: F3mpF3Mv