Emacs 如何在elisp中获得可靠的压痕

Emacs 如何在elisp中获得可靠的压痕,emacs,elisp,indentation,auto-indent,Emacs,Elisp,Indentation,Auto Indent,我是Emacs的新手 我正在尝试编写一个可以跨所有模式工作的elisp函数。具体来说,我想编写一个插入大括号的函数(有点像插入括号),就像以下键序列对只支持自动缩进的哑编辑器所做的那样: "{" <ret> "}" <up-arrow> <end> <ret> <tab> 不幸的是,这并不完全正确。我不认为indent relative是正确的函数,因为它在Java风格中没有正确的缩进: f | 扩展为: f { | } 在C

我是Emacs的新手

我正在尝试编写一个可以跨所有模式工作的elisp函数。具体来说,我想编写一个插入大括号的函数(有点像
插入括号
),就像以下键序列对只支持自动缩进的哑编辑器所做的那样:

"{" <ret> "}" <up-arrow> <end> <ret> <tab>
不幸的是,这并不完全正确。我不认为
indent relative
是正确的函数,因为它在Java风格中没有正确的缩进:

f |
扩展为:

f {
  |
}
在C模式下:

somelongword another |
扩展到:

somelongword another {
             |
}
但是,
根据模式缩进也不正确,因为它在C-ish模式下缩进过多(尾随的“}”缩进),而在基本模式下根本不缩进


正确的处理方法是什么?

以下是我长期以来一直使用的方法:

(defun ins-c++-curly()
“插入{}。
从结束行开始,将其视为函数体“
(互动)
(如果(回头看“\\()\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)$”)
(项目
(插入“{\n\n}”)
(根据模式缩进)
(前线-1)
(根据模式缩进)
(插入“{}”)
(向后字符)
此功能:

  • 回望时插入
    {}
    块 在适当的位置,例如在
    之后
  • 否则,插入
    {}
    并向后返回一个字符。 对于数组和新样式的初始化非常有用
  • 这适用于C++,其中我有4个空格的缩进,


    Java也是如此,我使用了2个空格。

    以下是我长期以来一直使用的内容:

    (defun ins-c++-curly()
    “插入{}。
    从结束行开始,将其视为函数体“
    (互动)
    (如果(回头看“\\()\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\)$”)
    (项目
    (插入“{\n\n}”)
    (根据模式缩进)
    (前线-1)
    (根据模式缩进)
    (插入“{}”)
    (向后字符)
    
    此功能:

  • 回望时插入
    {}
    块 在适当的位置,例如在
    之后
  • 否则,插入
    {}
    并向后返回一个字符。 对于数组和新样式的初始化非常有用
  • 这适用于C++,其中我有4个空格的缩进,


    Java也是如此,我把它放在2个空格处。

    根据模式缩进是正确的答案,我想,但你需要记住,它不能预测未来,所以你需要在插入文本后而不是之前调用它:

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

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

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


    是否因为不同的模式有不同的默认缩进,除非用户专门设置它们<代码>(defun my tabset hook()(setq indent tabs mode t)(setq tab stop list(编号顺序22002))(setq tab width 2)(setq indent line函数“insert tab”)(添加hook“text mode hook”my tabset hook)(添加hook“tex mode hook”my tabset hook)(添加hook“LaTeX mode hook”my tabset hook)
    是不是因为不同的模式有不同的默认缩进,除非用户专门设置<代码>(defun my tabset hook()(setq indent tabs mode t)(setq tab stop list(序号22002))(setq tab width 2)(setq indent line function‘insert tab))(添加hook‘text mode hook’my tabset hook)(添加hook‘tex mode hook’my tabset hook)(添加hook‘LaTeX mode hook’my tabset hook)
    坦率地说,我更愿意完全禁用emacs的智能缩进。它太不可预测,不能在基本模式下工作。我可以闭上眼睛使用哑自动缩进,无论源代码是用什么编写的,我都知道它会做什么…在基本模式下,根据模式缩进根本不会缩进如果使用
    基本模式
    ,这本身就是一个问题。如果缩进是不可预测的,那么它就是一个bug,您应该报告。如果它是可预测的,但与您喜欢的样式不同,当然,这是另一个问题。坦率地说,我更愿意完全禁用emacs的智能缩进。它太不可预测,不能在基本模式下工作。我可以闭上眼睛使用哑自动缩进,无论源代码是用什么编写的,我都知道它会做什么…在基本模式下,根据模式缩进根本不会缩进如果使用
    基本模式
    ,这本身就是一个问题。如果缩进是不可预测的,那么它就是一个bug,您应该报告。如果它是可预测的,但与您喜欢的样式不同,当然,这是另一个问题。按模式缩进不会在基本模式下缩进,因此它对我的目的没有好处。除非它可以在基本模式下缩进?那么你的目的是什么?我想大括号意味着代码,为什么要以基本模式编写代码?您希望如何在基本模式下缩进?我可以在代码上加一个
    (if(eq-major-mode'basicmode))
    ,但我不确定以后该怎么办。我在从编译器前端转储AST时使用花括号,在其他特殊文件格式中使用其他括号结构。为他们编写主要模式的人太多了,更不用说配置所有这些模式了。我将尝试从不同的方向来理解这一点。我问了另一个关于完全禁用智能缩进的问题。如果我能在Emacs中使用一个愚蠢的自动缩进模式,我就能一劳永逸地解决这个问题:根据模式缩进不会在基本模式下缩进,所以这对我的目的没有好处。除非它可以在基本模式下缩进?那么你的目的是什么?我想大括号意味着代码,为什么要以基本模式编写代码?您希望如何在基本模式下缩进?我可以在代码上加一个
    (如果(eq主模式的“基本模式”)
    ,但我不是s