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