erikw / tmux-powerline

⚡️ A tmux plugin giving you a hackable status bar consisting of dynamic & beautiful looking powerline segments, written purely in bash.
BSD 3-Clause "New" or "Revised" License
3.37k stars 511 forks source link

Battery segment not displaying #331

Closed skywarth closed 10 months ago

skywarth commented 10 months ago

Hi,

I just installed tmux-powerline and was about to customize it. So far all the segments defined in the default configs seems to be working, except for battery segment. It simply doesn't display it at all. I disabled all other segments to test maybe it wasn't able to fit in the stack width, that didn't change anything. Screenshot below, certain fields are hidden:

BTW: default tmux (without tmux-powerline plugin) displays the battery just fine.

Screenshot from 2023-09-22 01-38-58

My configuration (basically default config):

# Default configuration file for tmux-powerline.
# Modeline {
#    vi: foldmarker={,} foldmethod=marker foldlevel=0 tabstop=4 filetype=sh
# }

# General {
    # Show which segment fails and its exit code.
    export TMUX_POWERLINE_DEBUG_MODE_ENABLED="false"
    # Use patched font symbols.
    export TMUX_POWERLINE_PATCHED_FONT_IN_USE="true"

    # The theme to use.
    export TMUX_POWERLINE_THEME="my-theme"
    # Overlay directory to look for themes. There you can put your own themes outside the repo. Fallback will still be the "themes" directory in the repo.
    export TMUX_POWERLINE_DIR_USER_THEMES="${XDG_CONFIG_HOME:-$HOME/.config}/tmux-powerline/themes"
    # Overlay directory to look for segments. There you can put your own segments outside the repo. Fallback will still be the "segments" directory in the repo.
    export TMUX_POWERLINE_DIR_USER_SEGMENTS="${XDG_CONFIG_HOME:-$HOME/.config}/tmux-powerline/segments"

    # The initial visibility of the status bar. Can be {"on, off"}.
    export TMUX_POWERLINE_STATUS_VISIBILITY="on"
    # The status bar refresh interval in seconds.
    # Note that events that force-refresh the status bar (such as window renaming) will ignore this.
    export TMUX_POWERLINE_STATUS_INTERVAL="1"
    # The location of the window list. Can be {"absolute-centre, centre, left, right"}.
    # Note that "absolute-centre" is only supported on `tmux -V` >= 3.2.
    export TMUX_POWERLINE_STATUS_JUSTIFICATION="centre"

    # The maximum length of the left status bar.
    export TMUX_POWERLINE_STATUS_LEFT_LENGTH="60"
    # The maximum length of the right status bar.
    export TMUX_POWERLINE_STATUS_RIGHT_LENGTH="90"

    # Uncomment these if you want to enable tmux bindings for muting (hiding) one of the status bars.
    # E.g. this example binding would mute the left status bar when pressing <prefix> followed by Ctrl-[
    #export TMUX_POWERLINE_MUTE_LEFT_KEYBINDING="C-["
    #export TMUX_POWERLINE_MUTE_RIGHT_KEYBINDING="C-]"
# }

# battery.sh {
    # How to display battery remaining. Can be {percentage, cute}.
    export TMUX_POWERLINE_SEG_BATTERY_TYPE="percentage"
    # How may hearts to show if cute indicators are used.
    export TMUX_POWERLINE_SEG_BATTERY_NUM_HEARTS="5"
# }

# date.sh {
    # date(1) format for the date. If you don't, for some reason, like ISO 8601 format you might want to have "%D" or "%m/%d/%Y".
    export TMUX_POWERLINE_SEG_DATE_FORMAT="%F"
# }

# disk_usage.sh {
    # Filesystem to retrieve disk space information. Any from the filesystems available (run "df | awk '{print }'" to check them).
    export TMUX_POWERLINE_SEG_DISK_USAGE_FILESYSTEM="/"
# }

# earthquake.sh {
    # The data provider to use. Currently only "goo" is supported.
    export TMUX_POWERLINE_SEG_EARTHQUAKE_DATA_PROVIDER="goo"
    # How often to update the earthquake data in seconds.
    # Note: This is not an early warning detector, use this
    # to be informed about recent earthquake magnitudes in your
    # area. If this is too often, goo may decide to ban you form
    # their server
    export TMUX_POWERLINE_SEG_EARTHQUAKE_UPDATE_PERIOD="600"
    # Only display information when earthquakes are within this many minutes
    export TMUX_POWERLINE_SEG_EARTHQUAKE_ALERT_TIME_WINDOW="60"
    # Display time with this format
    export TMUX_POWERLINE_SEG_EARTHQUAKE_TIME_FORMAT='(%H:%M)'
    # Display only if magnitude is greater or equal to this number
    export TMUX_POWERLINE_SEG_EARTHQUAKE_MIN_MAGNITUDE="3"
