diff --git a/README.md b/README.md index fc0d279..8bb987a 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,5 @@ Then in tmux, install plugins with ` - I`. Install the [Hack font](https://github.com/source-foundry/Hack). -Run the following command: - -```sh -$ ~/dotfiles/style-gnome-terminal.sh styles/gruvbox8.conf -``` +Apply the gruvbox8 theme using +[gnome-terminal-configure](https://github.com/letitz/gnome-terminal-configure). diff --git a/gnome-terminal-configure.sh b/gnome-terminal-configure.sh deleted file mode 100755 index 96c50f1..0000000 --- a/gnome-terminal-configure.sh +++ /dev/null @@ -1,579 +0,0 @@ -#!/bin/bash -# vim: tw=80 ts=2 sw=2: - -set -eu - -# CONSTANTS -# ========= - -PROGRAM_NAME="$0" - -# DConf directory in which gnome-terminal profile configuration is stored. -ROOT_DCONF_DIR='/org/gnome/terminal/legacy/profiles:/' - -# The names of ANSI color properties in config files. -# Order matters. These correspond to the ANSI color codes. -ANSI_COLOR_PROPERTIES=( - "ansi-colors-black" - "ansi-colors-red" - "ansi-colors-green" - "ansi-colors-yellow" - "ansi-colors-blue" - "ansi-colors-purple" - "ansi-colors-cyan" - "ansi-colors-white" - "ansi-colors-bright-black" - "ansi-colors-bright-red" - "ansi-colors-bright-green" - "ansi-colors-bright-yellow" - "ansi-colors-bright-blue" - "ansi-colors-bright-purple" - "ansi-colors-bright-cyan" - "ansi-colors-bright-white" -) - -# LOGGING -# ======= - -# log ARGS... -# echo for stderr -function log() { - echo 1>&2 "$@" -} - -# die ARGS... -# log then exit with an error code -function die() { - log "$@" - exit 1 -} - - -# CONFIG -# ====== -# -# Configuration files have a very basic grammar: -# -# PROPERTY_NAME = VALUE -# -# The functions below allow reading config file contents. - -# config_get_property file property -# Echoes the given property from the given config file. -function config_get_property() { - file="$1" - property="$2" - - sed -n "s:^${property} *= *\(\.*\):\1:p" < "${file}" -} - -# config_get_property_or_die file property -# config_get_property, except dies if the property is not found. -function config_get_property_or_die() { - file="$1" - property="$2" - - result=$(config_get_property "${file}" "${property}") - if [ -z "$result" ]; then - die "Error: cannot find property '${property}' in file '${file}'." - fi - - echo "${result}" -} - -# config_get_font file -function config_get_font() { - file="$1" - config_get_property "${file}" "font" -} - -# config_get_foreground_color file -function config_get_foreground_color() { - file="$1" - config_get_property "${file}" "foreground-color" -} - -# config_get_background_color file -function config_get_background_color() { - file="$1" - config_get_property "${file}" "background-color" -} - -# join_ansi_colors COLOR1 ... COLOR16 -# Echoes "[${COLOR1}, ..., ${COLOR16}]". -function join_ansi_colors () { - echo -n "[$1" - for i in {2..16}; do - echo -n ", ${!i}" # Get the i-th argument to this function. - done - echo "]" -} - -# config_get_ansi_colors file -function config_get_ansi_colors() { - file="$1" - - ansi_colors=() - for property in "${ANSI_COLOR_PROPERTIES[@]}"; do - # TODO: This does not actually die, because exit is called in a subshell. - color=$(config_get_property_or_die "${file}" "${property}") - ansi_colors+=("${color}") - done - - join_ansi_colors "${ansi_colors[@]}" -} - - -# PROFILE -# ======= -# -# Gnome-terminal profile preferences are read and written through dconf. -# -# In the following functions, profiles are referenced by their dconf directory -# paths (ending in a '/' character). - -# profile_path ID -function profile_path() { - id="$1" - echo "${ROOT_DCONF_DIR}:${id}/" -} - -# profile_list -function profile_list() { - dconf list "${ROOT_DCONF_DIR}" | sed -nE 's_^:(.*)/$_\1_p' -} - -# profile_get_property profile property -# Echoes the given property from the given gnome-terminal profile. -function profile_get_property() { - profile="$1" - property="$2" - - dconf read "${profile}${property}" -} - -# profile_set_property profile property value -# Sets the given profile's given property to the given value. -function profile_set_property() { - profile="$1" - property="$2" - value="$3" - - dconf write "${profile}${property}" "${value}" -} - - -# profile_get_name profile -# Echoes the human-readable name for the given gnome-terminal profile. -function profile_get_name() { - profile="$1" - profile_get_property "${profile}" "visible-name" -} - -# profile_set_name profile value -# Sets the human-readable name for the given gnome-terminal profile. -function profile_set_name() { - profile="$1" - value="$2" - profile_set_property "${profile}" "visible-name" "${value}" -} - -# profile_get_font profile -# Echoes the font for the given gnome-terminal profile. -function profile_get_font() { - profile="$1" - profile_get_property "${profile}" "font" -} - -# profile_set_font profile value -# Sets the font for the given gnome-terminal profile. -function profile_set_font() { - profile="$1" - value="$2" - profile_set_property "${profile}" "font" "${value}" -} - -# profile_get_foreground_color profile -# Echoes the foreground color for the given gnome-terminal profile. -function profile_get_foreground_color() { - profile="$1" - profile_get_property "${profile}" "foreground-color" -} - -# profile_set_foreground_color profile value -# Sets the foreground color for the given gnome-terminal profile. -function profile_set_foreground_color() { - profile="$1" - value="$2" - profile_set_property "${profile}" "foreground-color" "${value}" -} - -# profile_get_background_color profile -# Echoes the background color for the given gnome-terminal profile. -function profile_get_background_color() { - profile="$1" - profile_get_property "${profile}" "background-color" -} - -# profile_set_background_color profile value -# Sets the background color for the given gnome-terminal profile. -function profile_set_background_color() { - profile="$1" - value="$2" - profile_set_property "${profile}" "background-color" "${value}" -} - -# profile_get_ansi_colors profile -# Echoes the ANSI color palette for the given gnome-terminal profile. -function profile_get_ansi_colors() { - profile="$1" - profile_get_property "${profile}" "palette" -} - -# profile_set_ansi_colors profile value -# Sets the ANSI color palette for the given gnome-terminal profile. -function profile_set_ansi_colors() { - profile="$1" - value="$2" - profile_set_property "${profile}" "palette" "${value}" -} - -# ansi_colors_build_regex INDEX -# Builds an extended regex to capture the color at INDEX as \2. -function ansi_colors_build_regex() { - index="$1" - - if [ "${index}" -lt 0 ] || [ "${index}" -gt 15 ]; then - die "Error: invalid ansi color index '${index}'." - fi - - # Match the opening bracket, which must be the first character. - echo -n "^\[" - - # Skip the items before the target index, if any. - if [ "${index}" -gt 0 ]; then - # These all end in a trailing comma. - echo -n "([^,]*,){$((${index}))}" - else - # Capture nothing so that the target capture group is \2. - echo -n "()" - fi - - # Capture the target group (and not the comma). - echo -n "([^,]*)" - - # Skip the remaining items, if any. - if [ "${index}" -lt 15 ]; then - # These all start with a leading comma. - echo -n "(,[^,]*){$((15 - ${index}))}" - fi - - # Match the closing bracket, which must be the last character. - echo '\]$' -} - -# ansi_colors get "[ COLOR1, ..., COLOR16 ]" INDEX -ansi_colors_get() { - colors_string="$1" - index="$2" - - regex=$(ansi_colors_build_regex "${index}") - echo "${colors_string}" | \ - sed -nE "s:${regex}:\\2:p" | \ - sed -e "s:^ *::" -e "s: *$::" # Remove whitespace. -} - -# dump_ansi_colors "[ COLOR1, ..., COLOR16 ]" -function dump_ansi_colors() { - colors_string="$1" - - for i in {0..15}; do - echo -n "${ANSI_COLOR_PROPERTIES[$i]} = " - ansi_colors_get "${colors_string}" $i - done -} - -# profile_dump_config profile -function profile_dump_config() { - profile="$1" - - font=$(profile_get_font "${profile}") - foreground_color=$(profile_get_foreground_color "${profile}") - background_color=$(profile_get_background_color "${profile}") - ansi_colors=$(profile_get_ansi_colors "${profile}") - - echo "font = ${font}" - echo "foreground-color = ${foreground_color}" - echo "background-color = ${background_color}" - dump_ansi_colors "${ansi_colors}" -} - -# profile_apply_config profile config_file -# Applies the given configuration to the given gnome-terminal profile. -function profile_apply_config() { - profile="$1" - config_file="$2" - - font=$(config_get_font "${config_file}") - foreground_color=$(config_get_foreground_color "${config_file}") - background_color=$(config_get_background_color "${config_file}") - ansi_colors=$(config_get_ansi_colors "${config_file}") - - profile_set_font "${profile}" "${font}" - profile_set_foreground_color "${profile}" "${foreground_color}" - profile_set_background_color "${profile}" "${background_color}" - profile_set_ansi_colors "${profile}" "${ansi_colors}" -} - -# INTERACTIVE USE -# =============== - -# choose_number prompt_base min max -# Asks the user to choose a number between min and max, inclusive. -# prompt_base should not end in a newline. -function choose_number() { - prompt_base="$1" - min_number="$2" - max_number="$3" - - while true; do - read -p "${prompt_base} [${min_number} to ${max_number}]: " chosen_number - if [ "${chosen_number}" -lt "${min_number}" ]; then - continue - fi - if [ "${chosen_number}" -gt "${max_number}" ]; then - continue - fi - - echo "${chosen_number}" - break - done -} - -# choose_profile -# Echoes the path to a valid gnome-terminal profile to modify. -function choose_profile() { - # Build an array of profile subdirectories. - profiles=() - for profile_subdir in $(dconf list "${ROOT_DCONF_DIR}"); do - profiles+=("${ROOT_DCONF_DIR}${profile_subdir}") - done - num_profiles="${#profiles[@]}" - - if [ "${num_profiles}" -eq 0 ]; then - die "Error: found no gnome-terminal profiles to style." - fi - - if [ "${num_profiles}" -eq 1 ]; then - profile="${profiles[0]}" - profile_name=$(profile_get_name "${profile}") - log "Found single gnome-terminal profile named '${profile_name}', using it." - echo "${profile}" - return - fi - - log "Available gnome-terminal profiles:" - - for i in $(seq 1 "${num_profiles}"); do - profile="${profiles[$(($i - 1))]}" - profile_name=$(profile_get_name "${profile}") - log " #$i: ${profile_name}" - done - - choose_number "Choose a profile" 1 "${num_profiles}" -} - -# usage ERROR -function usage() { - ERROR="$1" - - log "Error: ${ERROR}" - log - log "USAGE: ${PROGRAM_NAME} SUBCOMMAND" - log - log "Where SUBCOMMAND can be one of:" - log - log " list" - log " Lists the available gnome-terminal profiles." - log - log " get [profile PROFILE_ID] PROPERTY" - log " Displays the given gnome-terminal profile property." - log - log " set [profile PROFILE_ID] PROPERTY VALUE" - log " Sets the given gnome-terminal profile property to the given value." - log - log " dump [profile PROFILE_ID]" - log " Dumps the given gnome-terminal as a configuration file to stdout." - log - log " apply [profile PROFILE_ID] FILE" - log " Applies the gnome-terminal configuration file." - die -} - -# expect_arguments command expected actual -function expect_arguments() { - command="$1" - expected="$2" - actual="$3" - - if [ "${actual}" -ne "${expected}" ]; then - die "Error: ${command} expects ${expected} arguments, got ${actual}." - fi -} - -# subcommand_list -function subcommand_list() { - expect_arguments "list" 0 $# - - profile_list -} - -# unquote -# For each line in stdin, removes the start and end single quotes. -function unquote() { - sed -nE "s:^'(([^'\]|\\.)*)'$:\1:p" -} - -# quote string -# Quotes the given argument. -quote() { - string="$1" - - # Surround with single quotes. - # Escape all enclosed quotes with a backslash. We need two backslashes for a - # reason that is not immediately clear to me. Something something the string - # is unescaped afterwards? - echo -n "'" - echo -n "${string}" | sed "s:':\\\\':g" - echo "'" -} - -# subcommand_get profile property -function subcommand_get() { - expect_arguments "get" 1 $(($# - 1)) - - profile="$1" - property="$2" - - case "${property}" in - "font") - profile_get_font "${profile}" | unquote - ;; - "foreground-color") - profile_get_foreground_color "${profile}" | unquote - ;; - "background-color") - profile_get_background_color "${profile}" | unquote - ;; - "palette") - profile_get_ansi_colors "${profile}" - ;; - *) - die "unknown profile property '${property}'" - ;; - esac -} - -# subcommand_set profile property value -function subcommand_set() { - expect_arguments "set" 2 $(($# - 1)) - - profile="$1" - property="$2" - value="$3" - - case "${property}" in - "font") - quoted=$(quote "${value}") - profile_set_font "${profile}" "${quoted}" - ;; - "foreground-color") - quoted=$(quote "${value}") - profile_set_foreground_color "${profile}" "${quoted}" - ;; - "background-color") - quoted=$(quote "${value}") - profile_set_background_color "${profile}" "${quoted}" - ;; - "palette") - profile_get_ansi_colors "${profile}" - ;; - *) - die "unknown profile property '${property}'" - ;; - esac -} - -# subcommand_dump profile -function subcommand_dump() { - expect_arguments "dump" 0 $(($# - 1)) - - profile="$1" - - profile_dump_config "${profile}" -} - -# subcommand_apply profile -function subcommand_apply() { - expect_arguments "apply" 0 $(($# - 1)) - - profile="$1" - - # Copy stdin to a temporary file. - config_file=$(mktemp) - tee > "${config_file}" - - # Apply the configuration file. - profile_apply_config "${profile}" "${config_file}" -} - -function main() { - if [ "$#" -le 0 ]; then - usage "Subcommand required." - fi - - subcommand="$1" - shift - - # Validate subcommand - need_profile=1 - case "${subcommand}" in - "list") - need_profile=0 - ;; - "get") - ;; - "set") - ;; - "dump") - ;; - "apply") - ;; - *) - usage "Unrecognized command '${subcommand}'." - ;; - esac - - # Commands that do not need a profile can just execute now. - if [ "${need_profile}" -eq 0 ]; then - "subcommand_${subcommand}" "$@" - return - fi - - # Parse the optional `profile PROFILE_ID` clause if present. - if [ "$#" -ge 1 ] && [ "$1" == "profile" ]; then - if [ "$#" -eq 1 ]; then - usage "expected profile ID after 'profile' keyword." - fi - - profile=$(profile_path "$2") - shift 2 - else - profile=$(choose_profile) - fi - - # Execute the subcommand. - "subcommand_${subcommand}" "${profile}" "$@" -} - -main "$@" diff --git a/styles/default.conf b/styles/default.conf deleted file mode 100644 index 5ffbd63..0000000 --- a/styles/default.conf +++ /dev/null @@ -1,21 +0,0 @@ -font = "Monospace 12" - -foreground-color = "#ffffff" -background-color = "#000000" - -ansi-colors-black = "#1d2021" -ansi-colors-red = "#cc241d" -ansi-colors-green = "#98971a" -ansi-colors-yellow = "#d79921" -ansi-colors-blue = "#458588" -ansi-colors-purple = "#b16286" -ansi-colors-cyan = "#689d6a" -ansi-colors-white = "#a89984" -ansi-colors-bright-black = "#928374" -ansi-colors-bright-red = "#fb4934" -ansi-colors-bright-green = "#b8bb26" -ansi-colors-bright-yellow = "#fabd2f" -ansi-colors-bright-blue = "#83a598" -ansi-colors-bright-purple = "#d3869b" -ansi-colors-bright-cyan = "#8ec07c" -ansi-colors-bright-white = "#ebdbb2" diff --git a/styles/gruvbox8.conf b/styles/gruvbox8.conf deleted file mode 100644 index 4748a67..0000000 --- a/styles/gruvbox8.conf +++ /dev/null @@ -1,21 +0,0 @@ -font = "Hack Regular 12" - -foreground-color = "#ebdbb2" -background-color = "#1d2021" - -ansi-colors-black = "#1d2021" -ansi-colors-red = "#cc241d" -ansi-colors-green = "#98971a" -ansi-colors-yellow = "#d79921" -ansi-colors-blue = "#458588" -ansi-colors-purple = "#b16286" -ansi-colors-cyan = "#689d6a" -ansi-colors-white = "#a89984" -ansi-colors-bright-black = "#928374" -ansi-colors-bright-red = "#fb4934" -ansi-colors-bright-green = "#b8bb26" -ansi-colors-bright-yellow = "#fabd2f" -ansi-colors-bright-blue = "#83a598" -ansi-colors-bright-purple = "#d3869b" -ansi-colors-bright-cyan = "#8ec07c" -ansi-colors-bright-white = "#ebdbb2"