unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* shell-resync-dirs changes my cursor position
@ 2007-09-10 12:07 Chris Moore
  2007-09-10 12:21 ` Chris Moore
  0 siblings, 1 reply; 8+ messages in thread
From: Chris Moore @ 2007-09-10 12:07 UTC (permalink / raw)
  To: emacs-devel

I'm editing a long shell command in a *shell* buffer.  Part way
through I try completing a filename and notice that the
default-directory isn't synced with the shell's working directory, so
I run M-x dirs RET to sync it.  That resets my cursor position to the
start of the line I was editing, rather than leaving it where I was
before.  I was trying to complete a filename, so I'd like now to just
be able to hit TAB and do so, rather than trying to find the place I
was at before.

Here's a patch and changelog (and uuencoded patch in case the patch
gets messed up by my mail client again):

2007-09-10  Chris Moore  <dooglus@gmail.com>

	* shell.el (shell-resync-dirs): Restore the cursor position to its
	previous location after syncing.

*** shell.el	31 Aug 2007 15:25:36 +0200	1.154
--- shell.el	10 Sep 2007 14:01:17 +0200	
***************
*** 808,813 ****
--- 808,814 ----
  command again."
    (interactive)
    (let* ((proc (get-buffer-process (current-buffer)))
+ 	 (starting-point (set-marker (make-marker) (point)))
  	 (pmark (process-mark proc)))
      (goto-char pmark)
      ;; If the process echoes commands, don't insert a fake command in
***************
*** 852,858 ****
  		   (setq shell-dirstack (cdr ds)
  			 shell-last-dir (car shell-dirstack))
  		   (shell-dirstack-message))
! 	  (error (message "Couldn't cd")))))))

  ;; For your typing convenience:
  (defalias 'dirs 'shell-resync-dirs)
--- 853,861 ----
  		   (setq shell-dirstack (cdr ds)
  			 shell-last-dir (car shell-dirstack))
  		   (shell-dirstack-message))
! 	  (error (message "Couldn't cd")))))
!     (goto-char starting-point)
!     (set-marker starting-point nil)))

  ;; For your typing convenience:
  (defalias 'dirs 'shell-resync-dirs)

begin 644 shell-resync-dirs-patch.txt.gz
M'XL(")DRY48``W-H96QL+7)E<WEN8RUD:7)S+7!A=&-H+G1X=`#-4D%NVS`0
M/%NOV/IB2C$-T;8203D%!0KTW!>PU$HF(I$*207P[[L4K;0.>NRA/&F'L\N9
MT19%`?Z"PW#`87,2\#+W<"S+)Q!5<ZR:TR,\E%1OQ$%4YXQS_ILM2OB!TXU]
M;DK1B*<;.RON3ZRA+NM]+4ZP`'%2`LY`WSP#4'8<I6E!]E*;PY80`*9-0"=5
MT.^8)V3`4`!CD[,*6(^!_YR[#AV/`'H/3,W.H5GQ/,^S!]@`\T&ZH$W/)TM#
MJ:;64;I7=,!&^8JW(@>V$&(?Q+XIXL!NXQ<6Q"(1%DF]#9:KBW2PD%?\^1F^
M=Q`N"*LV5!>+?G7J]]!:LPN@C4<70$)'.CYRT.;O,5;'?5W5*492N(D*R,Q;
M^C.\U8ZL*I*L6@>M7VP0*]T.TH=(H5N2>]^1'*=Y=Q=\)/&R1R)\H4B`H7,V
MQI9@V'ZU\]!&)ZK=YNG0J&R)X!LQKW9V$*X3Q4_VS#L:C49A0PS68B<'+3WL
MXG.P2T\[]%>C%@5Y6I;JM*\?Q;HL_Z=MXGU:B/NM^R#\L7R?]M+HX1^G]PM;
':>&SXP,`````
`
end

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: shell-resync-dirs changes my cursor position
  2007-09-10 12:07 shell-resync-dirs changes my cursor position Chris Moore
@ 2007-09-10 12:21 ` Chris Moore
  2007-09-10 19:17   ` Davis Herring
  2007-09-10 23:55   ` Richard Stallman
  0 siblings, 2 replies; 8+ messages in thread
From: Chris Moore @ 2007-09-10 12:21 UTC (permalink / raw)
  To: emacs-devel

On 9/10/07, Chris Moore <christopher.ian.moore@gmail.com> wrote:

> Here's a patch and changelog (and uuencoded patch in case the patch
> gets messed up by my mail client again):

That patch didn't work if the cursor was at the beginning of the
command being edited.

This one does.  There's probably a better way of doing this.

2007-09-10  Chris Moore  <dooglus@gmail.com>

       * shell.el (shell-resync-dirs): Restore the cursor position to its
       previous location after syncing.

*** shell.el	31 Aug 2007 15:25:36 +0200	1.154
--- shell.el	10 Sep 2007 14:19:02 +0200	
***************
*** 808,813 ****
--- 808,816 ----
  command again."
    (interactive)
    (let* ((proc (get-buffer-process (current-buffer)))
+ 	 (starting-point (if (eq (marker-position (process-mark
(get-buffer-process (current-buffer)))) (point))
+ 			     'start
+ 			   (set-marker (make-marker) (point))))
  	 (pmark (process-mark proc)))
      (goto-char pmark)
      ;; If the process echoes commands, don't insert a fake command in
***************
*** 852,858 ****
  		   (setq shell-dirstack (cdr ds)
  			 shell-last-dir (car shell-dirstack))
  		   (shell-dirstack-message))
! 	  (error (message "Couldn't cd")))))))

  ;; For your typing convenience:
  (defalias 'dirs 'shell-resync-dirs)