# }

# hostname.sh {
    # Use short or long format for the hostname. Can be {"short, long"}.
    export TMUX_POWERLINE_SEG_HOSTNAME_FORMAT="short"
# }

# macos_notification_count.sh {
    # App ids to query in notification center, separated by space
    # To get the app id that is associated with a specific app run:
    # sqlite3 -list "/com.apple.notificationcenter/db/db" 'select * from app_info'
    # The first column contains the app ids
    # "5" is the app id of Messages.app
    # Only "banner" notifications are supported (see settings in the notification center)
    export TMUX_POWERLINE_SEG_MACOS_NOTIFICATION_COUNT_APPIDS="5"
    # Notification symbol
    export TMUX_POWERLINE_SEG_MACOS_NOTIFICATION_COUNT_CHAR="💬"
# }

# mailcount.sh {
    # Mailbox type to use. Can be any of {apple_mail, gmail, maildir, mbox, mailcheck}
    export TMUX_POWERLINE_SEG_MAILCOUNT_MAILBOX_TYPE=""

    ## Gmail
    # Enter your Gmail username here WITH OUT @gmail.com.( OR @domain)
    export TMUX_POWERLINE_SEG_MAILCOUNT_GMAIL_USERNAME=""
    # Google password. Recomenned to use application specific password (https://accounts.google.com/b/0/IssuedAuthSubTokens) Leave this empty to get password from OS X keychain.
    # For OSX users : MAKE SURE that you add a key to the keychain in the format as follows
    # Keychain Item name : http://<value-you-fill-in-server-variable-below>
    # Account name : <username-below>@<server-below>
    # Password : Your password ( Once again, try to use 2 step-verification and application-specific password)
    # See http://support.google.com/accounts/bin/answer.py?hl=en&answer=185833 for more info.
    export TMUX_POWERLINE_SEG_MAILCOUNT_GMAIL_PASSWORD=""
    # Domain name that will complete your email. For normal GMail users it probably is "gmail.com but can be "foo.tld" for Google Apps users.
    export TMUX_POWERLINE_SEG_MAILCOUNT_GMAIL_SERVER="gmail.com"
    # How often in minutes to check for new mails.
    export TMUX_POWERLINE_SEG_MAILCOUNT_GMAIL_INTERVAL="5"

    ## Maildir
    # Path to the maildir to check.
    export TMUX_POWERLINE_SEG_MAILCOUNT_MAILDIR_INBOX="[REDACTED]"

    ## mbox
    # Path to the mbox to check.
    export TMUX_POWERLINE_SEG_MAILCOUNT_MBOX_INBOX=""

    ## mailcheck
    # Optional path to mailcheckrc
    export TMUX_POWERLINE_SEG_MAILCOUNT_MAILCHECKRC="[REDACTED]"
# }

# now_playing.sh {
    # Music player to use. Can be any of {audacious, banshee, cmus, itunes, lastfm, mocp, mpd, mpd_simple, pithos, playerctl, rdio, rhythmbox, spotify, spotify_wine, file}.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_MUSIC_PLAYER="playerctl"
    # File to be read in case the song is being read from a file
    export TMUX_POWERLINE_SEG_NOW_PLAYING_FILE_NAME=""
    # Maximum output length.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_MAX_LEN="40"
    # How to handle too long strings. Can be {trim, roll}.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_TRIM_METHOD="trim"
    # Charcters per second to roll if rolling trim method is used.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_ROLL_SPEED="2"

    # Hostname for MPD server in the format "[password@]host"
    export TMUX_POWERLINE_SEG_NOW_PLAYING_MPD_HOST="localhost"
    # Port the MPD server is running on.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_MPD_PORT="6600"
    # Song display format for mpd_simple. See mpc(1) for delimiters.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_MPD_SIMPLE_FORMAT="%artist% - %title%"
    # Song display format for playerctl. see "Format Strings" in playerctl(1).
    export TMUX_POWERLINE_SEG_NOW_PLAYING_PLAYERCTL_FORMAT="{{ artist }} - {{ title }}"
    # Song display format for rhythmbox. see "FORMATS" in rhythmbox-client(1).
    export TMUX_POWERLINE_SEG_NOW_PLAYING_RHYTHMBOX_FORMAT="%aa - %tt"

    # Last.fm
    # Set up steps for Last.fm
    # 1. Make sure jq(1) is installed on the system.
    # 2. Create a new API application at https://www.last.fm/api/account/create (name it tmux-powerline) and copy the API key and insert it below in the setting TMUX_POWERLINE_SEG_NOW_PLAYING_LASTFM_API_KEY
    # 3. Make sure the API can access your recently played song by going to you user privacy settings https://www.last.fm/settings/privacy and make sure "Hide recent listening information" is UNCHECKED.
    # Username for Last.fm if that music player is used.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_LASTFM_USERNAME=""
    # API Key for the API.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_LASTFM_API_KEY=""
    # How often in seconds to update the data from last.fm.
    export TMUX_POWERLINE_SEG_NOW_PLAYING_LASTFM_UPDATE_PERIOD="30"
    # Fancy char to display before now playing track
    export TMUX_POWERLINE_SEG_NOW_PLAYING_NOTE_CHAR="♫"
