Emacs设置了哪些“本地规则”?

3
我一直在试图解决Emacs中的sh-mode缩进问题(我在then之后得到了双重缩进),发现我可以手动设置缩进,然后运行C-c >自动配置缩进。但是,此配置仅适用于当前会话,我似乎找不到任何已被修改的变量作为自动配置的结果。(虽然它起作用:缩进始终是我想要的。)运行后,它会说“设置本地规则”,但不告诉我已设置了哪些本地规则。
当然,当我重新启动Emacs时,本地配置将丢失,我必须再次运行自动配置命令。
我在这个网站上找到了许多关于列出变量及其值的问题,但我找不到如何列出仅已更改为当前会话的变量。我甚至使用了这篇帖子在运行C-c >命令之前和之后转储变量并比较输出;没有明显不同之处。
所以我想问的问题有两个:
1.如果“本地规则”指的是会话变量,则如何查找已设置的变量? 2.如果“本地规则”指的是其他内容,则是什么以及如何将这些更改传输到我的~/.emacs文件中?

我不像其他人那样熟练地使用键盘快捷键,但我知道如何查找触发的函数名称。C-h k C-c >M-x describe-key RET C-c >,然后你可以在*Help*缓冲区中使用鼠标或回车键访问源代码,或者你可以输入M-x find-function并查看正在发生的事情并开始向后跟踪。这可能比检查所有缓冲区本地变量更实用。也许跟踪始于sh-script.el内部的sh-learn-buffer-indent函数? - lawlist
1
请考虑提交错误报告以改进“本地规则集”消息:M-x report-emacs-bug - Drew
1
@Richard Wiseman -- 对Emacs源代码进行“本地规则集”的grep,可以找到函数smie-config-guess,其中包含一个文档字符串,说明:“*尝试找出此缓冲区的缩进设置。要保存结果以供将来使用,请使用smie-config-save*”。 - lawlist
感谢@Drew的建议。我可能已经提交了一个错误报告...或者它可能失败了。我填写了信息,按下了C-c C-c,然后(因为我没有可用的SMTP服务器)选择发送到我的电子邮件客户端,然后...什么也没发生。感觉好像失败了。 - IpsRich
哦,现在我更加困惑了。我不知道有什么(如果有的话)已经改变,但是现在当我修改缩进并要求它学习时,它现在会说“没有可更改的内容”。这很奇怪,因为当我在(当前正确缩进的)行上按TAB键时,它会恢复到旧的、不正确的(即双倍)缩进!所以我删除两个空格,使其看起来正确,然后再次尝试C-c > - 它再次说“没有可更改的内容”!我甚至重新启动了Emacs,以防那是问题所在。 - IpsRich
显示剩余4条评论
2个回答

1
我认为结果取决于您的Emacs版本,但是在最近的版本中,这由SMIE处理,因此个人设置保存在smie-config变量中。
当前缓冲区中使用的本地设置保存在内部变量(smie-config--buffer-local)中。您可以将它们转移到smie-config并通过调用smie-config-save将它们保存到~/.emacs中。
还有一个细节:smie-config-save本身不会将设置保存到~/.emacs中。它仅将它们从瞬态缓冲区本地变量smie-config--buffer-local转移到全局smie-config变量中,该变量受Customize控制,并且可以通过类似M-x customize-save-customized的方法保存到您的~/.emacs中。这在smie-config-save中应该得到改进。我建议使用M-x report-emacs-bug来要求这种改进。

谢谢您的建议。我正在使用GNU Emacs 24.5.1版本。我已经运行了C-c >命令(并确认新的缩进有效),并检查了smie-config的值,但它是“nil”,状态为“STANDARD”。这是否意味着我的Emacs没有使用SMIE? - IpsRich
我添加了更多关于缓冲区本地和暂时设置存储位置的细节。 - Stefan
谢谢。这确实让我更清楚了,但似乎没有任何效果。我的~/.emacs文件根本没有提到smie,所以我的尝试保存它肯定不会起作用。现在我遇到了一个问题,即C-c >甚至不报告“设置本地规则”(请参见我上面的评论),因此我甚至无法再尝试保存了。 - IpsRich
已经有一段时间了,但这仍然让我感到烦恼!我设法使smie配置保存;我的.emacs文件现在包含一行:'(smie-config (quote ((sh-mode (2 :elem basic 4))))),但不幸的是,这对js-mode没有任何影响!因此看起来smie配置与js-mode配置是分开的。当js-learn-buffer-indent说“设置本地规则”时,它似乎是指smie规则(因为smie-config-save确实注意到有变化),但保存它们显然没有效果。而且我295天前报告的错误也没有任何进展。 :-( - IpsRich
@RichardWiseman:js-mode没有使用SMIE,所以你在js-mode中遇到的问题是不同的:-( 至于这个bug报告,你能提醒我它的bug编号吗? - Stefan
错误编号为[24848](https://debbugs.gnu.org/cgi/bugreport.cgi?bug=24848),但在讨论中,有人建议现在可能很好地使用SMIE来进行“js-mode”的操作。我发现使用`smie-config-guess`与`sh-learn-buffer-indent`具有相同的影响(即在当前缓冲区中起作用),但不幸的是似乎无法保存以供将来使用。 - IpsRich

0

这更像是一个不完整的解决方法,而不是一个答案,但它是一个开始!

思路是在 shell 脚本加载时立即触发 sh-learn-buffer-indent。将以下内容添加到您的 ~/.emacs 文件中:

(add-hook 'sh-set-shell-hook 'sh-learn-buffer-indent)

几个重要的注意事项:

  1. 它假设您的shell脚本在加载时已经正确格式化。
  2. 对于大文件,它可能会很慢。

(这显然在sh-script.el中提到,并由Noam Postavsky通过我提交的错误报告引起了我的注意。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接