2

我是 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 模式下缩进太多(尾随的 '}' 是缩进的),而在基本模式下根本不会。

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

4

2 回答 2

3

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

(defun insert-braces-macro ()
  (interactive)
  (insert "{")
  (newline) (indent-according-to-mode)
  (save-excursion
    (newline)
    (insert "}")
    (indent-according-to-mode)))
于 2013-09-22T12:55:54.017 回答
1

这是我长期以来一直在使用的:

(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 个空格。

于 2013-09-22T06:29:49.277 回答