【问题标题】:Emacs: Set tab indent for just one file on the flyEmacs:即时为一个文件设置制表符缩进
【发布时间】:2011-06-04 23:54:47
【问题描述】:

我在一个开源项目中工作,创建者将制表符缩进设置为 2 个空格。

我只想为我正在处理的一个文件而不是同一类型的其他文件即时启用它。一定有像 M-x set-tab-indent 这样的东西。它是以.js 结尾的JavaScript 文件。

我知道我可以使用:

(setq-default tab-width int)

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

谢谢。

【问题讨论】:

    标签: emacs


    【解决方案1】:

    您可以使用以下方法使变量 js-indent-level 成为缓冲区的本地变量:

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

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

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

    【讨论】:

    • 这应该是正确的答案...如果我们可以将一个函数添加到我们的 .emacs 中,它可以在 1 中完成这 2 个步骤,则可以加分!
    • @AsfandYarQazi 您始终可以自定义 js-indent-level(打开一个 .js 文件,然后 M-x customize-variable js-indent-level )。这将允许您设置默认值并将其保存以供将来的会话使用。问题是关于动态更改特定缓冲区的缩进。
    • 我的意思是,如果有一个可以用 M-x 调用的函数,它使变量成为局部缓冲区,并将它的值更改为某些东西,那就太棒了。所以就像M-x set-variable-locally
    【解决方案2】:

    单缓冲区最简单的方法是使用M-x set-variable

    1. 输入M-x set-variable并按回车
    2. 当提示设置变量时,设置tab-width,然后按回车键
    3. 系统将提示您使用Set tab-width (buffer-local) to value: 行。 输入你想要的值,然后回车

    缓冲区应该立即用新值更新。

    【讨论】:

    • 这是最简单最直接的答案,无需在项目目录中添加任何内容。请注意,它可能不是 tab-width 您所追求的 - 事实上,它根本不应该改变文件,只是它的显示方式。您更有可能需要某种-indent-offset,具体取决于您的主要模式。例如,我在 web 模式下查看一个 HTML 文件(我几乎不这样做,所以它没有正确配置)。我需要设置web-mode-markup-indent-offset
    【解决方案3】:

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

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

    【讨论】:

    • 通过局部变量部分设置的变量会自动设置为缓冲区局部,因此您的eval 是不必要的,我将其删除。
    • 甚至更好(回想起来也很明显)。谢谢你的 cjm。
    • 唯一的问题是我必须确保我不会在公共回购中提交这一行。
    • 我找到了解决方案 :) stackoverflow.com/questions/6240111/…
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

      正如其他人所指出的,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)
      

      【讨论】:

        【解决方案6】:

        我在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))))
        

        【讨论】:

        • 这个自动检测程序对我来说似乎是最方便的。
        猜你喜欢
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 2013-08-09
        相关资源
        最近更新 更多