【问题标题】:How to get reliable indentation in elisp如何在 elisp 中获得可靠的缩进
【发布时间】:2013-09-22 05:46:51
【问题描述】:

我是 Emacs 新手。

我正在尝试编写一个适用于所有模式的 elisp 函数。具体来说,我想编写一个插入大括号的函数(有点像insert-parentheses),就像下面的键序列对只支持自动缩进的愚蠢编辑器所做的一样:

"{" <ret> "}" <up-arrow> <end> <ret> <tab>

此键序列适用于 Java 和 C# (bsd) 样式的缩进。我需要它在所有大括号-y emacs 模式以及纯文本文件中工作 - 我有其他没有 emacs 模式但仍使用大括号的格式。

这是我的第 12 次尝试:

(defun insert-braces-macro ()
  (interactive)
  (insert "{")
  (newline)
  (indent-relative t)
  (insert "}")
  (forward-line -1)
  (end-of-line)
  (newline)
  (indent-relative t)
  (indent-relative nil))

不幸的是,这并不完全正确。我不认为 indent-relative 是正确的函数,因为它在 Java 样式中没有正确缩进:

f |

扩展为:

f {
  |
}

在 C 模式下:

somelongword another |

扩展到:

somelongword another {
             |
}

但是indent-according-to-mode 也不对,因为它在 C-ish 模式下会缩进太多(尾部的 '}' 是缩进的),而在基本模式下则完全不行。

处理这个问题的正确方法是什么?

【问题讨论】:

  • 是不是因为不同的模式有不同的默认缩进,除非用户特别设置? (defun my-tabset-hook () (setq indent-tabs-mode t) (setq tab-stop-list (number-sequence 2 200 2)) (setq tab-width 2) (setq indent-line-function 'insert-tab) ) (add-hook 'text-mode-hook 'my-tabset-hook) (add-hook 'tex-mode-hook 'my-tabset-hook) (add-hook 'LaTeX-mode-hook 'my-tabset-hook)

标签: emacs elisp indentation auto-indent


【解决方案1】:

indent-according-to-mode 是正确的答案,我认为,但你需要记住它不能预测未来,所以你需要在插入文本之后调用它而不是之前:

(defun insert-braces-macro ()
  (interactive)
  (insert "{")
  (newline) (indent-according-to-mode)
  (save-excursion
    (newline)
    (insert "}")
    (indent-according-to-mode)))

【讨论】:

  • 坦率地说,我宁愿完全禁用 emacs 的智能缩进。它太不可预测并且在基本模式下不起作用。我可以闭着眼睛使用哑自动缩进,并且无论源代码是用什么编写的,我都知道它的作用......
  • indent-according-to-mode 在基本模式下根本不缩进
  • 如果你使用fundamental-mode,这本身就是一个问题。
  • 如果缩进是不可预测的,那么这是一个错误,您应该报告。如果它是可预测的,但与你喜欢的风格不同,那当然是另一个问题了。
【解决方案2】:

这是我用了很久的东西:

(defun ins-c++-curly ()
  "Insert {}.
Treat it as a function body when from endline before )"
  (interactive)
  (if (looking-back "\\()\\|try\\|else\\|const\\|:\\)$")
      (progn
        (insert " {\n\n}")
        (indent-according-to-mode)
        (forward-line -1)
        (indent-according-to-mode))
    (insert "{}")
    (backward-char)))

这个函数:

  1. 回看时插入{} 块 在合适的地方,例如在) 之后。
  2. 否则,插入{} 并后退一个字符。 对数组和新式初始化很有用。

这适用于 C++,我将缩进设置为 4 个空格, 以及 Java,我有 2 个空格。

【讨论】:

  • indent-according-to-mode 在基本模式下不缩进,所以对我的目的没有好处。除非它可以在基本模式下缩进?
  • 那你的目的是什么?我想花括号意味着代码,为什么要在基本模式下编写代码?你想如何在基本模式下缩进?我可以在代码上添加(if (eq major-mode 'fundamental-mode) ...),但我不确定之后该怎么做。
  • 我在从编译器前端转储 AST 时使用花括号,并在其他 ad-hoc 文件格式中使用其他括号结构。为它们编写主要模式太多了,更不用说配置所有这些模式了。
  • 我将尝试将其引向不同的方向。我问了另一个关于完全禁用智能缩进的问题。如果我能在 Emacs 中获得一个愚蠢的自动缩进模式,我可以一劳永逸地解决这个问题:stackoverflow.com/questions/18945380/…
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 2011-10-18
  • 2012-04-04
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多