【发布时间】:2010-11-29 19:51:10
【问题描述】:
我最近一直在尝试使用 emacs,我需要做的一件事就是缩进。
示例 1:
sub foo {
my $bar = 'quux';
|
示例 2:
sub foo {
my $bar = 'quux'; |# foo
假设以上示例中的竖线字符表示光标位置。现在,我为每个缩进级别(没有制表符)使用(4)个空格,并且我已经设置了 emacs 来自动缩进我的代码。那里没有问题。但是在上面的示例中,如果我要在指定的光标位置按退格键,我希望 emacs 一直退格键回到下一个缩进级别(第 4 列)。也就是说,我希望它将前面的空格视为由制表符组成。相反,它总是只删除一个空格字符。
在 vim 中,我打开 'expandtab' 以使其插入空格而不是制表符,并打开 'softtabstop',使其(除其他外)退格到下一个“软制表符”,如上所述。
在 emacs 中,我想我可以(如果我更了解 emacs/elisp)将退格键绑定到执行以下操作的函数:
if indent-tabs-mode is nil
if the cursor position is preceded by whitespace
calculate the position of the previous "soft tabstop"
if there's enough whitespace
backspace all the way to that point
else
backspace by one character
我想知道的是,有没有更简单的方法可以做到这一点,和/或有人知道现有的解决方案吗?
【问题讨论】:
-
这很复杂,因为它看起来像是在编写 Perl,并且 cperl-mode(Emacs 的最佳 Perl 模式)已经将退格键绑定到
cperl-electric-backspace。 (虽然这个函数没有做任何关键的事情,所以你可以不用它提供的行为。) -
一个小更新:我搞错了一件事。当 vim 无法返回到下一个软制表位时,它会删除尽可能多的空格(即 1 到 3),而不仅仅是 1。
-
解决方案已更新以删除尽可能多的空格(直到制表位)
标签: vim emacs indentation