如何模仿Vim';s';softtabstop';在Emacs中?

如何模仿Vim';s';softtabstop';在Emacs中?,vim,emacs,indentation,Vim,Emacs,Indentation,最近我一直在尝试进入emacs,我需要做的一件事就是缩进 例1: sub foo { my $bar = 'quux'; | 例2: sub foo { my $bar = 'quux'; |# foo 假设上面示例中的管道字符指示光标位置。现在,我为每个缩进级别使用(4)个空格(没有制表符),并且我已经设置了emacs来自动缩进代码。没问题。但是在上面的例子中,如果我在指定的光标位置点击backspace,我想让emacs一直退到下一个缩进级别(第/4列

最近我一直在尝试进入emacs,我需要做的一件事就是缩进

例1:

sub foo {
    my $bar = 'quux';
    |
例2:

sub foo {
    my $bar = 'quux';       |# foo
假设上面示例中的管道字符指示光标位置。现在,我为每个缩进级别使用(4)个空格(没有制表符),并且我已经设置了emacs来自动缩进代码。没问题。但是在上面的例子中,如果我在指定的光标位置点击backspace,我想让emacs一直退到下一个缩进级别(第/4列)。也就是说,我希望它将前面的空白视为由制表符组成。相反,它总是只删除单个空格字符

在vim中,我打开“expandtab”使其插入空格而不是制表符,并打开“softtabstop”,使其(除其他外)返回到如上所述的下一个“softtabstop”

在emacs中,我想我可以(如果我更了解emacs/elisp的话)将backspace绑定到一个函数,该函数执行如下操作:

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

我想知道的是,有没有更简单的方法来实现这一点,和/或是否有人知道现有的解决方案?

这对我来说很有用,其中
选项卡宽度
用作列的宽度。在相应的键映射中设置键

(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))))))

这一点很复杂,因为看起来您正在编写Perl,而cperl模式(Emacs的最佳Perl模式)已经将backspace绑定到
cperl electric backspace
。(尽管该函数不做任何重要的事情,因此您可以在没有它提供的行为的情况下生存。)一个小的更新:我错了一件事。当vim无法返回到下一个软制表位时,它会删除尽可能多的空白(即1到3),而不仅仅是1。解决方案更新为删除尽可能多的空白(直到制表位)。请参阅:(有一个增强版)。不错,但发现
向后删除字符非常烦人,某些用户可能希望将其替换为
向后删除字符