2010-11-11 91 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