Compare commits

..

No commits in common. "1ed9e44ffa92a878f80e4756c4d56c8e69ff0d8e" and "4aab62cd8056038ec0b9ab424857d82bac8f5b21" have entirely different histories.

24 changed files with 563 additions and 170 deletions

View file

@ -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

View file

@ -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

Can't render this file because it has a wrong number of fields in line 32.

View file

@ -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

View file

@ -113,7 +113,7 @@ map("t", "\\\\", [[<C-\><C-n>]], { desc = "exit terminal mode" })
map("n", "<leader>/", ":noh<cr>", { desc = "remove highlights" })
-- split buffers vertically/horizontally with the leader \ or - (mirrors my
-- multiplexer setup)
-- tmux setup)
map("n", "<leader>-", ":sp<cr>", { desc = "open horiz split" })
map("n", "<leader>\\", ":vsp<cr>", { desc = "open vert split" })
-- open actual new tab with leader-T

View file

@ -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/{}",

View file

@ -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

View file

@ -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"

View file

@ -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

View file

@ -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"

View file

@ -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

View file

@ -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)"

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -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 "

View file

@ -305,21 +305,16 @@ nnoremap <space>C :fzfcdhome<cr>
nnoremap <space>w :grep<space>
" external commands
if executable('atool')
" extract currently selected file(s)
noremap ,xx :!atool -x %f<cr>
" compress currently selected file(s)
noremap ,xc :!atool -a %c:r.tar.gz %f<cr>
" archive currently selected file(s)
noremap ,xa :!atool -a %c:r.tar %f<cr>
" zip currently selected file(s)
noremap ,xz :!atool -a %c:r.zip %f<cr>
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<cr>
" compress currently selected file(s)
noremap ,xc :!atool -a %c:r.tar.gz %f<cr>
" archive currently selected file(s)
noremap ,xa :!atool -a %c:r.tar %f<cr>
" zip currently selected file(s)
noremap ,xz :!atool -a %c:r.zip %f<cr>
" 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<cr>
nnoremap ,T :!vifm-thumbnailer -r -t %u %c<cr>
" batch rename or delete files in current dir
if executable('edir')
nnoremap ,rr :!edir<cr>
nnoremap ,rf :!edir --files<cr>
nnoremap ,rd :!edir --dirs<cr>
nnoremap ,rR :!edir --all --depth=10<cr>
elseif executable('vidir')
nnoremap ,rr :!vidir<cr>
if executable('find')
nnoremap ,rf :!find . -maxdepth 1 -type f | vidir -<cr>
nnoremap ,rd :!find . -maxdepth 1 -type d | vidir -<cr>
nnoremap ,rR :!find . | vidir -<cr>
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 <space>z :zoxide<cr>
autocmd DirEnter * !zoxide add %d %i
endif
nnoremap ,r :!vidir<cr>
" allows preview to work for normal view and single pane view
noremap <silent> 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}

View file

@ -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))"
}

View file

@ -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 ]
}

View file

@ -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

View file

@ -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