emacs中的Ctrl-backspace删除太多

lim*_*imp 5 emacs

emacs中的ctrl-backspace会删除所有空白是很好的。但是,它并不止于此!它似乎只有删除至少一个单词后才会停止。例如,这意味着在这里使用它:

foo(bar)
    <cursor>
Run Code Online (Sandbox Code Playgroud)

结果是

foo(<cursor>
Run Code Online (Sandbox Code Playgroud)

哪个真傻(恕我直言)!我想要的行为类似于以下内容:

  1. 如果光标前面有空格,请删除所有空格(然后停止!)。
  2. 如果光标之前有一个单词,请删除该单词。
  3. 否则,删除光标之前的所有相邻重复字符。

这似乎是一个更合理的Ctrl-Backspace,但是老实说,如果我能得到(1),那将是一个巨大的改进。是否有用于此的包装或设置?我不太了解emacs lisp,但也许会指出相关API的位置...

Abo*_*ang 5

我使用以下 Intellij 风格的智能向后杀死词

(defun aborn/backward-kill-word ()
  "Customize/Smart backward-kill-word."
  (interactive)
  (let* ((cp (point))
         (backword)
         (end)
         (space-pos)
         (backword-char (if (bobp)
                            ""           ;; cursor in begin of buffer
                          (buffer-substring cp (- cp 1)))))
    (if (equal (length backword-char) (string-width backword-char))
        (progn
          (save-excursion
            (setq backword (buffer-substring (point) (progn (forward-word -1) (point)))))
          (setq ab/debug backword)
          (save-excursion
            (when (and backword          ;; when backword contains space
                       (s-contains? " " backword))
              (setq space-pos (ignore-errors (search-backward " ")))))
          (save-excursion
            (let* ((pos (ignore-errors (search-backward-regexp "\n")))
                   (substr (when pos (buffer-substring pos cp))))
              (when (or (and substr (s-blank? (s-trim substr)))
                        (s-contains? "\n" backword))
                (setq end pos))))
          (if end
              (kill-region cp end)
            (if space-pos
                (kill-region cp space-pos)
              (backward-kill-word 1))))
      (kill-region cp (- cp 1)))         ;; word is non-english word
    ))

(global-set-key  [C-backspace]
            'aborn/backward-kill-word)
Run Code Online (Sandbox Code Playgroud)


Sue*_*mme 3

Ctrl-backspace 运行命令backward-kill-word,顾名思义,该命令将始终尝试删除前一个单词。

也许您需要 M-\ ( delete-horizontal-space),它会删除光标周围的所有空白。无论如何,这将满足您的第一个要求。