#+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 #+TOC headlines 6 * Contents :noexport: :PROPERTIES: :TOC: :include all :depth 3 :END: :CONTENTS: - [[#contents][Contents]] - [[#profile][.profile]] - [[#environment][Environment]] - [[#my-paths][My paths]] - [[#guix-settings][Guix settings]] - [[#other-package-managers][Other package managers]] - [[#npm][npm]] - [[#xresources][XResources]] - [[#off-package-manager-paths][(OFF) Package manager paths]] - [[#bash][Bash]] - [[#bash_profile][.bash_profile]] - [[#bashrc][.bashrc]] - [[#startup--environment][Startup & environment]] - [[#launch-fish][Launch fish]] - [[#colors][Colors]] - [[#settings][Settings]] - [[#aliases][Aliases]] - [[#anaconda][Anaconda]] - [[#starship-prompt][Starship prompt]] - [[#fish][Fish]] - [[#nushell][Nushell]] - [[#starship-prompt][Starship prompt]] - [[#tmux][Tmux]] - [[#term-settings][Term settings]] - [[#keybindings][Keybindings]] - [[#copy-to-clipboard][Copy to clipboard]] - [[#ui][UI]] - [[#alacritty][Alacritty]] - [[#various-console-applications][Various console applications]] - [[#guix-settings][Guix settings]] :END: * =.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=~/Documents/org-mode/ledger/ledger.journal #+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 #+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 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::*conda][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 ones 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 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 *** 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" alias gg="lazygit" alias ls="exa --icons" alias ll="exa -lah --icons" alias q="exit" alias c="clear" alias ci="init_conda" alias ca="conda activate" alias cii="export INIT_CONDA=true && init_conda" #+end_src #+begin_src bash if [[ ! -z "$SIMPLE" ]]; then unalias ls alias ll="ls -lah" fi #+end_src *** Anaconda #+begin_quote managed by 'conda init' !!! #+end_quote Yeah, tell this to yourself #+begin_src bash init_conda () { __conda_setup="$('/home/pavel/.guix-extra-profiles/dev/dev/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/home/pavel/.guix-extra-profiles/dev/dev/etc/profile.d/conda.sh" ]; then . "/home/pavel/.guix-extra-profiles/dev/dev/etc/profile.d/conda.sh" else # export PATH="/home/pavel/Programs/miniconda3/bin:$PATH" echo "what" fi fi unset __conda_setup } if [[ ! -z "$INIT_CONDA" ]]; then init_conda fi #+end_src *** Starship #+begin_src bash if [[ -z "$SIMPLE" ]]; then eval "$(starship init bash)" 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 starship init fish | source #+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 cad="conda activate (basename (pwd))" #+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"; colorscript random end #+end_src Suppress fish greeting #+begin_src fish set fish_greeting #+end_src ** Anaconda First, a function to initialize anaconda. #+begin_src fish function init_conda eval /home/pavel/.guix-extra-profiles/dev/dev/bin/conda "shell.fish" "hook" $argv | source end if test -n "$INIT_CONDA"; init_conda end #+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 * 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. Set starship prompt #+begin_src conf-toml :noweb yes startup = [ <>, "mkdir ~/.cache/starship", "starship init nu | save ~/.cache/starship/init.nu", "source ~/.cache/starship/init.nu", ] prompt = "starship_prompt" #+end_src Skip welcome message #+begin_src conf-toml skip_welcome_message = true #+end_src Set table mode #+begin_src conf-toml table_mode = "rounded" #+end_src Aliases #+begin_src conf-toml :tangle no :noweb-ref nu-aliases "alias ll = ls -l", "alias c = clear", "alias q = exit" #+end_src Colors #+begin_src conf-toml [color_config] primitive_filesize="ub" primitive_boolean="yu" primitive_duration="g" primitive_path="y" primitive_date="r" primitive_int="c" primitive_decimal="c" #+end_src * Starship prompt | Guix dependency | Description | |-----------------+---------------------| | rust-starship | 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 two 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 copying 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 I generated the following with [[https://github.com/edkolev/tmuxline.vim][tmuxline.vim]] plugin and palenight theme for [[https://github.com/vim-airline/vim-airline][vim-airline]] #+begin_src conf-space :tangle ./.tmux.line.conf # This tmux statusbar config was created by tmuxline.vim # on Wed, 22 Jan 2020 set -g status-justify "centre" set -g status "on" set -g status-left-style "none" set -g message-command-style "fg=#bfc7d5,bg=#474b59" set -g status-right-style "none" set -g pane-active-border-style "fg=#939ede" set -g status-style "none,bg=#333747" set -g message-style "fg=#bfc7d5,bg=#474b59" set -g pane-border-style "fg=#474b59" set -g status-right-length "100" set -g status-left-length "100" setw -g window-status-activity-style "none,fg=#939ede,bg=#333747" setw -g window-status-separator "" setw -g window-status-style "none,fg=#bfc7d5,bg=#333747" set -g status-left "#[fg=#292D3E,bg=#939ede] #S #[fg=#939ede,bg=#474b59,nobold,nounderscore,noitalics]#[fg=#bfc7d5,bg=#474b59] #W #[fg=#474b59,bg=#333747,nobold,nounderscore,noitalics]" set -g status-right "#[fg=#333747,bg=#333747,nobold,nounderscore,noitalics]#[fg=#bfc7d5,bg=#333747] %-H:%M #[fg=#474b59,bg=#333747,nobold,nounderscore,noitalics]#[fg=#bfc7d5,bg=#474b59] %a, %b %d #[fg=#939ede,bg=#474b59,nobold,nounderscore,noitalics]#[fg=#292D3E,bg=#939ede] #H " setw -g window-status-format "#[fg=#333747,bg=#333747,nobold,nounderscore,noitalics]#[default] #I #W #[align=left] #[fg=#333747,bg=#333747,nobold,nounderscore,noitalics]" setw -g window-status-current-format "#[fg=#333747,bg=#474b59,nobold,nounderscore,noitalics]#[fg=#bfc7d5,bg=#474b59] #I #W #[fg=#474b59,bg=#333747,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 configuration the in yml format is way more convinient than patches. Once again, we have an application which doesn't support reading Xresources, so here goes noweb. #+name: get-xrdb #+begin_src bash :var color="color0" :tangle no xrdb -query all | grep "$color:" | cut -f 2 #+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: '<>' background_opacity: 0.80 window: padding: x: 0 y: 0 dynamic_padding: true 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 | | ** 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 corresponding 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 are were changes in the last =TTMEOUT_MIN=, merge (usually the merge has to be fast-forward) - If fetch was successful & merge was 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" if [[ $(git ls-files -u | wc -l) -gt 0 ]]; then notify-send -u critical "Autocommit $(pwd)" "Merge conflict!" exit 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-send "Autocommit $(pwd)" "$NOTIFICATION" fi if [[ $(git ls-files -u | wc -l) -gt 0 ]]; then notify-send -u critical "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