#+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" * Contents :PROPERTIES: :TOC: :include all :depth 3 :END: :CONTENTS: - [[#contents][Contents]] - [[#profile][.profile]] - [[#environment][Environment]] - [[#various-paths][Various 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]] - [[#starship-prompt][Starship prompt]] - [[#tmux][Tmux]] - [[#term-settings][Term settings]] - [[#keybindings][Keybindings]] - [[#copy-to-clipboard][Copy to clipboard]] - [[#ui][UI]] - [[#alacritty][Alacritty]] :END: * =.profile= :PROPERTIES: :header-args+: :tangle ./.profile :header-args:sh: :shebang "" :comments link :END: ** Environment #+begin_src sh # export EDITOR=/usr/bin/vim # export BROWSER=/usr/bin/firefox export QT_QPA_PLATFORMTHEME="qt5ct" export QT_AUTO_SCREEN_SCALE_FACTOR=0 # export GTK2_RC_FILES="$HOME/.gtkrc-2.0" #+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 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 unset profile done #+end_src Set a folder for my packages. #+begin_src sh export GUIX_PACKAGE_PATH=~/guix-packages #+end_src ** XResources | Guix dependency | |-----------------| | xrdb | #+begin_src sh xrdb ~/.Xresources #+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" ]] && source /etc/profile return fi #+end_src Source the system-wide file #+begin_src bash source /etc/bashrc #+end_src 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} ]] 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-ref shell-aliases alias v="vim" alias gg="lazygit" alias ls="exa --icons" alias ll="exa -lah --icons" alias q="exit" alias c="clear" #+end_src *** OFF (OFF) Anaconda #+begin_quote managed by 'conda init' !!! #+end_quote Yeah, tell this to yourself #+begin_src bash :tangle no # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/home/pavel/Programs/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/home/pavel/Programs/miniconda3/etc/profile.d/conda.sh" ]; then . "/home/pavel/Programs/miniconda3/etc/profile.d/conda.sh" else export PATH="/home/pavel/Programs/miniconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< #+end_src *** Starship prompt #+begin_src bash eval "$(starship init bash)" #+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 <> #+end_src Anaconda #+begin_src fish :tangle no # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! eval /home/pavel/Programs/miniconda3/bin/conda "shell.fish" "hook" $argv | source # <<< conda initialize <<< #+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 * 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 | [[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 applications | Guix dependency | Description | |-----------------+--------------------------------------| | ncurses | provides stuff like ~clear~ | | exa | ~ls~ replacement, written in Rust | | bat | ~cat~ clone with syntax highlighting | | Note | Description | |------+-----------------| | TODO | package fselect | * Guix settings #+NAME: packages #+begin_src emacs-lisp :tangle no (my/format-guix-dependencies) #+end_src #+begin_src scheme :tangle .config/guix/manifests/console.scm :noweb yes (specifications->manifest '( <>)) #+end_src