From 06ced8274de7c2edd19cd5be4642bb0ec0772437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kayhan=20G=C3=BCltekin?= Date: Sat, 27 Jul 2024 10:38:11 -0400 Subject: [PATCH] feat(dircycle): add bindings to go up or down in hierarchy (#12291) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- plugins/dircycle/README.md | 22 ++++++++------ plugins/dircycle/dircycle.plugin.zsh | 45 ++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 15 deletions(-) diff --git a/plugins/dircycle/README.md b/plugins/dircycle/README.md index 3c9b3a96f..c4105558d 100644 --- a/plugins/dircycle/README.md +++ b/plugins/dircycle/README.md @@ -37,13 +37,13 @@ Say you opened these directories on the terminal: 3 ~ ``` -By pressing Ctrl + Shift + Left, the current working directory or `$CWD` will be from `oh-my-zsh` to `Hacktoberfest`. Press it again and it will be at `Projects`. +By pressing Ctrl + Shift + Left, the current working directory or `$PWD` will be from `oh-my-zsh` to `Hacktoberfest`. Press it again and it will be at `Projects`. -And by pressing Ctrl + Shift + Right, the `$CWD` will be from `Projects` to `Hacktoberfest`. Press it again and it will be at `oh-my-zsh`. +And by pressing Ctrl + Shift + Right, the `$PWD` will be from `Projects` to `Hacktoberfest`. Press it again and it will be at `oh-my-zsh`. Here's a example history table with the same accessed directories like above: -| Current `$CWD` | Key press | New `$CWD` | +| Current `$PWD` | Key press | New `$PWD` | | --------------- | ----------------------------------------------------- | --------------- | | `oh-my-zsh` | Ctrl + Shift + Left | `Hacktoberfest` | | `Hacktoberfest` | Ctrl + Shift + Left | `Projects` | @@ -53,7 +53,7 @@ Here's a example history table with the same accessed directories like above: | `Hacktoberfest` | Ctrl + Shift + Right | `oh-my-zsh` | | `oh-my-zsh` | Ctrl + Shift + Right | `~` | -Note the last traversal, when pressing Ctrl + Shift + Right on a last known `$CWD`, it will change back to the first known `$CWD`, which in the example is `~`. +Note the last traversal, when pressing Ctrl + Shift + Right on a last known `$PWD`, it will change back to the first known `$PWD`, which in the example is `~`. Here's an asciinema cast demonstrating the example above: @@ -61,18 +61,22 @@ Here's an asciinema cast demonstrating the example above: ## Functions -| Function | Description | -| -------------------- | --------------------------------------------------------------------------------------------------------- | -| `insert-cycledleft` | Change `$CWD` to the previous known stack, binded on Ctrl + Shift + Left | -| `insert-cycledright` | Change `$CWD` to the next known stack, binded on Ctrl + Shift + Right | +| Function | Description | +| -------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `insert-cycledleft` | Change `$PWD` to the previous known stack, bound to Ctrl + Shift + Left | +| `insert-cycledright` | Change `$PWD` to the next known stack, bound to Ctrl + Shift + Right | +| `insert-cycledup` | Change `$PWD` to the parent folder, bound to Ctrl + Shift + Up | +| `insert-cycleddown` | Change `$PWD` to the first alphabetical child folder, bound to Ctrl + Shift + Down | ## Rebinding keys -You can bind these functions to other key sequences, as long as you know the bindkey sequence. For example, these commands bind to Alt + Shift + Left / Right in `xterm-256color`: +You can bind these functions to other key sequences, as long as you know the bindkey sequence. For example, these commands bind to Alt + Shift + key in `xterm-256color`: ```zsh bindkey '^[[1;4D' insert-cycledleft bindkey '^[[1;4C' insert-cycledright +bindkey "\e[1;4A" insert-cycledup +bindkey "\e[1;4B" insert-cycleddown ``` You can get the bindkey sequence by pressing Ctrl + V, then pressing the keyboard shortcut you want to use. diff --git a/plugins/dircycle/dircycle.plugin.zsh b/plugins/dircycle/dircycle.plugin.zsh index bb69f6b3f..8c03594ba 100644 --- a/plugins/dircycle/dircycle.plugin.zsh +++ b/plugins/dircycle/dircycle.plugin.zsh @@ -8,7 +8,16 @@ # pushd +N: start counting from left of `dirs' output # pushd -N: start counting from right of `dirs' output +# Either switch to a directory from dirstack, using +N or -N syntax +# or switch to a directory by path, using `switch-to-dir -- ` switch-to-dir () { + # If $1 is --, then treat $2 as a directory path + if [[ $1 == -- ]]; then + # We use `-q` because we don't want chpwd to run, we'll do it manually + [[ -d "$2" ]] && builtin pushd -q "$2" &>/dev/null + return $? + fi + setopt localoptions nopushdminus [[ ${#dirstack} -eq 0 ]] && return 1 @@ -22,10 +31,10 @@ switch-to-dir () { } insert-cycledleft () { - switch-to-dir +1 || return + switch-to-dir +1 || return $? local fn - for fn (chpwd $chpwd_functions precmd $precmd_functions); do + for fn in chpwd $chpwd_functions precmd $precmd_functions; do (( $+functions[$fn] )) && $fn done zle reset-prompt @@ -33,22 +42,46 @@ insert-cycledleft () { zle -N insert-cycledleft insert-cycledright () { - switch-to-dir -0 || return + switch-to-dir -0 || return $? local fn - for fn (chpwd $chpwd_functions precmd $precmd_functions); do + for fn in chpwd $chpwd_functions precmd $precmd_functions; do (( $+functions[$fn] )) && $fn done zle reset-prompt } zle -N insert-cycledright +insert-cycledup () { + switch-to-dir -- .. || return $? + + local fn + for fn in chpwd $chpwd_functions precmd $precmd_functions; do + (( $+functions[$fn] )) && $fn + done + zle reset-prompt +} +zle -N insert-cycledup + +insert-cycleddown () { + switch-to-dir -- "$(find . -mindepth 1 -maxdepth 1 -type d | sort -n | head -n 1)" || return $? + + local fn + for fn in chpwd $chpwd_functions precmd $precmd_functions; do + (( $+functions[$fn] )) && $fn + done + zle reset-prompt +} +zle -N insert-cycleddown # These sequences work for xterm, Apple Terminal.app, and probably others. # Not for rxvt-unicode, but it doesn't seem differentiate Ctrl-Shift-Arrow # from plain Shift-Arrow, at least by default. +# # iTerm2 does not have these key combinations defined by default; you will need # to add them under "Keys" in your profile if you want to use this. You can do # this conveniently by loading the "xterm with Numeric Keypad" preset. -bindkey "\e[1;6D" insert-cycledleft -bindkey "\e[1;6C" insert-cycledright +bindkey "\e[1;6D" insert-cycledleft # Ctrl+Shift+Left +bindkey "\e[1;6C" insert-cycledright # Ctrl+Shift+Right +bindkey "\e[1;6A" insert-cycledup # Ctrl+Shift+Up +bindkey "\e[1;6B" insert-cycleddown # Ctrl+Shift+Down