* bug#13122: save-excursion not saving point
@ 2012-12-08 6:20 Jyothis V
2012-12-08 11:21 ` martin rudalics
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Jyothis V @ 2012-12-08 6:20 UTC (permalink / raw)
To: 13122
[-- Attachment #1: Type: text/plain, Size: 1823 bytes --]
Hi,
I wrote the following version of transpose-chars which is supposed to
always transform the last two chars without moving the point.
(defun gosmacs-tranpose-chars (n)
(interactive "p")
(save-excursion
(forward-char (- n))
(transpose-chars 1)))
The trouble is, even though I have used save-excursion, the point does
move 2 characters backwards when n=1! For other values of n, this seems to
be working fine.
Regards,
Jyothis V
In GNU Emacs 24.2.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.6.2)
of 2012-11-18 on eric
Windowing system distributor `The X.Org Foundation', version 11.0.11300000
Configured using:
`configure '--prefix=/usr' '--sysconfdir=/etc' '--libexecdir=/usr/lib'
'--localstatedir=/var' '--with-x-toolkit=gtk3' '--with-xft'
'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector
--param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2'
'LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro''
Important settings:
value of $LC_ALL: nil
value of $LC_COLLATE: nil
value of $LC_CTYPE: nil
value of $LC_MESSAGES: nil
value of $LC_MONETARY: nil
value of $LC_NUMERIC: nil
value of $LC_TIME: nil
value of $LANG: en_US.UTF-8
value of $XMODIFIERS: nil
locale-coding-system: utf-8-unix
default enable-multibyte-characters: t
Major mode: Lisp Interaction
Minor modes in effect:
diff-auto-refine-mode: t
global-auto-complete-mode: t
auto-complete-mode: t
icomplete-mode: t
ido-everywhere: t
shell-dirtrack-mode: t
which-function-mode: t
cua-mode: t
display-time-mode: t
electric-pair-mode: t
show-paren-mode: t
tooltip-mode: t
mouse-wheel-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
line-number-mode: t
transient-mark-mode: t
[-- Attachment #2: Type: text/html, Size: 2140 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#13122: save-excursion not saving point
2012-12-08 6:20 bug#13122: save-excursion not saving point Jyothis V
@ 2012-12-08 11:21 ` martin rudalics
2012-12-21 5:43 ` Chong Yidong
2013-01-07 12:32 ` bug#13122: sort-regexp-fields also seems to not save point Alexander Kjeldaas
2019-04-26 19:53 ` bug#13122: save-excursion not saving point Tino Calancha
2 siblings, 1 reply; 9+ messages in thread
From: martin rudalics @ 2012-12-08 11:21 UTC (permalink / raw)
To: Jyothis V; +Cc: 13122
> I wrote the following version of transpose-chars which is supposed to
> always transform the last two chars without moving the point.
> (defun gosmacs-tranpose-chars (n)
> (interactive "p")
> (save-excursion
> (forward-char (- n))
> (transpose-chars 1)))
>
> The trouble is, even though I have used save-excursion, the point does
> move 2 characters backwards when n=1! For other values of n, this seems to
> be working fine.
This is a limitation (or bug) in the code of `transpose-subr' and
`transpose-subr-1' due to the use of `delete-and-extract-region' (IIRC
transposing mangles `undo' as well.)
martin
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#13122: save-excursion not saving point
2012-12-08 11:21 ` martin rudalics
@ 2012-12-21 5:43 ` Chong Yidong
0 siblings, 0 replies; 9+ messages in thread
From: Chong Yidong @ 2012-12-21 5:43 UTC (permalink / raw)
To: martin rudalics; +Cc: Jyothis V, 13122-done
martin rudalics <rudalics@gmx.at> writes:
> This is a limitation (or bug) in the code of `transpose-subr' and
> `transpose-subr-1' due to the use of `delete-and-extract-region' (IIRC
> transposing mangles `undo' as well.)
I've committed a fix to trunk.
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#13122: sort-regexp-fields also seems to not save point
2012-12-08 6:20 bug#13122: save-excursion not saving point Jyothis V
2012-12-08 11:21 ` martin rudalics
@ 2013-01-07 12:32 ` Alexander Kjeldaas
2019-04-26 19:53 ` bug#13122: save-excursion not saving point Tino Calancha
2 siblings, 0 replies; 9+ messages in thread
From: Alexander Kjeldaas @ 2013-01-07 12:32 UTC (permalink / raw)
To: 13122
[-- Attachment #1: Type: text/plain, Size: 641 bytes --]
I think this might be related. In the following function, point is also
not restored:
(defun my-java-organize-imports2 ()
"Sorts import statements"
(interactive)
(message "Point %d" (point))
(sit-for 3)
(save-excursion
(let (deactivate-mark)
;; Remove empty lines between imports
(replace-regexp "^import \\(.*\\)\n\\(\n\\)*import \\(.*\\)$"
"import \\1\nimport \\3"
nil (point-min) (point-max))
;; Sort imports in file
(sort-regexp-fields nil "^.*$" "^import .*$" (point-min)
(point-max))))
(message "Point %d" (point))
(sit-for 3))
Thanks,
Alexander
[-- Attachment #2: Type: text/html, Size: 935 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#13122: save-excursion not saving point
2012-12-08 6:20 bug#13122: save-excursion not saving point Jyothis V
2012-12-08 11:21 ` martin rudalics
2013-01-07 12:32 ` bug#13122: sort-regexp-fields also seems to not save point Alexander Kjeldaas
@ 2019-04-26 19:53 ` Tino Calancha
2019-04-27 6:57 ` Eli Zaretskii
2 siblings, 1 reply; 9+ messages in thread
From: Tino Calancha @ 2019-04-26 19:53 UTC (permalink / raw)
To: 13122
;; Following expression should eval as non-nil
(let ((pos 3))
(with-temp-buffer
(insert "abcdef")
(goto-char pos)
(save-excursion (transpose-chars 2))
(= pos (point))))
=> nil
In GNU Emacs 27.0.50 (build 3, x86_64-pc-linux-gnu, GTK+ Version 3.22.11)
of 2019-04-23 built on calancha-pc.dy.bbexcite.jp
Repository revision: 981470e3590534a4d2947dfe5626cae832c6502d
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.11902000
System Description: Debian GNU/Linux 9 (stretch)
Jyothis V <jyothisv@gmail.com> writes:
> I wrote the following version of transpose-chars which is supposed to
> always transform the last two chars without moving the point.
> (defun gosmacs-tranpose-chars (n)
> (interactive "p")
> (save-excursion
> (forward-char (- n))
> (transpose-chars 1)))
>
> The trouble is, even though I have used save-excursion, the point does
> move 2 characters backwards when n=1! For other values of n, this seems to be working fine.
>
> Regards,
> Jyothis V
>
> In GNU Emacs 24.2.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.6.2)
> of 2012-11-18 on eric
> Windowing system distributor `The X.Org Foundation', version 11.0.11300000
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#13122: save-excursion not saving point
2019-04-26 19:53 ` bug#13122: save-excursion not saving point Tino Calancha
@ 2019-04-27 6:57 ` Eli Zaretskii
2019-04-27 7:44 ` Tino Calancha
0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2019-04-27 6:57 UTC (permalink / raw)
To: Tino Calancha; +Cc: 13122
> From: Tino Calancha <tino.calancha@gmail.com>
> Date: Sat, 27 Apr 2019 04:53:56 +0900
>
> ;; Following expression should eval as non-nil
> (let ((pos 3))
> (with-temp-buffer
> (insert "abcdef")
> (goto-char pos)
> (save-excursion (transpose-chars 2))
> (= pos (point))))
> => nil
Why did you think it should evaluate to non-nil? The ELisp manual has
a warning near the end of description of save-excursion; I think it's
relevant to this use case.
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#13122: save-excursion not saving point
2019-04-27 6:57 ` Eli Zaretskii
@ 2019-04-27 7:44 ` Tino Calancha
2019-04-27 9:59 ` Andreas Schwab
0 siblings, 1 reply; 9+ messages in thread
From: Tino Calancha @ 2019-04-27 7:44 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 13122, Tino Calancha
On Sat, 27 Apr 2019, Eli Zaretskii wrote:
>> From: Tino Calancha <tino.calancha@gmail.com>
>> Date: Sat, 27 Apr 2019 04:53:56 +0900
>>
>> ;; Following expression should eval as non-nil
>> (let ((pos 3))
>> (with-temp-buffer
>> (insert "abcdef")
>> (goto-char pos)
>> (save-excursion (transpose-chars 2))
>> (= pos (point))))
>> => nil
I read that warning; maybe getting `nil' is above is expected; if that's
the case then we can close the report again.
The reason why I shared the above snippet is because Chong applied a patch
(commit: aa26f345096166bd8c135876dbab9b671ae232e3)
to fix the original recipe:
a call to `traspose-chars' inside a `save-excursion' moving the
point if the argument is n != 1.
> Why did you think it should evaluate to non-nil? The ELisp manual has
> a warning near the end of description of save-excursion; I think it's
> relevant to this use case.
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#13122: save-excursion not saving point
2019-04-27 7:44 ` Tino Calancha
@ 2019-04-27 9:59 ` Andreas Schwab
2019-05-04 8:39 ` Tino Calancha
0 siblings, 1 reply; 9+ messages in thread
From: Andreas Schwab @ 2019-04-27 9:59 UTC (permalink / raw)
To: Tino Calancha; +Cc: 13122
On Apr 27 2019, Tino Calancha <tino.calancha@gmail.com> wrote:
> On Sat, 27 Apr 2019, Eli Zaretskii wrote:
>
>>> From: Tino Calancha <tino.calancha@gmail.com>
>>> Date: Sat, 27 Apr 2019 04:53:56 +0900
>>>
>>> ;; Following expression should eval as non-nil
>>> (let ((pos 3))
>>> (with-temp-buffer
>>> (insert "abcdef")
>>> (goto-char pos)
>>> (save-excursion (transpose-chars 2))
>>> (= pos (point))))
>>> => nil
>
> I read that warning; maybe getting `nil' is above is expected; if that's
> the case then we can close the report again.
Since the form inside save-excursion can modify the text before point,
there is never a guarantee that the numeric value of point stays the
same. And if point points inside the modified text, it is generally
unspecified how point moves during the modification.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#13122: save-excursion not saving point
2019-04-27 9:59 ` Andreas Schwab
@ 2019-05-04 8:39 ` Tino Calancha
0 siblings, 0 replies; 9+ messages in thread
From: Tino Calancha @ 2019-05-04 8:39 UTC (permalink / raw)
To: 13122-done
Saving the point, in the general case, would rely on unspecified
behaviour; so I close this bug.
>>>> ;; Following expression should eval as non-nil
>>>> (let ((pos 3))
>>>> (with-temp-buffer
>>>> (insert "abcdef")
>>>> (goto-char pos)
>>>> (save-excursion (transpose-chars 2))
>>>> (= pos (point))))
>>>> => nil
> Since the form inside save-excursion can modify the text before point,
> there is never a guarantee that the numeric value of point stays the
> same. And if point points inside the modified text, it is generally
> unspecified how point moves during the modification.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2019-05-04 8:39 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-08 6:20 bug#13122: save-excursion not saving point Jyothis V
2012-12-08 11:21 ` martin rudalics
2012-12-21 5:43 ` Chong Yidong
2013-01-07 12:32 ` bug#13122: sort-regexp-fields also seems to not save point Alexander Kjeldaas
2019-04-26 19:53 ` bug#13122: save-excursion not saving point Tino Calancha
2019-04-27 6:57 ` Eli Zaretskii
2019-04-27 7:44 ` Tino Calancha
2019-04-27 9:59 ` Andreas Schwab
2019-05-04 8:39 ` Tino Calancha
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.