我正在使用python-mode.el运行Emacs以便在Python中进行编码。我希望学习如何使代码区域自动缩进。
以下代码没有缩进。
while match != None:
if match.group(1):
titles.append(match.group(1))
if match.group(2):
if match.group(2) != '':
pns.append(int(match.group(2)))
else:
pns.append('')
else:
pns.append('')
if match.group(3):
closings.append(len(''.join(match.group(3).split())))
else:
closings.append(0)
match = pat.search(match.group(4))
如果我选择了区域,然后点击M-x indent-region
,那就完全错了:
while match != None:
if match.group(1):
titles.append(match.group(1))
if match.group(2):
if match.group(2) != '':
pns.append(int(match.group(2)))
else:
pns.append('')
else:
pns.append('')
if match.group(3):
closings.append(len(''.join(match.group(3).split())))
else:
closings.append(0)
match = pat.search(match.group(4))
理想应该是:
while match != None:
if match.group(1):
titles.append(match.group(1))
if match.group(2):
if match.group(2) != '':
pns.append(int(match.group(2)))
else:
pns.append('')
else:
pns.append('')
if match.group(3):
closings.append(len(''.join(match.group(3).split())))
else:
closings.append(0)
match = pat.search(match.group(4))
M-x indent-region
错误地理解缩进
代码行之间的关系?是因为我的代码含糊不清吗?感谢。
答案 0 :(得分:2)
问题是emacs无法知道你想要if-block结束的位置。您所需的代码和代码缩进区域生成都是有效的python。在类C语言中,由于大括号决定了块的长度,因此这不是问题。对于python,因为emacs无法确定它假设每行代码仍然是前一个块的一部分。
您可能希望查看python-indent-left(绑定到“C-c<”)和python-indent-right(“C-c>”)。要修复你的例子,你要突出显示除第一行之外的所有内容,然后运行python-indent-left。
答案 1 :(得分:1)
如上所述,在Python中,您无法可靠地自动缩进较大的部分。
然而,有一种方法可以加快逐行进行。这在这里使用:
(defun indent-and-forward ()
"Indent current line and go forward one line. "
(interactive "*")
(if (empty-line-p)
(fixup-whitespace)
(indent-according-to-mode))
(if (eobp)
(newline-and-indent)
(forward-line 1))
(back-to-indentation))
BTW它也应该适用于其他模式,而不仅仅是Python。这里的钥匙是
(global-set-key [(super i)] 'indent-and-forward)
这个按键被按下,你可以旅行大部分 - 只要留意它仍然可以做你想要的。如果不是 - 只使用TAB键作为此行并继续下一行。