# }

# pwd.sh {
    # Maximum length of output.
    export TMUX_POWERLINE_SEG_PWD_MAX_LEN="40"
# }

# time.sh {
    # date(1) format for the time. Americans might want to have "%I:%M %p".
    export TMUX_POWERLINE_SEG_TIME_FORMAT="%H:%M"
# }

# tmux_session_info.sh {
    # Session info format to feed into the command: tmux display-message -p
    # For example, if FORMAT is '[ #S ]', the command is: tmux display-message -p '[ #S ]'
    export TMUX_POWERLINE_SEG_TMUX_SESSION_INFO_FORMAT="#S:#I.#P"
# }

# utc_time.sh {
    # date(1) format for the UTC time.
    export TMUX_POWERLINE_SEG_UTC_TIME_FORMAT="%H:%M %Z"
# }

# vcs_branch.sh {
    # Max length of the branch name.
    export TMUX_POWERLINE_SEG_VCS_BRANCH_MAX_LEN="24"
# }

# weather.sh {
    # The data provider to use. Currently only "yahoo" is supported.
    export TMUX_POWERLINE_SEG_WEATHER_DATA_PROVIDER="yrno"
    # What unit to use. Can be any of {c,f,k}.
    export TMUX_POWERLINE_SEG_WEATHER_UNIT="c"
    # How often to update the weather in seconds.
    export TMUX_POWERLINE_SEG_WEATHER_UPDATE_PERIOD="600"
    # Name of GNU grep binary if in PATH, or path to it.
    export TMUX_POWERLINE_SEG_WEATHER_GREP="grep"
    # Location of the JSON parser, jq
    export TMUX_POWERLINE_SEG_WEATHER_JSON="jq"
    # Your location
    # Latitude and Longtitude for use with yr.no
    TMUX_POWERLINE_SEG_WEATHER_LAT=""
    TMUX_POWERLINE_SEG_WEATHER_LON=""
# }

Theme: my-theme.sh (also copied from default)

# Default Theme

if patched_font_in_use; then
    TMUX_POWERLINE_SEPARATOR_LEFT_BOLD=""
    TMUX_POWERLINE_SEPARATOR_LEFT_THIN=""
    TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD=""
    TMUX_POWERLINE_SEPARATOR_RIGHT_THIN=""
else
    TMUX_POWERLINE_SEPARATOR_LEFT_BOLD="◀"
    TMUX_POWERLINE_SEPARATOR_LEFT_THIN="❮"
    TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD="▶"
    TMUX_POWERLINE_SEPARATOR_RIGHT_THIN="❯"
fi

TMUX_POWERLINE_DEFAULT_BACKGROUND_COLOR=${TMUX_POWERLINE_DEFAULT_BACKGROUND_COLOR:-'235'}
TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR=${TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR:-'255'}

TMUX_POWERLINE_DEFAULT_LEFTSIDE_SEPARATOR=${TMUX_POWERLINE_DEFAULT_LEFTSIDE_SEPARATOR:-$TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD}
TMUX_POWERLINE_DEFAULT_RIGHTSIDE_SEPARATOR=${TMUX_POWERLINE_DEFAULT_RIGHTSIDE_SEPARATOR:-$TMUX_POWERLINE_SEPARATOR_LEFT_BOLD}

# See man tmux.conf for additional formatting options for the status line.
# The `format regular` and `format inverse` functions are provided as conveniences

if [ -z $TMUX_POWERLINE_WINDOW_STATUS_CURRENT ]; then
    TMUX_POWERLINE_WINDOW_STATUS_CURRENT=(
        "#[$(format inverse)]" \
        "$TMUX_POWERLINE_DEFAULT_LEFTSIDE_SEPARATOR" \
        " #I#F " \
        "$TMUX_POWERLINE_SEPARATOR_RIGHT_THIN" \
        " #W " \
        "#[$(format regular)]" \
        "$TMUX_POWERLINE_DEFAULT_LEFTSIDE_SEPARATOR"
    )
fi

if [ -z $TMUX_POWERLINE_WINDOW_STATUS_STYLE ]; then
    TMUX_POWERLINE_WINDOW_STATUS_STYLE=(
        "$(format regular)"
    )
fi

