From 5fe22fcbc6364aaacce373d71fa7d6b6f2d11a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Tue, 16 Dec 2014 00:43:01 +0100 Subject: [PATCH 1/4] Clean up and fix +1/-0 syntax to work as expected This change follows this proposed behaviour: Ctrl+Shift+Left: move to last visited directory Ctrl+Shift+Right: move to next visited directory an alternative behaviour would be: Ctrl+Shift+Left: move directory to the left in `dirs` output Ctrl+Shift+Right: move directory to the right in `dirs` output It also introduces `setopt nopushdminus` as a way to standardise pushd syntax. It's value wasn't clear before, which has been the cause of so many pull requests regarding this plugin not working in some environments. --- plugins/dircycle/dircycle.plugin.zsh | 29 ++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/plugins/dircycle/dircycle.plugin.zsh b/plugins/dircycle/dircycle.plugin.zsh index c6b6ba785..2064af46a 100644 --- a/plugins/dircycle/dircycle.plugin.zsh +++ b/plugins/dircycle/dircycle.plugin.zsh @@ -1,10 +1,27 @@ -## -# dircycle plugin: enables cycling through the directory -# stack using Ctrl+Shift+Left/Right +# enables cycling through the directory stack using +# Ctrl+Shift+Left/Right +# +# left/right direction follows the order in which directories +# were visited, like left/right arrows do in a browser -eval "insert-cycledleft () { zle push-line; LBUFFER='pushd -q +1'; zle accept-line }" +# NO_PUSHD_MINUS syntax: +# pushd +N: start counting from left of `dirs' output +# pushd -N: start counting from right of `dirs' output +setopt nopushdminus + +insert-cycledleft () { + zle push-line + LBUFFER='pushd -q +1' + zle accept-line +} zle -N insert-cycledleft -bindkey "\e[1;6D" insert-cycledleft -eval "insert-cycledright () { zle push-line; LBUFFER='pushd -q +0'; zle accept-line }" + +insert-cycledright () { + zle push-line + LBUFFER='pushd -q -0' + zle accept-line +} zle -N insert-cycledright + +bindkey "\e[1;6D" insert-cycledleft bindkey "\e[1;6C" insert-cycledright From e93fd939adb69a498ba1296b1ce0c99786e26084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Tue, 16 Dec 2014 01:29:06 +0100 Subject: [PATCH 2/4] Run pushd command directly and trigger prompt redraw --- plugins/dircycle/dircycle.plugin.zsh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/dircycle/dircycle.plugin.zsh b/plugins/dircycle/dircycle.plugin.zsh index 2064af46a..1c4a0175a 100644 --- a/plugins/dircycle/dircycle.plugin.zsh +++ b/plugins/dircycle/dircycle.plugin.zsh @@ -10,16 +10,14 @@ setopt nopushdminus insert-cycledleft () { - zle push-line - LBUFFER='pushd -q +1' - zle accept-line + builtin pushd -q +1 &>/dev/null || true + zle reset-prompt } zle -N insert-cycledleft insert-cycledright () { - zle push-line - LBUFFER='pushd -q -0' - zle accept-line + builtin pushd -q -0 &>/dev/null || true + zle reset-prompt } zle -N insert-cycledright From 999bab187c0a59301f4055fb6239a5352d3c96ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sat, 20 Dec 2014 20:35:52 +0100 Subject: [PATCH 3/4] Emulate zsh in zlewidgets instead of static setopt command This way the user can keep their preferred pushd syntax while enabling us to use a standard syntax in our defined functions. To explain further, without a clear value on the PUSHD_MINUS option, we could be changing the +1/-0 values all we want, that some user would find that it didn't work for him. We have two options, then: - Setting a particular value, which was my first approach. - Using `emulate -L zsh` to ensure all options defined in the function's body won't be passed along to the main zsh instance. For more info see: http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#index-emulate --- plugins/dircycle/dircycle.plugin.zsh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/dircycle/dircycle.plugin.zsh b/plugins/dircycle/dircycle.plugin.zsh index 1c4a0175a..12b20ab04 100644 --- a/plugins/dircycle/dircycle.plugin.zsh +++ b/plugins/dircycle/dircycle.plugin.zsh @@ -7,15 +7,20 @@ # NO_PUSHD_MINUS syntax: # pushd +N: start counting from left of `dirs' output # pushd -N: start counting from right of `dirs' output -setopt nopushdminus insert-cycledleft () { + emulate -L zsh + setopt nopushdminus + builtin pushd -q +1 &>/dev/null || true zle reset-prompt } zle -N insert-cycledleft insert-cycledright () { + emulate -L zsh + setopt nopushdminus + builtin pushd -q -0 &>/dev/null || true zle reset-prompt } From 282240bf37d6fd9979da2c3a41006824dbb4e268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 24 Dec 2014 01:33:28 +0100 Subject: [PATCH 4/4] Account for iTerm2 sent keys in dircycle plugin --- plugins/dircycle/dircycle.plugin.zsh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins/dircycle/dircycle.plugin.zsh b/plugins/dircycle/dircycle.plugin.zsh index 12b20ab04..1e31105b1 100644 --- a/plugins/dircycle/dircycle.plugin.zsh +++ b/plugins/dircycle/dircycle.plugin.zsh @@ -26,5 +26,12 @@ insert-cycledright () { } zle -N insert-cycledright -bindkey "\e[1;6D" insert-cycledleft -bindkey "\e[1;6C" insert-cycledright + +# add key bindings for iTerm2 +if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then + bindkey "^[[1;6D" insert-cycledleft + bindkey "^[[1;6C" insert-cycledright +else + bindkey "\e[1;6D" insert-cycledleft + bindkey "\e[1;6C" insert-cycledright +fi \ No newline at end of file