diff --git a/README.md b/README.md index a6bca26..e827554 100644 --- a/README.md +++ b/README.md @@ -43,19 +43,19 @@ Enjoy! ![Overview - an older image of the dotfile desktop with gaps, showing git logs, styler logs, duckduckgo in a browser, and a vifm view of the dotfiles themselves](https://gitlab.com/marty-oehme/dotfiles/-/wikis/uploads/aaf0319d575dc192ea0f4bd6eaf83c08/gaps.png) +* [`alacritty`](https://github.com/jwilm/alacritty) - Terminal emulator (GPU accelerated and customizable) * [`wayland`](https://github.com/wayland-project/wayland) - Containing basics for fully functional tiling wayland setup: * [`river`](https://github.com/riverwm/river) - Tiling window manager for wayland * [`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 -* [`kitty`](https://sw.kovidgoyal.net/kitty/) - Terminal emulator (GPU accelerated and configurable) -* [`tmux`](https://github.com/tmux/tmux/) - terminal multiplexer -* [`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`](bibtex/README.md) - LateX/BibteX/pandoc plaintext writing & reference suite * [`git`](git/README.md) - distributed version control system. +* [`pass`](pass/README.md) - Password management suite +* [`nvim`](https://neovim.io/) - Neovim configuration +* [`bibtex`](bibtex/README.md) - LateX/BibteX/pandoc plaintext writing & reference suite +* [`qutebrowser`](https://github.com/qutebrowser/qutebrowser) - vim-key enabled web browser +* [`tmux`](https://github.com/tmux/tmux/) - terminal multiplexer +* [`vifm`](https://github.com/vifm/vifm) - vim-like file-manager ## Notes diff --git a/bootstrap/packages.txt b/bootstrap/packages.txt index 39c42e7..59a2787 100644 --- a/bootstrap/packages.txt +++ b/bootstrap/packages.txt @@ -1,6 +1,7 @@ acpid activitywatch-bin afew +alacritty alias-tips-git alsa-utils an2linuxserver-git @@ -172,6 +173,7 @@ speedtest-cli sshfs stow surfraw +sxhkd sxiv systemd-sysvcompat task @@ -222,7 +224,6 @@ devour htop jrnl khard -kitty mopidy-autoplay mopidy-iris mopidy-local diff --git a/qutebrowser/.config/qutebrowser/config.py b/qutebrowser/.config/qutebrowser/config.py index bb24bd7..359a28e 100644 --- a/qutebrowser/.config/qutebrowser/config.py +++ b/qutebrowser/.config/qutebrowser/config.py @@ -11,12 +11,10 @@ from qutebrowser.config.configfiles import ConfigAPI # noqa: F401 # load additional settings configured via autoconfig.yml config.load_autoconfig() -term = os.getenv("TERMINAL", "xterm") - c.completion.web_history.max_items = 1000 c.hints.uppercase = True c.editor.command = [ - term, + "alacritty", "-e", "nvim", "-f", @@ -28,7 +26,7 @@ c.editor.command = [ # change filepicker c.fileselect.handler = "external" picker = [ - term, + "alacritty", "--class", "float", "-e", diff --git a/services/.config/systemd/user/dropdown-terminal.service b/services/.config/systemd/user/dropdown-terminal.service index d541a9d..78755de 100644 --- a/services/.config/systemd/user/dropdown-terminal.service +++ b/services/.config/systemd/user/dropdown-terminal.service @@ -1,12 +1,12 @@ [Unit] -Description=Terminal window hidden to be called at any point +Description=Alacritty window hidden on i3 scratchpad Requires=x-started-confirm.service After=x-started-confirm.service [Service] Type=simple # workaround to allow relative executable invocation (i.e. current users' home dir) -ExecStart=/bin/bash -c 'kitty --title "dropdown-terminal" --class scratchpad' +ExecStart=/bin/bash -c 'alacritty --title "dropdown-terminal" --class Alacritty,scratchpad' Restart=always [Install] diff --git a/services/.config/systemd/user/dropdown-todo.service b/services/.config/systemd/user/dropdown-todo.service index ed6a646..28f804d 100644 --- a/services/.config/systemd/user/dropdown-todo.service +++ b/services/.config/systemd/user/dropdown-todo.service @@ -1,12 +1,12 @@ [Unit] -Description=Todo.md hidden vim instance +Description=Todo.md floating vim instance Requires=x-started-confirm.service After=x-started-confirm.service [Service] Type=simple # workaround to allow relative executable invocation (i.e. current users' home dir) -ExecStart=/bin/bash -c 'kitty --title "dropdown-todo" --class scratchpad nvim -c ":set nonumber norelativenumber noshowmode noruler laststatus=0 noshowcmd shortmess=F | :Limelight" %h/documents/records/todo.md' +ExecStart=/bin/bash -c 'alacritty --title "dropdown-todo" --class "Alacritty,scratchpad" -e nvim -c ":set nonumber norelativenumber noshowmode noruler laststatus=0 noshowcmd shortmess=F | :Limelight" %h/documents/records/todo.md' Restart=always [Install] diff --git a/services/README.md b/services/README.md index 4b40271..d3a139e 100644 --- a/services/README.md +++ b/services/README.md @@ -62,12 +62,12 @@ As another example, if you want to check for changes every 30 seconds but still ## Dropdown services -The `dropdown-terminal.service` is very simple, and always keeps a terminal window running. +The `dropdown-terminal.service` is very simple, and always keeps a (`alacritty`) terminal window running. The program is started with a `scratchpad` class, which is picked up by [`i3`](i3) and automatically hidden. You can then show/hide the terminal as a floating overlay as you need, mimicking a floating terminal (by default with `super + shift + return`, though this may change). When you close the window in any way, systemd automatically restarts it in the background. -The `dropdown-todo.service` is similar but instead of an empty terminal window, +The `dropdown-todo.service` is similar but instead of an empty (`alacritty`) terminal window, it starts up a `nvim` instance which hides most of its interface and shows a to-do list. The list, by default, is situated in `~/documents/records/todo.md` and can be displayed with `super + t`. diff --git a/sh/.config/sh/env b/sh/.config/sh/env index 8e8a25f..7d180ed 100644 --- a/sh/.config/sh/env +++ b/sh/.config/sh/env @@ -25,7 +25,7 @@ export BIBFILE="${BIBFILE:-$LIBRARYROOT/academia/academia.bib}" # these are my personal 'important' application settings export EDITOR="nvim" export BROWSER="qutebrowser" -export TERMINAL="kitty" +export TERMINAL="alacritty" export PAGER="less" export FILEREADER="zathura" @@ -45,5 +45,5 @@ export SHELL=${SHELL:-/bin/bash} export TERM=xterm-256color if exist fzf; then - export FZF_DEFAULT_OPTS="--bind 'tab:toggle+down,shift-tab:toggle+up,ctrl-g:top,ctrl-t:toggle-preview,ctrl-d:preview-half-page-down,ctrl-u:preview-half-page-up' --color=light -1 -m --delimiter :" + export FZF_DEFAULT_OPTS="--bind 'tab:toggle+down,shift-tab:toggle+up,ctrl-g:top,ctrl-t:toggle-preview,ctrl-d:preview-half-page-down,ctrl-u:preview-half-page-up' --color=light -1 -m --delimiter :" fi diff --git a/sxhkd/.config/sxhkd/chain-labels.example.conf b/sxhkd/.config/sxhkd/chain-labels.example.conf new file mode 100644 index 0000000..f2cef24 --- /dev/null +++ b/sxhkd/.config/sxhkd/chain-labels.example.conf @@ -0,0 +1,7 @@ +# for sxhkd-chain-labels script + +# media manipulation mode: playing, pausing, skipping,.. +media:alt + m + +# academia mode: opening bibtex readings, annotating,.. +academia:alt + a diff --git a/sxhkd/.config/sxhkd/sxhkdrc b/sxhkd/.config/sxhkd/sxhkdrc new file mode 100644 index 0000000..ca1325f --- /dev/null +++ b/sxhkd/.config/sxhkd/sxhkdrc @@ -0,0 +1,103 @@ +# universal x key bindings + +# System functionality + +# Enable lock screen (TODO does not stop music, etc yet) +super + x + lockscreen + +# Open System Power Menu +super + BackSpace + rofi -modi "powermenu:~/.config/rofi/modes/powermenu" -show powermenu -theme themes/powermenu -selected-row 2 + +# quick-switching of theme using styler +super + F8 + styler set $(styler list themes | rofi -dmenu -theme /themes/dropdown -matching fuzzy -filter "-256 -atelier ") + +super + F7 + polybar-msg cmd toggle + +# enable function (/media) key functionality +XF86MonBrightness{Up,Down} + control-brightness {up, down} 10 +XF86AudioMute + control-volume mute +XF86Audio{LowerVolume,RaiseVolume} + control-volume {down, up} + +XF86Search + ~/.local/share/qutebrowser/userscripts/qutedmenu + # dunstctl set-paused toggle && echo "$(dunstctl is-paused)" > /tmp/dunstpaused + +# Open terminal emulator (the variable gets set in sh module basic env vars) +super + Return + $TERMINAL + +# open quick start menu +super + space + rofi -show drun -theme themes/dmenu + +# open more extensive run menu +super + shift + space + rofi -modi combi,ssh -show combi -combi-modi "window,clipboard:greenclip print,run" -theme themes/dropdown + +# open dropdown calculator -- top left (small r), bottom right (capital R) +super + { r, shift + r } + rofi -modi calc -show calc -location { 1, 5 } + +# open gopass frontend menu +super + shift + p + rofi-pass -theme themes/dropdown + +# open surfraw rofi frontend +super + shift + q + rofi-surfraw + +# insert emojis into any document/form +super + shift + e + rofimoji + +super + shift + u + alacritty --class floating,floating -e sharefile | xargs notify-send + +# invoke qutebrowser userscript to open link (from history/marks) +super + shift + o + qutedmenu + +## modes + +# mode:media:alt + m +# seek +/- 5 seconds +alt + m : {h,l} + playerctl position {5-,5+} +# seek +/- 15 seconds +alt + m : shift + {h,l} + playerctl position {15-,15+} +# decrease/increase volume +alt + m : {j,k} + pulsemixer --change-volume {-5,+5} +# decrease/increase volume +alt + m : shift + {j,k} + playerctl {next,previous} +# pause/stop player +alt + m : {_,shift} + p + playerctl {play-pause,stop} +# exit mode +alt + m : alt + m + pkill -ALRM sxhkd + +# mode:academia:alt + a +# due papers this week +alt + a : {F1,F2} + rofi-bib-due -p{1,3} -u $(date --date='fri this week' +%Y-%m-%d) +# due papers overall +alt + a : shift + {F1,F2} + rofi-bib-due -p{1,3} +alt + a : F3 + rofi-bib-due +# read wallabag articles from the cmdline +alt + a : {r, shift+r} + alacritty --class floating,floating -e wallr {-n,_} +# exit mode +alt + a : alt + a + pkill -ALRM sxhkd diff --git a/sxhkd/.local/bin/sxhkd-chain-labels b/sxhkd/.local/bin/sxhkd-chain-labels new file mode 100755 index 0000000..103a497 --- /dev/null +++ b/sxhkd/.local/bin/sxhkd-chain-labels @@ -0,0 +1,196 @@ +#!/usr/bin/env sh + +# output is to stdout unless explicitly set through -o or env var +OUTPUTF="$SXHKD_OUTPUTF" + +# set fifo input file, according (somewhat) to xdg +if [ -n "$SXHKD_FIFO" ]; then + FIFO="$SXHKD_FIFO" +elif [ -p "${XDG_RUNTIME_DIR}"/sxhkd_fifo ]; then + FIFO="${XDG_RUNTIME_DIR}"/sxhkd_fifo +elif [ -p "${XDG_CACHE_HOME:-$HOME/.cache}"/sxhkd_fifo ]; then + FIFO="${XDG_CACHE_HOME:-$HOME/.cache}"/sxhkd_fifo +elif [ -p "$HOME/.sxhkd_fifo" ]; then + FIFO="$HOME/.sxhkd_fifo" +fi + +# set label config file, according (somewhat) to xdg +if [ -n "$SXHKD_LABELCONFIG" ]; then + LABELCONFIG="$SXHKD_LABELCONFIG" +elif [ -f "${XDG_CONFIG_HOME:-$HOME/.config}"/sxhkd/chain-labels.conf ]; then + LABELCONFIG="${XDG_CONFIG_HOME:-$HOME/.config}"/sxhkd/chain-labels.conf +elif [ -f "$HOME/.chain-labels.conf" ]; then + LABELCONFIG="$HOME/.chain-labels.conf" +fi + +SXHKDRC_FILE="$XDG_CONFIG_HOME"/sxhkd/sxhkdrc + +main() { + while read -r event; do + detect_event "$event" + done <"$FIFO" +} + +detect_event() { + ev="$(echo "$1" | sed -e 's/^H.*$/hotkey/;s/^C.*$/command/;s/^BBegin chain.*$/chainstart/;s/^EEnd chain.*$/chainend/;')" + + case $ev in + hotkey) ev_hotkey "$(echo "$1" | sed -e 's/^H//')" ;; + # command) ev_command "$(echo "$1" | sed -e 's/^C//')" ;; + chainstart) ev_chainstart "$(echo "$1" | sed -e 's/^B//')" ;; + chainend) ev_chainend "$(echo "$1" | sed -e 's/^E//')" ;; + *) ;; + esac +} + +send_msg() { + if [ -n "$OUTPUTF" ]; then + echo "$1" >"$OUTPUTF" + else + echo "$1" + fi +} + +ev_hotkey() { + LAST_HOTKEY="$1" +} + +# compare labels to last hotkey, return mode name +ev_chainstart() { + [ -z "$LAST_HOTKEY" ] && return 1 + found=$(echo "$LABELS" | sed -e "/$LAST_HOTKEY/!d;s/^\(.\+\):.*$/\1/") + send_msg "$found" +} + +ev_chainend() { + send_msg "" +} + +# TODO add option to also display last command done in chain +# ev_command() { +# send_msg "command: $1" +# } + +# read config from file, remove comments (lines starting with #) and empty lines +read_config() { + [ ! -f "$1" ] && return 1 + + parse_labels "$(cat "$1")" +} + +# parse sxhkdrc for mode compatible comments +read_sxhkdrc() { + [ ! -f "$1" ] && return 1 + + _sxhkdrc_content="$(sed -e '/^# mode:/!d;s/^# mode://' <"$1")" + parse_labels "$_sxhkdrc_content" +} + +# append +parse_labels() { + LABELS="${LABELS}$(echo "$1" | sed -e '/^#/d;/^[[:blank:]]*$/d')" +} + +get_help() { + printf \ + "Usage: sxhkd-chain-labels [-c config file][-o output file][-s input pipe] + + By default will take the input from the input pipe (at XDG_RUNTIME_DIR/sxhkd_fifo) and + print the current sxhkd chain mode to stdout. That means, sxhkd needs to be started + with a fifo pipe running, ideally to the XDG_RUNTIME_DIR: + + mkfifo \$XDG_RUNTIME_DIR/sxhkd_fifo && sxhkd -s \$XDG_RUNTIME_DIR/sxhkd_fifo + + When given a key combination which maps to a specific mode, it will print out the name + of the mode instead. These maps can be passed with -c flag, specifying an options file. + By default it will look in \$XDG_CONFIG_HOME/sxhkd/sxhkd-chain-labels.conf + + When passed the -o flag it will replace the contents of the file passed in with the + current sxhkd chain mode, emptying the file when no mode is active. + + Default lookup places for files, in descending order: + :input fifo + \$SXHKD_FIFO (env variable) + \$XDG_RUNTIME_DIR/sxhkd_fifo + \$XDG_CACHE_HOME/sxhkd_fifo + ~/.cache/sxhkd_fifo + ~/.sxhkd_fifo + + :label configuration + \$SXHKD_LABELCONFIG (env variable) + \$XDG_CONFIG_HOME/sxhkd/chain-labels.conf + ~/.config/sxhkd/chain-labels.conf + ~/.chain-labels.conf + \$XDG_CONFIG_HOME/sxhkd/sxhkdrc (parsing) + + The label configuration file uses the following format: + mode name:key chain + + Lines beginning with a # will be ignored. Whitespace is important, sxhkd will, by + default, put a single space between any component of the key combination. + + An example file chain-labels.conf: + media:super + alt + m + system:super + backspace + + Instead of using an explicit configuration file, you can put the chain mode + information into the regular sxhkdrc as comments. They need to follow this exact format: + # mode:mode-name:key-chain + + They can occur anywhere in the file. The space between # and mode is necessary, and # + needs to be the first character on the line. + The above example file as written into the sxhkdrc: + # mode:media:super + alt + m + # mode:system:super + backspace + + If an explicit configuration file exists, it will supersede any mode information in the + sxhkdrc file. + \n" +} + +get_version() { + printf \ + "%s: 0.3 + + fifo input pipe: + %s %s + label configuration file: + %s %s + output: + %s \n" \ + "$0" \ + "$FIFO" \ + "$([ -p "$FIFO" ] && echo "(found)" || echo "(NOT FOUND)")" \ + "${LABELCONFIG:-"$SXHKDRC_FILE"}" \ + "$([ -f "${LABELCONFIG:-"$SXHKDRC_FILE"}" ] && echo "(found)" || echo "(NOT FOUND)")" \ + "${OUTPUTF:-stdout}" +} + +while getopts "vho:s:c:" opt; do + case "$opt" in + \?) + printf "Usage: sxhkd-chain-labels [-c config file][-o output file][-s input pipe]\n" + exit 0 + ;; + h) + get_help + exit 0 + ;; + v) + get_version + exit 0 + ;; + o) OUTPUTF="$OPTARG" ;; + s) FIFO="$OPTARG" ;; + c) LABELCONFIG="$OPTARG" ;; + esac +done +shift $((OPTIND - 1)) + +[ "${1:-}" = "--" ] && shift + +# look for default label config, prefer config file to parsing sxhkdrc +[ -z "$LABELS" ] && read_config "$LABELCONFIG" +[ -z "$LABELS" ] && read_sxhkdrc "$SXHKDRC_FILE" + +main "$@" diff --git a/sxhkd/.local/bin/sxhkd-piped b/sxhkd/.local/bin/sxhkd-piped new file mode 100755 index 0000000..7c555b4 --- /dev/null +++ b/sxhkd/.local/bin/sxhkd-piped @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +# Starting sxhkd without arguments automatically creates +# a fifo pipe in XDG_RUNTIME_DIR, to enable IPC for sxhkd. +# Mostly used for sxhkd-chain-labels script. + +type sxhkd >/dev/null 2>&1 || { + return 1 +} + +# get the complete path to sxhkd to avoid +# recursion later on +PROG="$(type sxhkd)" +PROG="${PROG##* }" + +FIFO="$XDG_RUNTIME_DIR"/sxhkd_fifo + +args="$*" +# create a fifo and start sxhkd with it +sxhkd() { + exist "$PROG" critical + + if [[ "$args" = *"-s"* ]]; then + "$PROG" "$@" + else + [ -e "$FIFO" ] && rm "$FIFO" + + mkfifo "$FIFO" + "$PROG" -s "$FIFO" "$@" + fi +} + +sxhkd "$@" diff --git a/sxhkd/README.md b/sxhkd/README.md new file mode 100644 index 0000000..72b34a7 --- /dev/null +++ b/sxhkd/README.md @@ -0,0 +1,46 @@ +# sxhkd + +[sxhkd](https://github.com/baskerville/sxhkd) -- simple X hotkey daemon + +sxhkd is set up to manage most of the key bindings in this dotfile configuraition. It is primarily used for three things: system control, to invoke rofi, and to switch between different desktop operating modes. + +## system control + +* super+x: lock the system, i.e. put a lockscreen in front of it, unlocked with your password +* media keys: control the Brightness, Volume, Mute of the system +* super+return: open a terminal + +## rofi invocations + +* super+backspace: system management (shutdown,reboot,logout,..) +* super+space: app launching +* super+r: extended run menu +* super+p: password/secret autofill menu +* super+F8: theme setting menu +* super+q: quick access to bookmarks and search bangs + +## modal desktop + +The modal setup of this desktop allows to first invoke an operating mode and then open the possibility for additional keybindings. +For example, `alt + m` will invoke the `media` mode and then media playback can be controlled through the hjkl keys. +Think of it like invoking the insert mode, or visual mode in a modal editor like vim. + +The idea behind the modal system is to not overload normal system operation with key binds that are only needed every now and again, and mostly as a coherent package. +If I want to control my media playback, by seeking forward or backward, having quick access to controlling the volume seems logical. +But I may not want to open a scholarly pdf, or programming project at the same time, so these actions don't need to be included in a coherent 'media' mode. + +The modes currently are: + +* media, for controlling playback and volume +* academia, for opening pdf, seeing upcoming readings, and editing references + +They are still in flux and may change every now and again as I put this modal setup to the test. To get a closer look at the actual key binds, look into `.config/sxhkd/sxhkdrc` for now. + +## modal notifications + +To know which mode is currently active on the desktop, this module includes a script which will print sxhkd's current mode to stdout, or a file. +This script can be used to show the active mode in a status bar, for example (as the polybar module in these dotfiles does). + +The script lives in `.local/bin/sxhkd-chain-labels` and can be invoked from the path by default. To see available options and the configuration file format use `sxhkd-chain-labels -h`, or take look at the script itself. + +This module overwrites the usual sxhkd program invocation using an alias, which makes sxhkd always (if no options are passed) create and use a named pipe in the XDG_RUNTIME_DIR directory. This is the default location the script will pick it up in. diff --git a/vifm/.config/vifm/vifmrc b/vifm/.config/vifm/vifmrc index 72bcbd6..135bd2d 100644 --- a/vifm/.config/vifm/vifmrc +++ b/vifm/.config/vifm/vifmrc @@ -348,6 +348,37 @@ set classify+=' ::*.doc,,*.docx::, ::*.xls,,*.xls[mx]::, ::*.pptx,,*.pp " You can also add %CLEAR if you want to clear screen before running FUSE " program. + +fileviewer *.pdf + \ vifm-sixel pdf %pw %ph %c %pd + \ %pc + \ vifm-sixel clear + +fileviewer *.epub + \ vifm-sixel epub %pw %ph %c %pd + \ %pc + \ vifm-sixel clear + +fileviewer