151 lines
4.5 KiB
Bash
Executable File
151 lines
4.5 KiB
Bash
Executable File
# -*- 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}}")
|
|
# `...` is a wildcard operator in go
|
|
[[ ${${(@)words[1,-2]}[(I)go]} = 0 ]] &&
|
|
[[ $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 "$@"
|