Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

149 lines (120 sloc) 4.53 kb
# -*- mode: sh -*-
#
# manydots-magic - zle tweak for emulating "..."=="../.." etc.
#
# Copyright (c) 2011, 2012 Akinori MUSHA
# Licensed under the 2-clause BSD license.
#
# This tweek helps input ancestor directories beyond the parent (`..')
# in a handy way. You can just type triple dots to input `../..',
# quadruple dots to `../../..', etc..
#
# % .. [Hit <.>]
# % ../.. [Hit <.>]
# % ../../.. [Hit <^H>]
# % ../.. [Hit <^H>]
# % ..
#
# As you see above, each of the `/..' parts complemented by this tweak
# can be deleted by a single invocation of the backward-delete-char
# command, only if invoked right after the magic happens.
#
# % .. [Hit </><.><.>]
# % ../.. [Hit <^H>]
# % ../.
#
# Usage:
# autoload -Uz manydots-magic
# manydots-magic
#
manydots-magic.self-insert() {
emulate -L zsh
local self_insert_function magic_count
zstyle -s ':manydots-magic' self-insert-function self_insert_function
if [[ "$KEYS" == .* && "$LBUFFER" != *...* && "$LBUFFER" == *.. ]] && {
local -a words
words=("${(@Q)${(z)LBUFFER}}")
[[ $words[-1] == (|*[/=]|[\<\>=]\().. ]]
}
then
[[ "$LASTWIDGET" == (self-insert|backward-delete-char) ]] &&
zstyle -s ':manydots-magic' magic-count magic_count
zstyle ':manydots-magic' magic-count $((magic_count+1))
LBUFFER="$LBUFFER/."
zle "$self_insert_function"
return
fi
# cancel expansion if it does not seem right
if [[ "$KEYS" != [=/,:\;\|\&\<\>\(\)\[\]{}^~\'\"\`[:space:]]* &&
"$LASTWIDGET" == (self-insert|backward-delete-char) && "$LBUFFER" == *../.. ]] && {
zstyle -s ':manydots-magic' magic-count magic_count
[[ "$magic_count" -gt 0 ]]
}
then
repeat $magic_count LBUFFER="${LBUFFER%/..}"
repeat $magic_count LBUFFER="$LBUFFER."
fi
zstyle ':manydots-magic' magic-count 0
zle "$self_insert_function"
}
manydots-magic.backward-delete-char() {
emulate -L zsh
local backward_delete_char_function
zstyle -s ':manydots-magic' backward-delete-char-function backward_delete_char_function
if [[ "$LASTWIDGET" == (self-insert|backward-delete-char) && "$LBUFFER" == *../.. ]] && {
local magic_count
zstyle -s ':manydots-magic' magic-count magic_count
[[ "$magic_count" -gt 0 ]]
}
then
zstyle ':manydots-magic' magic-count $((magic_count-1))
LBUFFER="${LBUFFER%..}"
else
zstyle ':manydots-magic' magic-count 0
fi
zle "$backward_delete_char_function"
}
manydots-magic.on() {
emulate -L zsh
local self_insert_function="${$(zle -lL | awk \
'$1=="zle"&&$2=="-N"&&$3=="self-insert"{print $4;exit}'):-.self-insert}"
[[ "$self_insert_function" == manydots-magic.self-insert ]] &&
return 0
# For url-quote-magic which does not zle -N itself
zle -la "$self_insert_function" || zle -N "$self_insert_function"
zstyle ':manydots-magic' self-insert-function "$self_insert_function"
zle -A manydots-magic.self-insert self-insert
local backward_delete_char_function="$(zle -lL | awk \
'$1=="zle"&&$2=="-N"&&$3=="backward-delete-char"{print $4;exit}')"
if [[ -n "$backward_delete_char_function" ]]
then
zle -la "$backward_delete_char_function" || zle -N "$backward_delete_char_function"
else
zle -A backward-delete-char manydots-magic.orig.backward-delete-char
backward_delete_char_function=manydots-magic.orig.backward-delete-char
fi
zstyle ':manydots-magic' backward-delete-char-function "$backward_delete_char_function"
zle -A manydots-magic.backward-delete-char backward-delete-char
zstyle ':manydots-magic' magic-count 0
return 0
}
manydots-magic.off() {
emulate -L zsh
local self_insert_function backward_delete_char_function
zstyle -s ':manydots-magic' self-insert-function self_insert_function
[[ -n "$self_insert_function" ]] &&
zle -A "$self_insert_function" self-insert
zstyle -s ':manydots-magic' backward-delete-char-function backward_delete_char_function
[[ -n "$backward_delete_char_function" ]] &&
zle -A "$backward_delete_char_function" backward-delete-char
zstyle ':manydots-magic' magic-count 0
return 0
}
zle -N manydots-magic.self-insert
zle -N manydots-magic.backward-delete-char
zle -N manydots-magic.on
zle -N manydots-magic.off
manydots-magic() {
manydots-magic.on
}
[[ -o kshautoload ]] || manydots-magic "$@"
Jump to Line
Something went wrong with that request. Please try again.