Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions conf.d/pure.fish
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions docs/components/features-list.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
| **`pure_begin_prompt_with_current_directory`** | `true` | `true`: _`pwd` `git`, `SSH`, duration_.<br/>`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)"

Expand All @@ -66,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 |
Expand Down
17 changes: 15 additions & 2 deletions functions/_pure_parse_directory.fish
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
6 changes: 6 additions & 0 deletions tests/_pure.test.fish
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
58 changes: 58 additions & 0 deletions tests/_pure_parse_directory.test.fish
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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


27 changes: 27 additions & 0 deletions tools/screenshot.fish
Original file line number Diff line number Diff line change
Expand Up @@ -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" (
Expand Down