aboutsummaryrefslogtreecommitdiff
path: root/internal/p10k.zsh
diff options
context:
space:
mode:
authorromkatv <roman.perepelitsa@gmail.com>2019-08-28 19:55:33 +0300
committerromkatv <roman.perepelitsa@gmail.com>2019-08-28 19:55:33 +0300
commit5f610a0af908137758992e2355c5ed6df2d71723 (patch)
tree4f338d51eba4268cbe6daa0a41a85821598c05aa /internal/p10k.zsh
parent3a1ebea014690b8fd39531732ec8abbeabc2d1f0 (diff)
fix network interface and ip parsing
Diffstat (limited to 'internal/p10k.zsh')
-rwxr-xr-xinternal/p10k.zsh73
1 files changed, 34 insertions, 39 deletions
diff --git a/internal/p10k.zsh b/internal/p10k.zsh
index fc262ade..7c1f1945 100755
--- a/internal/p10k.zsh
+++ b/internal/p10k.zsh
@@ -212,44 +212,13 @@ _p9k_segment_in_use() {
}
function _p9k_parse_ip() {
- local desiredInterface=${1:-'^[^ ]+'}
-
- if [[ $_p9k_os == OSX ]]; then
- [[ -x /sbin/ifconfig ]] || return
- local rawInterfaces && rawInterfaces="$(/sbin/ifconfig -l 2>/dev/null)" || return
- local -a interfaces=(${(A)=rawInterfaces})
- local pattern="${desiredInterface}[^ ]?"
- local -a relevantInterfaces
- for rawInterface in $interfaces; do
- [[ "$rawInterface" =~ $pattern ]] && relevantInterfaces+=$MATCH
- done
- local newline=$'\n'
- local interfaceName interface
- for interfaceName in $relevantInterfaces; do
- interface="$(/sbin/ifconfig $interfaceName 2>/dev/null)" || continue
- [[ "${interface}" =~ "lo[0-9]*" ]] && continue
- if [[ "${interface//${newline}/}" =~ "<([^>]*)>(.*)inet[ ]+([^ ]*)" ]]; then
- local ipFound="${match[3]}"
- local -a interfaceStates=(${(s:,:)match[1]})
- if (( ${interfaceStates[(I)UP]} )); then
- _p9k_ret=$ipFound
- return
- fi
- fi
- done
- else
- [[ -x /sbin/ip ]] || return
- local -a interfaces=( "${(f)$(/sbin/ip -brief -4 a show 2>/dev/null)}" )
- local pattern="^${desiredInterface}[[:space:]]+UP[[:space:]]+([^/ ]+)"
- local interface
- for interface in "${(@)interfaces}"; do
- if [[ "$interface" =~ $pattern ]]; then
- _p9k_ret=$match[1]
- return
- fi
- done
- fi
-
+ local iface_regex="^${1:-.*}\$" iface ip
+ for iface ip in "${(@kv)_p9k_iface}"; do
+ if [[ $iface =~ $iface_regex ]]; then
+ _p9k_ret=$ip
+ return 0
+ fi
+ done
return 1
}
@@ -3075,6 +3044,23 @@ _p9k_preexec() {
_p9k_timer_start=EPOCHREALTIME
}
+function _p9k_set_iface() {
+ if [[ ! -x /sbin/ifconfig ]]; then
+ _p9k_iface=()
+ return
+ fi
+ local line
+ local iface
+ for line in ${(f)"$(/sbin/ifconfig 2>/dev/null)"}; do
+ if [[ $line == (#b)([^[:space:]:]##):[[:space:]]##flags=(<->)'<'* ]]; then
+ [[ $match[2] == *[13579] ]] && iface=$match[1] || iface=
+ elif [[ -n $iface && $line == (#b)[[:space:]]##inet[[:space:]]##([0-9.]##)* ]]; then
+ _p9k_iface[$iface]=$match[1]
+ iface=
+ fi
+ done
+}
+
function _p9k_build_segment() {
_p9k_segment_name=${_p9k_segment_name%_joined}
if [[ $_p9k_segment_name == custom_* ]]; then
@@ -3093,6 +3079,8 @@ function _p9k_set_prompt() {
PROMPT=$_p9k_prompt_prefix_left
RPROMPT=
+ (( _p9k_fetch_iface )) && _p9k_set_iface
+
local -i left_idx=1 right_idx=1 num_lines=$#_p9k_line_segments_left i
for i in {1..$num_lines}; do
local right=
@@ -3544,6 +3532,8 @@ _p9k_init_vars() {
typeset -gi _p9k_num_cpus
typeset -g _p9k_pwd
typeset -g _p9k_pwd_a
+ typeset -gA _p9k_iface
+ typeset -gi _p9k_fetch_iface
typeset -g P9K_VISUAL_IDENTIFIER
typeset -g P9K_CONTENT
@@ -3686,7 +3676,7 @@ _p9k_init_params() {
_p9k_declare -i POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH
_p9k_declare -e POWERLEVEL9K_SHORTEN_DELIMITER
_p9k_declare -i POWERLEVEL9K_SHORTEN_DIR_LENGTH
- _p9k_declare -s POWERLEVEL9K_IP_INTERFACE "^[^ ]+"
+ _p9k_declare -s POWERLEVEL9K_IP_INTERFACE ""
_p9k_declare -s POWERLEVEL9K_VPN_IP_INTERFACE "tun"
_p9k_declare -i POWERLEVEL9K_LOAD_WHICH 5
_p9k_declare -b POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW 0
@@ -4328,6 +4318,11 @@ _p9k_init() {
fi
_p9k_wrap_zle_widget zle-keymap-select _p9k_zle_keymap_select
+
+ if [[ -n $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]] && _p9k_segment_in_use public_ip ||
+ _p9k_segment_in_use ip || _p9k_segment_in_use vpn_ip; then
+ _p9k_fetch_iface=1
+ fi
}
_p9k_deinit() {