unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* 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 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).