如何在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
如果你将下面的代码输入到你的主目录下的 .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 以使这些更改生效。
我现在无法提供太多帮助 - 我有两天的截止期限 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 有效
我是lua-mode.el的维护者(但不是作者)。我不如其他贡献者在Emacs Lisp方面熟练,所以我欢迎补丁。但我想指出的是:默认规则没有什么奇怪或不正确的地方:据我所见,想法很简单,当您处于匿名函数中时,缩进应该取函数关键字作为其左侧边缘。当考虑在其他地方使用函数表达式时,如作为函数参数时,这是有意义的。
因此,一个简单的解决方法是不写
local f = function...
而是
local function f...
除非你在使用一个版本的Lua之前,该版本不支持"local function"语法。
话虽如此,我能理解为什么你想要不同的缩进。在这种情况下,我认为有一个配置变量lua-indent-function-from-function-keyword(更好的名称,有人有想法吗?),我很乐意接受实现它的补丁。
我知道这个问题已经提出一段时间了,但是我想指出这仍然是一个问题,通过Emacs包系统安装的lua-mode。
一个更简洁的方法在 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)
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我认为你需要的许多内容可以在自定义 C 缩进定义的 Emacs 手册中找到,这属于一般的缩进引擎描述。
您可以使它执行您能想象到的任何操作,这比只是想象任何操作要强烈得多。