if [ -z $TMUX_POWERLINE_WINDOW_STATUS_FORMAT ]; then
    TMUX_POWERLINE_WINDOW_STATUS_FORMAT=(
        "#[$(format regular)]" \
        "  #I#{?window_flags,#F, } " \
        "$TMUX_POWERLINE_SEPARATOR_RIGHT_THIN" \
        " #W "
    )
fi

# Format: segment_name background_color foreground_color [non_default_separator] [separator_background_color] [separator_foreground_color] [spacing_disable] [separator_disable]
#
# * background_color and foreground_color. Formats:
#   * Named colors (chech man page of tmux for complete list) e.g. black, red, green, yellow, blue, magenta, cyan, white
#   * a hexadecimal RGB string e.g. #ffffff
#   * 'default' for the defalt tmux color.
# * non_default_separator - specify an alternative character for this segment's separator
# * separator_background_color - specify a unique background color for the separator
# * separator_foreground_color - specify a unique foreground color for the separator
# * spacing_disable - remove space on left, right or both sides of the segment:
#   * "left_disable" - disable space on the left
#   * "right_disable" - disable space on the right
#   * "both_disable" - disable spaces on both sides
#   * - any other character/string produces no change to default behavior (eg "none", "X", etc.)
#
# * separator_disable - disables drawing a separator on this segment, very useful for segments
#   with dynamic background colours (eg tmux_mem_cpu_load):
#   * "separator_disable" - disables the separator
#   * - any other character/string produces no change to default behavior
#
# Example segment with separator disabled and right space character disabled:
# "hostname 33 0 {TMUX_POWERLINE_SEPARATOR_RIGHT_BOLD} 33 0 right_disable separator_disable"
#
# Note that although redundant the non_default_separator, separator_background_color and
# separator_foreground_color options must still be specified so that appropriate index
# of options to support the spacing_disable and separator_disable features can be used

if [ -z $TMUX_POWERLINE_LEFT_STATUS_SEGMENTS ]; then
    TMUX_POWERLINE_LEFT_STATUS_SEGMENTS=(
        "tmux_session_info 148 234" \
        "hostname 33 0" \
        #"ifstat 30 255" \
        #"ifstat_sys 30 255" \
        "lan_ip 24 255 ${TMUX_POWERLINE_SEPARATOR_RIGHT_THIN}" \
        "wan_ip 24 255" \
        "vcs_branch 29 88" \
        #"vcs_compare 60 255" \
        #"vcs_staged 64 255" \
        #"vcs_modified 9 255" \
        #"vcs_others 245 0" \
    )
fi

if [ -z $TMUX_POWERLINE_RIGHT_STATUS_SEGMENTS ]; then
    TMUX_POWERLINE_RIGHT_STATUS_SEGMENTS=(
        #"earthquake 3 0" \
        "pwd 89 211" \
        #"macos_notification_count 29 255" \
        #"mailcount 9 255" \
        "now_playing 234 37" \
        #"cpu 240 136" \
        "load 237 167" \
        #"tmux_mem_cpu_load 234 136" \
        "battery 137 127" \
        "weather 37 255" \
        #"rainbarf 0 ${TMUX_POWERLINE_DEFAULT_FOREGROUND_COLOR}" \
        #"xkb_layout 125 117" \
        "date_day 235 136" \
        "date 235 136 ${TMUX_POWERLINE_SEPARATOR_LEFT_THIN}" \
        "time 235 136 ${TMUX_POWERLINE_SEPARATOR_LEFT_THIN}" \
        #"utc_time 235 136 ${TMUX_POWERLINE_SEPARATOR_LEFT_THIN}" \
    )
fi

My theme and config file is being read, it updates the plugin, I tested it by altering certain lines it was reflected on the tmux display.

BAT0 and BAT1 exists, it contains up to date data about the battery.

I'm on Ubuntu 22.04.

What is wrong, why is it not working? I can provide additional debugging outputs if needed.

Thank you

erikw commented 10 months ago

Hello, sry late reply.

There could be a 100 reasons why the batter segment doesn't work on your system. The best way forward is to follow the debugging instructions outlined at https://github.com/erikw/tmux-powerline#debugging

As you said you're on Ubuntu, the relevant code to debug should be https://github.com/erikw/tmux-powerline/blob/4b23381ceca5a52c771d9bec791905f6689437bf/segments/battery.sh#L83-L123

skywarth commented 10 months ago

Alright I'll try to debug the corresponding section whenever I have the time. Will update the issue if I find anything strange.

skywarth commented 10 months ago

It's been some time since I had a ride with Bash, here we go.

My findings during the debug:

skywarth commented 10 months ago

PR proposal is at #334

skywarth commented 10 months ago

Confirmed to be solved on production release (main branch) after #334 is merged. :+1: