summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Hilburn <bhilburn@gmail.com>2017-08-12 20:52:10 +0300
committerGitHub <noreply@github.com>2017-08-12 20:52:10 +0300
commit9f4faf7f21a992f32114f134dfb0737657241b37 (patch)
tree1e8de4a7dcb38e93c4d02ebd16aff4c4eea4d5da
parent02332d596214c8e68bd3e86a8d0b90d3a4d60cf1 (diff)
parente464b4e2a559508f9f4e0a9bc28a3b1e7d08fbd6 (diff)
Merge pull request #596 from eumiro/truncate_to_unique
Add TRUNCATE_TO_UNIQUE shortening dir strategy
-rw-r--r--README.md1
-rwxr-xr-xpowerlevel9k.zsh-theme21
-rwxr-xr-xtest/segments/dir.spec21
3 files changed, 43 insertions, 0 deletions
diff --git a/README.md b/README.md
index 225f14e7..9c17c2c5 100644
--- a/README.md
+++ b/README.md
@@ -367,6 +367,7 @@ Customizations available are:
|`truncate_from_right`|Just leaves the beginning of a folder name untouched. E.g. your folders will be truncated like so: "/ro../Pr../office". How many characters will be untouched is controlled by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`.|
|`truncate_with_package_name`|Search for a `package.json` or `composer.json` and prints the `name` field to abbreviate the directory path. The precedence and/or files could be set by `POWERLEVEL9K_DIR_PACKAGE_FILES=(package.json composer.json)`. If you have [jq](https://stedolan.github.io/jq/) installed, it will dramatically improve the speed of this strategy.|
|`truncate_with_folder_marker`|Search for a file that is specified by `POWERLEVEL9K_SHORTEN_FOLDER_MARKER` and truncate everything before that (if found, otherwise stop on $HOME and ROOT).|
+|`truncate_to_unique`|Parse all parent path components and truncate them to the shortest unique length. If you copy & paste the result to a shell, after hitting `TAB` it should expand to the original path unambiguously.|
For example, if you wanted the truncation behavior of the `fish` shell, which
truncates `/usr/share/plasma` to `/u/s/plasma`, you would use the following:
diff --git a/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme
index a4469406..3c34f0bb 100755
--- a/powerlevel9k.zsh-theme
+++ b/powerlevel9k.zsh-theme
@@ -780,6 +780,27 @@ prompt_dir() {
# the current path.
current_path=$current_path${PWD#${last_marked_folder}*}
;;
+ truncate_to_unique)
+ # for each parent path component find the shortest unique beginning
+ # characters sequence. Source: https://stackoverflow.com/a/45336078
+ paths=(${(s:/:)PWD})
+ cur_path='/'
+ cur_short_path='/'
+ for directory in ${paths[@]}
+ do
+ cur_dir=''
+ for (( i=0; i<${#directory}; i++ )); do
+ cur_dir+="${directory:$i:1}"
+ matching=("$cur_path"/"$cur_dir"*/)
+ if [[ ${#matching[@]} -eq 1 ]]; then
+ break
+ fi
+ done
+ cur_short_path+="$cur_dir/"
+ cur_path+="$directory/"
+ done
+ current_path="${cur_short_path: : -1}"
+ ;;
*)
current_path="$(print -P "%$((POWERLEVEL9K_SHORTEN_DIR_LENGTH+1))(c:$POWERLEVEL9K_SHORTEN_DELIMITER/:)%${POWERLEVEL9K_SHORTEN_DIR_LENGTH}c")"
;;
diff --git a/test/segments/dir.spec b/test/segments/dir.spec
index bb0297e2..ef27e160 100755
--- a/test/segments/dir.spec
+++ b/test/segments/dir.spec
@@ -406,4 +406,25 @@ function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndRightTruncat
unset POWERLEVEL9K_SHORTEN_STRATEGY
}
+function testTruncateToUniqueWorks() {
+ POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true
+ POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx'
+ POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
+ POWERLEVEL9K_SHORTEN_STRATEGY='truncate_to_unique'
+ mkdir -p /tmp/powerlevel9k-test/adam/devl
+ mkdir -p /tmp/powerlevel9k-test/alice/devl
+ mkdir -p /tmp/powerlevel9k-test/alice/docs
+ mkdir -p /tmp/powerlevel9k-test/bob/docs
+ cd /tmp/powerlevel9k-test/alice/devl
+
+ assertEquals "%K{blue} %F{black}txXxpxXxalxXxde %k%F{blue}%f " "$(build_left_prompt)"
+
+ cd -
+ rm -fr /tmp/powerlevel9k-test
+ unset POWERLEVEL9K_DIR_PATH_SEPARATOR
+ unset POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER
+ unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
+ unset POWERLEVEL9K_SHORTEN_STRATEGY
+}
+
source shunit2/source/2.1/src/shunit2