diff --git a/README.md b/README.md index 46cca40..3d97a7e 100644 --- a/README.md +++ b/README.md @@ -53,12 +53,13 @@ Enjoy! * [`waybar`](https://github.com/Alexays/Waybar) - Easily customizable statusbar for wayland * [`bemenu`](https://github.com/Cloudef/bemenu) - Extended dmenu replacement for wayland, X11 and ncurses * [`fontconfig`] - System-wide font replacements and styling settings -* [`wezterm`](https://wezfurlong.org/wezterm/) - Terminal emulator and multiplexer (fast, understandable and lua configurable) +* [`wezterm`](https://wezfurlong.org/wezterm/) - Terminal emulator (fast, understandable and lua configurable) +* [`tmux`](https://github.com/tmux/tmux/) - terminal multiplexer (slowly migrating away in favor of wezterm) * [`nvim`](https://neovim.io/) - Neovim configuration * [`vifm`](https://github.com/vifm/vifm) - vim-like file-manager * [`qutebrowser`](https://github.com/qutebrowser/qutebrowser) - vim-key enabled web browser * [`pass`](pass/README.md) - Password management suite -* [`bibtex`] - LateX/BibteX/pandoc plaintext writing & reference suite (slowly migrating toward [typst](https://typst.app)) +* [`bibtex`] - LateX/BibteX/pandoc plaintext writing & reference suite * [`git`](git/README.md) - distributed version control system. * [`office`](office/README.md) - office/productivity software for writing e-mail and setting appointments diff --git a/bootstrap/packages_stable.tsv b/bootstrap/packages_stable.tsv index fb736d2..3d77a6e 100644 --- a/bootstrap/packages_stable.tsv +++ b/bootstrap/packages_stable.tsv @@ -41,8 +41,8 @@ bind A complete, highly portable implementation of the DNS protocol R bluetuith-bin A TUI based bluetooth manager A bluez-utils Development and debugging utilities for the bluetooth protocol stack R booster Fast and secure initramfs generator R -bottom A graphical process/system monitor R brightnessctl Lightweight brightness control tool R +btop A monitor of system resources, bpytop ported to C++ R caddy Fast web server with automatic HTTPS R calcurse A text-based personal organizer R catdoc A convertor for Microsoft Word, Excel, PowerPoint and RTF Files to text R @@ -65,7 +65,6 @@ dos2unix Text file format converter R dotter-rs-bin A dotfile manager and templater written in Rust A duf Disk Usage/Free Utility R dust A more intuitive version of du in rust R -edir Program to rename, remove, and copy files and directories using your editor A efm-langserver General purpose Language Server A enca Charset analyser and converter R entr Run arbitrary commands when files change R @@ -90,6 +89,7 @@ git-lfs Git extension for versioning large files R gitlint Git commit message linter A gitui Blazing fast terminal-ui for git written in Rust R gk6x-bin Configure keys, macros, and lighting on GK6X keyboards (GK64, GK84, GK61, etc) A +glances CLI curses-based monitoring tool R glfw-wayland A free, open source, portable framework for graphical application development (wayland) R glow Command-line markdown renderer R gnu-netcat GNU rewrite of netcat, the network piping application R @@ -166,7 +166,6 @@ mermaid-cli Generation of diagram and flowchart from text in a similar manner as mimeo Open files by MIME-type or file name using regular expressions. A minidlna A DLNA/UPnP-AV Media server (aka ReadyDLNA) R minio-client Replacement for ls, cp, mkdir, diff and rsync commands for filesystems and object storage R -miniserve Tool to serve files via HTTP R mopidy-bandcamp Mopidy backend for Bandcamp A mopidy-iris A Mopidy Web client that utilizes the Spotify and EchoNest frameworks. (Formerly Spotmop) A mopidy-local Mopidy extension for local media playback A @@ -282,6 +281,7 @@ scc-bin Sloc, Cloc and Code: scc is a very fast accurate code counter with compl scrcpy Display and control your Android device R screen Full-screen window manager that multiplexes a physical terminal R sd Intuitive find & replace R +sfz A simple static file server A shellcheck-bin Shell script analysis tool (binary release, static) A shfmt Format shell programs R sioyek PDF viewer for research papers and technical books. A @@ -311,6 +311,7 @@ tidy-viewer CLI csv pretty printer that uses column styling A timew Timewarrior, A command line time tracking application R tinyxxd Standalone version of the hex dump utility that comes with ViM R tlp Linux Advanced Power Management R +tmux Terminal multiplexer R toilet free replacement for the FIGlet utility. A topgrade-bin Invoke the upgrade procedure of multiple package managers A traceroute Tracks the route taken by packets over an IP network R diff --git a/multimedia/.config/mpv/mpv.conf b/multimedia/.config/mpv/mpv.conf index 302d642..d928d32 100644 --- a/multimedia/.config/mpv/mpv.conf +++ b/multimedia/.config/mpv/mpv.conf @@ -39,11 +39,13 @@ osd-font='Iosevka Nerd Font' osd-font-size=15 ### Subtitles + ## options and compatibility -sub-ass-use-video-data=all +# vsfilter backward compatibility +sub-ass-vsfilter-blur-compat=yes sub-ass-scale-with-window=no # custom ass style params -sub-ass-style-overrides=Kerning=yes +sub-ass-force-style=Kerning=yes # fuzzy-search available subs in folder sub-auto=fuzzy # search for external subs in these relative subdirectories @@ -83,6 +85,7 @@ audio-pitch-correction=yes ### Video hwdec=auto +profile=opengl-hq opengl-early-flush=auto opengl-pbo=no # ever so slightly up saturation diff --git a/nvim/.config/nvim/lua/core/mappings.lua b/nvim/.config/nvim/lua/core/mappings.lua index c0c5880..7f457e9 100644 --- a/nvim/.config/nvim/lua/core/mappings.lua +++ b/nvim/.config/nvim/lua/core/mappings.lua @@ -113,7 +113,7 @@ map("t", "\\\\", [[]], { desc = "exit terminal mode" }) map("n", "/", ":noh", { desc = "remove highlights" }) -- split buffers vertically/horizontally with the leader \ or - (mirrors my --- multiplexer setup) +-- tmux setup) map("n", "-", ":sp", { desc = "open horiz split" }) map("n", "\\", ":vsp", { desc = "open vert split" }) -- open actual new tab with leader-T diff --git a/qutebrowser/config/searchengines.py b/qutebrowser/config/searchengines.py index 42dab38..cbbfdcd 100644 --- a/qutebrowser/config/searchengines.py +++ b/qutebrowser/config/searchengines.py @@ -18,7 +18,7 @@ c.url.searchengines = { "l": "https://links.martyoeh.me/?searchterm={}&searchtags=", "lib": "http://libgen.fun/search.php?req={}", "man": "https://manned.org/browse/search?q={}", - "maps": "https://facilmap.org/#q={}", + "maps": "https://www.qwant.com/maps/?q={}", "pcw": "https://www.pcgamingwiki.com/w/index.php?search={}", "py": "https://pypi.org/search/?q={}", "r": "https://www.reddit.com/r/{}", diff --git a/qutebrowser/scripts/qutedmenu b/qutebrowser/scripts/qutedmenu index d32b47f..a6b69b8 100755 --- a/qutebrowser/scripts/qutedmenu +++ b/qutebrowser/scripts/qutedmenu @@ -7,11 +7,6 @@ #:bind o spawn --userscript /path/to/userscripts/qutedmenu open #:bind O spawn --userscript /path/to/userscripts/qutedmenu tab -warn() { - echo "$1" >&2 -} - - readonly confdir=${XDG_CONFIG_HOME:-$HOME/.config} readonly datadir=${XDG_DATA_HOME:-$HOME/.local/share} readonly optsfile=$confdir/dmenu/bemenucolors @@ -29,21 +24,8 @@ create_menu() { printf -- '%s\n' "$url" done <"$QUTE_CONFIG_DIR"/bookmarks/urls - # Saved sessions - if type yq >/dev/null 2>&1; then - while read -r url; do - printf -- '%s\n' "$url" - done < <(yq ".windows.[].tabs.[].history.[].url" "${QUTE_DATA_DIR}"/sessions/*.yml | sed -e 's/^"\(.*\)"$/\1/') - else - warn "Did not find yq executable, not searching saved sessions." - fi - # Finally history - if type sqlite3 >/dev/null 2>&1; then - printf -- '%s\n' "$(sqlite3 -separator ' ' "$QUTE_DATA_DIR/history.sqlite" 'select title, url from CompletionHistory')" - else - warn "Did not find sqlite3 executable, not searching history." - fi + printf -- '%s\n' "$(sqlite3 -separator ' ' "$QUTE_DATA_DIR/history.sqlite" 'select title, url from CompletionHistory')" } get_selection() { @@ -74,6 +56,5 @@ url=${url/*http/http} case $1 in open) printf '%s' "open $url" >>"$QUTE_FIFO" || qutebrowser "$url" ;; -print) echo "$url" ;; tab | *) printf '%s' "open -t $url" >>"$QUTE_FIFO" || qutebrowser "$url" ;; esac diff --git a/sh/.config/sh/alias.d/serve.sh b/sh/.config/sh/alias.d/sfz.sh similarity index 73% rename from sh/.config/sh/alias.d/serve.sh rename to sh/.config/sh/alias.d/sfz.sh index d58d216..6d0daf8 100644 --- a/sh/.config/sh/alias.d/serve.sh +++ b/sh/.config/sh/alias.d/sfz.sh @@ -2,9 +2,7 @@ ## Quickly bring up a file server for # the current directory. -if exist miniserve; then - alias serve="miniserve" -elif exist sfz; then +if exist sfz; then alias serve="sfz" elif exist gossa; then alias serve="gossa" diff --git a/sh/.config/sh/alias.d/top.sh b/sh/.config/sh/alias.d/top.sh deleted file mode 100644 index 5966525..0000000 --- a/sh/.config/sh/alias.d/top.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env sh -## Use the preferred system monitoring application -# when invoking top. - -if exist btm; then - alias top="btm" -elif exist btop; then - alias top="btop" -elif exist gotop; then - alias top="gotop" -elif exist glances; then - alias top="glances" -elif exist bpytop; then - alias top="bpytop" -elif exist bashtop; then - alias top="bashtop" -elif exist htop; then - alias top="htop" -elif exist top; then - alias top="top" -fi diff --git a/sh/.config/sh/xdg b/sh/.config/sh/xdg index 0b62166..38bbd99 100644 --- a/sh/.config/sh/xdg +++ b/sh/.config/sh/xdg @@ -61,6 +61,7 @@ fi export PYTHONSTARTUP="$XDG_CONFIG_HOME/python/pythonrc" export SQLITE_HISTORY="$XDG_STATE_HOME/sqlite_history" export TEXMFVAR="$XDG_CACHE_HOME/texlive/texmf-var" +export TMUX_PLUGIN_MANAGER_PATH="$XDG_DATA_HOME/tmux" export VAGRANT_HOME="$XDG_DATA_HOME/vagrant" export WINEPREFIX="$XDG_DATA_HOME/wine" export ZDOTDIR="$XDG_CONFIG_HOME/zsh" diff --git a/terminal/.config/sh/alias.d/tmux.sh b/terminal/.config/sh/alias.d/tmux.sh new file mode 100644 index 0000000..12459be --- /dev/null +++ b/terminal/.config/sh/alias.d/tmux.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env sh + +exist() { type "$1" >/dev/null 2>&1; } + +# alias tmux to follow xdg-specification +# shellcheck disable=2139 +alias tmux="tmux -f ${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf" + +# fzf +if exist fzf; then + # fzf select a tmux session to connect to, with pane preview + alias tm='_fzf_tmux_attach_start_session' + alias tl=tm +else + alias tm='tmux_attach_start' + # show a list of running tmux sessions + alias tl='tmux list-sessions -F "#{session_name}" 2>/dev/null ' +fi + +_fzf_tmux_list_sessions() { + tmux list-sessions -F "#{session_name}" 2>/dev/null | fzf \ + --layout=reverse \ + --height=50% \ + --border \ + --prompt="Session> " \ + --preview="tmux_pane_tree {}" \ + --preview-window=right:80% \ + --print-query +} + +_fzf_tmux_attach_start_session() { + if [ -z "$1" ]; then + result=$(_fzf_tmux_list_sessions) + case "$?" in + 0) + # found a session, attaching + tmux_attach_start "$(echo "$result" | tail --lines=1)" + ;; + 1) + # did not find a session, creating + result=$(echo "$result" | head --lines=1) + # if . was only thing entered, create one for current dir + if [ "$result" = "." ]; then + tmux_attach_start + # create for query name + else + tmux_attach_start "$result" + fi + ;; + esac + else + tmux_attach_start "$1" + fi +} + +unset choice +unset -f exist diff --git a/terminal/.config/starship.toml b/terminal/.config/starship.toml deleted file mode 100644 index 16a4bce..0000000 --- a/terminal/.config/starship.toml +++ /dev/null @@ -1,79 +0,0 @@ -format = """ -$custom\ -$sudo\ -$username\ -$directory\ -$git_state\ -$git_status\ -$status\ -$character -""" - -right_format =""" -$cmd_duration\ -$hostname\ -$git_branch\ -$fossil_branch\ -$go\ -$lua\ -$nodejs\ -$python\ -$package -""" - -[directory] -style = "blue" -fish_style_pwd_dir_length = 1 -read_only = " " -read_only_style = "purple" - -[character] -success_symbol = "[❯](purple)" -error_symbol = "[❯](red)" -vimcmd_symbol = "[❮](green)" - -[git_branch] -format = "[$branch]($style) " -style = "bright-black" - -[git_status] -format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218) ($ahead_behind$stashed)]($style) " -style = "cyan" -conflicted = "​" -untracked = "​" -modified = "​" -staged = "​" -renamed = "​" -deleted = "​" -stashed = "≡" - -[git_state] -format = '\([$state( $progress_current/$progress_total)]($style)\) ' -style = "bright-black" - -[cmd_duration] -format = "[$duration]($style) " -style = "yellow" - -[python] -format = "[$virtualenv]($style) " -style = "bright-black" - -[fossil_branch] - -[line_break] -disabled = true - -[package] -symbol = "" -style = "blue" - -[status] -disabled = false -symbol = " " - -[sudo] -disabled = false -symbol = " 󱍔 " -style = 'bold yellow' -format = "[$symbol]($style)" diff --git a/terminal/.config/tmux/sessions/dot.session b/terminal/.config/tmux/sessions/dot.session new file mode 100644 index 0000000..abb88c6 --- /dev/null +++ b/terminal/.config/tmux/sessions/dot.session @@ -0,0 +1,13 @@ +rename-window dot-git +send-keys "cd ~/.dotfiles; while true; do [[ -z $(git status -s) ]] && { fd -t f --hidden | entr -cd tea issue ;} || { fd -t f --hidden | entr -cd git -c color.ui=always diff ;} ; done" +split-window -h "cd ~/.dotfiles; while true; do fd -t f --hidden --exclude .git/objects | entr -cd git -c color.ui=always status; done" +split-window -v +send-keys "cd ~/.dotfiles; clear" C-m L C-m +select-pane -t 1 +split-window -v "cd ~/.dotfiles; while true; do fd -t f --hidden --exclude .git/objects | entr -cd git -c color.ui=always log --graph --date=short --decorate --oneline --all --remotes; done" +select-pane -t 4 +new-window -n code +send-keys "cd ~/.dotfiles; v ." C-m zo +new-window -n test +select-window -t 1 +attach-session -t . -c ~/.dotfiles diff --git a/terminal/.config/tmux/sessions/music.session b/terminal/.config/tmux/sessions/music.session new file mode 100644 index 0000000..0ae173a --- /dev/null +++ b/terminal/.config/tmux/sessions/music.session @@ -0,0 +1,9 @@ +rename-window server +send-keys "mopidy" C-m +new-window -n player +send-keys "ncmpcpp" C-m +new-window -n mixer +send-keys "pulsemixer" C-m +new-window -n bluetooth +send-keys "bluetoothctl" C-m +select-window -t 2 diff --git a/terminal/.config/tmux/sessions/notes.session b/terminal/.config/tmux/sessions/notes.session new file mode 100644 index 0000000..266f002 --- /dev/null +++ b/terminal/.config/tmux/sessions/notes.session @@ -0,0 +1,7 @@ +rename-window notes +send-keys vm Space $WIKIROOT Space $LIBRARY C-m +new-window -n notepad +send-keys cd Space $WIKIROOT C-m +send-keys v C-m +send-keys Space w w +attach-session -t . -c $WIKIROOT diff --git a/terminal/.config/tmux/sessions/social.session b/terminal/.config/tmux/sessions/social.session new file mode 100644 index 0000000..c81074b --- /dev/null +++ b/terminal/.config/tmux/sessions/social.session @@ -0,0 +1,10 @@ +rename-window mail +send-keys "neomutt" C-m +new-window -n news +send-keys "newsboat" C-m +split-window -h +send-keys "tut" C-m +new-window -n matrix +send-keys "gomuks" C-m +new-window -n signal +send-keys "siggo" C-m diff --git a/terminal/.config/tmux/sessions/sport.session b/terminal/.config/tmux/sessions/sport.session new file mode 100644 index 0000000..0bbca19 --- /dev/null +++ b/terminal/.config/tmux/sessions/sport.session @@ -0,0 +1,4 @@ +rename-window stats +send-keys "cd ~/documents/records; v workout.md" C-m +new-window -n routine +send-keys "cd ~/documents/records; sc-im workout.csv" C-m diff --git a/terminal/.config/tmux/sessions/todo.session b/terminal/.config/tmux/sessions/todo.session new file mode 100644 index 0000000..7fd71ad --- /dev/null +++ b/terminal/.config/tmux/sessions/todo.session @@ -0,0 +1,15 @@ +rename-window focus +send-keys tasksh C-m "+TODAY" C-m +new-window -n dash +send-keys "cd ${XDG_DATA_HOME:-~/.local/share}/task/; fd . | entr -c task next" C-m +split-window -h -l 71 +send-keys "cd ${XDG_DATA_HOME:-~/.local/share}/task/; fd . | entr -c task summary" C-m +split-window -v "cd ${XDG_DATA_HOME:-~/.local/share}/task/; fd . | entr -c task status:pending or +ACTIVE burndown" +select-pane -t 1 +split-window -v -l 5 +send-keys "t" Space +new-window -n journal +send-keys "calcurse" C-m +split-window -h -l 35% "ls ~/documents/records/jrnl.md | entr -c jrnl -5" +split-window -v -l 10% +select-window -t 2 diff --git a/terminal/.config/tmux/tmux.conf b/terminal/.config/tmux/tmux.conf new file mode 100644 index 0000000..5e477b4 --- /dev/null +++ b/terminal/.config/tmux/tmux.conf @@ -0,0 +1,183 @@ +# Layout of this conf file: +# 1. Global Settings +# 2. Plugins +# 3. Keybinds +# 4. Theme + +# For rapid change prototyping, disabled normally: +# bind-key r source-file ~/.config/tmux/tmux.conf \; display-message "config reloaded." + +###################### +### 1. GLOBAL SETTINGS +###################### + +# show that activity happens but don't display a huge 'activity happening' notification +setw -g monitor-activity on +set -g visual-activity off + +# Start counting windows and panes at 1 +set -g base-index 1 +setw -g pane-base-index 1 +set -g renumber-windows on + +# Terminal improvements +set-window-option -g automatic-rename on +set-option -g set-titles on +set -g mouse on +# allow truecolor support +set -g default-terminal 'xterm-256color' +set -ga terminal-overrides ',xterm-256color:Tc' +set -g status-keys vi +set-window-option -g mode-keys vi +set -g history-limit 10000 + +# Screen size is based on the smallest client looking at the current windows, not the smallest +# client connected to the overall session. If two clients are connected to the same session but not +# looking at the same window, why would they care about each others screen size? +setw -g aggressive-resize on + +# No delay for escape key press +set -sg escape-time 0 + +# to enable autoread option in neovim +set-option -g focus-events on + +#################### +## 2. PLUGINS ## +#################### + +set -g @tpm_plugins ' \ + tmux-plugins/tpm \ + tmux-plugins/tmux-sensible \ + christoomey/vim-tmux-navigator \ + Morantron/tmux-fingers \ + ' + +set -g @fingers-key F + +# make sure tpm is installed +if-shell "test ! -d $TMUX_PLUGIN_MANAGER_PATH/tpm" \ + "run 'git clone https://github.com/tmux-plugins/tpm $TMUX_PLUGIN_MANAGER_PATH/tpm && $TMUX_PLUGIN_MANAGER_PATH/tpm/bin/install_plugins'" \ + +# optinally add this to install plugins on each start -- adds small lag to startup + # "run-shell $TMUX_PLUGIN_MANAGER_PATH/tpm/bin/install_plugins" + +##################### +## 3. KEYBINDINGS ## +##################### + +# Unbind some defaults +unbind '"' +unbind % + +# Custom modifier key +set -g prefix C-a +unbind-key C-b +bind-key -r C-a send-prefix + +# Window Navigation - Prefix + Vim Keys +bind-key -r C-h select-window -t :- +bind-key -r C-l select-window -t :+ + +# Resize Panes +bind-key -r H resize-pane -L 3 +bind-key -r J resize-pane -D 1 +bind-key -r K resize-pane -U 1 +bind-key -r L resize-pane -R 3 + +bind-key -r C-H resize-pane -L 10 +bind-key -r C-J resize-pane -D 5 +bind-key -r C-K resize-pane -U 5 +bind-key -r C-L resize-pane -R 10 + +# Send Pane to a new window (but stay on current window), join it back into the current window +bind-key B break-pane -d +bind-key C-b command-prompt -p "join pane from: " "join-pane -h -s '%%'" + +# Swap panes within the current window (swaps pane # entered with currently selected pane) +bind-key b display-panes\; command-prompt -p "pane #: " "swap-pane -t '%%'" + +# Kill tabs quicker +bind-key x kill-pane +bind-key C-x kill-window + +# Split Window into panes - automatically handled by plugin +bind-key '\' split-window -h -c '#{pane_current_path}' +bind-key '-' split-window -v -c '#{pane_current_path}' + +# Open a sessions chooser +bind C-s split-window -v "tmux list-sessions | sed -E 's/:.*$//' | grep -v \"^$(tmux display-message -p '#S')\$\" | fzf --reverse | xargs tmux switch-client -t" + +# Make visual selections act a little more like vim +bind-key -T copy-mode-vi v send -X begin-selection +bind-key -T copy-mode-vi V send -X select-line +bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel 'wl-copy' \; send -X rectangle-off +bind-key -T copy-mode-vi 'C-v' send -X begin-selection \; send -X rectangle-on + +##################### +## 4. THEME ## +##################### + +# Status update interval +set -g status-interval 1 +# Clock mode +set -g clock-mode-colour colour24 +set -g clock-mode-style 24 + +# This tmux statusbar config was created by tmuxline.vim +# on Wed, 13 Mar 2019 + +set -g message-command-style bg="#2e2e2e",fg="#c8c8c8" +set -g message-style bg="#2e2e2e",fg="#c8c8c8" +set -g pane-active-border-style fg="#2e2e2e" +set -g pane-border-style fg="#2e2e2e" +set -g status-justify "centre" +set -g status "on" +set -g status-style "none" +set -g status-style "none" +set -g status-left-length "100" +set -g status-right-length "100" +setw -g window-status-style fg="#c8c8c8",bg="#2e2e2e","none" +setw -g window-status-activity-style bg="#2e2e2e",fg="#c8c8c8","underscore" +setw -g window-status-separator "" +set -g status-left "#[fg=#c8c8c8,bg=#2e2e2e] #S #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#[fg=#c8c8c8,bg=#2e2e2e] #I:#P #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#[fg=#c8c8c8,bg=#2e2e2e] #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]" +set -g status-right "#[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics] #[fg=#c8c8c8,bg=#2e2e2e] #{?client_prefix,#[fg=colour232]#[bg=brightblue],} #(whoami) #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#[fg=#c8c8c8,bg=#2e2e2e] %d-%b-%y #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#[fg=#c8c8c8,bg=#2e2e2e] #H " +setw -g window-status-format "#[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#[default] #I #W #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]" +setw -g window-status-current-format "#[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#[fg=#c8c8c8,bg=#2e2e2e]  #I #W #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]" + +######################## +## 5. Nested Sessions ## +######################## +# from: https://github.com/samoshkin/tmux-config/blob/master/tmux/tmux.conf +# all credit to samoshkin + +# Session is considered to be remote when we ssh into host +if-shell 'test -n "$SSH_CLIENT"' \ + 'source-file $XDG_CONFIG_HOME/tmux/tmux.remote.conf' + +# We want to have single prefix key "C-a", usable both for local and remote session +# we don't want to "C-a" + "a" approach either +# Idea is to turn off all key bindings and prefix handling on local session, +# so that all keystrokes are passed to inner/remote session + +# see: toggle on/off all keybindings · Issue #237 · tmux/tmux - https://github.com/tmux/tmux/issues/237 + +# Also, change some visual styles when window keys are off +bind -T root F12 \ + set prefix None \;\ + set key-table off \;\ + set status-style fg="colour245",bg="colour238" \;\ + set window-status-current-format "#[fg=$color_window_off_status_bg,bg=$color_window_off_status_current_bg]$separator_powerline_right#[default] #I:#W# #[fg=$color_window_off_status_current_bg,bg=$color_window_off_status_bg]$separator_powerline_right#[default]" \;\ + set window-status-current-style fg="colour232",bg="colour254","bold" \;\ + if -F '#{pane_in_mode}' 'send-keys -X cancel' \;\ + refresh-client -S \;\ + +bind -T off F12 \ + set -u prefix \;\ + set -u key-table \;\ + set -u status-style \;\ + set -u window-status-current-style \;\ + set -u window-status-current-format \;\ + refresh-client -S + +run -b "$TMUX_PLUGIN_MANAGER_PATH/tpm/tpm" diff --git a/terminal/.config/tmux/tmux.remote.conf b/terminal/.config/tmux/tmux.remote.conf new file mode 100644 index 0000000..defe108 --- /dev/null +++ b/terminal/.config/tmux/tmux.remote.conf @@ -0,0 +1,10 @@ +# show status bar at bottom for remote session, +set -g status-position bottom + +# Set port of SSH remote tunnel, where tmux will pipe buffers to transfer on local machine for copy +set -g @copy_backend_remote_tunnel_port 11988 + +# In remote mode we don't show "clock" and "battery status" widgets +set -g status-left "#[fg=#c8c8c8,bg=#2e2e2e][SSH]#S #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#[fg=#c8c8c8,bg=#2e2e2e] #(whoami) #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#[fg=#c8c8c8,bg=#2e2e2e] #I:#P #[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]" +set -g status-right "#{prefix_highlight} $wg_is_keys_off $wg_is_zoomed #{sysstat_cpu} | #{sysstat_mem} | #{sysstat_loadavg} | $wg_user_host | #{online_status}" +set -g status-right "#[fg=#2e2e2e,bg=#2e2e2e,nobold,nounderscore,noitalics]#{prefix_highlight} #H " diff --git a/terminal/.config/vifm/vifmrc b/terminal/.config/vifm/vifmrc index 35d133f..35f7f2a 100644 --- a/terminal/.config/vifm/vifmrc +++ b/terminal/.config/vifm/vifmrc @@ -305,21 +305,16 @@ nnoremap C :fzfcdhome nnoremap w :grep " external commands -if executable('atool') - " extract currently selected file(s) - noremap ,xx :!atool -x %f - " compress currently selected file(s) - noremap ,xc :!atool -a %c:r.tar.gz %f - " archive currently selected file(s) - noremap ,xa :!atool -a %c:r.tar %f - " zip currently selected file(s) - noremap ,xz :!atool -a %c:r.zip %f -endif - -if executable('pdftk') - " combine selected PDFs into single one (named output.pdf) - noremap ,pc :!pdftk %f cat output output.pdf -endif +" extract currently selected file(s) +noremap ,xx :!atool -x %f +" compress currently selected file(s) +noremap ,xc :!atool -a %c:r.tar.gz %f +" archive currently selected file(s) +noremap ,xa :!atool -a %c:r.tar %f +" zip currently selected file(s) +noremap ,xz :!atool -a %c:r.zip %f +" combine selected PDFs into single one (named output.pdf) +noremap ,pc :!pdftk %f cat output output.pdf " preview thumbnails of current folder " select thumbnails with m/M in nsxiv @@ -328,27 +323,7 @@ nnoremap ,t :!vifm-thumbnailer -t %u %c nnoremap ,T :!vifm-thumbnailer -r -t %u %c " batch rename or delete files in current dir -if executable('edir') - nnoremap ,rr :!edir - nnoremap ,rf :!edir --files - nnoremap ,rd :!edir --dirs - nnoremap ,rR :!edir --all --depth=10 -elseif executable('vidir') - nnoremap ,rr :!vidir - if executable('find') - nnoremap ,rf :!find . -maxdepth 1 -type f | vidir - - nnoremap ,rd :!find . -maxdepth 1 -type d | vidir - - nnoremap ,rR :!find . | vidir - - endif -endif - -if executable('zoxide') - " integrate zoxide search and add any vifm-visited paths automatically - " adapted from https://q2a.vifm.info/949/how-can-i-integrate-zoxide-into-vifm - command! zoxide :set noquickview | :execute 'cd' fnameescape(system('zoxide query --interactive "%a" 2>/dev/tty')) '%IU' | redraw - nnoremap z :zoxide - autocmd DirEnter * !zoxide add %d %i -endif +nnoremap ,r :!vidir " allows preview to work for normal view and single pane view noremap w : if layoutis('only') @@ -466,8 +441,6 @@ fileviewer *.[1-8] man ./%c | col -b " Images filextype *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm - \ {View in vimiv} - \ vimiv %f, \ {View in imv} \ imv %f %i, \ {View in viu} @@ -476,6 +449,8 @@ filextype *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm \ vifm-thumbnailer %c, \ {View in nsxiv} \ nsxiv %f, + \ {View in vimiv} + \ vimiv %f, \ {View in sxiv} \ sxiv %f, \ {View in feh} diff --git a/terminal/.config/zsh/completions/_tmux_attach_start b/terminal/.config/zsh/completions/_tmux_attach_start new file mode 100755 index 0000000..da73e36 --- /dev/null +++ b/terminal/.config/zsh/completions/_tmux_attach_start @@ -0,0 +1,12 @@ +#compdef _tmux_attach_start +# +# Requires tmux_attach_start script in path +# +# Enables completion for zsh of tmux_attach_start function +# with currently open sessions, or tmux options. + +_tmux_attach_start() { + _alternative \ + "sessions:user sessions:($(tmux list-sessions -F'#{session_name}' 2>/dev/null))" +} + diff --git a/terminal/.local/bin/test/tmux_attach_start.bats b/terminal/.local/bin/test/tmux_attach_start.bats new file mode 100644 index 0000000..941d8ea --- /dev/null +++ b/terminal/.local/bin/test/tmux_attach_start.bats @@ -0,0 +1,39 @@ +setup() { + fut="$BATS_TEST_DIRNAME/../tmux_attach_start" +} + +teardown() { + rm -rf $BATS_TMPDIR/xdg/* +} + +@test "runs correctly if invoked without arguments" { + run $fut + echo "$BATS_TEST_DIRNAME/../tmux_attach_start" + [ "$status" -eq 0 ] +} + +@test "Errors out if passed a non-existent session file (and some session name)" { + run $fut IDONT_EXIST_HERE.session sessionname + echo "STATUS: $output" + [ "$status" -eq 1 ] + echo "OUTPUT: $output" + [ "$output" = "can not source session file: 'IDONT_EXIST_HERE.session' does not exist." ] +} + +@test "Runs without errors when session file exists in PWD" { + touch $PWD/exists.session + run $fut exists.session sessionname + rm $PWD/exists.session + + [ "$status" -eq 0 ] +} + +@test "Runs without errors when session file exists in XDG_CONFIG_HOME/tmux/sessions/" { + export XDG_CONFIG_HOME=$BATS_TMPDIR + mkdir -p $XDG_CONFIG_HOME/tmux/sessions + sesdir=$XDG_CONFIG_HOME/tmux/sessions + touch $sesdir/exists.session + run $fut exists.session sessionname + + [ "$status" -eq 0 ] +} diff --git a/terminal/.local/bin/tmux_attach_start b/terminal/.local/bin/tmux_attach_start new file mode 100755 index 0000000..e6ffc26 --- /dev/null +++ b/terminal/.local/bin/tmux_attach_start @@ -0,0 +1,154 @@ +#!/bin/sh +# +# Attach to a tmux session, or create it if it doesnt exist + +if [ "$1" = '-h' ] || [ "$1" = '--help' ]; then + cat <<-EOF + Usage: $0 [FILE] [NAME] + Attach to an existing tmux session, or bootstrap a new session. + + If no session exists which fits the criteria, this will create a new one and + load it up obeying the commands contained in the FILE argument passed in. It + must contain commands which are tmux-command compatible since they will be + passed to tmux unmodified. If a session exists and a valid configuration FILE is + passed, it will attach itself to the session and execute the session setup inside. + + It will load the default tmux.conf in the following order: + - XDG_CONFIG_HOME/tmux/tmux.conf (usually ~/.config/tmux/tmux.conf) + - ~/.tmux.conf + - /etc/tmux.conf + Afterwards, it will apply the contents of the FILE argument passed into the command. + + If no FILE argument is passed it will create an empty session, or attach itself to + the session specified. + + If no NAME argument is passed it will automatically create a session name from the + FILE argument passed. + + If creating a new session without passing in a FILE argument, and the current directory + contains a .tmux.session file, it will automatically use that to set up the session. + + By default, it also looks for valid session files in XDG_CONFIG_HOME/tmux/sessions/ + This path can be changed by setting the TM_SESSION_PATH environment variable. +EOF + exit 0 +fi + +# Make tmux obey the XDG specification on startup +if [ -e "$XDG_CONFIG_HOME/tmux/tmux.conf" ]; then + start="tmux -f $XDG_CONFIG_HOME/tmux/tmux.conf" +else + start=tmux +fi + +_file_exists() { + if [ -f "$1" ]; then + true + else + false + fi +} + +_not_in_tmux() { + [ -z "$TMUX" ] +} + +_session_exists() { + if tmux has-session -t "$session_name" >/dev/null 2>&1; then + true + else + false + fi +} + +_create_detached_session() { + ($start new-session -d -s "$session_name") +} + +_load_env_session_file() { + if [ -f ./.tmux.session ]; then + xargs -L1 tmux <./.tmux.session + fi +} + +_load_session_file() { + if [ -f "$session_file" ]; then + xargs -L1 tmux <"$session_file" + fi +} + +_set_session_file_path() { + # Prefer local dir if file exists there, fall back to root dir + if _file_exists "${1}"; then + session_file="${1}" + elif _file_exists "${session_dir}${1}"; then + session_file="${session_dir}${1}" + fi +} + +_set_session_vars() { + session_dir=${TM_SESSION_DIR:-"$XDG_CONFIG_HOME/tmux/sessions/"} + + # set up session name and config file - if passed in as arguments + if [ "$#" -eq 2 ]; then + if ! _file_exists "$1" && ! _file_exists "${session_dir}${1}"; then + echo >&2 "can not source session file: '${1}' does not exist." + exit 1 + fi + _set_session_file_path "$1" + session_name=${2} + elif [ "$#" -eq 1 ]; then + _set_session_file_path "$1" + if ! _file_exists "$session_file"; then + session_name=${1} + fi + fi + + # set default session name if none was passed + if [ -z "$session_name" ]; then + # only if we have a filename should we append it to the session name + if [ -n "$session_file" ]; then + fname=/$(basename "$session_file" .session) + fi + # default to parent directory name / config file name for the session + session_name=$(basename "$PWD" | sed 's/[^a-zA-Z0-9\-]//g' | tr . -)"$fname" + fi +} + +_attach_or_create() { + # first create a new session if one doesn't exist + if ! _session_exists; then + _create_detached_session + # look for .tmux.session file if no file has been explicitly passed in + # session files always take precedence over environment files when specifically passed in + if ! _file_exists "$session_file"; then + _load_env_session_file + fi + fi + + _load_session_file + + # then attach or switch to the session + if _not_in_tmux; then + $start attach -t "$session_name" + else + $start switch-client -t "$session_name" + fi + + _unset_functions +} + +_unset_functions() { + unset _set_session_vars + unset _set_session_file_path + unset _attach_or_create + unset _load_session_file + unset _create_detached_session + unset _session_exists + unset _not_in_tmux + unset _file_exists +} + +_set_session_vars "$@" +_attach_or_create +exit 0 diff --git a/terminal/.local/bin/tmux_pane_tree b/terminal/.local/bin/tmux_pane_tree new file mode 100755 index 0000000..19f38f8 --- /dev/null +++ b/terminal/.local/bin/tmux_pane_tree @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# create a tree-style view +# of all open tmux panes +# and the command they are currently running + +tmux ls -F'#{session_id}' | while read -r s; do + S=$(tmux ls -F'#{session_id}#{session_name}: #{T:tree_mode_format}' | grep ^"$s") + session_info=${S##$s} + session_name=$(echo "$session_info" | cut -d ':' -f 1) + if [[ -n "$1" ]] && [[ "$1" == "$session_name" ]]; then + echo -e "\033[1;34m$session_info\033[0m" + tmux lsw -t"$s" -F'#{window_id}' | while read -r w; do + W=$(tmux lsw -t"$s" -F'#{window_id}#{T:tree_mode_format} - #{pane_current_command}' | grep ^"$w") + H=$(tmux lsw -t"$s" -F'#{window_id}#H' | grep ^"$w") + echo " ﬌ ${W##$w}" | sed "s/\"${H##$w}\" //" + done + else + echo -e "\033[1m$session_info\033[0m" + fi +done