diff --git a/assets/ghostty/config b/assets/ghostty/config new file mode 100644 index 0000000..b1c8d24 --- /dev/null +++ b/assets/ghostty/config @@ -0,0 +1,15 @@ +# shortcut disabled: (unbind > ignore) +keybind = ctrl+shift+arrow_left=unbind +keybind = ctrl+shift+arrow_right=unbind +keybind = ctrl+shift+n=unbind +keybind = ctrl+shift+t=unbind +keybind = ctrl+,=unbind + +# explicit text forward: shift+{home,end} +keybind = shift+home=text:\x1b[1;2H +keybind = shift+end=text:\x1b[1;2F +keybind = shift+backspace=text:\x1b[127;2u +keybind = alt+backspace=text:\x1b[127;11u + +# Mouse Wheel speed +mouse-scroll-multiplier = 1 diff --git a/lib/initiate.bash b/lib/initiate.bash new file mode 100644 index 0000000..9362136 --- /dev/null +++ b/lib/initiate.bash @@ -0,0 +1,177 @@ +#!/usr/bin/env miaou-bash + +# CONSTANTS + +readonly AZERTY_ZONES=( + 'Europe/Paris' + 'Indian/Reunion' + 'Indian/Mayotte' + 'America/Cayenne' + 'America/Guadeloupe' + 'America/Martinique' + 'Pacific/Noumea' + 'Pacific/Tahiti' +) +readonly REQUIRED_PKGS=(file jq vim git) +readonly BACKUP='ORIGINAL' + +# FUNCTIONS + +function usr_bin_miaou_bash { + local source_bin="$MIAOU_BASH_DIR/bin/miaou-bash" + local dest_bin="/usr/bin/miaou-bash" + if ! [[ -f "$dest_bin" ]]; then + cp -f "$source_bin" "$dest_bin" + echo "/usr/bin/miaou-bash created" + elif ! cmp -s "$source_bin" "$dest_bin"; then + cp -f "$source_bin" "$dest_bin" + echo "/usr/bin/miaou-bash updated" + fi +} + +function install_required_packages { + . "$MIAOU_BASH_DIR"/tools/pkg_add "${REQUIRED_PKGS[@]}" +} + +function rm_bashrc_skeleton { + if [[ -e /etc/skel/.bashrc ]]; then + rm /etc/skel/.bashrc + echo "skeleton .bashrc removed!" + fi +} + +function link_etc { + local filename="$1" subfolder="${2:-}" + local link_name="$filename" + [[ -v LINK_NAME ]] && link_name="$LINK_NAME" + + local source="$MIAOU_BASH_DIR/etc" + local destination="/etc" + [[ -n "$subfolder" ]] && source+="/${subfolder}" && destination+="/${subfolder}" + if [[ -L "$destination/$link_name" ]]; then + if [[ "$(readlink "$destination/$link_name")" != "$source/$filename" ]]; then + ln -sf "$source/$filename" "$destination/$link_name" + echo "link $source/$link_name updated" + fi + else + if [[ -f "$destination/$link_name" ]]; then + mv "$destination/$link_name" "$destination/$link_name.$BACKUP" + echo "$destination/$link_name.$BACKUP saved!" + fi + ln -s "$source/$filename" "$destination/$link_name" + echo "link $source/$link_name created" + fi +} + +function arch_vimrc { + mkdir -p /etc/vim + if ! grep -q '/etc/vim/vimrc.local' /etc/vimrc; then + cat >>/etc/vimrc <<-EOF + " Source a global configuration file if available + if filereadable("/etc/vim/vimrc.local") + source /etc/vim/vimrc.local + endif +EOF + echo "vimrc source /etc/vim/vimrc.local if any" + fi +} + +function link_config_files { + [[ "$DISTRO_LIKE" == 'arch' ]] && arch_vimrc + + link_etc vimrc.core vim + link_etc vimrc.miaou vim + link_etc vimrc.rookie vim + + if in_azerty_zone 2>/dev/null; then + link_etc vimrc.azerty vim + LINK_NAME=vimrc.local link_etc vimrc.local.azerty vim + else + link_etc vimrc.local vim + fi + link_etc bash.bashrc + link_etc inputrc # last command required to detect successful installation +} + +function bind_inputrc { + bind -f /etc/inputrc 2>/dev/null # arch: dismiss harmless warning +} + +function in_azerty_zone { + [[ -L /etc/localtime ]] || return 1 + + local zone + zone=$(readlink /etc/localtime) + zone="${zone#/usr/share/zoneinfo/}" # remove prefix + for i in "${AZERTY_ZONES[@]}"; do [[ "$zone" == "$i" ]] && return; done + return 1 +} + +function fix_terminfo_ghostty { + if ! infocmp xterm-ghostty >/dev/null 2>&1; then + tic -x "$MIAOU_BASH_DIR"/assets/terminfo/ghostty 2>/dev/null + echo 'terminfo ghostty succesfully compiled' + fi +} + +function ghostty_global_config { + ! command -v ghostty >/dev/null && return + + # ghostty exists + [[ ! -d /etc/ghostty ]] && mkdir -p /etc/ghostty + local global_config=/etc/ghostty/config + local asset_config="$MIAOU_BASH_DIR"/assets/ghostty/config + local change=false + if [[ ! -f "$global_config" ]]; then + cp "$asset_config" "$global_config" + echo 'ghostty global config created' + change=true + elif ! cmp -s "$asset_config" "$global_config"; then + cp "$asset_config" "$global_config" + echo 'ghostty global config replaced' + change=true + fi + + if [[ ! -f /etc/skell/.config/ghostty/config ]]; then + # ghostty config skeleton for new users + mkdir -p /etc/skel/.config/ghostty + echo "config-file = $global_config" >/etc/skel/.config/ghostty/config + fi + + # change ghostty configuration for any normal user UID>=1000 + mapfile -t normal_users < <(awk -F: '$3 >= 1000 && $1 != "nobody" { print $1 }' /etc/passwd) + for user in "${normal_users[@]}"; do + local user_home + user_home=$(getent passwd "$user" | cut -d: -f6) + local user_ghostty_config="$user_home"/.config/ghostty/config.ghostty + + if [[ ! -f "$user_ghostty_config" ]]; then + sudo -u "$user" -- mkdir -p "$user_home"/.config/ghostty + echo -e "# global config\nconfig-file = /etc/ghostty/config\n" | + sudo -u "$user" -- tee "$user_ghostty_config" >/dev/null + echo "new predefined ghostty config file for user: $user" + elif ! grep -q 'config-file = /etc/ghostty/config' "$user_ghostty_config"; then + # prepend on top + echo -e "# global config\nconfig-file = /etc/ghostty/config\n" | + sudo -u "$user" -- tee "$user_ghostty_config".tmp >/dev/null + cat "$user_ghostty_config" | + sudo -u "$user" -- tee -a "$user_ghostty_config".tmp >/dev/null + rm "$user_ghostty_config" + sudo -u "$user" mv "$user_ghostty_config".tmp "$user_ghostty_config" + echo "modify pre-existant ghostty config file for user: $user" + fi + done +} + +# MAIN + +source "$MIAOU_BASH_DIR/lib/functions.bash" +assert_root +usr_bin_miaou_bash +DISTRO_LIKE=$(fetch_distro_like) +install_required_packages +rm_bashrc_skeleton +fix_terminfo_ghostty +ghostty_global_config +link_config_files +bind_inputrc