如何在emacs lua-mode中配置缩进?

在此处完全使用 emacs 的新手。

我在 Ubuntu 上使用 emacs 23.1.1,并使用了 emacs starter kit。我主要在 lua-mode 中工作(使用 package-install lua-mode 安装)。

我需要调整缩进的方式,以使其与我的编码规范匹配。

我的规范是:

  • 将制表符转换为空格;
  • 每个缩进两个空格;
  • 每行最多 80 个字符,不带尾随空格。

例如:

local foo = function()
  print("Hello, world!")
end

如果我不与其自动缩进冲突,则会得到以下结果:

local foo = function()
               print("Hello, world")
end

更新:

(这属于一个注释,但由于需要额外的格式,我不得不把它放在这里。)

如果我尝试 Thomas 的解决方案,我会得到这个:

local foo = function()
               print("Hello, world")
        end

请注意,end 缩进了一个 制表符 和四个空格。并不完全起作用......

更新2:

这个东西也以错误的方式缩进:

local bar = foo(
    "one",
    "two",
   baz(), -- 注意是三个空格
   "quo"
)

它应该是:

local bar = foo(
    "one",
    "two",
    baz(),
    "quo"
  )

更新 3:

错误缩进的第三种情况:

local bar = foo(
    "one",
    "two"
  )

  local t = 5 -- 此行不应缩进,
              -- 还请注意 local 和 t 之间的制表符。

更新 4:

这是我从 Thomas 的当前版本中得到的结果:

local foo = function()
               print("Hello, world")
        end

            local bar = 5 -- Emacs 将 \t 放在 5 之前

            local zzz = foo( -- Emacs 在 foo 之前放置 \t
                "one", -- 在此处按了两次 TAB
                "two",
               three(),
               "four"
            )

除非另有说明,否则我没有做任何缩进,只是输入了代码,并在每行的末尾按下了 RETURN。 我实际上没有输入任何注释。

它应该如下所示:

local foo = function()
  print("Hello, world")
end

local bar = 5

local zzz = foo(
    "one",
    "two",
    three(),
    "four"
  )

更新 5:

还有一个错误的缩进情况:

local foo =
{
bar(); -- 在此处按了一个 TAB,但右括号将其取消了
baz;
}

应该是:

local foo =
{
  bar();
  baz;
}

更新 6:

为了完整起见,以下是我使用 lua-mode 的当前 Git HEAD 而没有 Thomas 的配置调整所得到的结果:

local foo = function()
               print("Hello, world!")
            end

local bar = 5

local foo = bar(
bar,
   baz(),
   quo(),
aaa
)

local t =
{
"one",
two(),
}

有了调整:

local foo = function()
           print("Hello, world!")
            end

            local bar = 5

            local foo = bar(
            bar,
               baz(),
               quo(),
               aaa
            )

            local t =
            {
            "one",
            two(),
         }

为匹配我的编码规范,它应该如下所示:

local foo = function()
  print("Hello, world!")
end

local bar = 5

local foo = bar(
    bar,
    baz(),
    quo(),
    aaa
  )

local t =
{
  "one",
  two(),
}

原文链接 https://stackoverflow.com/questions/4643206

点赞
stackoverflow用户39975
stackoverflow用户39975

我认为你需要的许多内容可以在自定义 C 缩进定义的 Emacs 手册中找到,这属于一般的缩进引擎描述。

您可以使它执行您能想象到的任何操作,这比只是想象任何操作要强烈得多。

2011-01-10 02:59:46
stackoverflow用户261142
stackoverflow用户261142

如果你将下面的代码输入到你的主目录下的 .emacs 文件中,它将使 lua-mode (仅限于 lua-mode)的行为如下:

  • 如果你按下 ENTER,将插入一个新行,并默认下一行将被缩进类似于前面的行。
  • 每当你按下 TAB 缩进行时,点会跳转到该行的第一个非空白字符,如果该行为空或点已经位于该字符处,则插入两个空格。

尤其是后者可能不是你想要的,但这可能是一个第一次的近似。

(defvar my-lua-indent 2
  "缩进插入的空格数")

(defun my-lua-enter ()
  "插入一个新行,并使该行按照前一个非空行缩进。"
  (interactive)
  (newline)
  (indent-relative-maybe))

