mirror of
https://github.com/romkatv/powerlevel10k.git
synced 2024-11-11 00:00:06 +00:00
Merge branch 'next' into dir_first_character
This commit is contained in:
commit
36d74f34c2
7 changed files with 148 additions and 37 deletions
|
@ -20,6 +20,10 @@ Added an option to configure the path separator. If you want something
|
|||
else than an ordinary slash, you could set
|
||||
`POWERLEVEL9K_DIR_PATH_SEPARATOR` to whatever you want.
|
||||
|
||||
### New segment 'dir_writable' added
|
||||
|
||||
This segment displays a lock icon if your user has no write permissions in the current folder.
|
||||
|
||||
### New segment 'disk_usage' added
|
||||
|
||||
This segment will show the usage level of your current partition.
|
||||
|
|
13
README.md
13
README.md
|
@ -89,6 +89,7 @@ The segments that are currently available are:
|
|||
* [`battery`](#battery) - Current battery status.
|
||||
* [`context`](#context) - Your username and host.
|
||||
* [`dir`](#dir) - Your current working directory.
|
||||
* `dir_writable` - Displays a lock icon, if you do not have write permissions on the current folder.
|
||||
* [`disk_usage`](#disk_usage) - Disk usage of your current partition.
|
||||
* `history` - The command number for the current line.
|
||||
* [`ip`](#ip) - Shows the current IP address.
|
||||
|
@ -278,9 +279,17 @@ Customizations available are:
|
|||
| Variable | Default Value | Description |
|
||||
|----------|---------------|-------------|
|
||||
|`POWERLEVEL9K_SHORTEN_DIR_LENGTH`|`2`|If your shorten strategy, below, is entire directories, this field determines how many directories to leave at the end. If your shorten strategy is by character count, this field determines how many characters to allow per directory string.|
|
||||
|`POWERLEVEL9K_SHORTEN_STRATEGY`|None|How the directory strings should be truncated. By default, it will truncate whole directories. Other options are `truncate_middle`, which leaves the start and end of the directory strings, and `truncate_from_right`, which cuts starting from the end of the string. You can also use `truncate_with_package_name` to use the `package.json` `name` field to abbreviate the directory path.|
|
||||
|`POWERLEVEL9K_SHORTEN_STRATEGY`|None|How the directory strings should be truncated. See the table below for more informations.|
|
||||
|`POWERLEVEL9K_SHORTEN_DELIMITER`|`..`|Delimiter to use in truncated strings. This can be any string you choose, including an empty string if you wish to have no delimiter.|
|
||||
|
||||
| Strategy Name | Description |
|
||||
|---------------|-------------|
|
||||
|Default|Truncate whole directories from left. How many is defined by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`|
|
||||
|`truncate_middle`|Truncates the middle part of a folder. E.g. you are in a folder named "~/MySuperProjects/AwesomeFiles/BoringOffice", then it will truncated to "~/MyS..cts/Awe..les/BoringOffice", if `POWERLEVEL9K_SHORTEN_DIR_LENGTH=3` is also set (controls the amount of characters to be left).|
|
||||
|`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`|Use the `package.json` `name` field to abbreviate the directory path.|
|
||||
|`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).|
|
||||
|
||||
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:
|
||||
```zsh
|
||||
|
@ -351,7 +360,7 @@ segment will not be displayed.
|
|||
|`POWERLEVEL9K_PUBLIC_IP_FILE`|'/tmp/p8k_public_ip'|This is the file your public IP is cached in.|
|
||||
|`POWERLEVEL9K_PUBLIC_IP_HOST`|'http://ident.me'|This is the default host to get your public IP.|
|
||||
|`POWERLEVEL9K_PUBLIC_IP_TIMEOUT`|300|The amount of time in seconds between refreshing your cached IP.|
|
||||
|`POWERLEVEL9K_PUBLIC_IP_METHOD`|None|You can set this to any of 'dig', 'curl', or 'wget' to only use that method to refresh your IP.|
|
||||
|`POWERLEVEL9K_PUBLIC_IP_METHODS`|(dig curl wget)| These methods in that order are used to refresh your IP.|
|
||||
|`POWERLEVEL9K_PUBLIC_IP_NONE`|None|The string displayed when an IP was not obtained|
|
||||
|
||||
##### rbenv
|
||||
|
|
|
@ -78,6 +78,7 @@ case $POWERLEVEL9K_MODE in
|
|||
PYTHON_ICON $'\U1F40D' # 🐍
|
||||
SWIFT_ICON ''
|
||||
PUBLIC_IP_ICON ''
|
||||
LOCK_ICON $'\UE138' #
|
||||
)
|
||||
;;
|
||||
'awesome-fontconfig')
|
||||
|
@ -138,6 +139,7 @@ case $POWERLEVEL9K_MODE in
|
|||
PYTHON_ICON $'\U1F40D' # 🐍
|
||||
SWIFT_ICON ''
|
||||
PUBLIC_IP_ICON ''
|
||||
LOCK_ICON $'\UE138' #
|
||||
)
|
||||
;;
|
||||
*)
|
||||
|
@ -198,6 +200,7 @@ case $POWERLEVEL9K_MODE in
|
|||
PYTHON_ICON ''
|
||||
SWIFT_ICON 'Swift'
|
||||
PUBLIC_IP_ICON ''
|
||||
LOCK_ICON $'\UE0A2'
|
||||
)
|
||||
;;
|
||||
esac
|
||||
|
|
|
@ -208,3 +208,19 @@ function truncatePathFromRight() {
|
|||
echo $1 | sed $SED_EXTENDED_REGEX_PARAMETER \
|
||||
"s@(([^/]{$((POWERLEVEL9K_SHORTEN_DIR_LENGTH))})([^/]{$delim_len}))[^/]+/@\2$POWERLEVEL9K_SHORTEN_DELIMITER/@g"
|
||||
}
|
||||
|
||||
# Search recursively in parent folders for given file.
|
||||
function upsearch () {
|
||||
if [[ "$PWD" == "$HOME" || "$PWD" == "/" ]]; then
|
||||
echo "$PWD"
|
||||
elif test -e "$1"; then
|
||||
pushd .. > /dev/null
|
||||
upsearch "$1"
|
||||
popd > /dev/null
|
||||
echo "$PWD"
|
||||
else
|
||||
pushd .. > /dev/null
|
||||
upsearch "$1"
|
||||
popd > /dev/null
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -469,12 +469,18 @@ prompt_battery() {
|
|||
fi
|
||||
}
|
||||
|
||||
# Public IP segment
|
||||
# Parameters:
|
||||
# * $1 Alignment: string - left|right
|
||||
# * $2 Index: integer
|
||||
# * $3 Joined: bool - If the segment should be joined
|
||||
prompt_public_ip() {
|
||||
# set default values for segment
|
||||
set_default POWERLEVEL9K_PUBLIC_IP_TIMEOUT "300"
|
||||
set_default POWERLEVEL9K_PUBLIC_IP_NONE ""
|
||||
set_default POWERLEVEL9K_PUBLIC_IP_FILE "/tmp/p9k_public_ip"
|
||||
set_default POWERLEVEL9K_PUBLIC_IP_HOST "http://ident.me"
|
||||
defined POWERLEVEL9K_PUBLIC_IP_METHODS || POWERLEVEL9K_PUBLIC_IP_METHODS=(dig curl wget)
|
||||
|
||||
# Do we need a fresh IP?
|
||||
local refresh_ip=false
|
||||
|
@ -491,52 +497,39 @@ prompt_public_ip() {
|
|||
fi
|
||||
|
||||
# grab a fresh IP if needed
|
||||
local fresh_ip
|
||||
if [[ $refresh_ip =~ true && -w $POWERLEVEL9K_PUBLIC_IP_FILE ]]; then
|
||||
# if method specified, don't use fallback methods
|
||||
if [[ -n $POWERLEVEL9K_PUBLIC_IP_METHOD ]] && [[ $POWERLEVEL9K_PUBLIC_IP_METHOD =~ 'wget|curl|dig' ]]; then
|
||||
local method=$POWERLEVEL9K_PUBLIC_IP_METHOD
|
||||
fi
|
||||
if [[ -n $method ]]; then
|
||||
for method in "${POWERLEVEL9K_PUBLIC_IP_METHODS[@]}"; do
|
||||
case $method in
|
||||
'dig')
|
||||
if type -p dig >/dev/null; then
|
||||
fresh_ip="$(dig +time=1 +tries=1 +short myip.opendns.com @resolver1.opendns.com 2> /dev/null)"
|
||||
[[ "$fresh_ip" =~ ^\; ]] && unset fresh_ip
|
||||
fi
|
||||
fresh_ip="$(dig +time=1 +tries=1 +short myip.opendns.com @resolver1.opendns.com 2> /dev/null)"
|
||||
[[ "$fresh_ip" =~ ^\; ]] && unset fresh_ip
|
||||
;;
|
||||
'curl')
|
||||
if [[ -z "$fresh_ip" ]] && type -p curl >/dev/null; then
|
||||
fresh_ip="$(curl --max-time 10 -w '\n' "$POWERLEVEL9K_PUBLIC_IP_HOST" 2> /dev/null)"
|
||||
fi
|
||||
fresh_ip="$(curl --max-time 10 -w '\n' "$POWERLEVEL9K_PUBLIC_IP_HOST" 2> /dev/null)"
|
||||
;;
|
||||
'wget')
|
||||
if [[ -z "$fresh_ip" ]] && type -p wget >/dev/null; then
|
||||
fresh_ip="$(wget -T 10 -qO- "$POWERLEVEL9K_PUBLIC_IP_HOST" 2> /dev/null)"
|
||||
fi
|
||||
fresh_ip="$(wget -T 10 -qO- "$POWERLEVEL9K_PUBLIC_IP_HOST" 2> /dev/null)"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
if type -p dig >/dev/null; then
|
||||
fresh_ip="$(dig +time=1 +tries=1 +short myip.opendns.com @resolver1.opendns.com 2> /dev/null)"
|
||||
[[ "$fresh_ip" =~ ^\; ]] && unset fresh_ip
|
||||
# If we found a fresh IP, break loop.
|
||||
if [[ -n "${fresh_ip}" ]]; then
|
||||
break;
|
||||
fi
|
||||
|
||||
if [[ -z "$fresh_ip" ]] && type -p curl >/dev/null; then
|
||||
fresh_ip="$(curl --max-time 10 -w '\n' "$POWERLEVEL9K_PUBLIC_IP_HOST" 2> /dev/null)"
|
||||
fi
|
||||
|
||||
if [[ -z "$fresh_ip" ]] && type -p wget >/dev/null; then
|
||||
fresh_ip="$(wget -T 10 -qO- "$POWERLEVEL9K_PUBLIC_IP_HOST" 2> /dev/null)"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# write IP to tmp file or clear tmp file if an IP was not retrieved
|
||||
[[ -n $fresh_ip ]] && echo $fresh_ip > $POWERLEVEL9K_PUBLIC_IP_FILE || echo $POWERLEVEL9K_PUBLIC_IP_NONE > $POWERLEVEL9K_PUBLIC_IP_FILE
|
||||
# Redirection with `>!`. From the manpage: Same as >, except that the file
|
||||
# is truncated to zero length if it exists, even if CLOBBER is unset.
|
||||
# If the file already exists, and a simple `>` redirection and CLOBBER
|
||||
# unset, ZSH will produce an error.
|
||||
[[ -n "${fresh_ip}" ]] && echo $fresh_ip >! $POWERLEVEL9K_PUBLIC_IP_FILE || echo $POWERLEVEL9K_PUBLIC_IP_NONE >! $POWERLEVEL9K_PUBLIC_IP_FILE
|
||||
fi
|
||||
|
||||
# read public IP saved to tmp file
|
||||
local public_ip=$(cat $POWERLEVEL9K_PUBLIC_IP_FILE)
|
||||
local public_ip="$(cat $POWERLEVEL9K_PUBLIC_IP_FILE)"
|
||||
|
||||
# Draw the prompt segment
|
||||
if [[ -n $public_ip ]]; then
|
||||
$1_prompt_segment "$0" "$2" "$DEFAULT_COLOR" "$DEFAULT_COLOR_INVERTED" "${public_ip}" 'PUBLIC_IP_ICON'
|
||||
fi
|
||||
|
@ -571,8 +564,7 @@ prompt_custom() {
|
|||
set_default POWERLEVEL9K_DIR_PATH_SEPARATOR "/"
|
||||
prompt_dir() {
|
||||
local current_path="$(print -P "%~")"
|
||||
if [[ -n "$POWERLEVEL9K_SHORTEN_DIR_LENGTH" ]]; then
|
||||
|
||||
if [[ -n "$POWERLEVEL9K_SHORTEN_DIR_LENGTH" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_with_folder_marker" ]]; then
|
||||
set_default POWERLEVEL9K_SHORTEN_DELIMITER $'\U2026'
|
||||
|
||||
case "$POWERLEVEL9K_SHORTEN_STRATEGY" in
|
||||
|
@ -587,12 +579,24 @@ prompt_dir() {
|
|||
|
||||
# Get the path of the Git repo, which should have the package.json file
|
||||
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == "true" ]]; then
|
||||
package_path=$(git rev-parse --show-toplevel)
|
||||
# Get path from the root of the git repository to the current dir
|
||||
local gitPath=$(git rev-parse --show-prefix)
|
||||
# Remove trailing slash from git path, so that we can
|
||||
# remove that git path from the pwd.
|
||||
gitPath=${gitPath%/}
|
||||
package_path=${$(pwd)%%$gitPath}
|
||||
# Remove trailing slash
|
||||
package_path=${package_path%/}
|
||||
elif [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) == "true" ]]; then
|
||||
package_path=${$(pwd)%%/.git*}
|
||||
fi
|
||||
|
||||
zero='%([BSUbfksu]|([FB]|){*})'
|
||||
# Replace the shortest possible match of the marked folder from
|
||||
# the current path. Remove the amount of characters up to the
|
||||
# folder marker from the left. Count only the visible characters
|
||||
# in the path (this is done by the "zero" pattern; see
|
||||
# http://stackoverflow.com/a/40855342/5586433).
|
||||
local zero='%([BSUbfksu]|([FB]|){*})'
|
||||
current_dir=$(pwd)
|
||||
# Then, find the length of the package_path string, and save the
|
||||
# subdirectory path as a substring of the current directory's path from 0
|
||||
|
@ -610,6 +614,32 @@ prompt_dir() {
|
|||
current_path=$(truncatePathFromRight "$(pwd | sed -e "s,^$HOME,~,")" )
|
||||
fi
|
||||
;;
|
||||
truncate_with_folder_marker)
|
||||
local last_marked_folder marked_folder
|
||||
set_default POWERLEVEL9K_SHORTEN_FOLDER_MARKER ".shorten_folder_marker"
|
||||
|
||||
# Search for the folder marker in the parent directories and
|
||||
# buildup a pattern that is removed from the current path
|
||||
# later on.
|
||||
for marked_folder in $(upsearch $POWERLEVEL9K_SHORTEN_FOLDER_MARKER); do
|
||||
if [[ "$marked_folder" == "/" ]]; then
|
||||
# If we reached root folder, stop upsearch.
|
||||
current_path="/"
|
||||
elif [[ "$marked_folder" == "$HOME" ]]; then
|
||||
# If we reached home folder, stop upsearch.
|
||||
current_path="~"
|
||||
elif [[ "${marked_folder%/*}" == $last_marked_folder ]]; then
|
||||
current_path="${current_path%/}/${marked_folder##*/}"
|
||||
else
|
||||
current_path="${current_path%/}/$POWERLEVEL9K_SHORTEN_DELIMITER/${marked_folder##*/}"
|
||||
fi
|
||||
last_marked_folder=$marked_folder
|
||||
done
|
||||
|
||||
# Replace the shortest possible match of the marked folder from
|
||||
# the current path.
|
||||
current_path=$current_path${PWD#${last_marked_folder}*}
|
||||
;;
|
||||
*)
|
||||
current_path="$(print -P "%$((POWERLEVEL9K_SHORTEN_DIR_LENGTH+1))(c:$POWERLEVEL9K_SHORTEN_DELIMITER/:)%${POWERLEVEL9K_SHORTEN_DIR_LENGTH}c")"
|
||||
;;
|
||||
|
@ -1118,6 +1148,13 @@ prompt_swift_version() {
|
|||
"$1_prompt_segment" "$0" "$2" "magenta" "white" "${swift_version}" 'SWIFT_ICON'
|
||||
}
|
||||
|
||||
# dir_writable: Display information about the user's permission to write in the current directory
|
||||
prompt_dir_writable() {
|
||||
if [[ ! -w "$PWD" ]]; then
|
||||
"$1_prompt_segment" "$0_FORBIDDEN" "$2" "red" "226" "" 'LOCK_ICON'
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################
|
||||
# Prompt processing and drawing
|
||||
################################################################
|
||||
|
@ -1244,4 +1281,3 @@ prompt_powerlevel9k_setup() {
|
|||
}
|
||||
|
||||
prompt_powerlevel9k_setup "$@"
|
||||
|
||||
|
|
1
prompt_powerlevel9k_setup
Symbolic link
1
prompt_powerlevel9k_setup
Symbolic link
|
@ -0,0 +1 @@
|
|||
powerlevel9k.zsh-theme
|
|
@ -72,6 +72,48 @@ function testTruncationFromRightWorks() {
|
|||
unset POWERLEVEL9K_SHORTEN_STRATEGY
|
||||
}
|
||||
|
||||
function testTruncateWithFolderMarkerWorks() {
|
||||
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
|
||||
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_with_folder_marker"
|
||||
|
||||
local BASEFOLDER=/tmp/powerlevel9k-test
|
||||
local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567
|
||||
mkdir -p $FOLDER
|
||||
# Setup folder marker
|
||||
touch $BASEFOLDER/1/12/.shorten_folder_marker
|
||||
cd $FOLDER
|
||||
assertEquals "%K{blue} %F{black}/…/12/123/1234/12345/123456/1234567 %k%F{blue}%f " "$(build_left_prompt)"
|
||||
|
||||
cd -
|
||||
rm -fr $BASEFOLDER
|
||||
unset BASEFOLDER
|
||||
unset FOLDER
|
||||
unset POWERLEVEL9K_SHORTEN_STRATEGY
|
||||
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
|
||||
}
|
||||
|
||||
function testTruncateWithFolderMarkerWithChangedFolderMarker() {
|
||||
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
|
||||
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_with_folder_marker"
|
||||
POWERLEVEL9K_SHORTEN_FOLDER_MARKER='.xxx'
|
||||
|
||||
local BASEFOLDER=/tmp/powerlevel9k-test
|
||||
local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567
|
||||
mkdir -p $FOLDER
|
||||
# Setup folder marker
|
||||
touch $BASEFOLDER/1/12/.xxx
|
||||
cd $FOLDER
|
||||
assertEquals "%K{blue} %F{black}/…/12/123/1234/12345/123456/1234567 %k%F{blue}%f " "$(build_left_prompt)"
|
||||
|
||||
cd -
|
||||
rm -fr $BASEFOLDER
|
||||
unset BASEFOLDER
|
||||
unset FOLDER
|
||||
unset POWERLEVEL9K_SHORTEN_FOLDER_MARKER
|
||||
unset POWERLEVEL9K_SHORTEN_STRATEGY
|
||||
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
|
||||
}
|
||||
|
||||
function testHomeFolderDetectionWorks() {
|
||||
POWERLEVEL9K_HOME_ICON='home-icon'
|
||||
|
||||
|
|
Loading…
Reference in a new issue