Subject: 28.2; Add option to preserve column after kill-whole-line

From: Sean Devlin <[email-masked]>
Date: Tue, 10 Jan 2023 16:36:45 -0500

Hi folks,

The kill-whole-line command kills the entire line surrounding point,
including the trailing newline. After running this command, the point is
left in the first column of the following line (which is now the current
line).

I think there should be an option to try to preserve the point's
original column. This is somewhat similar to setting a goal column
before calling next-line, except in this case the goal column is
implicit based on the starting position.

Here's a recipe to demonstrate the current behavior:

1. Emacs -Q
2. C-u 30 A RET
3. C-u 5 B RET
4. C-u 30 C RET
5. C-p C-p C-p C-u 15 C-f
6. M-x kill-whole-line
7. M-x kill-whole-line

At the end of step 5, the point is in column 15. After both of steps 6
and 7, the point is left in column 0 of the next (now current) line.

The behavior I would like to have with the hypothetical option set is:

1. We start in column 15 at the end of step 5.
2. At the end of step 6, we should be in column 5, since the new line is
too short to accommodate our goal.
3. At the end of step 7, we should be in column 15, since the new line
is long enough.

In other words, in a sequence of consecutive kill-whole-line calls, the
goal column should be set during the first call, and each subsequent
call should attempt to honor that original goal. Calling some other
command would clear the kill-whole-line goal column.

Thanks!

In GNU Emacs 28.2
System Description:  macOS 13

Configured using:
'configure --with-ns '--enable-locallisppath=/Library/Application
Support/Emacs/${version}/site-lisp:/Library/Application
Support/Emacs/site-lisp' --with-modules'

Configured features:
ACL GMP GNUTLS JSON LIBXML2 MODULES NOTIFY KQUEUE NS PDUMPER THREADS
TOOLKIT_SCROLL_BARS ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util rmail
rmail-loaddefs auth-source cl-seq eieio eieio-core cl-macs
eieio-loaddefs password-cache json map text-property-search time-date
subr-x seq byte-opt gv bytecomp byte-compile cconv mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs
cl-lib sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils
iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/ns-win ns-win ucs-normalize
mule-util term/common-win tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode lisp-mode prog-mode register
page tab-bar menu-bar rfn-eshadow isearch easymenu timer select
scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer cl-generic cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932
hebrew greek romanian slovak czech european ethiopic indian cyrillic
chinese composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help simple abbrev obarray cl-preloaded nadvice button
loaddefs faces cus-face macroexp files window text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote threads kqueue cocoa ns multi-tty
make-network-process emacs)

Memory information:
((conses 16 50726 6790)
(symbols 48 6552 1)
(strings 32 18282 2240)
(string-bytes 1 632208)
(vectors 16 13824)
(vector-slots 8 191484 11565)
(floats 8 21 38)
(intervals 56 202 0)
(buffers 992 10))