GNU bug report logs - #73527
30.0.90; Comint rebinds C-d

Previous Next

Package: emacs;

Reported by: Augusto Stoffel <arstoffel <at> gmail.com>

Date: Sat, 28 Sep 2024 10:50:02 UTC

Severity: normal

Merged with 78262

Found in versions 30.1, 30.0.90

Fixed in version 31.0.50

Done: Juri Linkov <juri <at> linkov.net>

Bug is archived. No further changes may be made.

Full log


Message #8 received at 73527 <at> debbugs.gnu.org (full text, mbox):

From: Juri Linkov <juri <at> linkov.net>
To: Augusto Stoffel <arstoffel <at> gmail.com>
Cc: 73527 <at> debbugs.gnu.org
Subject: Re: bug#73527: 30.0.90; Comint rebinds C-d
Date: Sun, 29 Sep 2024 19:08:03 +0300
> comint-mode rebinds C-d (to `comint-delchar-or-maybe-eof') in a way that
> is supposed to fall back to the default C-d behavior unless point is on
> a blank input line.
>
> If the user rebinds C-d in the global map, e.g. to something sensible
> such as `delete-forward-char', this preference is overridden.
>
> Should a menu-item with :filter property be used instead in
> comint-mode-map?

It would be nice to make such filter customizable.

For example, currently I have to use:

  (define-key shell-mode-map "\C-d" 'my-shell-c-d)
  (defun my-shell-c-d (&optional arg)
    (interactive "p")
    (cond ((and (eobp)
                (save-excursion
                  (let ((inhibit-field-text-motion t))
                    (goto-char (line-beginning-position))
                    (looking-at-p "^iex.*>\s*$"))))
           (let ((process (get-buffer-process (current-buffer))))
             (process-send-string process ":init.stop()\n")))
          ((and (eobp)
                (save-excursion
                  (let ((inhibit-field-text-motion t))
                    (goto-char (line-beginning-position))
                    (looking-at-p "^[a-z:]*cljs\\..*=>\s*$"))))
           (let ((process (get-buffer-process (current-buffer))))
             (process-send-string process ":cljs/quit\n")))
          (t
           (comint-delchar-or-maybe-eof arg))))

But with a filter all these cases could be moved to the filter predicate,
along with its default value extracted from 'comint-delchar-or-maybe-eof':

    (if (and (eobp) proc (= (point) (marker-position (process-mark proc))))
	(comint-send-eof)
      (delete-char arg))

Then rebinding `C-d' from `delete-char' to `delete-forward-char'
will be handled automatically.

Also for the users of `delete-selection-mode' this will remove
the need to add more settings:

  (put 'comint-delchar-or-maybe-eof 'delete-selection 'supersede)
  (put 'my-shell-c-d 'delete-selection 'supersede)

according to this part of delsel.el:

  ;; delete-backward-char and delete-forward-char already delete the selection by
  ;; default, but not delete-char.
  (put 'delete-char 'delete-selection 'supersede)




This bug report was last modified 6 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.