#+TITLE: Console #+TODO: TODO(t) CHECK(s) | OFF(o) #+PROPERTY: header-args :mkdirp yes #+PROPERTY: header-args:conf-space :comments link #+PROPERTY: header-args:conf-toml :comments link #+PROPERTY: header-args:sh :tangle-mode (identity #o755) :comments link :shebang "#!/usr/bin/env sh" #+PROPERTY: header-args:bash :tangle-mode (identity #o755) :comments link :shebang "#!/usr/bin/env bash" #+OPTIONS: broken-links:auto h:6 toc:nil #+begin_quote No matter from which side you approach penguins, more always come from behind #+end_quote - A friend of mine * =.profile= :PROPERTIES: :header-args+: :tangle ./.profile :header-args:sh: :shebang "" :comments link :END: ** Environment #+begin_src sh export QT_QPA_PLATFORMTHEME="qt5ct" export QT_AUTO_SCREEN_SCALE_FACTOR=0 #+end_src Set ripgrep config path #+begin_src sh export RIPGREP_CONFIG_PATH=$HOME/.config/ripgrep/ripgreprc #+end_src hledger path #+begin_src sh export LEDGER_FILE="$HOME/30-39 Life/32 org-mode/ledger/ledger.journal" #+end_src Checking if running inside termux #+begin_src sh if command -v termux-setup-storage > /dev/null; then export IS_ANDROID=true [[ -f ~/.android_profile ]] && . ~/.android_profile fi #+end_src Timezone #+begin_src sh # TZ='Asia/Karachi'; export TZ #+end_src ** My paths My script folders #+begin_src sh 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 #+end_src ** Guix settings Enable extra profiles #+begin_src sh if [ -z "$IS_ANDROID" ]; 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 export MANPATH="${MANPATH:-$(manpath)}:$profile/share/man" fi export XDG_DATA_DIRS="$XDG_DATA_DIRS:$profile/share" unset profile done fi #+end_src Set Jupyter config PATH. It defaults to readonly directory somewhere in Guix profile. #+begin_src sh export JUPYTER_CONFIG_DIR=$HOME/.config/jupyter #+end_src Set a folder for my packages. #+begin_src sh export GUIX_PACKAGE_PATH=~/guix-packages #+end_src Locale settings #+begin_src sh export GUIX_LOCPATH=$HOME/.guix-extra-profiles/console/console/lib/locale #+end_src ** Other package managers Using other package managers with Guix requires some extra work. Cask #+begin_src sh if [ -d "$HOME/.cask" ]; then export PATH="/home/pavel/.cask/bin:$PATH" fi #+end_src Make flatpak apps visible to launchers: #+begin_src sh if [ -d "$HOME/.local/share/flatpak" ]; then export XDG_DATA_DIRS="$XDG_DATA_DIRS:$HOME/.local/share/flatpak/exports/share" fi #+end_src Enable Nix #+begin_src sh if [ -f /run/current-system/profile/etc/profile.d/nix.sh ]; then . /run/current-system/profile/etc/profile.d/nix.sh fi #+end_src Use Guix fontconfig. Necessary for nix apps #+begin_src sh if [ -d "$HOME/.guix-extra-profiles/desktop-misc" ]; then export FONTCONFIG_PATH="$HOME/.guix-extra-profiles/desktop-misc/desktop-misc/etc/fonts" fi #+end_src Make nix apps visible to launchers: #+begin_src sh if [ -d "$HOME/.nix-profile" ]; then export XDG_DATA_DIRS="$XDG_DATA_DIRS:$HOME/.nix-profile/share/applications" fi #+end_src *** 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: #+begin_src conf :tangle ~/._npmrc prefix=/home/pavel/.npm-packages #+end_src 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: #+begin_src sh export NPM_CONFIG_USERCONFIG=$HOME/._npmrc #+end_src The variable is unset in a script in [[file:Guix.org::*micromamba][Guix.org]]. Set PATH & MANPATH #+begin_src sh NPM_PACKAGES="${HOME}/.npm-packages" export PATH="$PATH:$NPM_PACKAGES/bin" export MANPATH="${MANPATH:-$(manpath)}:$NPM_PACKAGES/share/man" #+end_src ** XResources | Guix dependency | |-----------------| | xrdb | #+begin_src sh if [ -z "$IS_ANDROID" ]; then xrdb ~/.Xresources fi #+end_src ** OFF (OFF) Package manager paths Turned off for now, because probably it won't be necessary in Guix. LaTeX #+begin_src sh :tangle no 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 #+end_src Cargo (Rust) #+begin_src sh :tangle no if [ -d "$HOME/.cargo" ] ; then export PATH="$HOME/.cargo/bin:$PATH" fi #+end_src RVM (Ruby) #+begin_src sh :tangle no 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 #+end_src Go #+begin_src sh :tangle no if [ -d "$HOME/go" ] ; then export PATH="$HOME/go/bin:$PATH" fi #+end_src ghcup (Haskell) #+begin_src sh :tangle no [ -f "/home/pavel/.ghcup/env" ] && source "/home/pavel/.ghcup/env" # ghcup-env #+end_src Perl #+begin_src sh :tangle no 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 #+end_src * Bash :PROPERTIES: :header-args:bash: :shebang "" :comments link :END: ** =.bash_profile= #+begin_src bash :tangle ./.bash_profile [[ -f ~/.profile ]] && . ~/.profile [[ -f ~/.bashrc ]] && . ~/.bashrc #+end_src ** =.bashrc= :PROPERTIES: :header-args+: :tangle ./.bashrc :END: 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. #+begin_src bash export SHELL #+end_src 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. #+begin_src bash if [[ $- != *i* ]] then [[ -n "$SSH_CLIENT" && -f "/etc/bashrc" ]] && source /etc/profile return fi #+end_src If =termux-setup-storage= is available, then we're running inside termux. It is necessary to source =~/.profile= manually. #+begin_src bash if command -v termux-setup-storage > /dev/null; then if [[ -z "$IS_ANDROID" ]]; then source ~/.profile fi fi #+end_src Source the system-wide file #+begin_src bash if [[ -f "/etc/bashrc" ]]; then source /etc/bashrc fi #+end_src | Guix dependency | |-----------------| | xhost | Allow other users to access X server. Necessary for stuff like aw-watcher-window. #+begin_src bash xhost +local:root > /dev/null 2>&1 #+end_src Set manpager to bat #+begin_src bash export MANPAGER="sh -c 'sed -e s/.\\\\x08//g | bat -l man -p'" #+end_src [[https://codeberg.org/akib/emacs-eat][eat]] integration #+begin_src bash [ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/bash" #+end_src *** Launch fish Launch fish shell unless bash itself is launched from fish. #+begin_src bash use_fish=true if [[ $(ps --no-header --pid=$PPID --format=cmd) != "fish" && ${use_fish} && $(command -v fish) ]] then exec fish fi #+end_src The rest of =.bashrc= is not executed if fish was launched. *** Colors Setting for colors, packed in the default =.bashrc= in Manjaro #+begin_src bash 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}$(/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 #+end_src *** Settings Some general bash settings. References: - [[https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html][shopt list]] #+begin_src bash 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) #+end_src History control #+begin_src bash shopt -s histappend export HISTCONTROL=ignoredups:erasedups HISTSIZE= HISTFILESIZE= #+end_src Autocompletions #+begin_src bash :tangle no [ -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 #+end_src *** Aliases #+begin_src bash :noweb yes :noweb-ref shell-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" #+end_src #+begin_src bash if [[ ! -z "$SIMPLE" ]]; then unalias ls alias ll="ls -lah" fi #+end_src *** Micromamba I've moved from conda to [[https://github.com/mamba-org/mamba][micromamba]] because it's faster. #+begin_quote managed by 'mamba init' !!! #+end_quote Yeah, tell this to yourself #+begin_src bash init_mamba () { export MAMBA_EXE="/gnu/store/w0rrglxs2247nr4wawrh5dylisjra1q4-micromamba-bin-1.4.4-0/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 #+end_src *** Starship #+begin_src bash if [[ -z "$SIMPLE" && "$TERM" != "dumb" ]]; then eval "$(starship init bash)" fi #+end_src *** Yandex Cloud #+begin_src bash 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 } #+end_src * Fish :PROPERTIES: :header-args+: :tangle ./.config/fish/config.fish :comments link :END: | Guix dependency | Description | |-----------------+------------------------------------------| | fish | An alternative non POSIX-compliant shell | [[https://fishshell.com/][Fish shell]] is a non-POSIX-compliant shell, which offers some fancy UI & UX features. Launch starship #+begin_src fish if [ "$TERM" != "dumb" ]; and type -q starship starship init fish | source end #+end_src Enable vi keybindings & aliases. The alias syntax is the same as in bash, so it's just a noweb reference to =.bashrc=. #+begin_src fish :noweb yes fish_vi_key_bindings 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 #+end_src | Guix dependency | |-----------------| | dt-colorscripts | Launch a random [[https://gitlab.com/dwt1/shell-color-scripts][DT's colorscript]] unless ran inside tmux or Emacs. #+begin_src fish if ! test -n "$TMUX"; and ! test -n "$IS_EMACS"; and type -q colorscript colorscript random end #+end_src Suppress fish greeting #+begin_src fish set fish_greeting #+end_src ** Micromamba First, a function to initialize micromamba. #+begin_src fish function init_mamba set -gx MAMBA_EXE "/gnu/store/w0rrglxs2247nr4wawrh5dylisjra1q4-micromamba-bin-1.4.4-0/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" #+end_src Then, check if launched from Emacs with environment activated. #+begin_src fish # if test -n "$EMACS_CONDA_ENV"; # conda activate $EMACS_CONDA_ENV # end #+end_src ** Colors Fish seems to have hardcoded colorcodes in some color settings. I set these to base16 colors, so they would match Xresources. #+begin_src fish set fish_color_command cyan set fish_color_comment green set fish_color_end white set fish_color_error red set fish_color_escape yellow set fish_color_operator yellow set fish_color_param magenta set fish_color_quote brwhite set fish_color_redirection yellow #+end_src ** Keybindings #+begin_src fish bind -M insert \el forward-char bind -M insert \eh backward-char bind -M insert \ew forward-word bind -M insert \eb backward-word #+end_src ** Functions A small function to open the file with =$EDITOR=. #+begin_src fish function e eval $EDITOR $argv end #+end_src ** direnv #+begin_src fish direnv hook fish | source #+end_src * Nushell :PROPERTIES: :header-args+: :tangle ./.config/nu/config.toml :comments link :END: | Guix dependency | |-----------------| | nushell-bin | A structured shell. I don't use it as of now, but perhaps one day. * Starship prompt | Guix dependency | Description | |-----------------+---------------------| | starship-bin | my prompt of choice | [[https://starship.rs/][Starship]] is a nice cross-shell prompt, written in Rust. References: - [[https://starship.rs/config/][Startship config guide]] #+begin_src conf-toml :tangle ./.config/starship.toml [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 = " " #+end_src * Tmux :PROPERTIES: :header-args+: :tangle ./.tmux.conf :END: | Guix dependency | |-----------------| | tmux | | python-tmuxp | [[https://github.com/tmux/tmux][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. #+begin_src conf-space set -g default-terminal "screen-256color" set -ga terminal-overrides ",*256col*:Tc" #+end_src History limit. #+begin_src conf-space set -g history-limit 20000 #+end_src ** Keybindings Enable vi keys and mouse. #+begin_src conf-space set-window-option -g mode-keys vi set-option -g xterm-keys on set-option -g mouse on set -sg escape-time 10 #+end_src Change prefix from =C-b= to =C-a=. #+begin_src conf-space unbind C-b set -g prefix C-a bind C-a send-prefix #+end_src Vi-like keybindings to manage panes & windows. #+begin_src conf-space 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 #+end_src Reload the config. #+begin_src conf-space bind r source-file ~/.tmux.conf #+end_src ** Copy to clipboard | Guix dependency | |-----------------| | xclip | Make tmux copy to clipboard as well #+begin_src conf-space 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" #+end_src ** UI On [2020-01-22 Wed], I had generated the first version of this following with [[https://github.com/edkolev/tmuxline.vim][tmuxline.vim]] plugin and palenight theme for [[https://github.com/vim-airline/vim-airline][vim-airline]]. Then I adapted it to use the current Emacs theme. #+begin_src conf-space :tangle ./.tmux.line.conf :noweb yes set -g status-justify "centre" set -g status "on" set -g status-left-style "none" set -g message-command-style "fg=<>,bg=<>" set -g status-right-style "none" set -g pane-active-border-style "fg=<>" set -g status-style "none,bg=<>" set -g message-style "fg=<>,bg=<>" set -g pane-border-style "fg=<>" set -g status-right-length "100" set -g status-left-length "100" setw -g window-status-activity-style "none,fg=<>,bg=<>" setw -g window-status-separator "" setw -g window-status-style "none,fg=<>,bg=<>" set -g status-left "#[fg=<>,bg=<>] #S #[fg=<>,bg=<>,nobold,nounderscore,noitalics]#[fg=<>,bg=<>] #W #[fg=<>,bg=<>,nobold,nounderscore,noitalics]" set -g status-right "%-H:%M #[bg=<>,fg=<>,nobold,nounderscore,noitalics]#[fg=<>,bg=<>] %a, %b %d #[bg=<>,fg=<>,nobold,nounderscore,noitalics]#[fg=<>,bg=<>] #H " setw -g window-status-format "#[fg=<>,bg=<>,nobold,nounderscore,noitalics]#[fg=<>,bg=<>] #I #W #[align=left] #[fg=<>,bg=<>,nobold,nounderscore,noitalics]" setw -g window-status-current-format "#[fg=<>,bg=<>,nobold,nounderscore,noitalics]#[fg=<>,bg=<>] #I #W #[fg=<>,bg=<>,nobold,nounderscore,noitalics]" #+end_src Source the line config: #+begin_src conf-space source ~/.tmux.line.conf #+end_src * Alacritty :PROPERTIES: :header-args+: :tangle ./.config/alacritty/alacritty.yml :comments link :END: | Guix dependency | |-----------------| | alacritty | [[https://github.com/alacritty/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. The application doesn't support XResources, so here goes noweb. #+NAME: get-color #+begin_src emacs-lisp :var name="black" quote=0 :tangle no (let ((color (or (my/color-value name)))) (if (> quote 0) (concat "\"" color "\"") color)) #+end_src #+NAME: get-fg-for-color #+begin_src emacs-lisp :var name="black" quote=0 :tangle no (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)) #+end_src #+begin_src emacs-lisp :tangle no (setq-local org-confirm-babel-evaluate nil) #+end_src References: - [[https://github.com/alacritty/alacritty/blob/master/alacritty.yml][default config]] #+begin_src yaml :noweb yes decorations: none font: normal: family: JetBrainsMono Nerd Font style: Regular size: 10 env: TERM: xterm-256color colors: primary: background: '<>' foreground: '<>' normal: black: '<>' red: '<>' green: '<>' yellow: '<>' blue: '<>' magenta: '<>' cyan: '<>' white: '<>' bright: Black: '<>' Red: '<>' Green: '<>' Yellow: '<>' Blue: '<>' Magenta: '<>' Cyan: '<>' 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 } #+end_src * Various console applications | Guix dependency | Description | |-----------------+---------------------------------------------| | ncurses | Provides stuff like ~clear~ | | exa | ~ls~ replacement, written in Rust | | bat | ~cat~ clone with syntax highlighting | | htop | Interactive process viewer | | nethogs | A tool to group processed by used bandwidth | | osync | rsync wrapper | | neofetch | Fetch system info | | fzf | fuzzy finder | | p7zip | archiver | | password-store | CLI password manager | | zip | | | unzip | | | jmtpfs | A tool to mount MTP devices (e.g. Android) | | tokei | Count lines of code | | sshfs | Mount stuff over SSH | | git-lfs | | | glibc-locales | | | direnv | | | jless-bin | JSON viewer | | megacmd | mega.nz client | | ncdu | disk usage analyzer | | openssl | | | bottom-bin | resource monitor | ** 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. #+begin_src text :tangle ~/.config/ripgrep/ripgreprc --ignore-file=/home/pavel/.config/ripgrep/ripgrepignore #+end_src The ignore file: #+begin_src text :tangle ~/.config/ripgrep/ripgrepignore *.ts.snap #+end_src By default, ripgrep doesn't read any configs, so it is necessary to set the =RIPGREP_CONFIG_PATH= variable in the [[*Environment][.profile.]] * Misc scripts ** =nt= - exec command with a finished notification Usage: #+begin_example nt #+end_example #+begin_src sh :tangle ~/bin/scripts/nt 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 #+end_src ** =autocommit= A script to autocommit files 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: #+begin_example autocommit [-F] #+end_example Environment: | Variable | Description | Default value | |---------------+-----------------+---------------| | =TIMEOUT_MIN= | Default timeout | 60 | Here's more or less what the script is doing: - If there is a merge conflict, notify - If there are changed files in the last =TIMEOUT_MIN= minutes, commit - Fetch - If there were changes in the last =TTMEOUT_MIN=, merge (usually the merge has to be fast-forwarded) - 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 #+begin_src bash :tangle ~/bin/scripts/autocommit 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 #+end_src =mcron= job: #+begin_src scheme :tangle ~/.config/cron/autocommit.guile (job "0 * * * *" "autocommit ~/Documents/org-mode") (job "0,15,30,45 * * * *" "autocommit ~/.password-store") #+end_src * Guix settings #+NAME: packages #+begin_src emacs-lisp :tangle no :eval never-export (my/format-guix-dependencies) #+end_src #+begin_src scheme :tangle .config/guix/manifests/console.scm :noweb yes (specifications->manifest '( <>)) #+end_src * Android notes SSH instructions: https://wiki.termux.com/wiki/Remote_Access Don't forget to install the following termux packages: | Termux package | |----------------| | vim | | tmux | | starship | | fish | | exa | | bat | | git | Also: - cleanup =$PREFIX/etc/motd= to remove hello message. - copy the required font at =$HOME/.termux/font.ttf= and run =termux-reload-settings=. ** Installation of [[https://gitlab.com/dwt1/shell-color-scripts][DT's colorscripts]]: #+begin_src bash :tangle no :eval no git clone https://gitlab.com/dwt1/shell-color-scripts.git cd shell-color-scripts #+end_src Apply a patch: #+begin_src diff --- 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)" #+end_src #+begin_src bash :tangle no :eval no 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 #+end_src