(defun my-lua-indent ()
  "如果光标在第一个非空白字符的左边,则将光标移动到第一个非空白字符所在位置。如果光标已经在该位置,或在空白行的开头,则在光标处插入两个空格。"
  (interactive)
  (when (looking-back "^\\s *")
    (if (looking-at "[\t ]")
        (progn (back-to-indentation)
               (when (looking-at "$")
                 (kill-line 0)
                 (indent-relative-maybe)
                 (insert (make-string my-lua-indent ? ))))
      (insert (make-string my-lua-indent ? )))))

(defun my-lua-setup ()
  "将 ENTER 绑定到 my-lua-enter,并按照我想要的方式配置缩进。确保使用空格进行缩进,而不是制表符。"
  (setq indent-tabs-mode nil)
  (local-set-key "\r" 'my-lua-enter)
  (setq indent-line-function 'my-lua-indent))

;; 将 `my-lua-setup`添加为一个回调函数,每当 lua-mode 激活时调用。
(add-hook 'lua-mode-hook 'my-lua-setup)

重新启动 Emacs 以使这些更改生效。

2011-01-10 10:02:47
stackoverflow用户569954
stackoverflow用户569954

我现在无法提供太多帮助 - 我有两天的截止期限 8-( - 但这是我在 .emacs 中使用的 lua-mode 配置,使其对我来说可用...

(setq lua-indent-level 2)
(setq lua-electric-flag nil)
(defun lua-abbrev-mode-off () (abbrev-mode 0))
(add-hook 'lua-mode-hook 'lua-abbrev-mode-off)
(setq save-abbrevs nil)   ;; 这个还需要吗?

我使用一种不寻常的缩进方式 - 请参见下面的示例 - 所以我已经严格要求自己只在 lua-mode 可以正确从上面的行中推断正确的缩进时才按 TAB 键...

map = function (f, A, n)
    local B = {}                 -- 这里的 TAB 不起作用
    for i=1,(n or #A) do         -- 这里的 TAB 有效
      table.insert(B, f(A[i]))   -- 这里的 TAB 有效
    end                          -- 这里的 TAB 有效
    return B                     -- 这里的 TAB 有效
  end                            -- 这里的 TAB 有效
2011-01-10 14:27:57
stackoverflow用户569229
stackoverflow用户569229

我是lua-mode.el的维护者(但不是作者)。我不如其他贡献者在Emacs Lisp方面熟练,所以我欢迎补丁。但我想指出的是:默认规则没有什么奇怪或不正确的地方:据我所见,想法很简单,当您处于匿名函数中时,缩进应该取函数关键字作为其左侧边缘。当考虑在其他地方使用函数表达式时,如作为函数参数时,这是有意义的。

因此,一个简单的解决方法是不写

local f = function...

而是

local function f...

除非你在使用一个版本的Lua之前,该版本不支持"local function"语法。

话虽如此,我能理解为什么你想要不同的缩进。在这种情况下,我认为有一个配置变量lua-indent-function-from-function-keyword(更好的名称,有人有想法吗?),我很乐意接受实现它的补丁。

2011-01-11 15:08:48
stackoverflow用户368405
stackoverflow用户368405

我知道这个问题已经提出一段时间了,但是我想指出这仍然是一个问题,通过Emacs包系统安装的lua-mode。

然而,最新版本的[GitHub](https://github.com/immerrr/lua-mode)运行良好,没有注意到任何缩进怪异。要遵守[Lua编码规范](http://lua-users.org/wiki/LuaStyleGuide),只需将`indent-tabs-mode`设置为`nil`和`lua-indent-level`设置为`2`。

2013-06-09 10:45:08
stackoverflow用户1756407
stackoverflow用户1756407

一个更简洁的方法在 2019 年 加入,以两个 lua-indent- 变量的形式呈现。 这几乎快到了,但出于某种原因它仍然会双重缩进嵌套块。 添加一些建议解决方案即可完成任务。

(setq lua-indent-nested-block-content-align nil)
(setq lua-indent-close-paren-align nil)

(defun lua-at-most-one-indent (old-function &rest arguments)
  (let ((old-res (apply old-function arguments)))
    (if (> old-res lua-indent-level) lua-indent-level old-res)))

(advice-add #'lua-calculate-indentation-block-modifier
            :around #'lua-at-most-one-indent)
2021-04-20 10:18:38