2010-03-06 107 views
2

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

回答

6

简单的答案是:Alt键 + X正常模式进入

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. 

只会工作,不过,如果在缓冲区一些提示(例如#!/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) 

有了它,我可以做我的设置主要模式CPerl与视图模式的次要模式:F3 米pF3中号v

1

嗯,那不是上面这么简单的答案。

更简单的答案是:Emacs只学习了如何识别22.1版本(2007年6月)中的Python文件。如果您使用的是较旧的emacs,那可以解释它。使用较新的版本,至少如果文件名以“.py”结尾,它应该正常工作。

+1

您可以使用'auto-mode-alist'通过文件扩展名设置模式,至少返回到版本18.x,IIRC(18.58或18.85是我记得使用的第一个版本)。 – 2010-03-07 05:04:49