From 5db9c53b19221b07de3a3ca1d9b57df9c85661fa Mon Sep 17 00:00:00 2001 From: Will Bailey Date: Wed, 15 Jul 2026 14:31:32 +0800 Subject: [PATCH 1/3] Add feature, tests, and docs --- conf.d/pure.fish | 1 + docs/components/features-list.md | 1 + functions/_pure_parse_directory.fish | 17 +++++++- tests/_pure.test.fish | 6 +++ tests/_pure_parse_directory.test.fish | 58 +++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/conf.d/pure.fish b/conf.d/pure.fish index 6bc28ff5..68448d21 100644 --- a/conf.d/pure.fish +++ b/conf.d/pure.fish @@ -21,6 +21,7 @@ _pure_set_default pure_color_prompt_on_success pure_color_success _pure_set_default pure_color_current_directory pure_color_primary _pure_set_default pure_shorten_prompt_current_directory_length 0 _pure_set_default pure_truncate_prompt_current_directory_keeps -1 +_pure_set_default pure_truncate_prompt_current_directory_to_git_root false # Git _pure_set_default pure_enable_git true diff --git a/docs/components/features-list.md b/docs/components/features-list.md index 1b1f5039..39f71255 100644 --- a/docs/components/features-list.md +++ b/docs/components/features-list.md @@ -55,6 +55,7 @@ | **`pure_begin_prompt_with_current_directory`** | `true` | `true`: _`pwd` `git`, `SSH`, duration_.
`false`: _`SSH` `pwd` `git`, duration_. | | **`pure_shorten_prompt_current_directory_length`** | `0` | Shorten every prompt path component but the last to X characters (0 do not shorten) | | **`pure_truncate_prompt_current_directory_keeps`** | `0` | Truncate working directory path in prompt, but keeps the last to `n` components (`0` full path in current directory) | +| **`pure_truncate_prompt_current_directory_to_git_root`** | `false` | `true`: truncate working directory path in prompt to be relative to the git repository root (keeps the repo folder name and subpath) | === "Enabled (pwd first)" diff --git a/functions/_pure_parse_directory.fish b/functions/_pure_parse_directory.fish index f28924b5..fdd2fd1e 100644 --- a/functions/_pure_parse_directory.fish +++ b/functions/_pure_parse_directory.fish @@ -2,12 +2,25 @@ function _pure_parse_directory \ --description "Replace '$HOME' with '~'" \ --argument-names max_path_length - set --local folder (fish_prompt_pwd_dir_length=$pure_shorten_prompt_current_directory_length prompt_pwd) + set --local directory $PWD + + if test "$pure_truncate_prompt_current_directory_to_git_root" = true + and type -q --no-functions git # skip when `git` is not available + + set --local git_root (command git rev-parse --show-toplevel 2>/dev/null) + + if test -n "$git_root" + set --local git_subpath (command git rev-parse --show-prefix 2>/dev/null) + set directory (string trim --right --chars=/ -- (basename $git_root)/$git_subpath) + end + end + + set --local folder (fish_prompt_pwd_dir_length=$pure_shorten_prompt_current_directory_length prompt_pwd $directory) if test -n "$max_path_length" if test (string length $folder) -gt $max_path_length # If path exceeds maximum symbol limit, force fish path formating function to use 1 character - set folder (fish_prompt_pwd_dir_length=1 prompt_pwd) + set folder (fish_prompt_pwd_dir_length=1 prompt_pwd $directory) end end diff --git a/tests/_pure.test.fish b/tests/_pure.test.fish index bece8607..a04b4ed6 100644 --- a/tests/_pure.test.fish +++ b/tests/_pure.test.fish @@ -405,6 +405,12 @@ before_all echo $pure_truncate_prompt_current_directory_keeps ) = -1 +@test "configure: pure_truncate_prompt_current_directory_to_git_root" ( + set --erase pure_truncate_prompt_current_directory_to_git_root + source (status dirname)/../conf.d/pure.fish + echo $pure_truncate_prompt_current_directory_to_git_root +) = false + @test "configure: pure_truncate_window_title_current_directory_keeps" ( set --erase pure_truncate_window_title_current_directory_keeps source (status dirname)/../conf.d/pure.fish diff --git a/tests/_pure_parse_directory.test.fish b/tests/_pure_parse_directory.test.fish index ed812800..43408ebf 100644 --- a/tests/_pure_parse_directory.test.fish +++ b/tests/_pure_parse_directory.test.fish @@ -8,6 +8,7 @@ function before_each _disable_colors set --universal pure_shorten_prompt_current_directory_length 0 set --universal pure_truncate_prompt_current_directory_keeps 0 + set --universal pure_truncate_prompt_current_directory_to_git_root false end function after_each @@ -76,4 +77,61 @@ before_each _pure_parse_directory ) = /tmp/current/directory +before_each +@test '_pure_parse_directory: git root - returns repo folder name only when cwd is the repo root' ( + set --universal pure_truncate_prompt_current_directory_to_git_root true + + mkdir -p /tmp/test_pure_parse_directory_git_root/pure + cd /tmp/test_pure_parse_directory_git_root/pure + git init --quiet + + _pure_parse_directory +) = pure + +before_each +@test '_pure_parse_directory: git root - returns repo folder name and subpath when in a subdirectory' ( + set --universal pure_truncate_prompt_current_directory_to_git_root true + + mkdir -p /tmp/test_pure_parse_directory_git_root/pure/functions + cd /tmp/test_pure_parse_directory_git_root/pure + git init --quiet + cd functions + + _pure_parse_directory +) = pure/functions + +before_each +@test '_pure_parse_directory: git root - leaves full path untouched when cwd is not a git repository' ( + set --universal pure_truncate_prompt_current_directory_to_git_root true + + mkdir -p /tmp/current/directory/ + cd /tmp/current/directory/ + + _pure_parse_directory +) = $PWD + +before_each +@test '_pure_parse_directory: git root - leaves full path untouched when disabled (default), even inside a git repository' ( + set --universal pure_truncate_prompt_current_directory_to_git_root false + + mkdir -p /tmp/test_pure_parse_directory_git_root/pure + cd /tmp/test_pure_parse_directory_git_root/pure + git init --quiet + + _pure_parse_directory +) = $PWD + +before_each +@test '_pure_parse_directory: git root - applies pure_truncate_prompt_current_directory_keeps on top of git-root truncation' ( + set --universal pure_truncate_prompt_current_directory_to_git_root true + set --universal pure_truncate_prompt_current_directory_keeps 1 + + mkdir -p /tmp/test_pure_parse_directory_git_root/pure/functions + cd /tmp/test_pure_parse_directory_git_root/pure + git init --quiet + cd functions + + _pure_parse_directory +) = functions + From 1fd73dd1065649720862cf39ab87058ddc88b50f Mon Sep 17 00:00:00 2001 From: Will Bailey Date: Wed, 15 Jul 2026 15:37:30 +0800 Subject: [PATCH 2/3] Add screenshots and feature list --- docs/components/features-list.md | 10 ++++++++++ tools/screenshot.fish | 27 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/docs/components/features-list.md b/docs/components/features-list.md index 39f71255..ab5302fe 100644 --- a/docs/components/features-list.md +++ b/docs/components/features-list.md @@ -67,6 +67,16 @@ ![screenshot pure_begin_prompt_with_current_directory=false](/pure/assets/screenshots/light-pure_begin_prompt_with_current_directory%3Dfalse.png#only-light) ![screenshot pure_begin_prompt_with_current_directory=false](/pure/assets/screenshots/mirage-pure_begin_prompt_with_current_directory%3Dfalse.png#only-dark) +=== "Truncated to git root" + + ![screenshot pure_truncate_prompt_current_directory_to_git_root=true](/pure/assets/screenshots/light-pure_truncate_prompt_current_directory_to_git_root%3Dtrue.png#only-light) + ![screenshot pure_truncate_prompt_current_directory_to_git_root=true](/pure/assets/screenshots/mirage-pure_truncate_prompt_current_directory_to_git_root%3Dtrue.png#only-dark) + +=== "Not truncated to git root" + + ![screenshot pure_truncate_prompt_current_directory_to_git_root=false](/pure/assets/screenshots/light-pure_truncate_prompt_current_directory_to_git_root%3Dfalse.png#only-light) + ![screenshot pure_truncate_prompt_current_directory_to_git_root=false](/pure/assets/screenshots/mirage-pure_truncate_prompt_current_directory_to_git_root%3Dfalse.png#only-dark) + ### Git | Option | Default | Description | diff --git a/tools/screenshot.fish b/tools/screenshot.fish index 34e2ebb4..afceeb5b 100644 --- a/tools/screenshot.fish +++ b/tools/screenshot.fish @@ -367,6 +367,33 @@ if set --query CI screenshot "pure_show_prefix_root_prompt=true" ) $status -eq $SUCCESS + # Truncate current directory to git root + before_each + @test "screenshot: pure_truncate_prompt_current_directory_to_git_root=false" ( + set --universal pure_truncate_prompt_current_directory_to_git_root false + + mkdir -p $__fish_config_dir/pure/functions + git init --quiet $__fish_config_dir/pure + pushd $__fish_config_dir/pure/functions + + screenshot "pure_truncate_prompt_current_directory_to_git_root=false" + + popd + ) $status -eq $SUCCESS + + before_each + @test "screenshot: pure_truncate_prompt_current_directory_to_git_root=true" ( + set --universal pure_truncate_prompt_current_directory_to_git_root true + + mkdir -p $__fish_config_dir/pure/functions + git init --quiet $__fish_config_dir/pure + pushd $__fish_config_dir/pure/functions + + screenshot "pure_truncate_prompt_current_directory_to_git_root=true" + + popd + ) $status -eq $SUCCESS + # Begin prompt with current directory before_each @test "screenshot: pure_begin_prompt_with_current_directory=false" ( From d9ad2085a3444e40131aec45826c61bcd99aee84 Mon Sep 17 00:00:00 2001 From: Will Bailey Date: Wed, 15 Jul 2026 15:53:55 +0800 Subject: [PATCH 3/3] Add readme entry --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ff0552b9..766ec948 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ Fully **customizable** (colors, symbols and features): * [Update terminal title with _current folder_ and _command_ πŸ› ][title] ; * [Shorten or truncate _current folder_ component πŸ΄πŸ› ][current-working-directory] ; +* [Truncate _current folder_ path to the git repository root 🏴][current-working-directory] ; * and more… 🏴 means it's controlled by a feature flag, πŸ›  means it's configurable.