dotfiles/Console.org

650 lines
18 KiB
Org Mode

#+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}$(</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
#+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
<<shell-aliases>>
#+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: '<<get-xrdb(color="color0")>>'
foreground: '<<get-xrdb(color="color7")>>'
normal:
black: '<<get-xrdb(color="color0")>>'
red: '<<get-xrdb(color="color1")>>'
green: '<<get-xrdb(color="color2")>>'
yellow: '<<get-xrdb(color="color3")>>'
blue: '<<get-xrdb(color="color4")>>'
magenta: '<<get-xrdb(color="color5")>>'
cyan: '<<get-xrdb(color="color6")>>'
white: '<<get-xrdb(color="color7")>>'
bright:
Black: '<<get-xrdb(color="color8")>>'
Red: '<<get-xrdb(color="color9")>>'
Green: '<<get-xrdb(color="color10")>>'
Yellow: '<<get-xrdb(color="color11")>>'
Blue: '<<get-xrdb(color="color12")>>'
Magenta: '<<get-xrdb(color="color13")>>'
Cyan: '<<get-xrdb(color="color14")>>'
White: '<<get-xrdb(color="color15")>>'
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
'(
<<packages()>>))
#+end_src