--- 855,864 ----
  		   (setq shell-dirstack (cdr ds)
  			 shell-last-dir (car shell-dirstack))
  		   (shell-dirstack-message))
! 	  (error (message "Couldn't cd")))))
!     (unless (eq starting-point 'start)
!       (goto-char starting-point)
!       (set-marker starting-point nil))))

  ;; For your typing convenience:
  (defalias 'dirs 'shell-resync-dirs)

begin 644 shell-resync-dirs-patch2.txt.gz
M'XL("$LVY48``W-H96QL+7)E<WEN8RUD:7)S+7!A=&-H,BYT>'0`S5+!CILP
M$#W#5TQSB6'C")*04O945:K4<[_`-0.QEMBL;5;*WW>,P^ZRZJ&''LH)/S^_
M>3/S\CP'=\%AV..0'$OX.O5P*(K/4%;-H6J.9W@HZ)R4^[(ZI9SS-W99P$\<
M[^Q34WYIBL.=G>;K+YRA+NI=71YA!H)2!,Y`_SP%D.9Z%;H%T0NE]QM"`)C2
M'JV07KU@%I$!?0Z,C=9(8#UZ_FOJ.K0\`.@<,#E9BWK!LRQ+'R`!YKRP7NF>
MCX9$2;D#AL_`KL(^A>?&*:^,!G87XN'B+RMD]"JHQEI)$HS"=J[X"C!'2K%8
M*/J$]\/;VRQT2$['6'GE(QPB81Y";[SA\B(LS.0%?WR$'QWX"\+B%>7%H%MF
MZW;0&KWUH+1#ZT%`1T9>)Z_TGQ=7'79U5<?%D<.EF^>8!=XJ2ZU*LBQ;"ZV;
MVR!6O!V$\X%"MV1W_2)V'/56%_Q*YD6/1/A$(Z%-66O"W"(,FV]F&MK0B6PW
M6?Q(*IU'\)V8-S-9\+>1%D[MZ1?4"K7$AABLQ4X,2CC8AG*TI[FT17?3<G:0
MQ7A6U:X^GY9X_I]M$V\.Q*2'.9J4Z`]!CS%<B*OLK)GO*.^B^D%-J^%?S_HW
(AKO0>8,$````
`
end

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: shell-resync-dirs changes my cursor position
  2007-09-10 12:21 ` Chris Moore
@ 2007-09-10 19:17   ` Davis Herring
  2007-09-10 23:55   ` Richard Stallman
  1 sibling, 0 replies; 8+ messages in thread
From: Davis Herring @ 2007-09-10 19:17 UTC (permalink / raw)
  To: Chris Moore; +Cc: emacs-devel

> This one does.  There's probably a better way of doing this.

Could you simplify it by storing the difference between point and the
process-mark, and then call `forward-char' at the end of the function?

Davis

-- 
This product is sold by volume, not by mass.  If it appears too dense or
too sparse, it is because mass-energy conversion has occurred during
shipping.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: shell-resync-dirs changes my cursor position
  2007-09-10 12:21 ` Chris Moore
  2007-09-10 19:17   ` Davis Herring
@ 2007-09-10 23:55   ` Richard Stallman
  2007-09-11  0:36     ` Davis Herring
  1 sibling, 1 reply; 8+ messages in thread
From: Richard Stallman @ 2007-09-10 23:55 UTC (permalink / raw)
  To: Chris Moore; +Cc: emacs-devel

Is there a clean, simple way of writing it with save-excursion?
If that way won't work, then there needs to be a comment explaining
why it won't -- why the extra complexity is needed.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: shell-resync-dirs changes my cursor position
  2007-09-10 23:55   ` Richard Stallman
@ 2007-09-11  0:36     ` Davis Herring
  2007-09-11 10:36       ` Chris Moore
  0 siblings, 1 reply; 8+ messages in thread
From: Davis Herring @ 2007-09-11  0:36 UTC (permalink / raw)
  To: rms; +Cc: Chris Moore, emacs-devel

> Is there a clean, simple way of writing it with save-excursion?
> If that way won't work, then there needs to be a comment explaining
> why it won't -- why the extra complexity is needed.

I didn't think there was, because point needs to be restored to a
different location in the buffer (after more output from the process), but
minimal testing seems to suggest that it works because the original text
is left in the buffer (just with more inserted before it).  OP, if you
don't know what we mean, just ask me off-list.

Davis

-- 
This product is sold by volume, not by mass.  If it appears too dense or
too sparse, it is because mass-energy conversion has occurred during
shipping.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: shell-resync-dirs changes my cursor position
  2007-09-11  0:36     ` Davis Herring
@ 2007-09-11 10:36       ` Chris Moore
  2007-09-12  8:46         ` Richard Stallman
  0 siblings, 1 reply; 8+ messages in thread
From: Chris Moore @ 2007-09-11 10:36 UTC (permalink / raw)
  To: herring; +Cc: rms, emacs-devel

On 9/11/07, Davis Herring <herring@lanl.gov> wrote:
> > Is there a clean, simple way of writing it with save-excursion?
> > If that way won't work, then there needs to be a comment explaining
> > why it won't -- why the extra complexity is needed.
>
> I didn't think there was, because point needs to be restored to a
> different location in the buffer (after more output from the process), but
> minimal testing seems to suggest that it works because the original text
> is left in the buffer (just with more inserted before it).  OP, if you
> don't know what we mean, just ask me off-list.

It seems to work just fine for every case except when the cursor
starts at the same place as the process mark (ie. at the beginning of
the command currently being edited, or with no command yet entered).
In that case save-excursion leaves the cursor where it started, rather
than moving it down past the 'dirs' command and its output.

Here's a patch that uses save-excursion and fixes the case where point
starts at the process mark.  I didn't re-indent the code, so it's
easier to see what I changed.  Below it I've pasted a uuencoded
version of the same patch after reindenting for the added
save-excursion.

2007-09-11  Chris Moore  <dooglus@gmail.com>

	* shell.el (shell-resync-dirs): Don't move the cursor relative to
	the command being edited.

*** shell.el	31 Aug 2007 15:25:36 +0200	1.154
--- shell.el	11 Sep 2007 12:27:54 +0200	
***************
*** 808,815 ****
  command again."
    (interactive)
    (let* ((proc (get-buffer-process (current-buffer)))
! 	 (pmark (process-mark proc)))
!     (goto-char pmark)
      ;; If the process echoes commands, don't insert a fake command in
      ;; the buffer or it will appear twice.
      (unless comint-process-echoes
--- 808,817 ----
  command again."
    (interactive)
    (let* ((proc (get-buffer-process (current-buffer)))
! 	 (pmark (process-mark proc))
! 	 (started-at-pmark (= (point) (marker-position pmark))))
!     (save-excursion
!       (goto-char pmark)
      ;; If the process echoes commands, don't insert a fake command in
      ;; the buffer or it will appear twice.
      (unless comint-process-echoes
***************
*** 852,858 ****
  		   (setq shell-dirstack (cdr ds)
  			 shell-last-dir (car shell-dirstack))
  		   (shell-dirstack-message))
! 	  (error (message "Couldn't cd")))))))

  ;; For your typing convenience:
  (defalias 'dirs 'shell-resync-dirs)
--- 854,861 ----
  		   (setq shell-dirstack (cdr ds)
  			 shell-last-dir (car shell-dirstack))
  		   (shell-dirstack-message))
! 	  (error (message "Couldn't cd"))))))
!     (if started-at-pmark (goto-char (marker-position pmark)))))

  ;; For your typing convenience:
  (defalias 'dirs 'shell-resync-dirs)

Here's a uuencoded version of the same patch, but after reindenting
the function:

begin 644 shell-keep-cursor-position.txt.gz
M'XL("`)NYD8``W-H96QL+6ME97`M8W5R<V]R+7!O<VET:6]N+G1X=`#%EDMO
MXS80@,_,KYCZT$A.:-C99ILFW4-1H,">LT`ON3#22"9,DPI)Y?'O.Z1$6X[M
MV,D&:$[F<,1YSY?Q>`QNCDI-4+$O,_BKK>%B.OT=9I?7%Y?77[["V93.;#:9
M7?YVPCE?:\]F<(M-KWUQ??'']?2RUSX9;_Z%,UQ-K\ZO+J\@"@`*LUP*78*H
MA=23$4D`,JD]6E%X^8AY)U'HQY!EC34%9#5Z?M]6%5H>!.@<9$5K+>HDS_/\
MY!=@D#5+81>0]6H\GL*A4XA/U\8;7LR%A:B<Y#<W\+T"/T=(-K"8&W3)8W<.
MI=&G'J1V:#T(J,0"5_%(O7XG/-+Y!<:"]/`DE0+1-$A&_9,L<)*<:;4*IN@5
MRD&*CG>6>YV8GV@RUH"7TCHOB@5_:-&^Y*O;T9T>K:-TTO.*K$]SN`'Z42!8
M+*5KE'A).KU5A[KDSENIZQC[;CN'/HKF5]:I8B&YV">9*F+HJ[5[5-]07C^\
M8"2W6.-STQV"+5T(WY\HT&IOHABCO-\N9+,J2+@"N:NB4;U_F]R^RT;)+H5J
M/.[),P5X=Y>/\N0.Q&\W1$$P.>OU5L'&GO@QEV3_V5L!&I^4U,$K?*06=M'%
MEFIXZJ"AM(:42MVT'BIKEN`:8ZH@:]UDJR5BUB&[)S^?A"V[OIYM6/Y74`>&
M5C!D,Q@>O/(TEPHATX8*H8Q9D!E.2>FRT14E$T6!S3KEIO7!M3A4\7XP3_Z-
M,8.L1*HZ)A>I+2TNS2/&\#<RLYZD'W/A3[L$43F4='X"M17W8:A^A498A_1S
M,NBJL#5*11GI]H5K[_LFS9;"%W-^C[74.@@NR*493W+*.TG2'J&W2L45ZO"F
MKOT<2C6X<G":Y3FCI@LN!]<@MDI2D#1V^5:6_P0)W:OQI9N;/L_P#4SCI=%"
M`:EZ=(TH\#R41?.U(#_?I19+T(7(8R2A"1V,8VO>PAFU8CR/R#3(D/5&%@LP
M546N/_O@>_<$^@<H79PYER8OC5M%_G,MEDA=@)5\CA/$4GCK'(?$OTYS;$;&
MHOX@U[,^U>F5TO7M%AV10]7I<)3ZS1$\U6%^0@>$;[N/R>U2AASQ0M"%EFJU
M/*AA:RIG-]M%22%2&R:KK%]:#Z]FG[3*J-5'W-TJX7Q0Z=[8_&+XWN8:6=+T
MB!I7JPZMI:',>C&,_C:M*@-@BC(LC]B+`"=Q#OXAS1?3$CU>FI!4BI-6AT1=
MX/5)Z$BLA)*"^C*8@]/.M$7WHHOH01XA'EG\=0;TF_^?+.[N*2W68TD+A_>J
MWQ(.0OD#/7AC7*QGOT0&^\6)1^3X3+8=W:_[8P_>/P_P[T3\8<BS#_!]@_!Q
M$>UF_`<I?R3GCR#]?M:_IOT6[P\1/Q;B/<Q?6?@@]=D6\'<AGWTF[=EAT+-]
MC&?'X)UR<@#PFS/E-Y;QST/^`YC_7-"_B?HC8#_`/=M#^ACC)[$^C-Q/TS[!
M[GV\9^]!_6[8LQ5QDPN[2,_>A'PWQ7LP?PSHCT,]O`OV!W%_%/`3VVB%;<-Q
2/6O[X?BI_S'\!W.1_B`E$```
`
end

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: shell-resync-dirs changes my cursor position
  2007-09-11 10:36       ` Chris Moore
@ 2007-09-12  8:46         ` Richard Stallman
  2007-09-13  7:26           ` Glenn Morris
  0 siblings, 1 reply; 8+ messages in thread
From: Richard Stallman @ 2007-09-12  8:46 UTC (permalink / raw)
  To: Chris Moore; +Cc: emacs-devel

Thanks for fixing this.  Would someone please install the patch?
Since it is a bug in Emacs 22, the fix should go there.

Chris, please remind people after a few days if it isn't installed.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: shell-resync-dirs changes my cursor position
  2007-09-12  8:46         ` Richard Stallman
@ 2007-09-13  7:26           ` Glenn Morris
  0 siblings, 0 replies; 8+ messages in thread
From: Glenn Morris @ 2007-09-13  7:26 UTC (permalink / raw)
  To: rms; +Cc: Chris Moore, emacs-devel

Richard Stallman wrote:

> Thanks for fixing this.  Would someone please install the patch?
> Since it is a bug in Emacs 22, the fix should go there.

ack

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2007-09-13  7:26 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-09-10 12:07 shell-resync-dirs changes my cursor position Chris Moore
2007-09-10 12:21 ` Chris Moore
2007-09-10 19:17   ` Davis Herring
2007-09-10 23:55   ` Richard Stallman
2007-09-11  0:36     ` Davis Herring
2007-09-11 10:36       ` Chris Moore
2007-09-12  8:46         ` Richard Stallman
2007-09-13  7:26           ` Glenn Morris

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).