zsh-users
 help / color / mirror / code / Atom feed
* Absolute pathnames similar to expand-cmd-path
@ 2011-01-25 15:56 David Evans
  2011-01-25 16:22 ` Mikael Magnusson
  0 siblings, 1 reply; 5+ messages in thread
From: David Evans @ 2011-01-25 15:56 UTC (permalink / raw)
  To: zsh-users

expand-cmd-path is a great widget. Is there a similar thing for turning the current word into an absolute path? Sometimes I'm typing a ../../.. chain and would like to see how far I've gone. This should be easy with a widget function and :a but I don't want to write it if even less work is needed.

Thanks!



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

* Re: Absolute pathnames similar to expand-cmd-path
  2011-01-25 15:56 Absolute pathnames similar to expand-cmd-path David Evans
@ 2011-01-25 16:22 ` Mikael Magnusson
  2011-01-28  3:53   ` Bart Schaefer
  0 siblings, 1 reply; 5+ messages in thread
From: Mikael Magnusson @ 2011-01-25 16:22 UTC (permalink / raw)
  To: David Evans; +Cc: zsh-users

On 25 January 2011 16:56, David Evans <david.evans@cl.cam.ac.uk> wrote:
> expand-cmd-path is a great widget. Is there a similar thing for turning the current word
> into an absolute path? Sometimes I'm typing a ../../.. chain and would like to see how far
> I've gone. This should be easy with a widget function and :a but I don't want to write it
> if even less work is needed.

I have this lying around. It shouldn't be too hard to modify it to do
what you want.

autoload -U split-shell-arguments

function _split_shell_arguments_under()
{
  local -a reply
  split-shell-arguments
  #have to duplicate some of modify-current-argument to get the word
  #_under_ the cursor, not after.
  setopt localoptions noksharrays multibyte
  if (( REPLY > 1 )); then
    if (( REPLY & 1 )); then
      (( REPLY-- ))
    fi
  fi
  REPLY=${reply[$REPLY]}
}

function _showcurrargrealpath() {
  setopt localoptions nonomatch
  local REPLY REALPATH
  _split_shell_arguments_under
  #zle -M "$(realpath ${(Q)${~REPLY}} 2> /dev/null | head -n1 || echo
1>&2 "No such path")"
  REALPATH=( ${(Q)${~REPLY}}(:A) )
  zle -M "${REALPATH:-Path not found: $REPLY}"
}


-- 
Mikael Magnusson


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

* Re: Absolute pathnames similar to expand-cmd-path
  2011-01-25 16:22 ` Mikael Magnusson
@ 2011-01-28  3:53   ` Bart Schaefer
  2011-01-28 22:17     ` Peter Stephenson
  0 siblings, 1 reply; 5+ messages in thread
From: Bart Schaefer @ 2011-01-28  3:53 UTC (permalink / raw)
  To: zsh-users

