如何在Emacs中模拟Vim的'softtabstop'?

6
我最近一直在尝试使用emacs,其中需要掌握的一个要点是缩进。
示例1:
sub foo {
    my $bar = 'quux';
    |

例子2:

sub foo {
    my $bar = 'quux';       |# foo

想象一下,上面例子中的管道符号表示光标位置。现在,我使用(4)个空格作为每个缩进级别(没有制表符),并且我已经设置了emacs自动缩进我的代码以便考虑这一点。没有任何问题。但是在上面的示例中,如果我在指示的光标位置按退格键,则希望emacs一直向后退到下一个缩进级别(列/ 4)。也就是说,我希望它将前面的空格视为由制表符组成。相反,它总是只擦除一个空格字符。
在vim中,我打开'expandtab'以使它插入空格而不是制表符,并且打开'softtabstop',使其(除其他外)返回到如上所述的下一个“soft tabstop”。
在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上。(尽管该函数并不执行任何关键操作,所以你可以不使用它提供的行为。) - cjm
一个小更新:我弄错了一件事。当vim无法返回到下一个软制表符停止位置时,它会删除尽可能多的空格(即1到3个),而不仅仅是1个。 - Hinrik
解决方案已更新,尽可能删除多余的空格(直到制表位)。 - Trey Jackson
1个回答

7

这对我来说是有效的,其中'tab-width被用作列的宽度。在适当的键映射中设置该键...

(local-set-key (kbd "DEL") 'backward-delete-whitespace-to-column)
(defun backward-delete-whitespace-to-column ()
  "delete back to the previous column of whitespace, or as much whitespace as possible,
or just one char if that's not possible"
  (interactive)
  (if indent-tabs-mode
      (call-interactively 'backward-delete-char-untabify)
    (let ((movement (% (current-column) tab-width))
          (p (point)))
      (when (= movement 0) (setq movement tab-width))
      (save-match-data
        (if (string-match "\\w*\\(\\s-+\\)$" (buffer-substring-no-properties (- p movement) p))
            (backward-delete-char-untabify (- (match-end 1) (match-beginning 1)))
        (call-interactively 'backward-delete-char-untabify))))))

请参见:https://www.emacswiki.org/emacs/BackspaceWhitespaceToTabStop(有一个*增强版*)。 - ideasman42
不错,但是我发现backward-delete-char-untabify很烦人,一些用户可能想用backward-delete-char替换它。 - ideasman42

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