首页 文章

Emacs自定义缩进

提问于
浏览
10

我的团队使用特殊类型的文件进行配置,我想使用emacs自动缩进(缩进)文件 .

我想通过一个左括号的标签大小来增加缩进 - {或[,并减少右括号的标签大小 - }或] .

例如,

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

C风格的缩进不起作用,因为一行不以分号结尾 .

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

2 回答

  • 13

    从文本模式或其他东西派生新模式并创建自己的缩进功能 . 我知道说起来容易做起来难,所以这可能足够接近:

    (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

    它看起来好像 javascript-mode 会对您的样本做正确的事情 . 它可能不完美,但比编写自己的缩进模式容易得多 .

相关问题