Skip to content

Latest commit

 

History

History
1201 lines (1021 loc) · 34.8 KB

Console.org

File metadata and controls

1201 lines (1021 loc) · 34.8 KB

Console

No matter from which side you approach penguins, more always come from behind

  • A friend of mine

Colors

Noweb function to get colors.

(let ((color (or (my/color-value name))))
  (if (> quote 0)
      (concat "\"" color "\"")
    color))
(let ((val (if (ct-light-p (my/color-value name))
               (my/color-value 'black)
             (my/color-value 'white))))
  (if (eq quote 1)
      (concat "\"" val "\"")
    val))
(setq-local org-confirm-babel-evaluate nil)

.profile

:header-args+: :tangle ./.profile

Environment

export QT_QPA_PLATFORMTHEME="qt5ct"
export QT_AUTO_SCREEN_SCALE_FACTOR=0

Set ripgrep config path

export RIPGREP_CONFIG_PATH=$HOME/.config/ripgrep/ripgreprc

hledger path

export LEDGER_FILE="$HOME/30-39 Life/32 org-mode/ledger/ledger.journal"

Checking if running inside termux

if command -v termux-setup-storage > /dev/null; then
    export IS_ANDROID=true
    [[ -f ~/.android_profile ]] && . ~/.android_profile
fi

Timezone

# TZ='Asia/Karachi'; export TZ

Turn off Guix

if [ -f "/home/pavel/.no-guix" ]; then
    export NO_GUIX=true
    export PATH=$(echo $PATH | tr ":" "\n" | grep -vE "guix|nix|gnu" | tr "\n" ":")
fi

My paths

My script folders

if [ -d "$HOME/bin" ] ; then
    export PATH="$HOME/bin:$PATH"
    export PATH="$HOME/bin/scripts:$PATH"
fi

if [ -d "$HOME/.local/bin" ] ; then
    export PATH="$HOME/.local/bin:$PATH"
fi

SSL Certs

This seems necessary when running Guix on a foreign distro.

if [ -d "$HOME/.guix-extra-profiles" ] ; then
    export SSL_CERT_DIR="$HOME/.guix-extra-profiles/system/system/etc/ssl/certs/"
    export SSL_CERT_FILE="$HOME/.guix-extra-profiles/system/system/etc/ssl/certs/ca-certificates.crt"
    export GIT_SSL_CAINFO="$SSL_CERT_FILE"
    export CURL_CA_BUNDLE="$SSL_CERT_FILE"
fi

ssh-agent

I’m paranoid so I encrypt my SSH keys.

Got the idea for below from ArchWiki:

if ! pgrep -u "$USER" ssh-agent > /dev/null; then
    ssh-agent -t 1h > "$XDG_RUNTIME_DIR/ssh-agent.env"
fi
if [[ ! -f "$SSH_AUTH_SOCK" ]]; then
    source "$XDG_RUNTIME_DIR/ssh-agent.env" >/dev/null
fi

Guix settings

Enable extra profiles

if [ -z "$IS_ANDROID" ] && [ -z "$NO_GUIX" ] ; then
    GUIX_EXTRA_PROFILES=$HOME/.guix-extra-profiles
    for i in $GUIX_EXTRA_PROFILES/*; do
        profile=$i/$(basename "$i")
        if [ -f "$profile"/etc/profile ]; then
            GUIX_PROFILE="$profile"
            . "$GUIX_PROFILE"/etc/profile
        fi
        if [ -d "$profile"/share/man ]; then
            if command -v manpath; then
                export MANPATH="${MANPATH:-$(manpath)}:$profile/share/man"
            else
                export MANPATH="${MANPATH}:$profile/share/man"
            fi
        fi
        export XDG_DATA_DIRS="$XDG_DATA_DIRS:$profile/share"
        unset profile
    done
fi

Set Jupyter config PATH. It defaults to readonly directory somewhere in Guix profile.

export JUPYTER_CONFIG_DIR=$HOME/.config/jupyter

Set a folder for my packages.

export GUIX_PACKAGE_PATH=~/guix-packages

Locale settings

export GUIX_LOCPATH=$HOME/.guix-extra-profiles/console/console/lib/locale

Somehow LibreOffice doesn’t work without the following:

export GIO_EXTRA_MODULES=""

Other package managers

Using other package managers with Guix requires some extra work.

Cask

if [ -d "$HOME/.cask" ]; then
    export PATH="/home/pavel/.cask/bin:$PATH"
fi

Make flatpak apps visible to launchers:

if [ -d "$HOME/.local/share/flatpak" ]; then
    export XDG_DATA_DIRS="$XDG_DATA_DIRS:$HOME/.local/share/flatpak/exports/share"
fi

Enable Nix

if [ -f /run/current-system/profile/etc/profile.d/nix.sh ] && [ -z "$NO_GUIX" ] ; then
  . /run/current-system/profile/etc/profile.d/nix.sh
fi

if [ -e /home/pavel/.nix-profile/etc/profile.d/nix.sh ] && [ -z "$NO_GUIX" ] ; then . /home/pavel/.nix-profile/etc/profile.d/nix.sh; fi

Use Guix fontconfig. Necessary for nix apps

if [ -d "$HOME/.guix-extra-profiles/desktop-misc" ] && [ -z "$NO_GUIX" ] ; then
    export FONTCONFIG_PATH="$HOME/.guix-extra-profiles/desktop-misc/desktop-misc/etc/fonts"
fi

Make nix apps visible to launchers:

if [ -d "$HOME/.nix-profile" ] && [ -z "$NO_GUIX" ]; then
    export XDG_DATA_DIRS="$XDG_DATA_DIRS:$HOME/.nix-profile/share/applications"
fi

npm

npm is especially cumbersome, for instance because by default it tries to install packages to /gnu/store/.

In principle, one can set a prefix like this:

prefix=/home/pavel/.npm-packages

But I also want to use node from conda occasionally, where prefix is already set correctly. So instead of tangling the above to the ~/.npmrc directly, I set an environment variable in the profile:

export NPM_CONFIG_USERCONFIG=$HOME/._npmrc

The variable is unset in a script in Guix.org.

Set PATH & MANPATH

NPM_PACKAGES="${HOME}/.npm-packages"

export PATH="$PATH:$NPM_PACKAGES/bin"
export MANPATH="${MANPATH:-$(manpath)}:$NPM_PACKAGES/share/man"

XResources

Guix dependency
xrdb
if [ -z "$IS_ANDROID" ]; then
    xrdb ~/.Xresources
fi

(OFF) Package manager paths

Turned off for now, because probably it won’t be necessary in Guix.

LaTeX

if [ -d "/usr/local/texlive/2020" ]; then
    export MANPATH="/usr/local/texlive/2020/texmf-dist/doc/man:$MANPATH"
    export INFOPATH="/usr/local/texlive/2020/texmf-dist/doc/info:$INFOPATH"
    export PATH="/usr/local/texlive/2020/bin/x86_64-linux:$PATH"
fi

Cargo (Rust)

if [ -d "$HOME/.cargo" ] ; then
    export PATH="$HOME/.cargo/bin:$PATH"
fi

RVM (Ruby)

if [ -d "$HOME/.rvm" ] ; then
    export PATH="$PATH:$HOME/.rvm/bin"
fi
# if [ -d "$HOME/.gem" ]; then
#     export PATH="$HOME/.gem/ruby/2.7.0/bin:$PATH"
# fi

Go

if [ -d "$HOME/go" ] ; then
    export PATH="$HOME/go/bin:$PATH"
fi

ghcup (Haskell)

[ -f "/home/pavel/.ghcup/env" ] && source "/home/pavel/.ghcup/env" # ghcup-env

Perl

if [ -d "$HOME/perl5" ] ; then
    PATH="/home/pavel/perl5/bin${PATH:+:${PATH}}"
    PERL5LIB="/home/pavel/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
    PERL_LOCAL_LIB_ROOT="/home/pavel/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
    PERL_MB_OPT="--install_base \"/home/pavel/perl5\""; export PERL_MB_OPT;
    PERL_MM_OPT="INSTALL_BASE=/home/pavel/perl5"; export PERL_MM_OPT;
fi

Bash

.bash_profile

[[ -f ~/.profile ]] && . ~/.profile

[[ -f ~/.bashrc ]] && . ~/.bashrc

.bashrc

:header-args+: :tangle ./.bashrc

My .bashrc, which has pieces from the default one in Guix & Manjaro, as well some mine settings.

Startup & environment

Export ‘SHELL’ to child processes. Programs such as ‘screen’ honor it and otherwise use /bin/sh.

export SHELL

We are being invoked from a non-interactive shell. If this is an SSH session (as in “ssh host command”), source /etc/profile, so we get PATH and other essential variables.

if [[ $- != *i* ]]
then
    [[ -n "$SSH_CLIENT" && -f "/etc/bashrc" ]] && source /etc/profile
    return
fi

If termux-setup-storage is available, then we’re running inside termux. It is necessary to source ~/.profile manually.

if command -v termux-setup-storage > /dev/null; then
    if [[ -z "$IS_ANDROID" ]]; then
        source ~/.profile
    fi
fi

Source the system-wide file

if [[ -f "/etc/bashrc" ]]; then
    source /etc/bashrc
fi
Guix dependency
xhost

Allow other users to access X server. Necessary for stuff like aw-watcher-window.

xhost +local:root > /dev/null 2>&1

Set manpager to bat

export MANPAGER="sh -c 'sed -e s/.\\\\x08//g | bat -l man -p'"

eat integration

[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/bash"

Launch fish

Launch fish shell unless bash itself is launched from fish.

use_fish=true

if [[ $(ps --no-header --pid=$PPID --format=cmd) != "fish" && ${use_fish} && $(command -v fish) ]]
then
    exec fish
fi

The rest of .bashrc is not executed if fish was launched.

Colors

Setting for colors, packed in the default .bashrc in Manjaro

use_color=true

# Set colorful PS1 only on colorful terminals.
# dircolors --print-database uses its own built-in database
# instead of using /etc/DIR_COLORS.  Try to use the external file
# first to take advantage of user additions.  Use internal bash
# globbing instead of external grep binary.
safe_term=${TERM//[^[:alnum:]]/?}   # sanitize TERM
match_lhs=""
[[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs}    ]] \
    && type -P dircolors >/dev/null \
    && match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true

if ${use_color} ; then
    # Enable colors for ls, etc.  Prefer ~/.dir_colors #64489
    if type -P dircolors >/dev/null ; then
        if [[ -f ~/.dir_colors ]] ; then
            eval $(dircolors -b ~/.dir_colors)
        elif [[ -f /etc/DIR_COLORS ]] ; then
            eval $(dircolors -b /etc/DIR_COLORS)
        fi
    fi

    if [[ ${EUID} == 0 ]] ; then
        PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] '
    else
        PS1='\[\033[01;32m\][\u@\h\[\033[01;37m\] \W\[\033[01;32m\]]\$\[\033[00m\] '
    fi

    alias ls='ls --color=auto'
    alias grep='grep --colour=auto'
    alias egrep='egrep --colour=auto'
    alias fgrep='fgrep --colour=auto'
else
    if [[ ${EUID} == 0 ]] ; then
        # show root@ when we don't have colors
        PS1='\u@\h \W \$ '
    else
        PS1='\u@\h \w \$ '
    fi
fi

unset use_color safe_term match_lhs sh

Settings

Some general bash settings.

References:

complete -cf sudo           # Sudo autocompletion

shopt -s checkwinsize       # Check windows size after each command
shopt -s expand_aliases     # Aliases
shopt -s autocd             # Cd to directory just by typing its name (without cd)

History control

shopt -s histappend
export HISTCONTROL=ignoredups:erasedups
HISTSIZE=
HISTFILESIZE=

Autocompletions

[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
if [ -d "/usr/share/fzf" ]; then
    source /usr/share/fzf/completion.bash
    source /usr/share/fzf/key-bindings.bash
fi

Aliases

alias v="vim"
if command -v exa > /dev/null; then
    alias ls="exa --icons"
    alias ll="exa -lah --icons"
else
    alias ll='ls -lah'
fi
alias q="exit"
alias c="clear"
alias ci="init_mamba"
alias ca="micromamba activate"
alias cii="export INIT_MAMBA=true && init_mamba"
if [[ ! -z "$SIMPLE" ]]; then
    unalias ls
    alias ll="ls -lah"
fi

Micromamba

I’ve moved from conda to micromamba because it’s faster.

managed by ‘mamba init’ !!!

Yeah, tell this to yourself

init_mamba () {
    export MAMBA_EXE="/home/pavel/.guix-extra-profiles/dev/dev/bin/micromamba";
    export MAMBA_ROOT_PREFIX="/home/pavel/micromamba";
    __mamba_setup="$("$MAMBA_EXE" shell hook --shell bash --prefix "$MAMBA_ROOT_PREFIX" 2> /dev/null)"
    if [ $? -eq 0 ]; then
        eval "$__mamba_setup"
    else
        if [ -f "/home/pavel/micromamba/etc/profile.d/micromamba.sh" ]; then
            . "/home/pavel/micromamba/etc/profile.d/micromamba.sh"
        else
            export  PATH="/home/pavel/micromamba/bin:$PATH"  # extra space after export prevents interference from conda init
        fi
    fi
    unset __mamba_setup
}

if [[ ! -z "$INIT_MAMBA" ]]; then
    init_mamba
fi

Starship

if [[ -z "$SIMPLE" && "$TERM" != "dumb" ]]; then
    eval "$(starship init bash)"
fi

Yandex Cloud

init_yc () {
    # The next line updates PATH for Yandex Cloud CLI.
    if [ -f '/home/pavel/yandex-cloud/path.bash.inc' ]; then source '/home/pavel/yandex-cloud/path.bash.inc'; fi

    # The next line enables shell command completion for yc.
    if [ -f '/home/pavel/yandex-cloud/completion.bash.inc' ]; then source '/home/pavel/yandex-cloud/completion.bash.inc'; fi
}

Fish

:header-args+: :tangle ./.config/fish/config.fish :comments link
Guix dependencyDescription
fishAn alternative non POSIX-compliant shell

Fish shell is a non-POSIX-compliant shell, which offers some fancy UI & UX features.

Launch starship

if [ "$TERM" != "dumb" ]; and type -q starship;
    starship init fish | source
else
    function fish_prompt -d "Write out the prompt"
        printf '%s@%s %s%s%s > ' $USER $hostname \
            (set_color $fish_color_cwd) (basename (pwd)) (set_color normal)
    end
end

Enable vi keybindings & aliases. The alias syntax is the same as in bash, so it’s just a noweb reference to .bashrc.

if [ "$IS_VTERM" != "1" ];
    fish_vi_key_bindings
else
    fish_default_key_bindings
end

alias q="exit"
alias c="clear"
if type -q exa
    alias ls="exa --icons"
    alias ll="exa -lah --icons"
else
    alias ll="ls -h"
end
Guix dependency
dt-colorscripts

Launch a random DT’s colorscript unless ran inside tmux or Emacs.

if ! test -n "$TMUX"; and ! test -n "$IS_EMACS"; and type -q colorscript
    colorscript random
end

Suppress fish greeting

set fish_greeting

Micromamba

First, a function to initialize micromamba.

function init_mamba
    set -gx MAMBA_EXE "/home/pavel/.guix-extra-profiles/dev/dev/bin/micromamba"
    set -gx MAMBA_ROOT_PREFIX "/home/pavel/micromamba"
    $MAMBA_EXE shell hook --shell fish --prefix $MAMBA_ROOT_PREFIX | source
end

if test -n "$INIT_MAMBA";
    init_mamba
end

alias ca="micromamba activate"
alias ci="init_mamba"
alias cii="export INIT_MAMBA=true && init_mamba"

Then, check if launched from Emacs with environment activated.

# if test -n "$EMACS_CONDA_ENV";
    # conda activate $EMACS_CONDA_ENV
# end

Colors

Fish seems to have hardcoded colorcodes in some color settings. I set these to base16 colors, so they would match Xresources.

set fish_color_command cyan
set fish_color_comment green
set fish_color_end black
set fish_color_error red
set fish_color_escape yellow
set fish_color_operator yellow
set fish_color_param magenta
set fish_color_quote green
set fish_color_redirection yellow

Keybindings

bind -M insert \el forward-char
bind -M insert \eh backward-char
bind -M insert \ew forward-word
bind -M insert \eb backward-word

Functions

A small function to open the file with $EDITOR.

function e
    eval $EDITOR $argv
end

direnv

if type -q direnv
    direnv hook fish | source
end

atuin

if type -q atuin
    set -gx ATUIN_NOBIND "true"
    atuin init fish | source
    bind \cr _atuin_search
    bind -M insert \cr _atuin_search
end

Nushell

:header-args+: :tangle ./.config/nu/config.toml :comments link
Guix dependency
nushell-bin

A structured shell. I don’t use it as of now, but perhaps one day.

Starship prompt

Guix dependencyDescription
starship-binmy prompt of choice

Starship is a nice cross-shell prompt, written in Rust.

References:

[character]
success_symbol = "[> ](bold green)"
error_symbol = "[✕ ](bold red)"
vicmd_symbol = "[ᐊ ](bold green)"

[aws]
symbol = " "

# [battery]
# full_symbol = ""
# charging_symbol = ""
# discharging_symbol = ""

[conda]
symbol = " "

[cmd_duration]
min_time = 500
format = " [$duration]($style) "

[docker_context]
symbol = " "

[elixir]
symbol = " "

[elm]
symbol = " "

[git_branch]
symbol = " "
truncation_length = 20

[golang]
symbol = " "

# [haskell]
# symbol = " "

[hg_branch]
symbol = " "

[java]
symbol = " "

[julia]
symbol = " "

[memory_usage]
symbol = " "

[nim]
symbol = " "

[nix_shell]
symbol = " "

[nodejs]
symbol = " "

[package]
symbol = " "
disabled = true

[php]
symbol = " "

[python]
symbol = " "

[ruby]
symbol = " "

[rust]
symbol = " "

Tmux

:header-args+: :tangle ./.tmux.conf
Guix dependency
tmux
python-tmuxp

tmux is my terminal multiplexer of choice.

It provides pretty sane defaults, so the config is not too large. I rebind the prefix to C-a though.

Term settings

I have no idea how and why these statements work.

set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"

History limit.

set -g history-limit 20000

Keybindings

Enable vi keys and mouse.

set-window-option -g mode-keys vi
set-option -g xterm-keys on
set-option -g mouse on
set -sg escape-time 10

Change prefix from C-b to C-a.

unbind C-b
set -g prefix C-a
bind C-a send-prefix

Vi-like keybindings to manage panes & windows.

bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

bind s split-window
bind v split-window -h

bind-key n new-window
bind-key t next-window
bind-key T previous-window

Reload the config.

bind r source-file ~/.tmux.conf

Copy to clipboard

Guix dependency
xclip

Make tmux copy to clipboard as well

bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

UI

On [2020-01-22 Wed], I had generated the first version of this following with tmuxline.vim plugin and palenight theme for vim-airline.

Then I adapted it to use the current Emacs theme.

set -g status-justify "centre"
set -g status "on"
set -g status-left-style "none"
set -g message-command-style "fg=<<get-color(name="fg")>>,bg=<<get-color(name="bg-other")>>"
set -g status-right-style "none"
set -g pane-active-border-style "fg=<<get-color(name="blue")>>"
set -g status-style "none,bg=<<get-color(name="bg-other")>>"
set -g message-style "fg=<<get-color(name="fg")>>,bg=<<get-color(name="bg-other")>>"
set -g pane-border-style "fg=<<get-color(name="blue")>>"
set -g status-right-length "100"
set -g status-left-length "100"
setw -g window-status-activity-style "none,fg=<<get-color(name="blue")>>,bg=<<get-color(name="bg-other")>>"
setw -g window-status-separator ""
setw -g window-status-style "none,fg=<<get-color(name="fg")>>,bg=<<get-color(name="bg-other")>>"
set -g status-left "#[fg=<<get-fg-for-color(name="blue")>>,bg=<<get-color(name="blue")>>] #S #[fg=<<get-color(name="blue")>>,bg=<<get-color(name="light-blue")>>,nobold,nounderscore,noitalics]#[fg=<<get-fg-for-color(name="light-blue")>>,bg=<<get-color(name="light-blue")>>] #W #[fg=<<get-color(name="light-blue")>>,bg=<<get-color(name="bg-other")>>,nobold,nounderscore,noitalics]"
set -g status-right "%-H:%M #[bg=<<get-color(name="bg-other")>>,fg=<<get-color(name="light-blue")>>,nobold,nounderscore,noitalics]#[fg=<<get-fg-for-color(name="light-blue")>>,bg=<<get-color(name="light-blue")>>] %a, %b %d #[bg=<<get-color(name="light-blue")>>,fg=<<get-color(name="blue")>>,nobold,nounderscore,noitalics]#[fg=<<get-fg-for-color(name="blue")>>,bg=<<get-color(name="blue")>>] #H "
setw -g window-status-format "#[fg=<<get-color(name="bg-other")>>,bg=<<get-color(name="light-blue")>>,nobold,nounderscore,noitalics]#[fg=<<get-fg-for-color(name="light-blue")>>,bg=<<get-color(name="light-blue")>>] #I #W #[align=left] #[fg=<<get-color(name="light-blue")>>,bg=<<get-color(name="bg-other")>>,nobold,nounderscore,noitalics]"
setw -g window-status-current-format "#[fg=<<get-color(name="bg-other")>>,bg=<<get-color(name="blue")>>,nobold,nounderscore,noitalics]#[fg=<<get-fg-for-color(name="blue")>>,bg=<<get-color(name="blue")>>] #I #W #[fg=<<get-color(name="blue")>>,bg=<<get-color(name="bg-other")>>,nobold,nounderscore,noitalics]"

Source the line config:

source ~/.tmux.line.conf

Alacritty

:header-args+: :tangle ./.config/alacritty/alacritty.yml :comments link
Guix dependency
alacritty

Alacritty is a GPU-accelerated terminal emulator. I haven’t found it to be an inch faster than st, but yml configuration is way more convenient than patches.

References:

decorations: none

font:
  normal:
    family: JetBrainsMono Nerd Font
    style: Regular

  size: 10

env:
  TERM: xterm-256color

colors:
  primary:
    background: '<<get-color(name="bg")>>'
    foreground: '<<get-color(name="fg")>>'
  normal:
    black: '<<get-color(name="black")>>'
    red: '<<get-color(name="red")>>'
    green: '<<get-color(name="green")>>'
    yellow: '<<get-color(name="yellow")>>'
    blue: '<<get-color(name="blue")>>'
    magenta: '<<get-color(name="magenta")>>'
    cyan: '<<get-color(name="cyan")>>'
    white: '<<get-color(name="white")>>'
  bright:
    Black: '<<get-color(name="light-black")>>'
    Red: '<<get-color(name="light-red")>>'
    Green: '<<get-color(name="light-green")>>'
    Yellow: '<<get-color(name="light-yellow")>>'
    Blue: '<<get-color(name="light-blue")>>'
    Magenta: '<<get-color(name="light-magenta")>>'
    Cyan: '<<get-color(name="light-cyan")>>'
    White: '<<get-color(name="light-white")>>'

window:
  padding:
    x: 0
    y: 0
  dynamic_padding: true
  opacity: 1

key_bindings:
  - { key: Paste,                                       action: Paste          }
  - { key: Copy,                                        action: Copy           }
  - { key: L,         mods: Control,                    action: ClearLogNotice }
  - { key: L,         mods: Control, mode: ~Vi|~Search, chars: "\x0c"          }
  - { key: PageUp,    mods: Shift,   mode: ~Alt,        action: ScrollPageUp,  }
  - { key: PageDown,  mods: Shift,   mode: ~Alt,        action: ScrollPageDown }
  - { key: Home,      mods: Shift,   mode: ~Alt,        action: ScrollToTop,   }
  - { key: End,       mods: Shift,   mode: ~Alt,        action: ScrollToBottom }

  #  Turn off vi mode
  - { key: Space,  mods: Shift|Control, mode: ~Search,    action: ReceiveChar             }

  # (Windows, Linux, and BSD only)
  - { key: V,              mods: Control|Shift, mode: ~Vi,        action: Paste            }
  - { key: C,              mods: Control|Shift,                   action: Copy             }
  - { key: F,              mods: Control|Shift, mode: ~Search,    action: ReceiveChar    }
  - { key: B,              mods: Control|Shift, mode: ~Search,    action: ReceiveChar   }
  - { key: Insert,         mods: Shift,                           action: PasteSelection   }
  - { key: Key0,           mods: Control,                         action: ResetFontSize    }
  - { key: Equals,         mods: Control,                         action: IncreaseFontSize }
  - { key: Plus,           mods: Control,                         action: IncreaseFontSize }
  - { key: NumpadAdd,      mods: Control,                         action: IncreaseFontSize }
  - { key: Minus,          mods: Control,                         action: DecreaseFontSize }
  - { key: NumpadSubtract, mods: Control,                         action: DecreaseFontSize }

Bottom

Guix dependencyDescription
bottom-binresource monitor

bottom is a TUI system monitor.

See the default config for the avaliable options.

(if (my/light-p) "default-light" "default")
[flags]
hide_table_gap = true  # Remove space in tables
color = "<<bottom-theme()>>"
process_command = true

[processes]
columns = ["PID", "State", "Name", "CPU%", "Mem%", "R/s", "W/s", "User"]

Atuin

atuin is a tool that replaces shell history with a SQLite database, providing some additional functionality.

See config reference.

update_check = false
enter_accept = true
keymap_mode = "vim-insert"

Various console applications

Guix dependencyDescription
ncursesProvides stuff like clear
exals replacement, written in Rust
batcat clone with syntax highlighting
htopInteractive process viewer
nethogsA tool to group processed by used bandwidth
osyncrsync wrapper
neofetchFetch system info
fzffuzzy finder
p7ziparchiver
password-storeCLI password manager
zip
unzip
jmtpfsA tool to mount MTP devices (e.g. Android)
tokeiCount lines of code
sshfsMount stuff over SSH
lftpFile transfer
git-lfs
glibc-locales
direnv
jless-binJSON viewer
megacmdmega.nz client
ncdudisk usage analyzer
openssl
aria2Download tool

ripgrep config

Occasionally I can’t exclude certain files from ripgrep via the VCS settings, so here is a simple config to ignore certain files globally.

--ignore-file=/home/pavel/.config/ripgrep/ripgrepignore

The ignore file:

*.ts.snap

By default, ripgrep doesn’t read any configs, so it is necessary to set the RIPGREP_CONFIG_PATH variable in the .profile.

Misc scripts

nt - exec command with a finished notification

Usage:

nt <command>
command="$@"
if [ ! -z "$command" ]; then
    start_time="$(date -u +%s)"
    $command
    end_time="$(date -u +%s)"
    elapsed="$(($end_time-$start_time))"
    notify-send "Terminal" "Command\n$command\nexecuted in $elapsed seconds"
else
    notify-send "Terminal" "Command execution complete"
fi

autocommit

A script to perform automatic commits in a repository. I use it to sync my org directory and password store. I guess it’s not how git is intended to be used, but it works for me.

Usage:

autocommit <repository> [-F]

Environment:

VariableDescriptionDefault value
TIMEOUT_MINDefault timeout60

Here’s roughly what the script is doing:

  • If there is a merge conflict, notify
  • If there were changed files in the last TIMEOUT_MIN minutes, commit
  • Fetch
  • If there were changes in the last TTMEOUT_MIN, merge (usually the merge is just fast-forward)
  • If the fetch was successful & the merge was either successful or delayed because of changes in the last TIMEOUT_MIN, push
  • Send a notification about the events above
  • Send a separate notification if there is a merge conflict
TIMEOUT_MIN=${TIMEOUT_MIN:-60}

export DISPLAY=:0
cd "$1"

TIMESTAMP=$(date +%s)
LAST_COMMIT_TIMESTAMP=$(git log -1 --format="%at" | xargs -I{} date -d @{} +%s)
RECENTLY_CHANGED_NUM=$(find . -not -path '*/\.*' -mmin -$TIMEOUT_MIN | wc -l)
CHANGED_NUM=$(git status --porcelain | wc -l)
COMMITED="No"
PUSHED="No"
FETCHED="No"
MERGED="No"

notify () {
    if command -v notify-send; then
        notify-send -u ${LEVEL:-normal} "$1" "$2"
    else
        echo "$1" "$2"
    fi
}

if [[ $(git ls-files -u | wc -l) -gt 0 ]]; then
    LEVEL=critical notify "Autocommit $(pwd)" "Merge conflict!"
fi

if [[ ($RECENTLY_CHANGED_NUM -eq 0 || $2 = "-F") && $CHANGED_NUM -gt 0 ]]; then
    read -r -d '' MESSAGE << EOM
Autocommit $(date -Iminutes)

Hostname: $(hostname)
EOM
    git add -A
    git commit -m "$MESSAGE"
    COMMITED="Yes"
fi

NEED_TO_PUSH=$(git log origin/master..HEAD | wc -l)

git fetch && FETCHED="Yes" || FETCHED="No"
if [[ $RECENTLY_CHANGED_NUM -gt 0 && $2 != '-F' ]]; then
    MERGED="Waiting"
fi

if [[ ($RECENTLY_CHANGED_NUM -eq 0 || $2 = "-F") && $FETCHED = "Yes" ]]; then
    MERGE_OUT=$(git merge origin/master) && MERGED="Yes" || MERGED="No"
fi

if [[ $NEED_TO_PUSH -gt 0 && ($MERGED = "Yes" || $MERGED = "Waiting") ]]; then
    git push origin && PUSHED="Yes" || PUSHED="No"
fi

if [[ $PUSHED = "Yes" || $COMMITED = "Yes" || ($MERGED = "Yes" &&  $MERGE_OUT != "Already up to date.")]]; then
    read -r -d '' NOTIFICATION << EOM
Commited: $COMMITED
Fetched: $FETCHED
Merged: $MERGED
Pushed: $PUSHED
EOM
    notify "Autocommit $(pwd)" "$NOTIFICATION"
fi

if [[ $(git ls-files -u | wc -l) -gt 0 ]]; then
    LEVEL=critical notify "Autocommit $(pwd)" "Merge conflict!"
fi

mcron job:

(job "0 * * * *" "autocommit /home/pavel/30-39\\ Life/32\\ org-mode/")
(job "0,15,30,45 * * * *" "autocommit ~/.password-store")

Guix settings

(my/format-guix-dependencies)
(specifications->manifest
 '(
   <<packages()>>))

Android notes

SSH instructions: https://wiki.termux.com/wiki/Remote_Access

Installation

First, run

pkg update

Then install the following packages:

Package
yadm
gnupg
git
which
starship
atuin
vim
tmux
emacs
make
clang
ripgrep
cmake
gperf
iproute2
wakatime-cli

Run

termux-setup-storage

Then import ssh and gpg keys. Set the main key to ultimate trust (gpg --edit-key ..., then trust).

Then:

yadm clone [email protected]/SqrtMinusOne/dotfiles.git

Install nerd fonts: https://github.com/notflawffles/termux-nerd-installer

git clone https://github.com/notflawffles/termux-nerd-installer.git
cd termux-nerd-installer
make install

Clone passwords.git to ~/.password-store/, org-mode.git to ~/30-39 Life/32 org-mode.

Create the file ~/.android-profile with contents:

export ANDROID_NAME=<name>

Then emacs should launch fine.

Also:

  • cleanup $PREFIX/etc/motd to remove hello message.

Installation of DT’s colorscripts:

git clone https://gitlab.com/dwt1/shell-color-scripts.git
cd shell-color-scripts

Apply a patch:

--- a/colorscript.sh
+++ b/colorscript.sh
@@ -2,7 +2,7 @@

 # Simple CLI for shell-color-scripts

-DIR_COLORSCRIPTS="/opt/shell-color-scripts/colorscripts"
+DIR_COLORSCRIPTS="$PREFIX/opt/shell-color-scripts/colorscripts"
 LS_CMD="$(command -v ls)"
 fmt_help="  %-20s\t%-54s\n"
 list_colorscripts="$($LS_CMD "${DIR_COLORSCRIPTS}" | cut -d ' ' -f 1 | nl)"
sudo mkdir -p $PREFIX/opt/shell-color-scripts/colorscripts || return 1
sudo cp -rf colorscripts/* $PREFIX/opt/shell-color-scripts/colorscripts
sudo cp colorscript.sh $PREFIX/bin/colorscript