On Jan 25,  5:22pm, Mikael Magnusson wrote:
> Subject: Re: Absolute pathnames similar to expand-cmd-path
>
> On 25 January 2011 16:56, David Evans <david.evans@cl.cam.ac.uk> wrote:
> > expand-cmd-path is a great widget. Is there a similar thing for
> > turning the current word into an absolute path? Sometimes I'm typing
> > a ../../.. chain and would like to see how far I've gone. This
> > should be easy with a widget function and :a but I don't want to
> > write it if even less work is needed.
> 
> I have this lying around. It shouldn't be too hard to modify it to do
> what you want.
> 
> function _split_shell_arguments_under()
> {
>   local -a reply
>   split-shell-arguments
>   #have to duplicate some of modify-current-argument to get the word
>   #_under_ the cursor, not after.

The following seems to work for me, though sometimes it doesn't leave
the cursor where I expect:

    autoload -uZ modify-current-argument
    current-argument-absolute-path() {
      modify-current-argument '$ARG:a'
    }
    zle -N current-argument-absolute-path


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

* Re: Absolute pathnames similar to expand-cmd-path
  2011-01-28  3:53   ` Bart Schaefer
@ 2011-01-28 22:17     ` Peter Stephenson
  2011-01-29  0:47       ` Bart Schaefer
  0 siblings, 1 reply; 5+ messages in thread
From: Peter Stephenson @ 2011-01-28 22:17 UTC (permalink / raw)
  To: zsh-users

On Thu, 27 Jan 2011 19:53:09 -0800
Bart Schaefer <schaefer@brasslantern.com> wrote:
> The following seems to work for me, though sometimes it doesn't leave
> the cursor where I expect:
> 
>     autoload -uZ modify-current-argument
>     current-argument-absolute-path() {
>       modify-current-argument '$ARG:a'
>     }
>     zle -N current-argument-absolute-path

Ah, it's magic you want.

The following changes the logic so that if the cursor was on the last
character or after the end of the original argument it is on the last
character or after the end of the new argument, and even more magically
if the characters from the original cursor position to the end are the
same characters at the end of the new string then the cursor is
positioned relative to the end of the new string.

This tickles cursor positioning annyonances in undo.

It will have to wait until Sourceforge resolve the problems.

--- ../zsh-git/zsh/Functions/Zle/modify-current-argument	2010-03-25 21:01:19.000000000 +0000
+++ Functions/Zle/modify-current-argument	2011-01-28 22:09:28.000000000 +0000
@@ -14,7 +14,7 @@
 setopt localoptions noksharrays multibyte
 
 local -a reply
-integer REPLY REPLY2
+integer REPLY REPLY2 fromend endoffset
 
 autoload -Uz split-shell-arguments
 split-shell-arguments
@@ -30,6 +30,13 @@ if (( REPLY & 1 )); then
   (( REPLY2 = ${#reply[REPLY]} + 1 ))
 fi
 
+# Work out offset from end of string
+(( fromend = $REPLY2 - ${#reply[REPLY]} - 1 ))
+if (( fromend >= -1 )); then
+  # Cursor is near the end of the word, we'll try to keep it there.
+  endoffset=1
+fi
+
 # Length of all characters before current.
 # Force use of character (not index) counting and join without IFS.
 integer wordoff="${(cj..)#reply[1,REPLY-1]}"
@@ -37,15 +44,32 @@ integer wordoff="${(cj..)#reply[1,REPLY-
 # Replacement for current word.  This could do anything to ${reply[REPLY]}.
 local ARG="${reply[REPLY]}" repl
 eval repl=\"$1\"
+
+if (( !endoffset )) && [[ ${repl[fromend,-1]} = ${ARG[fromend,-1]} ]]; then
+  # If the part of the string from here to the end hasn't changed,
+  # leave the cursor this distance from the end instead of the beginning.
+  endoffset=1
+fi
+
 # New line:  all words before and after current word, with
 # no additional spaces since we've already got the whitespace
 # and the replacement word in the middle.
-BUFFER="${(j..)reply[1,REPLY-1]}${repl}${(j..)reply[REPLY+1,-1]}"
+local left="${(j..)reply[1,REPLY-1]}${repl}"
+local right="${(j..)reply[REPLY+1,-1]}"
 
-# Keep cursor at same position in replaced word.
-# Redundant here, but useful if $repl changes the length.
-# Limit to the next position after the end of the word.
-integer repmax=$(( ${#repl} + 1 ))
-# Remember CURSOR starts from offset 0 for some reason, so
-# subtract 1 from positions.
-(( CURSOR = wordoff + (REPLY2 > repmax ? repmax : REPLY2) - 1 ))
+if [[ endoffset -ne 0 && ${#repl} -ne 0 ]]; then
+  # Place cursor relative to end.
+  LBUFFER="$left"
+  RBUFFER="$right"
+  (( CURSOR += fromend ))
+else
+  BUFFER="$left$right"
+
+  # Keep cursor at same position in replaced word.
+  # Redundant here, but useful if $repl changes the length.
+  # Limit to the next position after the end of the word.
+  integer repmax=$(( ${#repl} + 1 ))
+  # Remember CURSOR starts from offset 0 for some reason, so
+  # subtract 1 from positions.
+  (( CURSOR = wordoff + (REPLY2 > repmax ? repmax : REPLY2) - 1 ))
+fi

-- 
Peter Stephenson <p.w.stephenson@ntlworld.com>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/


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

* Re: Absolute pathnames similar to expand-cmd-path
  2011-01-28 22:17     ` Peter Stephenson
@ 2011-01-29  0:47       ` Bart Schaefer
  0 siblings, 0 replies; 5+ messages in thread
From: Bart Schaefer @ 2011-01-29  0:47 UTC (permalink / raw)
  To: zsh-users

On Jan 28, 10:17pm, Peter Stephenson wrote:
} Subject: Re: Absolute pathnames similar to expand-cmd-path
}
} On Thu, 27 Jan 2011 19:53:09 -0800
} Bart Schaefer <schaefer@brasslantern.com> wrote:
} > The following seems to work for me, though sometimes it doesn't leave
} > the cursor where I expect:
} > 
} >     autoload -uZ modify-current-argument
} >     current-argument-absolute-path() {
} >       modify-current-argument '$ARG:a'
} >     }
} >     zle -N current-argument-absolute-path
} 
} Ah, it's magic you want.

No, though I'll take it now that you've offered. :-)  I just expected
the cursor to end up at least as far to the right (within the word)
as it started.

Instead it would do things like move from the right end of a longer
word, to one space to the left of the end of a shorter one.  It was
this extra leftward motion that puzzled me.

-- 


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

end of thread, other threads:[~2011-01-29  0:48 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-25 15:56 Absolute pathnames similar to expand-cmd-path David Evans
2011-01-25 16:22 ` Mikael Magnusson
2011-01-28  3:53   ` Bart Schaefer
2011-01-28 22:17     ` Peter Stephenson
2011-01-29  0:47       ` Bart Schaefer

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

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 NNTP newsgroup(s).