2010-11-11 93 views
10

我的团队使用特殊类型的文件进行配置,并且我想使用emacs自动缩进(块缩进)文件。Emacs自定义缩进

我想通过左括号的制表符大小来增加缩进 - {或[,并减少右括号的制表符大小}或]。由于线不与分号结束

例如,

files = { 
    file1 = first_file.txt 
    file2 = second_file.txt 
    rules = { 
     skip_header = 1 
     fast_process = 1 
    } 
} 

C风格压痕不起作用。

我已经研究了emacs压缩今天半天,但仍不知道如何做到这一点。

回答

0

它在我看来好像javascript-mode会做你的样品正确的事情。它可能不完美,但比编写自己的缩进模式容易得多。

+0

是JavaScript的模式相同,java的模式? 我无法从M-x命令中找到javascript模式。 – canonv 2010-11-11 19:13:55

+0

java-mode适用于圆括号,但对括号不起作用。我可以对java模式进行调整,以便它可以用于括号吗? – canonv 2010-11-11 19:21:59

+0

'javascript-mode'('js-mode'的别名)内置于Emacs 23.2。也许你正在运行一个旧版本的Emacs?如果您无法升级或无法升级,请参阅Emacs wiki上的[JavaScriptMode](http://www.emacswiki.org/emacs/JavaScriptMode)。 – 2010-11-11 19:23:14

11

从文本模式或其他东西导出新模式并创建自己的缩进功能。我知道这是谈何容易,所以这可能是非常接近:

(define-derived-mode foo-mode text-mode "Foo" 
    "Mode for editing some kind of config files." 
    (make-local-variable 'foo-indent-offset) 
    (set (make-local-variable 'indent-line-function) 'foo-indent-line)) 

(defvar foo-indent-offset 4 
    "*Indentation offset for `foo-mode'.") 

(defun foo-indent-line() 
    "Indent current line for `foo-mode'." 
    (interactive) 
    (let ((indent-col 0)) 
    (save-excursion 
     (beginning-of-line) 
     (condition-case nil 
      (while t 
      (backward-up-list 1) 
      (when (looking-at "[[{]") 
       (setq indent-col (+ indent-col foo-indent-offset)))) 
     (error nil))) 
    (save-excursion 
     (back-to-indentation) 
     (when (and (looking-at "[]}]") (>= indent-col foo-indent-offset)) 
     (setq indent-col (- indent-col foo-indent-offset)))) 
    (indent-line-to indent-col))) 

打开你的文件,然后执行M-x foo-mode

+1

谢谢Scottfrazer。它的工作接近完美。 但是,它为单个缩进添加了四个空格,并为双缩进添加了一个制表符而不是八个空格。 当我的同事vi中打开该文件时,缩进不再那么漂亮。 你能告诉我如何使它每个缩进添加一个选项卡? 如果这是不可能的,每个缩进4个空格也很好。 – canonv 2010-11-11 21:04:30

+1

这听起来像一个基本的缩进设置问题,与我的答案无关。如果你不需要标签,试着把'(setq-default indent-tabs-mode nil)'放在你的.emacs文件中,或者如果你想要所有的标签,就把'(setq foo-indent-offset tab-width)'放进去。 – scottfrazer 2010-11-12 14:08:45