2011-06-04 25 views
23

我在一個開源項目上工作,其中創建者將其製表符縮進設置爲2個空格。Emacs:設置製表符縮進只是一個文件動態

我想只啓用它爲我工作的一個文件,而不是相同類型的其他文件。必須有類似M-xset-tab-indent。這是一個以.js結尾的JavaScript文件。

我知道我可以使用:

(setq-default tab-width int) 

.emacs文件裏面,但我寧願只叫M-Xcommand設置它和我在這個文件上工作的持續時間內忘記它。我試過M-xapropos和Google,但找不到具體的命令。

謝謝。

回答

5

在項目中創建的目錄中的文件「爲.dir-locals.el」,並填寫像這樣:

((nil . ((tab-width . 2)))) 

這將自動完成設置標籤寬度的,你不必修改實際文件(可能是版本控制的)。

有關格式的更多信息,請參閱the manual。我相信這需要Emacs 23.

23

可以使用使變量js-indent-level本地緩衝區:

M-x set-variable <RET> js-indent-level <RET> 2

+0

這應該是正確的答案...獎勵積分如果可以有一個函數,我們可以添加到我們的.emacs,這兩個步驟在1! – 2014-04-01 15:43:13

+0

@AsfandYarQazi您可以隨時自定義js-indent級別(打開.js文件,然後M-x自定義變量 js-indent級別)。這將允許您設置默認值並將其保存爲將來的會話。問題是關於改變特定緩衝區的動態縮進。 – 2014-04-02 09:32:37

+0

我的意思是,擁有一個可以使用M-x調用的函數來創建一個可變緩衝區本地值,並將其值更改爲某些值將會很棒。就像'M-x set-variable-locally' – 2014-04-02 11:50:36

11

您還可以使用文件:

M-x make-variable-buffer-local <RET> js-indent-level <RET>

然後你可以使用設置變量在緩衝區局部變量來自動化該文件的omrib解決方案,將其添加到該文件中:

// Local Variables: 
// js-indent-level: 2 
// indent-tabs-mode: nil 
// End: 
+0

通過本地變量設置的變量會自動作爲緩衝區本地,所以你的'eval'是不必要的,我將它刪除了。 – cjm 2011-06-05 06:19:51

+0

更好(回想起來很明顯)。感謝那個cjm。 – phils 2011-06-05 09:00:14

+0

唯一的一點是,我必須確保我不會在公開回購中提交此行。 – 2011-06-07 19:32:16

1

正如其他人所指出的,File Local Variables approach的一個問題是您需要修改該文件,如果您需要將這些聲明放在版本控制之外,那麼這並不理想。

如果你想要的變量適用於所有文件指定目錄下,然後目錄局部變量顯然是要走的路,並且可以實現與任何一個.dir-locals.el文件,或致電(dir-locals-set-directory-class)

我更喜歡目錄類接近自己,我很瘦國王,這是一個遺憾,沒有一個類似的文件局部變量的方法,但我發現目錄類代碼實際上完美地與文件,並且唯一的問題是dir-locals-set-directory-class調用file-name-as-directory其參數,它阻止它匹配,由於後面的斜線。

因此,下面是一種爲單個文件配置目錄局部變量,而不修改文件本身或影響同一父目錄下的其他文件的方法。

(defun my-file-locals-set-directory-class (file class &optional mtime) 
    "Enable 'directory local' classes for individual files, 
by allowing non-directories in `dir-locals-directory-cache'. 
Adapted from `dir-locals-set-directory-class'." 
    (setq file (expand-file-name file)) 
    (unless (assq class dir-locals-class-alist) 
    (error "No such class `%s'" (symbol-name class))) 
    (push (list file class mtime) dir-locals-directory-cache)) 

(dir-locals-set-class-variables 
'my-javascript-class 
'((nil . ((js-indent-level . 2) 
      (indent-tabs-mode . nil))))) 

(my-file-locals-set-directory-class 
"path/to/the/file.js" 'my-javascript-class) 
0

我使用的代碼片段在我​​試圖自動檢測使用2空間縮進文件,並切換的Emacs的縮進該文件到2位,當它看到這樣的文件:

(add-hook 'js-mode-hook 
      (lambda() 
      (when (string-match-p "^ [A-Za-z]" (buffer-string)) 
       (make-variable-buffer-local 'js-indent-level) 
       (set-variable 'js-indent-level 2)))) 
2

單緩衝區執行此操作的最簡單方法是使用M-x set-variable

  1. 類型M-x set-variable,然後按回車
  2. 當提示輸入變量來設置,設置tab-width然後按回車鍵
  3. 你會與線Set tab-width (buffer-local) to value:提示。 把你想要的值,然後按回車

緩衝區應立即用新值更新。