From: Chong Yidong Date: Mon, 28 Jun 2010 01:01:11 +0000 (-0400) Subject: * bindings.el (global-map): Bind delete and DEL, the former to X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~438^2~51^2~105 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b92296739624ac4928d7ed90155b4ee91625fea4;p=emacs.git * bindings.el (global-map): Bind delete and DEL, the former to delete-forward-char. * mouse.el (mouse-region-delete-keys): Deleted. (mouse-show-mark): Simplify. * simple.el (delete-active-region): New option. (delete-backward-char): Implement in Lisp. (delete-forward-char): New command. * src/cmds.c (Fdelete_backward_char): Move into Lisp. --- diff --git a/etc/NEWS b/etc/NEWS index ef791281671..ba320c153e0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -144,6 +144,25 @@ loaded, customize `package-load-list'. ** completion-at-point is now an alias for complete-symbol. ** mouse-region-delete-keys has been deleted. + +** Deletion changes + +*** New option `delete-active-region'. +If non-nil, C-d, [delete], and DEL delete the region if it is active +and no prefix argument is given. If set to `kill', these commands +kill instead. + +*** New command `delete-forward-char', bound to C-d and [delete]. +This is meant for interactive use, and obeys `delete-active-region'; +delete-char, meant for Lisp, does not obey `delete-active-region'. + +*** `delete-backward-char' is now a Lisp function. +Apart from obeying `delete-active-region', its behavior is unchanged. +However, the byte compiler now warns if it is called from Lisp; you +should use delete-char with a negative argument instead. + +*** The option `mouse-region-delete-keys' has been deleted. + * Changes in Specialized Modes and Packages in Emacs 24.1 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d88b7dfab2c..089264183bc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,15 @@ +2010-06-28 Chong Yidong + + * simple.el (delete-active-region): New option. + (delete-backward-char): Implement in Lisp. + (delete-forward-char): New command. + + * mouse.el (mouse-region-delete-keys): Deleted. + (mouse-show-mark): Simplify. + + * bindings.el (global-map): Bind delete and DEL, the former to + delete-forward-char. + 2010-01-16 Lennart Borgman * progmodes/ruby-mode.el (ruby-mode-map): Don't bind TAB. diff --git a/lisp/bindings.el b/lisp/bindings.el index f9d3e75cf6e..4eab37edf46 100644 --- a/lisp/bindings.el +++ b/lisp/bindings.el @@ -822,6 +822,9 @@ if `inhibit-field-text-motion' is non-nil." (setq i (1+ i)))) (define-key global-map [?\C-\M--] 'negative-argument) +(define-key global-map "\177" 'delete-backward-char) +(define-key global-map "\C-d" 'delete-forward-char) + (define-key global-map "\C-k" 'kill-line) (define-key global-map "\C-w" 'kill-region) (define-key esc-map "w" 'kill-ring-save) diff --git a/lisp/mouse.el b/lisp/mouse.el index d1abb7dd4b1..f6ff37794a5 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -929,7 +929,7 @@ should only be used by mouse-drag-region." (mouse-minibuffer-check start-event) (setq mouse-selection-click-count-buffer (current-buffer)) ;; We must call deactivate-mark before repositioning point. - ;; Otherwise, for select-active-regions non-nil, we get the wrong + ;; Otherwise, for `select-active-regions' non-nil, we get the wrong ;; selection if the user drags a region, clicks elsewhere to ;; reposition point, then middle-clicks to paste the selection. (deactivate-mark) @@ -1263,11 +1263,6 @@ If MODE is 2 then do the same for lines." ;; Momentarily show where the mark is, if highlighting doesn't show it. -(defcustom mouse-region-delete-keys '([delete] [deletechar] [backspace]) - "List of keys that should cause the mouse region to be deleted." - :group 'mouse - :type '(repeat key-sequence)) - (defun mouse-show-mark () (let ((inhibit-quit t) (echo-keystrokes 0) @@ -1297,8 +1292,7 @@ If MODE is 2 then do the same for lines." 'vertical-scroll-bar)) (and (memq 'down (event-modifiers event)) (not (key-binding key)) - (not (mouse-undouble-last-event events)) - (not (member key mouse-region-delete-keys))))) + (not (mouse-undouble-last-event events))))) (and (consp event) (or (eq (car event) 'switch-frame) (eq (posn-point (event-end event)) @@ -1311,22 +1305,9 @@ If MODE is 2 then do the same for lines." (setq events nil))))))) ;; If we lost the selection, just turn off the highlighting. (unless ignore - ;; For certain special keys, delete the region. - (if (member key mouse-region-delete-keys) - (progn - ;; Since notionally this is a separate command, - ;; run all the hooks that would be run if it were - ;; executed separately. - (run-hooks 'post-command-hook) - (setq last-command this-command) - (setq this-original-command 'delete-region) - (setq this-command (or (command-remapping this-original-command) - this-original-command)) - (run-hooks 'pre-command-hook) - (call-interactively this-command)) - ;; Otherwise, unread the key so it gets executed normally. - (setq unread-command-events - (nconc events unread-command-events)))) + ;; Unread the key so it gets executed normally. + (setq unread-command-events + (nconc events unread-command-events))) (setq quit-flag nil) (unless transient-mark-mode (delete-overlay mouse-drag-overlay)))) diff --git a/lisp/simple.el b/lisp/simple.el index ef30e98dd1c..a7876335c17 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -844,6 +844,78 @@ Don't use this command in Lisp programs! (overlay-recenter (point)) (recenter -3)))) +(defcustom delete-active-region t + "Whether single-char deletion commands delete an active region. +This has an effect only if Transient Mark mode is enabled, and +affects `delete-forward-char' and `delete-backward-char', though +not `delete-char'. + +If the value is the symbol `kill', the active region is killed +instead of deleted." + :type '(choice (const :tag "Delete active region" t) + (const :tag "Kill active region" kill) + (const :tag "Do ordinary deletion" nil)) + :group 'editing + :version "24.1") + +(defun delete-backward-char (n &optional killflag) + "Delete the previous N characters (following if N is negative). +If Transient Mark mode is enabled, the mark is active, and N is 1, +delete the text in the region and deactivate the mark instead. +To disable this, set `delete-active-region' to nil. + +Optional second arg KILLFLAG, if non-nil, means to kill (save in +kill ring) instead of delete. Interactively, N is the prefix +arg, and KILLFLAG is set if N is explicitly specified. + +In Overwrite mode, single character backward deletion may replace +tabs with spaces so as to back over columns, unless point is at +the end of the line." + (interactive "p\nP") + (unless (integerp n) + (signal 'wrong-type-argument (list 'integerp n))) + (cond ((and (use-region-p) + delete-active-region + (= n 1)) + ;; If a region is active, kill or delete it. + (if (eq delete-active-region 'kill) + (kill-region (region-beginning) (region-end)) + (delete-region (region-beginning) (region-end)))) + ;; In Overwrite mode, maybe untabify while deleting + ((null (or (null overwrite-mode) + (<= n 0) + (memq (char-before) '(?\t ?\n)) + (eobp) + (eq (char-after) ?\n))) + (let* ((ocol (current-column)) + (val (delete-char (- n) killflag))) + (save-excursion + (insert-char ?\s (- ocol (current-column)) nil)))) + ;; Otherwise, do simple deletion. + (t (delete-char (- n) killflag)))) + +(defun delete-forward-char (n &optional killflag) + "Delete the previous N characters (following if N is negative). +If Transient Mark mode is enabled, the mark is active, and N is 1, +delete the text in the region and deactivate the mark instead. +To disable this, set `delete-active-region' to nil. + +Optional second arg KILLFLAG non-nil means to kill (save in kill +ring) instead of delete. Interactively, N is the prefix arg, and +KILLFLAG is set if N was explicitly specified." + (interactive "p\nP") + (unless (integerp n) + (signal 'wrong-type-argument (list 'integerp n))) + (cond ((and (use-region-p) + delete-active-region + (= n 1)) + ;; If a region is active, kill or delete it. + (if (eq delete-active-region 'kill) + (kill-region (region-beginning) (region-end)) + (delete-region (region-beginning) (region-end)))) + ;; Otherwise, do simple deletion. + (t (delete-char n killflag)))) + (defun mark-whole-buffer () "Put point at beginning and mark at end of buffer. You probably should not use this function in Lisp programs; diff --git a/src/ChangeLog b/src/ChangeLog index 12e45710e62..18e12b5e022 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2010-06-28 Chong Yidong + + * cmds.c (Fdelete_backward_char): Move into Lisp. + 2010-06-27 Dan Nicolaescu * s/freebsd.h (BSD4_2): Remove redundant definition. diff --git a/src/cmds.c b/src/cmds.c index ba89c532be8..465fce18a4b 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -240,7 +240,9 @@ DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP", doc: /* Delete the following N characters (previous if N is negative). Optional second arg KILLFLAG non-nil means kill instead (save in kill ring). Interactively, N is the prefix arg, and KILLFLAG is set if -N was explicitly specified. */) +N was explicitly specified. + +The command `delete-forward' is preferable for interactive use. */) (n, killflag) Lisp_Object n, killflag; { @@ -273,60 +275,6 @@ N was explicitly specified. */) return Qnil; } -DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char, - 1, 2, "p\nP", - doc: /* Delete the previous N characters (following if N is negative). -Optional second arg KILLFLAG non-nil means kill instead (save in kill ring). -Interactively, N is the prefix arg, and KILLFLAG is set if -N was explicitly specified. -This is meant for interactive use only; from Lisp, better use `delete-char' -with a negated argument. */) - (n, killflag) - Lisp_Object n, killflag; -{ - Lisp_Object value; - int deleted_special = 0; - int pos, pos_byte, i; - - CHECK_NUMBER (n); - - /* See if we are about to delete a tab or newline backwards. */ - pos = PT; - pos_byte = PT_BYTE; - for (i = 0; i < XINT (n) && pos_byte > BEGV_BYTE; i++) - { - int c; - - DEC_BOTH (pos, pos_byte); - c = FETCH_BYTE (pos_byte); - if (c == '\t' || c == '\n') - { - deleted_special = 1; - break; - } - } - - /* In overwrite mode, back over columns while clearing them out, - unless at end of line. */ - if (XINT (n) > 0 - && ! NILP (current_buffer->overwrite_mode) - && ! deleted_special - && ! (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n')) - { - int column = (int) current_column (); /* iftc */ - - value = Fdelete_char (make_number (-XINT (n)), killflag); - i = column - (int) current_column (); /* iftc */ - Finsert_char (make_number (' '), make_number (i), Qnil); - /* Whitespace chars are ASCII chars, so we can simply subtract. */ - SET_PT_BOTH (PT - i, PT_BYTE - i); - } - else - value = Fdelete_char (make_number (-XINT (n)), killflag); - - return value; -} - static int nonundocount; /* Note that there's code in command_loop_1 which typically avoids @@ -635,8 +583,6 @@ More precisely, a char with closeparen syntax is self-inserted. */); defsubr (&Send_of_line); defsubr (&Sdelete_char); - defsubr (&Sdelete_backward_char); - defsubr (&Sself_insert_command); } @@ -658,10 +604,8 @@ keys_of_cmds () initial_define_key (global_map, Ctl ('A'), "beginning-of-line"); initial_define_key (global_map, Ctl ('B'), "backward-char"); - initial_define_key (global_map, Ctl ('D'), "delete-char"); initial_define_key (global_map, Ctl ('E'), "end-of-line"); initial_define_key (global_map, Ctl ('F'), "forward-char"); - initial_define_key (global_map, 0177, "delete-backward-char"); } /* arch-tag: 022ba3cd-67f9-4978-9c5d-7d2b18d8644e