unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Luc Teirlinck <teirllm@dms.auburn.edu>
Cc: emacs-devel@gnu.org
Subject: Re: Various simple.el patches
Date: Tue, 20 May 2003 22:12:04 -0500 (CDT)	[thread overview]
Message-ID: <200305210312.h4L3C4907897@eel.dms.auburn.edu> (raw)
In-Reply-To: <84iss7mlgd.fsf@lucy.is.informatik.uni-duisburg.de> (kai.grossjohann@gmx.net)

There are still problems with the present version of `kill-whole-line'.
Start out with:

word1 word2

and place point between word1 and word2.
Now S-<backspace> C-y yields:
 word2 (followed by a newline)
M-0 S-<backspace> C-y yields:
 word2 (without newline)
and M--1 S-<backspace> C-y yields:
word1 (without trailing space or newline)

Makes no sense.

The problem is that kill-region sets this-command to 'kill-region, but
only when the command returns to the command loop will this result in
last-command being set to 'kill-region and kill-region checks
last-command to figure out whether to append or not.  So we have to
bind last-command to the appropriate value explicitly.  The:

     ((< arg 0)
      (forward-visible-line 1)

which I suggested to add has to be removed, since it moves point
without killing, potentially messing up the kill ring.  There goes the
M-- S-<backspace> C-x z z z z fun.  Not the end of the problems.
Things need to work out OK in read-only buffers.  But there killed
text does not really get removed and, as a result, it winds up getting
copied twice in certain situations.  Hence the need for
save-excursion's.  After all of this we wind up with version 1 of
kill-whole-line below.

That version works more or less OK, but some things seem less than
ideal:  

1.  As already mentioned, the possibility of killing backward with M--
    S-<backspace> C-x z z z is gone.

2.  The now more complex function gets very vulnerable to any possible
    future changes (including possible customization variables) in the
    not very primitive function kill-line.  So on second thought, it
    might actually be better to write the function entirely in terms
    of kill-region after all.

3.  Killing in read-only buffers turns out not to be either terribly
    convenient or terribly intuitive.

Version 2 of the function (see below) seems to take care of all three
problems.  Maybe somewhat strange at first is that S-<backspace> with
a negative argument leaves point at the *end* of the preceding non
killed line.  But M-0 S-<backspace> already leaves point at the end of
a line in read-only buffers, even in version 1.  I believe that the
behavior of version 2 can easily be understood, by the user, in the
following terms: with zero argument, point first moves to the
beginning of the line and then the line gets killed without killing
the newline.  With positive argument, point also first moves to the
beginning of the line and then a number of lines and the following
newline are killed.  With negative argument, point first moves to the
end of the line and the killing ends with the kill of the last
*preceding* newline.  This way, the resulting behavior seems intuitive,
even in read-only buffers.  We can not really implement the function
in this straightforward way, because that could severely mess up the
kill ring.  (This is what makes the actual implementation somewhat
complicated.)  But except for the fact that the kill ring gets handled
correctly, the behavior is equivalent.

I include below the two versions.  They differ in behavior for
negative arguments.  Version 2 does not use kill-line.  Once we decide
on which version to use (1 or 2 or some other one), I will still do
some further checking of that version in other situations, such as in
the presence of invisible text, just to make sure.  Personally, I
prefer version 2.

Version 1:

===File ~/kwlversion1=======================================
(defun kill-whole-line (&optional arg)
  "Kill current line.
With prefix arg, kill that many lines from point.
If arg is negative, kill backwards.
If arg is zero, kill current line but exclude the trailing newline."
  (interactive "P")
  (setq arg (prefix-numeric-value arg))
  (cond ((zerop arg)
	 (save-excursion
	   (kill-region (point) (progn (forward-visible-line 0) (point))))
	 (let ((last-command
		(if (eq this-command 'kill-region)
		    'kill-region
		  last-command)))
	   (kill-region (point) (progn (end-of-visible-line) (point)))))
	((< arg 0)
	 (save-excursion
	   (kill-line 1))
	 (let ((last-command
		(if (eq this-command 'kill-region)
		    'kill-region
		  last-command)))
	   (kill-line (1+ arg))))
	(t
	 (save-excursion
	   (kill-line 0))
	 (if (eobp) (signal 'end-of-buffer nil))
	 (let ((last-command
		(if (eq this-command 'kill-region)
		    'kill-region
		  last-command)))
	   (kill-line arg)))))

============================================================

Version 2:

===File ~/kwlversion2=======================================
(defun kill-whole-line (&optional arg)
  "Kill current line.
With prefix arg, kill that many lines from point.
If arg is negative, kill backwards.
If arg is zero, kill current line but exclude the trailing newline."
  (interactive "P")
  (setq arg (prefix-numeric-value arg))
  (cond ((zerop arg)
	 (save-excursion
	   (kill-region (point) (progn (forward-visible-line 0) (point))))
	 (let ((last-command
		(if (eq this-command 'kill-region)
		    'kill-region
		  last-command)))
	   (kill-region (point) (progn (end-of-visible-line) (point)))))
	((< arg 0)
	 (save-excursion
	   (kill-region (point) (progn (end-of-visible-line) (point))))
	 (let ((last-command
		(if (eq this-command 'kill-region)
		    'kill-region
		  last-command)))
	   (kill-region (point)
			(progn (forward-visible-line (1+ arg))
			       (unless (bobp) (backward-char))
			       (point)))))
	(t
	 (if (and (bolp) (eobp)) (signal 'end-of-buffer nil))
	 (save-excursion
	   (kill-region (point) (progn (forward-visible-line 0) (point))))
	 (let ((last-command
		(if (eq this-command 'kill-region)
		    'kill-region
		  last-command)))
	   (kill-region (point)
			(progn (forward-visible-line arg) (point)))))))

============================================================

  parent reply	other threads:[~2003-05-21  3:12 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-05-13 20:31 Various simple.el patches Stefan Monnier
2003-05-14 11:44 ` Kai Großjohann
2003-05-14 12:42   ` Miles Bader
2003-05-14 13:58     ` Kai Großjohann
2003-05-14 14:48       ` Miles Bader
2003-05-14 15:54         ` Kai Großjohann
2003-05-16  3:51           ` Richard Stallman
2003-05-16  5:54             ` Kai Großjohann
2003-05-17 13:49               ` Richard Stallman
2003-05-18 15:38                 ` Kai Großjohann
2003-05-19  2:11                   ` Luc Teirlinck
2003-05-19  7:42                     ` Kai Großjohann
2003-05-19 14:22                       ` Luc Teirlinck
2003-05-21  3:12                       ` Luc Teirlinck [this message]
2003-05-21 14:07                         ` Luc Teirlinck
2003-05-21 18:06                           ` Tak Ota
2003-05-21 18:16                             ` Luc Teirlinck
2003-05-21 18:33                             ` Luc Teirlinck
2003-05-21 18:44                             ` Luc Teirlinck
2003-05-22  2:52                           ` Luc Teirlinck
2003-05-23  3:52                             ` Luc Teirlinck
2003-05-23  6:57                               ` Kai Großjohann
2003-05-23 18:27                                 ` Luc Teirlinck
2003-05-23 19:04                                   ` Kai Großjohann
2003-05-23 19:45                                     ` Luc Teirlinck
2003-05-28  4:32                                     ` Luc Teirlinck
2003-05-28 18:46                                       ` Kai Großjohann
2003-05-28 19:47                                         ` Luc Teirlinck
2003-05-28 20:11                                           ` Kai Großjohann
2003-05-30  0:50                                         ` Richard Stallman
2003-05-24 10:00                                   ` Eli Zaretskii
2003-05-25  2:42                                     ` Luc Teirlinck
2003-05-25  3:33                                       ` Eli Zaretskii
2003-05-25  4:43                                         ` Luc Teirlinck
2003-05-25  5:00                                           ` Luc Teirlinck
2003-05-26 13:48                                             ` Richard Stallman
2003-05-25 17:08                                           ` Eli Zaretskii
2003-05-25 15:06                                         ` Stefan Monnier
2003-05-25 15:04                                       ` Stefan Monnier
2003-05-23 18:47                                 ` Luc Teirlinck
2003-05-23 13:51                               ` Stefan Monnier
2003-05-23 17:06                                 ` Luc Teirlinck
2003-05-23 19:07                                   ` Kai Großjohann
2003-05-23 19:24                               ` Kai Großjohann
2003-05-23 19:39                                 ` Luc Teirlinck
2003-05-24 23:20                                 ` Richard Stallman
2003-05-27 17:43                                   ` Kevin Rodgers
2003-05-28 23:58                                     ` Richard Stallman
2003-05-14 16:38         ` Ami Fischman
2003-05-14 17:38           ` Stefan Monnier
2003-05-16  3:51         ` Richard Stallman
2003-05-15 15:40 ` Jan Nieuwenhuizen
2003-05-15 15:45   ` Stefan Monnier
2003-05-16 15:47 ` Richard Stallman
2003-05-16 18:18   ` Stefan Monnier
2003-05-18 12:22     ` Richard Stallman
2003-05-18 15:13       ` Kai Großjohann
2003-05-19 14:53         ` Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200305210312.h4L3C4907897@eel.dms.auburn.edu \
    --to=teirllm@dms.auburn.edu \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).