Emacs:动态设置一个文件的标签缩进

时间:2011-06-04 23:54:48

标签: emacs

我在一个开源项目上工作,创建者将其tab-indents设置为2个空格。

我想立即为我工作的一个文件启用它,而不是其他相同类型的文件。必须有像 M-x set-tab-indent这样的东西。这是一个以.js结尾的JavaScript文件。

我知道我可以使用:

(setq-default tab-width int)

在我的.emacs文件中,但我只是调用 M-x command来设置它并在我处理此文件期间忘记它。我尝试了 M-x apropos和Google,但找不到具体的命令。

感谢。

6 个答案:

答案 0 :(得分:25)

您可以使用以下内容将变量js-indent-level置于缓冲区本地:

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

然后您可以使用以下方法在缓冲区中设置该变量:

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

答案 1 :(得分:13)

您还可以使用文件局部变量为该文件自动化omrib的解决方案,方法是将其添加到其中:

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

答案 2 :(得分:7)

单一缓冲区执行此操作的最简单方法是使用M-x set-variable

  1. 输入M-x set-variable并按Enter
  2. 当系统提示您设置变量时,请设置tab-width,然后按enter
  3. 系统会提示您Set tab-width (buffer-local) to value:行。 输入您想要的值,然后按Enter键
  4. 应立即使用新值更新缓冲区。

答案 3 :(得分:6)

在项目目录中创建一个“.dir-locals.el”文件并填写如下:

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

这将自动设置标签宽度,您不必修改实际文件(可能是版本控制的。)

有关格式的详细信息,请参阅the manual。我相信这需要Emacs 23。

答案 4 :(得分: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)

答案 5 :(得分:0)

我在我的init.el中使用一段代码尝试自动检测使用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))))