Emacs有问题的JavaScript缩进

Emacs有问题的JavaScript缩进,javascript,emacs,Javascript,Emacs,我正在遵循,但在Emacs的JS模式下无法获得正确的标识。我尝试自定义模式的缩进选项,尝试了其他模式,如js3,但似乎没有任何效果 当我有括号时,我必须打断表达式,Emacs缩进如下: this.offices.each(this.addOfficesToMap, this); 而我遵循的惯例是,当一个表达式被分解时,我应该只留下4个空格。因此,缩进应该如下所示: this.offices.each(this.addOfficesToMap, thi

我正在遵循,但在Emacs的JS模式下无法获得正确的标识。我尝试自定义模式的缩进选项,尝试了其他模式,如js3,但似乎没有任何效果

当我有括号时,我必须打断表达式,Emacs缩进如下:

this.offices.each(this.addOfficesToMap,
                  this);
而我遵循的惯例是,当一个表达式被分解时,我应该只留下4个空格。因此,缩进应该如下所示:

this.offices.each(this.addOfficesToMap,
    this);

你知道我如何更改分解表达式上的缩进吗?

顺便说一句,虽然缩进约定因语言而异,用户之间的偏好甚至可能有所不同(例如在上述情况下),但有相当多的重叠,而且通常有编写代码的方法,因此几乎没有分歧。 例如,您的上述代码可以写成:

this.offices.each(
    this.addOfficesToMap,
    this
);


大多数缩进样式在如何缩进上基本一致。

您想要更改的行为被硬编码到一个名为
js的函数中——适当的缩进。解决问题的一个不雅观的方法是替换.emacs中的函数:

(需要“cl”)
(加载“js”后求值)(defun js——正确缩进(解析状态)
“返回当前行的正确缩进。”
(省去远足
(返回缩进)
(第二个((第四个解析状态)
(js--get-c-offset'c(第8次解析状态)))
((第8次解析状态)0);内部字符串
((js--ctrl语句缩进))
((等式(后面的字符)?#)0)
((保存偏移(js——宏的开始))4)
((第n个1解析状态)
;单个结束符/括号应缩进
与开场白的级别相同。同样适用于
“case”和“default”。
(让((相同的缩进-p)(看
"[]})]\\|\\_\\|\\_"))
(continued-expr-p(js--continued-expression-p)))
(转到字符(第n个1解析状态));转到开始字符
(如果(查看“[({[]\\s-*\\(/[/*]\\\\\\\\\\\\\\;$\\)”)
(程序;开头部分/括号后无任何内容
(向后跳过语法“”)
(何时(等式(前字符)?\)(向后列表))
(返回缩进)
(条件(相同-缩进-p
(本栏))
(续-expr-p)
(+(当前列)(*2 js缩进级别)
js expr缩进偏移量)
(t
(+(当前列)js缩进级别
(大小写(第n个1解析状态后的字符))
(?\(js paren缩进偏移)
(?\[js方形缩进偏移量)
(?\{js卷曲缩进偏移量()()())))
如果开幕式后有什么事
;括号/括号,其他所有内容都应缩进
相同的水平。
;此处修改了代码:
(除非相同-indent-p
(移动第1行的开头)
(转发字符4)
;结束修改代码
(当前列)
((js--continued-expression-p)
(+js缩进级别js expr缩进偏移量))
(t0)
我已经修改了函数底部的三行代码。如果希望缩进为8个字符而不是4个字符,请相应地更改
(forward char 4)

请注意,
js——正确的缩进(以及js库)需要cl.el库,但是在加载后使用
eval会弄糟这一点。因此,您需要在.emacs中明确要求
cl
,才能使其起作用


请注意,此“解决方案”仅针对您指定的情况硬编码4个空格的缩进,根本不处理嵌套代码。但了解代码中处理您的情况的要点至少应该能让您找到需要更复杂解决方案的部分。

您可以尝试…这是一种fork js2模式,但具有一些改进,如良好的缩进…另一种方法是阅读本文:…但诚恳地说,替换旧的js2模式是一个更好的主意…它有一些改进…希望这能帮助您…

您可以在


你有样式指南的链接吗?

是的,我的问题是我已经定制了很多东西,但是新行的缩进,在一个断开的表达式中,总是以这种方式缩进代码。我不确定到目前为止是否可以定制缩进以匹配任何约定。也许你会说我可以用li创建一些代码sp在这种情况下缩进,但我只是一个新手:B这个问题我得到了一些东西。如果我按m-I,我得到了预期的标识。在按下C-h k后,帮助系统告诉我执行的命令是tab-to-tab-stop。这是我想要的默认标识。我认为您的要求不正确:“当一条语句不能放在一行上时,可能需要将其打断。将打断符放在运算符之后,最好放在逗号之后。运算符之后的打断符可降低复制粘贴错误被分号插入掩盖的可能性。下一行应缩进8个空格。”(而不是4)。非常感谢您的帮助,但效果不太好。首先,您的代码破坏了缩进区域功能(emacs认为
Symbol的函数定义无效:当我执行
C+M+\
时,case
)。其次,钩子不起作用。据一位朋友说:(a)他缺少一个(lambda()…)。(b)我认为emacs没有缓冲区本地绑定。(c) 如果您对每个JS缓冲区都这样做,那么您可能只需要全局更改函数。最后,我将使用制表位并忘记JS自动缩进。我的~/.emacs中的代码是
(添加hook'JS mode hook(lambda()(local set key[tab]'tab-to-tab-s
this.offices.each
    (this.addOfficesToMap,
     this);