From 32b8ebec9a503b9796fda0a8ac3eb11eec744397 Mon Sep 17 00:00:00 2001 From: "Collin J. Doering" Date: Mon, 31 Jan 2022 11:41:17 -0500 Subject: [PATCH] Initial commit --- .envrc | 1 + .gitignore | 25 + .guix-authorizations | 9 + .guix-channel | 3 + .guix/home-manifest.scm | 323 ++ Makefile | 49 + README.org | 129 + channels.scm | 22 + .../awesome/.config/awesome/rc.lua | 373 ++ .../compton/.config/compton/compton.conf | 244 ++ .../dunst/.config/dunst/dunstrc | 242 ++ .../gtk/.config/gtk-2.0/gtkfilechooser.ini | 11 + .../gtk/.config/gtk-3.0/bookmarks | 1 + .../gtk/.config/gtk-3.0/settings.ini | 17 + user-config-unused/gtk/.gtkrc-2.0 | 19 + .../luakit/.config/luakit/binds.lua | 588 ++++ .../luakit/.config/luakit/globals.lua | 85 + .../luakit/.config/luakit/modes.lua | 163 + .../luakit/.config/luakit/rc.lua | 181 + .../luakit/.config/luakit/theme.lua | 69 + .../luakit/.config/luakit/webview.lua | 350 ++ .../luakit/.config/luakit/window.lua | 859 +++++ .../mc/.config/mc/edit.indent.rc | 31 + .../mc/.config/mc/filehighlight.ini | 47 + user-config-unused/mc/.config/mc/hotlist | 14 + user-config-unused/mc/.config/mc/ini | 212 ++ user-config-unused/mc/.config/mc/mc.ext | 793 +++++ user-config-unused/mc/.config/mc/mc.keymap | 456 +++ user-config-unused/mc/.config/mc/mc.menu | 365 ++ user-config-unused/mc/.config/mc/mc.menu.sr | 344 ++ user-config-unused/mc/.config/mc/mcedit.menu | 486 +++ user-config-unused/mc/.config/mc/sfs.ini | 28 + user-config-unused/ncmpcpp/.ncmpcpp/bindings | 522 +++ user-config-unused/ncmpcpp/.ncmpcpp/config | 29 + .../obmenugen/.config/obmenugen/exclusions | 13 + .../obmenugen/.config/obmenugen/obmenugen.cfg | 35 + .../.config/obmenugen/obmenugen.schema | 43 + .../openbox/.config/openbox/autostart.sh | 1 + .../openbox/.config/openbox/menu.xml | 91 + .../openbox/.config/openbox/rc.xml | 732 ++++ user-config-unused/pekwm/.pekwm/config | 108 + user-config-unused/pekwm/.pekwm/keys | 315 ++ user-config-unused/pekwm/.pekwm/menu | 147 + user-config-unused/pekwm/.pekwm/mouse | 182 + user-config-unused/pekwm/.pekwm/start | 18 + user-config-unused/pekwm/.pekwm/vars | 1 + user-config-unused/psd/.config/psd/psd.conf | 57 + user-config-unused/ratpoison/.ratpoisonrc | 28 + .../applications/transmission-remote.desktop | 9 + .../rkd-conf/.local/share/fonts/.uuid | 1 + .../.local/share/fonts/all-the-icons.ttf | Bin 0 -> 44732 bytes .../.local/share/fonts/file-icons.ttf | Bin 0 -> 173892 bytes .../.local/share/fonts/fontawesome.ttf | Bin 0 -> 152796 bytes .../share/fonts/material-design-icons.ttf | Bin 0 -> 128180 bytes .../rkd-conf/.local/share/fonts/octicons.ttf | Bin 0 -> 52544 bytes .../.local/share/fonts/weathericons.ttf | Bin 0 -> 99564 bytes .../.local/share/mc/skins/gotar-mod.ini | 131 + .../rkd-conf/.unison/default.prf | 1 + user-config-unused/rkd-conf/.unison/org.prf | 15 + user-config-unused/rkd-conf/.vimrc | 17 + user-config-unused/rkd-conf/.vnc/xstartup | 67 + user-config-unused/screen/.screenrc | 21 + user-config-unused/stumpwm/.stumpwmrc | 62 + .../surfraw/.config/surfraw/conf | 3 + .../.config/transmission/settings.json | 68 + user-config-unused/xbindkeys/.xbindkeysrc | 115 + user-config-unused/xmonad/.bin/xmonadClose.sh | 76 + user-config-unused/xmonad/.xmobarrc | 43 + user-config-unused/xmonad/.xmonad/xmonad.hs | 615 ++++ .../alacritty/.config/alacritty/alacritty.yml | 697 ++++ user-config/bash/.bash_profile | 4 + user-config/bash/.bashrc | 15 + user-config/emacs/.bin/emacs-mail.sh | 3 + user-config/emacs/.bin/org-protocol-open.sh | 13 + user-config/emacs/.emacs.d/.mc-lists.el | 16 + user-config/emacs/.emacs.d/config.org | 3054 +++++++++++++++++ .../emacs/.emacs.d/etc/assets/beep.wav | Bin 0 -> 23206 bytes user-config/emacs/.emacs.d/etc/custom.el | 0 user-config/emacs/.emacs.d/etc/eshell/aliases | 6 + user-config/emacs/.emacs.d/etc/eshell/profile | 7 + .../latex-mode/.yas-compiled-snippets.el | 8 + .../.yas-ignore-filenames-as-triggers | 0 .../etc/snippets/latex-mode/.yas-make-groups | 0 .../etc/snippets/latex-mode/.yas-parents | 1 + .../snippets/latex-mode/abstract.yasnippet | 9 + .../etc/snippets/latex-mode/align.yasnippet | 9 + .../snippets/latex-mode/alignstar.yasnippet | 9 + .../etc/snippets/latex-mode/array.yasnippet | 9 + .../etc/snippets/latex-mode/article.yasnippet | 28 + .../etc/snippets/latex-mode/beamer.yasnippet | 37 + .../.emacs.d/etc/snippets/latex-mode/begin | 9 + .../etc/snippets/latex-mode/begin.yasnippet | 10 + .../etc/snippets/latex-mode/bib.yasnippet | 8 + .../etc/snippets/latex-mode/big.yasnippet | 7 + .../etc/snippets/latex-mode/bigop.yasnippet | 7 + .../etc/snippets/latex-mode/binom.yasnippet | 7 + .../etc/snippets/latex-mode/block.yasnippet | 9 + .../etc/snippets/latex-mode/bold.yasnippet | 7 + .../etc/snippets/latex-mode/case.yasnippet | 9 + .../etc/snippets/latex-mode/cha.yasnippet | 9 + .../etc/snippets/latex-mode/chastar.yasnippet | 8 + .../etc/snippets/latex-mode/cite.yasnippet | 7 + .../etc/snippets/latex-mode/coprod.yasnippet | 7 + .../etc/snippets/latex-mode/desc.yasnippet | 9 + .../etc/snippets/latex-mode/doc.yasnippet | 10 + .../etc/snippets/latex-mode/em.yasnippet | 7 + .../etc/snippets/latex-mode/enum.yasnippet | 9 + .../etc/snippets/latex-mode/eq.yasnippet | 10 + .../etc/snippets/latex-mode/eqs.yasnippet | 10 + .../etc/snippets/latex-mode/fig.yasnippet | 12 + .../etc/snippets/latex-mode/frac.yasnippet | 7 + .../etc/snippets/latex-mode/frame.yasnippet | 9 + .../etc/snippets/latex-mode/gls.yasnippet | 8 + .../snippets/latex-mode/graphics.yasnippet | 6 + .../etc/snippets/latex-mode/href.yasnippet | 6 + .../etc/snippets/latex-mode/int.yasnippet | 7 + .../etc/snippets/latex-mode/it.yasnippet | 7 + .../etc/snippets/latex-mode/itd.yasnippet | 7 + .../etc/snippets/latex-mode/item.yasnippet | 9 + .../etc/snippets/latex-mode/label.yasnippet | 7 + .../etc/snippets/latex-mode/letter.yasnippet | 27 + .../etc/snippets/latex-mode/lim.yasnippet | 7 + .../etc/snippets/latex-mode/math.yasnippet | 9 + .../etc/snippets/latex-mode/matrix.yasnippet | 11 + .../snippets/latex-mode/minipage.yasnippet | 9 + .../etc/snippets/latex-mode/par.yasnippet | 9 + .../etc/snippets/latex-mode/prod.yasnippet | 7 + .../etc/snippets/latex-mode/ref.yasnippet | 7 + .../etc/snippets/latex-mode/sc.yasnippet | 7 + .../etc/snippets/latex-mode/sec.yasnippet | 9 + .../etc/snippets/latex-mode/secstar.yasnippet | 8 + .../etc/snippets/latex-mode/ssub.yasnippet | 9 + .../snippets/latex-mode/ssubstar.yasnippet | 8 + .../etc/snippets/latex-mode/sub.yasnippet | 9 + .../etc/snippets/latex-mode/subfig.yasnippet | 10 + .../etc/snippets/latex-mode/substar.yasnippet | 8 + .../etc/snippets/latex-mode/sum.yasnippet | 7 + .../etc/snippets/latex-mode/table.yasnippet | 14 + .../etc/snippets/latex-mode/tt.yasnippet | 7 + .../etc/snippets/latex-mode/url.yasnippet | 7 + .../etc/snippets/latex-mode/use.yasnippet | 7 + .../etc/snippets/latex-mode/verb.yasnippet | 11 + .../markdown-mode/.yas-compiled-snippets.el | 8 + .../.emacs.d/etc/snippets/markdown-mode/blog | 13 + .../.emacs.d/etc/snippets/scheme-mode/and | 7 + .../.emacs.d/etc/snippets/scheme-mode/append | 6 + .../.emacs.d/etc/snippets/scheme-mode/apply | 6 + .../.emacs.d/etc/snippets/scheme-mode/car | 6 + .../.emacs.d/etc/snippets/scheme-mode/cdr | 6 + .../.emacs.d/etc/snippets/scheme-mode/class | 9 + .../.emacs.d/etc/snippets/scheme-mode/cond | 7 + .../.emacs.d/etc/snippets/scheme-mode/cons | 6 + .../.emacs.d/etc/snippets/scheme-mode/define | 7 + .../etc/snippets/scheme-mode/define-match | 7 + .../etc/snippets/scheme-mode/define-public | 7 + .../etc/snippets/scheme-mode/define-syntax | 7 + .../snippets/scheme-mode/define-syntax-rule | 7 + .../etc/snippets/scheme-mode/define-syntax.1 | 7 + .../etc/snippets/scheme-mode/define.1 | 6 + .../.emacs.d/etc/snippets/scheme-mode/lambda | 6 + .../etc/snippets/scheme-mode/lambda.1 | 6 + .../etc/snippets/scheme-mode/lambda.2 | 6 + .../.emacs.d/etc/snippets/scheme-mode/length | 6 + .../.emacs.d/etc/snippets/scheme-mode/let | 7 + .../.emacs.d/etc/snippets/scheme-mode/let* | 7 + .../.emacs.d/etc/snippets/scheme-mode/let.1 | 7 + .../.emacs.d/etc/snippets/scheme-mode/letrec | 7 + .../.emacs.d/etc/snippets/scheme-mode/list | 5 + .../.emacs.d/etc/snippets/scheme-mode/match | 7 + .../.emacs.d/etc/snippets/scheme-mode/match* | 7 + .../.emacs.d/etc/snippets/scheme-mode/or | 7 + .../.emacs.d/etc/snippets/scheme-mode/quote | 5 + .../.emacs.d/etc/snippets/scheme-mode/repeat | 6 + .../etc/snippets/yaml-mode/base64-field | 6 + .../.emacs.d/etc/snippets/yaml-mode/configmap | 9 + .../.emacs.d/etc/snippets/yaml-mode/container | 8 + .../etc/snippets/yaml-mode/deployment | 21 + .../.emacs.d/etc/snippets/yaml-mode/endpoint | 15 + .../.emacs.d/etc/snippets/yaml-mode/ingress | 15 + .../etc/snippets/yaml-mode/ingress-rule | 12 + .../.emacs.d/etc/snippets/yaml-mode/manifest | 11 + .../.emacs.d/etc/snippets/yaml-mode/namespace | 10 + .../emacs/.emacs.d/etc/snippets/yaml-mode/pod | 12 + .../.emacs.d/etc/snippets/yaml-mode/secret | 12 + .../etc/snippets/yaml-mode/service-account | 11 + .../etc/snippets/yaml-mode/storage-class | 14 + .../etc/snippets/yaml-mode/volume-mount | 7 + .../emacs/.emacs.d/etc/templates/c-template.c | 23 + .../etc/templates/clojure-template.clj | 19 + .../.emacs.d/etc/templates/cpp-template.cc | 23 + .../.emacs.d/etc/templates/css-template.css | 23 + .../etc/templates/emacs-lisp-template.el | 19 + .../etc/templates/erlang-template.erl | 19 + .../.emacs.d/etc/templates/haml-template.haml | 19 + .../etc/templates/haskell-template.hs | 19 + .../.emacs.d/etc/templates/html-template.html | 9 + .../etc/templates/java-script-template.js | 23 + .../.emacs.d/etc/templates/java-template.java | 22 + .../.emacs.d/etc/templates/lisp-template.lisp | 19 + .../.emacs.d/etc/templates/lua-template.lua | 19 + .../.emacs.d/etc/templates/ocaml-template.ml | 23 + .../.emacs.d/etc/templates/php-template.php | 28 + .../.emacs.d/etc/templates/python-scratch.py | 3 + .../.emacs.d/etc/templates/python-template.py | 19 + .../etc/templates/racket-template.rkt | 21 + .../.emacs.d/etc/templates/ruby-template.rb | 19 + .../.emacs.d/etc/templates/sass-template.sass | 19 + .../etc/templates/scala-template.scala | 23 + .../etc/templates/scheme-template.scm | 19 + .../.emacs.d/etc/templates/scss-template.scss | 19 + .../.emacs.d/etc/templates/shell-template.sh | 21 + .../.emacs.d/etc/templates/sml-template.ml | 23 + .../.emacs.d/etc/templates/sml-template.sml | 23 + .../etc/yasnippet/snippets/markdown-mode/blog | 13 + user-config/emacs/.emacs.d/init.el | 32 + .../org-protocol-override.desktop | 8 + user-config/git/.config/git/attributes | 1 + user-config/git/.gitconfig | 15 + user-config/gpg/.gnupg/gpg-agent.conf | 23 + user-config/gpg/.pam_environment | 2 + user-config/guile/.guile | 7 + user-config/guix/.config/guix/channels.scm | 18 + user-config/guix/.config/guix/home.scm | 4 + user-config/haskell/.cabal/config | 211 ++ user-config/haskell/.ghci | 11 + user-config/kitty/.config/kitty/kitty.conf | 788 +++++ user-config/kitty/.config/kitty/session.conf | 5 + user-config/mbsync/.mbsyncrc | 193 ++ user-config/mpd/.mpdconf | 463 +++ .../nyxt/.config/nyxt/auto-config.lisp | 0 user-config/nyxt/.config/nyxt/init.lisp | 11 + user-config/racket/.racketrc | 2 + .../redshift/.config/redshift/redshift.conf | 70 + .../rofi-pass/.config/rofi-pass/config | 84 + user-config/rofi/.config/rofi/config.rasi | 148 + .../.config/shepherd/init.d/fccache.scm | 31 + .../shepherd/.config/shepherd/init.d/mpd.scm | 32 + .../.config/shepherd/init.d/pulseaudio.scm | 31 + .../shepherd/.config/shepherd/init.scm | 13 + user-config/sway/.bin/start-sway.sh | 3 + user-config/sway/.config/sway/config | 220 ++ user-config/tmux/.tmux.conf | 30 + user-config/wofi/.config/wofi/style.css | 37 + user-config/xorg/.Xresources | 63 + user-config/xorg/.bin/keyboard.sh | 67 + user-config/xorg/.bin/startx.sh | 18 + user-config/xorg/.screenlayout/just-laptop.sh | 11 + user-config/xorg/.screenlayout/personal.sh | 44 + user-config/xorg/.screenlayout/work-home.sh | 8 + user-config/xorg/.screenlayout/work.sh | 8 + user-config/xorg/.xinitrc | 178 + user-config/zathura/.config/zathura/zathurarc | 7 + user-config/zsh/.zprofile | 11 + .../zsh/.zsh_resources/completions/_aws-vault | 24 + .../zsh/.zsh_resources/completions/_beet | 237 ++ .../completions/_docker-compose | 474 +++ .../zsh/.zsh_resources/completions/_exa | 40 + user-config/zsh/.zshenv | 10 + user-config/zsh/.zshrc | 346 ++ 259 files changed, 19423 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 .guix-authorizations create mode 100644 .guix-channel create mode 100644 .guix/home-manifest.scm create mode 100644 Makefile create mode 100644 README.org create mode 100644 channels.scm create mode 100644 user-config-unused/awesome/.config/awesome/rc.lua create mode 100644 user-config-unused/compton/.config/compton/compton.conf create mode 100644 user-config-unused/dunst/.config/dunst/dunstrc create mode 100644 user-config-unused/gtk/.config/gtk-2.0/gtkfilechooser.ini create mode 100644 user-config-unused/gtk/.config/gtk-3.0/bookmarks create mode 100644 user-config-unused/gtk/.config/gtk-3.0/settings.ini create mode 100644 user-config-unused/gtk/.gtkrc-2.0 create mode 100644 user-config-unused/luakit/.config/luakit/binds.lua create mode 100644 user-config-unused/luakit/.config/luakit/globals.lua create mode 100644 user-config-unused/luakit/.config/luakit/modes.lua create mode 100644 user-config-unused/luakit/.config/luakit/rc.lua create mode 100644 user-config-unused/luakit/.config/luakit/theme.lua create mode 100644 user-config-unused/luakit/.config/luakit/webview.lua create mode 100644 user-config-unused/luakit/.config/luakit/window.lua create mode 100755 user-config-unused/mc/.config/mc/edit.indent.rc create mode 100644 user-config-unused/mc/.config/mc/filehighlight.ini create mode 100644 user-config-unused/mc/.config/mc/hotlist create mode 100644 user-config-unused/mc/.config/mc/ini create mode 100644 user-config-unused/mc/.config/mc/mc.ext create mode 100644 user-config-unused/mc/.config/mc/mc.keymap create mode 100644 user-config-unused/mc/.config/mc/mc.menu create mode 100644 user-config-unused/mc/.config/mc/mc.menu.sr create mode 100644 user-config-unused/mc/.config/mc/mcedit.menu create mode 100644 user-config-unused/mc/.config/mc/sfs.ini create mode 100644 user-config-unused/ncmpcpp/.ncmpcpp/bindings create mode 100644 user-config-unused/ncmpcpp/.ncmpcpp/config create mode 100644 user-config-unused/obmenugen/.config/obmenugen/exclusions create mode 100644 user-config-unused/obmenugen/.config/obmenugen/obmenugen.cfg create mode 100644 user-config-unused/obmenugen/.config/obmenugen/obmenugen.schema create mode 100755 user-config-unused/openbox/.config/openbox/autostart.sh create mode 100644 user-config-unused/openbox/.config/openbox/menu.xml create mode 100644 user-config-unused/openbox/.config/openbox/rc.xml create mode 100644 user-config-unused/pekwm/.pekwm/config create mode 100644 user-config-unused/pekwm/.pekwm/keys create mode 100644 user-config-unused/pekwm/.pekwm/menu create mode 100644 user-config-unused/pekwm/.pekwm/mouse create mode 100644 user-config-unused/pekwm/.pekwm/start create mode 100644 user-config-unused/pekwm/.pekwm/vars create mode 100644 user-config-unused/psd/.config/psd/psd.conf create mode 100644 user-config-unused/ratpoison/.ratpoisonrc create mode 100644 user-config-unused/rkd-conf/.local/share/applications/transmission-remote.desktop create mode 100644 user-config-unused/rkd-conf/.local/share/fonts/.uuid create mode 100644 user-config-unused/rkd-conf/.local/share/fonts/all-the-icons.ttf create mode 100644 user-config-unused/rkd-conf/.local/share/fonts/file-icons.ttf create mode 100644 user-config-unused/rkd-conf/.local/share/fonts/fontawesome.ttf create mode 100644 user-config-unused/rkd-conf/.local/share/fonts/material-design-icons.ttf create mode 100644 user-config-unused/rkd-conf/.local/share/fonts/octicons.ttf create mode 100644 user-config-unused/rkd-conf/.local/share/fonts/weathericons.ttf create mode 100644 user-config-unused/rkd-conf/.local/share/mc/skins/gotar-mod.ini create mode 100644 user-config-unused/rkd-conf/.unison/default.prf create mode 100644 user-config-unused/rkd-conf/.unison/org.prf create mode 100644 user-config-unused/rkd-conf/.vimrc create mode 100755 user-config-unused/rkd-conf/.vnc/xstartup create mode 100644 user-config-unused/screen/.screenrc create mode 100644 user-config-unused/stumpwm/.stumpwmrc create mode 100644 user-config-unused/surfraw/.config/surfraw/conf create mode 100644 user-config-unused/transmission/.config/transmission/settings.json create mode 100644 user-config-unused/xbindkeys/.xbindkeysrc create mode 100755 user-config-unused/xmonad/.bin/xmonadClose.sh create mode 100644 user-config-unused/xmonad/.xmobarrc create mode 100644 user-config-unused/xmonad/.xmonad/xmonad.hs create mode 100644 user-config/alacritty/.config/alacritty/alacritty.yml create mode 100644 user-config/bash/.bash_profile create mode 100644 user-config/bash/.bashrc create mode 100755 user-config/emacs/.bin/emacs-mail.sh create mode 100755 user-config/emacs/.bin/org-protocol-open.sh create mode 100644 user-config/emacs/.emacs.d/.mc-lists.el create mode 100644 user-config/emacs/.emacs.d/config.org create mode 100644 user-config/emacs/.emacs.d/etc/assets/beep.wav create mode 100644 user-config/emacs/.emacs.d/etc/custom.el create mode 100644 user-config/emacs/.emacs.d/etc/eshell/aliases create mode 100644 user-config/emacs/.emacs.d/etc/eshell/profile create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-compiled-snippets.el create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-ignore-filenames-as-triggers create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-make-groups create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-parents create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/abstract.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/align.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/alignstar.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/array.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/article.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/beamer.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/begin create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/begin.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/bib.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/big.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/bigop.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/binom.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/block.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/bold.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/case.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/cha.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/chastar.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/cite.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/coprod.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/desc.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/doc.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/em.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/enum.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/eq.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/eqs.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/fig.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/frac.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/frame.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/gls.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/graphics.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/href.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/int.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/it.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/itd.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/item.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/label.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/letter.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/lim.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/math.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/matrix.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/minipage.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/par.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/prod.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/ref.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/sc.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/sec.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/secstar.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/ssub.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/ssubstar.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/sub.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/subfig.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/substar.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/sum.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/table.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/tt.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/url.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/use.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/latex-mode/verb.yasnippet create mode 100644 user-config/emacs/.emacs.d/etc/snippets/markdown-mode/.yas-compiled-snippets.el create mode 100644 user-config/emacs/.emacs.d/etc/snippets/markdown-mode/blog create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/and create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/append create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/apply create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/car create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cdr create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/class create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cond create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cons create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-match create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-public create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax-rule create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax.1 create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define.1 create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda.1 create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda.2 create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/length create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let* create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let.1 create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/letrec create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/list create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/match create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/match* create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/or create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/quote create mode 100644 user-config/emacs/.emacs.d/etc/snippets/scheme-mode/repeat create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/base64-field create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/configmap create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/container create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/deployment create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/endpoint create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/ingress create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/ingress-rule create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/manifest create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/namespace create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/pod create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/secret create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/service-account create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/storage-class create mode 100644 user-config/emacs/.emacs.d/etc/snippets/yaml-mode/volume-mount create mode 100644 user-config/emacs/.emacs.d/etc/templates/c-template.c create mode 100644 user-config/emacs/.emacs.d/etc/templates/clojure-template.clj create mode 100644 user-config/emacs/.emacs.d/etc/templates/cpp-template.cc create mode 100644 user-config/emacs/.emacs.d/etc/templates/css-template.css create mode 100644 user-config/emacs/.emacs.d/etc/templates/emacs-lisp-template.el create mode 100644 user-config/emacs/.emacs.d/etc/templates/erlang-template.erl create mode 100644 user-config/emacs/.emacs.d/etc/templates/haml-template.haml create mode 100644 user-config/emacs/.emacs.d/etc/templates/haskell-template.hs create mode 100644 user-config/emacs/.emacs.d/etc/templates/html-template.html create mode 100644 user-config/emacs/.emacs.d/etc/templates/java-script-template.js create mode 100644 user-config/emacs/.emacs.d/etc/templates/java-template.java create mode 100644 user-config/emacs/.emacs.d/etc/templates/lisp-template.lisp create mode 100644 user-config/emacs/.emacs.d/etc/templates/lua-template.lua create mode 100644 user-config/emacs/.emacs.d/etc/templates/ocaml-template.ml create mode 100644 user-config/emacs/.emacs.d/etc/templates/php-template.php create mode 100644 user-config/emacs/.emacs.d/etc/templates/python-scratch.py create mode 100644 user-config/emacs/.emacs.d/etc/templates/python-template.py create mode 100644 user-config/emacs/.emacs.d/etc/templates/racket-template.rkt create mode 100644 user-config/emacs/.emacs.d/etc/templates/ruby-template.rb create mode 100644 user-config/emacs/.emacs.d/etc/templates/sass-template.sass create mode 100644 user-config/emacs/.emacs.d/etc/templates/scala-template.scala create mode 100644 user-config/emacs/.emacs.d/etc/templates/scheme-template.scm create mode 100644 user-config/emacs/.emacs.d/etc/templates/scss-template.scss create mode 100644 user-config/emacs/.emacs.d/etc/templates/shell-template.sh create mode 100644 user-config/emacs/.emacs.d/etc/templates/sml-template.ml create mode 100644 user-config/emacs/.emacs.d/etc/templates/sml-template.sml create mode 100644 user-config/emacs/.emacs.d/etc/yasnippet/snippets/markdown-mode/blog create mode 100644 user-config/emacs/.emacs.d/init.el create mode 100644 user-config/emacs/.local/share/applications/org-protocol-override.desktop create mode 100644 user-config/git/.config/git/attributes create mode 100644 user-config/git/.gitconfig create mode 100644 user-config/gpg/.gnupg/gpg-agent.conf create mode 100644 user-config/gpg/.pam_environment create mode 100644 user-config/guile/.guile create mode 100644 user-config/guix/.config/guix/channels.scm create mode 100644 user-config/guix/.config/guix/home.scm create mode 100644 user-config/haskell/.cabal/config create mode 100644 user-config/haskell/.ghci create mode 100644 user-config/kitty/.config/kitty/kitty.conf create mode 100644 user-config/kitty/.config/kitty/session.conf create mode 100644 user-config/mbsync/.mbsyncrc create mode 100644 user-config/mpd/.mpdconf create mode 100644 user-config/nyxt/.config/nyxt/auto-config.lisp create mode 100644 user-config/nyxt/.config/nyxt/init.lisp create mode 100644 user-config/racket/.racketrc create mode 100644 user-config/redshift/.config/redshift/redshift.conf create mode 100644 user-config/rofi-pass/.config/rofi-pass/config create mode 100644 user-config/rofi/.config/rofi/config.rasi create mode 100644 user-config/shepherd/.config/shepherd/init.d/fccache.scm create mode 100644 user-config/shepherd/.config/shepherd/init.d/mpd.scm create mode 100644 user-config/shepherd/.config/shepherd/init.d/pulseaudio.scm create mode 100644 user-config/shepherd/.config/shepherd/init.scm create mode 100755 user-config/sway/.bin/start-sway.sh create mode 100644 user-config/sway/.config/sway/config create mode 100644 user-config/tmux/.tmux.conf create mode 100644 user-config/wofi/.config/wofi/style.css create mode 100644 user-config/xorg/.Xresources create mode 100755 user-config/xorg/.bin/keyboard.sh create mode 100755 user-config/xorg/.bin/startx.sh create mode 100755 user-config/xorg/.screenlayout/just-laptop.sh create mode 100755 user-config/xorg/.screenlayout/personal.sh create mode 100755 user-config/xorg/.screenlayout/work-home.sh create mode 100755 user-config/xorg/.screenlayout/work.sh create mode 100755 user-config/xorg/.xinitrc create mode 100644 user-config/zathura/.config/zathura/zathurarc create mode 100644 user-config/zsh/.zprofile create mode 100644 user-config/zsh/.zsh_resources/completions/_aws-vault create mode 100644 user-config/zsh/.zsh_resources/completions/_beet create mode 100644 user-config/zsh/.zsh_resources/completions/_docker-compose create mode 100644 user-config/zsh/.zsh_resources/completions/_exa create mode 100644 user-config/zsh/.zshenv create mode 100644 user-config/zsh/.zshrc diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..83268ce --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use guix --ad-hoc stow make diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b2f0fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# All +*~ +.tern-port + +# Shepherd +user-config/shepherd/.config/shepherd/shepherd.log + +# Emacs +.#* +*.elc +user-config/emacs/.emacs.d/var +user-config/emacs/.emacs.d/config.el + +# Transmission +rkd-conf/.config/transmission/dht.dat +rkd-conf/.config/transmission/resume/ +rkd-conf/.config/transmission/stats.json +rkd-conf/.config/transmission/torrents/ + +# Xmonad +xmonad/.xmonad/xmonad-x86_64-linux +xmonad/.xmonad/xmonad.errors +xmonad/.xmonad/xmonad.hi +xmonad/.xmonad/xmonad.o + diff --git a/.guix-authorizations b/.guix-authorizations new file mode 100644 index 0000000..82f090f --- /dev/null +++ b/.guix-authorizations @@ -0,0 +1,9 @@ +;; This is the list of OpenPGP keys currently authorized to sign commits in +;; this repository. + +(authorizations + (version 0) + + ((;; primary: "F7BD DC6D BBE6 B16B 2C71 1A02 5FAB 9938 E05B FEC8" + "F8D5 46F3 AF37 EF53 D1B6 48BE 7B4D EB93 212B 3022" + (name "rekahsoft")))) diff --git a/.guix-channel b/.guix-channel new file mode 100644 index 0000000..78647ed --- /dev/null +++ b/.guix-channel @@ -0,0 +1,3 @@ +(channel + (version 0) + (directory ".guix")) diff --git a/.guix/home-manifest.scm b/.guix/home-manifest.scm new file mode 100644 index 0000000..ce5bd9b --- /dev/null +++ b/.guix/home-manifest.scm @@ -0,0 +1,323 @@ +(use-modules + (gnu packages) + (guix profiles) + (guix transformations)) + +(define transform--emacs-helm-mu + (options->transformation + '((with-commit . "emacs-helm-mu=392a8c11ab27b625d9f863cdde14e09893401b15")))) + +(define transform--emacs-org-super-agenda + (options->transformation + '((without-tests . "emacs-org-super-agenda")))) + +(define %emacs-manifest + (concatenate-manifests + (list + (packages->manifest + (list + ;; Temporary: emacs-helm-mu is broken but has been fixed upstream + (transform--emacs-helm-mu + (specification->package "emacs-helm-mu")) + ;; Temporary: emacs-org-super-agenda tests stall and do not complete due to interactive prompt + (transform--emacs-org-super-agenda + (specification->package "emacs-org-super-agenda")) + (transform--emacs-org-super-agenda ;; org-ql propigates org-super-agenda + (specification->package "emacs-org-ql")))) + (specifications->manifest + '("aspell" + "aspell-dict-en" + "emacs" + "emacs-ace-jump-mode" + "emacs-ace-window" + "emacs-ag" + "emacs-all-the-icons-dired" + "emacs-auctex" + "emacs-auto-complete" + "emacs-auto-yasnippet" + "emacs-dashboard" + "emacs-dired-hacks" + "emacs-docker" + "emacs-docker-tramp" + "emacs-doom-modeline" + "emacs-elpher" + "emacs-emmet-mode" + "emacs-emms" + "emacs-expand-region" + "emacs-exwm" + "emacs-eval-in-repl" + "emacs-fill-column-indicator" + "emacs-flycheck" + "emacs-flycheck-ledger" + "emacs-geiser" + "emacs-gnuplot" + "emacs-go-mode" + "emacs-god-mode" + "emacs-graphql-mode" + "emacs-graphviz-dot-mode" + "emacs-guix" + "emacs-haskell-mode" + "emacs-helm" + "emacs-helm-ag" + "emacs-helm-c-yasnippet" + "emacs-helm-descbinds" + "emacs-helm-exwm" + "emacs-helm-gtags" + "emacs-helm-ls-git" + "emacs-helm-org" + "emacs-helm-pass" + "emacs-helm-projectile" + "emacs-helm-swoop" + "emacs-highlight-sexp" + "emacs-htmlize" + "emacs-hydra" + "emacs-ibuffer-projectile" + "emacs-isearch+" + "emacs-ivy" + "emacs-json-mode" + "emacs-jsonnet-mode" + "emacs-ledger-mode" + "emacs-lua-mode" + "emacs-magit" + "emacs-forge" + "emacs-markdown-mode" + "emacs-mmm-mode" + "emacs-mu4e-alert" + "emacs-mu4e-conversation" + "emacs-multi-term" + "emacs-multiple-cursors" + "emacs-no-littering" + "emacs-org" + "emacs-org-babel-eval-in-repl" + "emacs-org-download" + "emacs-org-mind-map" + "emacs-org-noter" + "emacs-org-roam" + "emacs-org-web-tools" + "emacs-orgit" + "emacs-ob-async" + "emacs-paredit" + "emacs-pdf-tools" + "emacs-persp-mode" + "emacs-php-mode" + "emacs-plantuml-mode" + "emacs-pretty-mode" + "emacs-projectile" + "emacs-racket-mode" + "emacs-rainbow-delimiters" + "emacs-rainbow-identifiers" + "emacs-rainbow-mode" + "emacs-realgud" + "emacs-recutils" + "emacs-restclient" + "emacs-ripgrep" + "emacs-rust-mode" + "emacs-scribble-mode" + "emacs-slime" + "emacs-string-inflection" + "emacs-swiper" + "emacs-terraform-mode" + "emacs-tramp" + "emacs-undo-tree" + "emacs-use-package" + "emacs-vterm" + "emacs-yaml-mode" + "emacs-yasnippet" + "emacs-yasnippet-snippets" + "gnuplot" + "isync" + "mu" + "plantuml" + + ; "emacs-ac-geiser" ;; TODO: hash mismatch; possible non-determinism + ;"emacs-helm-mu" ;; TODO: broken, but fixed upstream + + ;; + ;; Remaining packages from the rekahsoft-guix channel + + "emacs-ace-mc" + "emacs-all-the-icons-ibuffer" + "emacs-hamlet-mode" + "emacs-helm-rg" + "emacs-helm-tramp" + "emacs-helm-unicode" + "emacs-highlight-indent-guides" + "emacs-highlight-parentheses" + "emacs-ibuffer-vc" + "emacs-intel-hex-mode" + "emacs-ix" + "emacs-mu4e-dashboard" + "emacs-mu4e-maildirs-extension" + "emacs-org-html-theme-darksun" + "emacs-org-html-themes" + "emacs-org-roam-extensions" + "emacs-org-roam-ui" + "emacs-persp-projectile" + "emacs-quack" + "emacs-rcirc-notify" + "emacs-rebox2" + "emacs-vimish-fold" + + ;; Use more up-to-date treemacs and treemacs-extra (as well as required dependencies) + "emacs-treemacs-20201225" + "emacs-treemacs-extra-20201225" + "emacs-all-the-icons-20201225" + "emacs-doom-themes-20201225" + + ;; Use more up-to-date ace-link + "emacs-ace-link-2021-01-1"))))) + +(define %shell-manifest + (specifications->manifest + '("bat" + "exa" + "ripgrep" + + ;; Remaining packages from the rekahsoft-guix channel + "fzf" ;; TODO: this was added upstream (as "go-github-com-junegunn-fzf") but is not as complete as my existing package + "sh-z" + "spaceship-prompt" + "zsh-autosuggestions"))) + +(define %xorg-manifest + (specifications->manifest + '("mesa" + "setxkbmap" + "xdg-utils" + "xf86-input-libinput" + "xf86-video-fbdev" + "xinit" + "xkbcomp" + "xkeyboard-config" + "xlsfonts" + "xorg-server" + "xrandr" + "xrdb" + "xsetroot"))) + +(define %wayland-manifest + (specifications->manifest + '("grim" + "hicolor-icon-theme" ;; Required for wofi icon theme + "slurp" + "sway" + "wayland" + "wofi"))) + +;; Manifest containing x programs (that cannot natively run with wayland). +(define %xorg-apps-manifest + (specifications->manifest + '("dunst" ;; <- May not need this; use something in emacs + "feh" + "pavucontrol" + "redshift" + "rofi" ;; <- Look into replacing in emacs + "rofi-pass" ;; <- This should be replacable in emacs with helm-pass + "unclutter" + "xautolock" + "xclip" + "zathura" + "zathura-djvu" + "zathura-pdf-poppler" + "zathura-ps" + + ;; "xbindkeys" <- should be able to depricate this + ;; "compton" <- this historyically caused issues with screen locking + + ;; + ;; Remaining packages from the rekahsoft-guix channel + "virt-viewer@11.0"))) + +;; Manifest containing Xorg and Wayland native compatible programs +(define %xorg-wayland-apps-manifest + (specifications->manifest + '("kitty" ;; <- May not need this and instead will use emacs-vterm + "alacritty" ;; <- ditto + "adwaita-icon-theme"))) + +(define %guile-manifest + (specifications->manifest + '("guile" + "guile-charting" ;; guile-charting is required for 'guix size --map-file' + "guile-colorized" + "guile-hall" + "guile-readline"))) + +(define %misc-manifest + (specifications->manifest + '("ansible" + "awscliv2" + "beets" + "bmon" + "coreutils" + "curl" + "direnv" + "flatpak" + "font-dejavu" ;; TODO: check if font is needed + "font-fira-code" ;; TODO: check if font is needed + "font-gnu-freefont" + "font-terminus" + "font-google-noto" + "git" + "git:send-email" + "git:subtree" + "glibc-locales" + "gnupg" + "graphviz" + "gs-fonts" ;; TODO: check if font is needed + "gwl" + "hledger" + "htop" + "ledger" + "ledger-autosync" + "mpd" + "mpv" + "ncmpcpp" ;; <- This can be replaced by emacs-emms + "nmap" + "nss-certs" + "nyxt" + "openssh" + "pass-otp" + "password-store" + "recutils" + "rhash" + "skopeo" + "texlive" + "tmux" + "ungoogled-chromium" + "util-linux" + "wget" + "youtube-dl" + + ;; TODO: kicad currently broken (wxwidgets does not build) + ;; "kicad" "kicad-library" "kicad-symbols" "gtkwave" + + ;; TODO: (packages I like but maybe should be project specific?) + ;; "avr-toolchain" (propigated inputs: "avrdude" "avr-binutils" "avr-gcc") + ;; "clojure" + ;; "lua" + ;; "chez" + ;; "coq" + + ;; TODO: (these probably should go in the system configuration) + ;; "bitlebee" + + ;; + ;; Remaining packages from the rekahsoft-guix channel + + "aws-vault" + "hledger-ui" + "hledger-web" + "terraform-provider-aws" + "terraform-wrapper"))) + +(concatenate-manifests + (list + %emacs-manifest + %shell-manifest + %xorg-manifest + %wayland-manifest + %xorg-apps-manifest + %xorg-wayland-apps-manifest + %guile-manifest + %misc-manifest)) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..71ec5ab --- /dev/null +++ b/Makefile @@ -0,0 +1,49 @@ +# Set default target for make > 3.80 +.DEFAULT_GOAL := default + +# Default make to the dev target +.PHONY: default +default: all + +# Variables +STOW := $(shell command -v stow 2> /dev/null) +STOW_FLAGS=-v -t $(HOME) +STOW_PACKAGE_DIR=user-config +STOW_PACKAGES=$(shell ls $(STOW_PACKAGE_DIR)) + +# Add additional flags if requested +ifeq ($(DRY),true) + STOW_FLAGS+=-n +endif +ifeq ($(RESTOW),true) + STOW_FLAGS+=-R +endif +ifeq ($(DELETE),true) + STOW_FLAGS+=-D +endif + +.PHONY: check-env +check-env: +ifndef STOW + $(error GNU stow must be installed) +endif + @[ -d ~/.config ] || mkdir ~/.config + @[ -d ~/.bin ] || mkdir ~/.bin + @[ -d ~/.local/share ] || mkdir -p ~/.local/share + +.PHONY: list-packages +list-packages: + @ls $(STOW_PACKAGE_DIR) + +.PHONY: $(STOW_PACKAGES) +$(STOW_PACKAGES): check-env + @cd $(STOW_PACKAGE_DIR) && $(STOW) $(STOW_FLAGS) $@ + +.PHONY: all +all: check-env + @cd $(STOW_PACKAGE_DIR) && $(STOW) $(STOW_FLAGS) $(STOW_PACKAGES) + +.PHONY: init +init: + guix pull -C channels.scm + guix package -m user-manifest.scm diff --git a/README.org b/README.org new file mode 100644 index 0000000..de603fc --- /dev/null +++ b/README.org @@ -0,0 +1,129 @@ +#+TITLE: RekahSoft Dotfiles +#+AUTHOR: Collin J. Doering + +#+begin_abstract +These are the dotfiles of Collin Doering. +#+end_abstract + +* Quickstart + +Clone this repository. + +#+begin_src shell + git clone ~/.dotfiles + cd ~/.dotfiles +#+end_src + +Dependencies are managed using [guix](https://guix.gnu.org) and can be installed with the +following. + +#+begin_src shell + guix pull -C ~/.dotfiles/channels.scm + guix package -m ~/.dotfiles/user-manifest.scm +#+end_src + +Configurations for a variety of programs are available to be 'installed' by symbolically +linking them into ~$HOME~ using stow. This process is simplified by the provided ~Makefile~. + +#+begin_src shell + # See what will be installed/linked by stow + make DRY=true + + # Install/link all configurations + make +#+end_src + +* Makefile Usage + +#+begin_verse +make [packages] [DRY=true] [RESTOW=true] [DELETE=true] + +Where: + must be undfined or 'true' + must be undfined or 'true' + must be undfined or 'true' + +Notes: + If no [packages] are listed, all packages are actioned upon via the all target +#+end_verse + +** Examples + +#+begin_src shell + # Install a subset of the entire configuration + make zsh xorg + + # Relink configuration + make RESTOW=true + + # Relink configuration for a subset of packages + make RESTOW=true bash zsh + + # Uninstall/unlink configuration + make DELETE=true + + # Uninstall/unlink configuration for a subset of packages + make DELETE=true bash +#+end_src + +* Development + +This section details some useful tips regarding development. + +** Guix + +Here are some useful commands for working with package upgrades on guix. + +#+begin_src shell + # Check for binary substitute availability on the tip of master + guix time-machine -- weather -m ~/.dotfiles/user-manifest.scm + + # Build a environment using the provided user-manifest.scm off the tip of master (useful to test the new environment) + guix time-machine -- environment -m ~/.dotfiles/user-manifest.scm -- exit +#+end_src + +*** Updates that modify zsh site-functions (completions) + +These updates require additional manual effort, otherwise completions don't show up. + +#+begin_src shell + # Set fpath in ~/.zprofile (this is already done in the zsh configuration) + #fpath=(~/.guix-profile/share/zsh/site-functions $fpath) + + rm -r ~/.zcompdump && compinit +#+end_src + +*** Try out any packaged window manager + +The included ~xorg~ configuration provides a script that is used to ~startx~, located in +~~/.bin/startx.sh~ after installing/linking the ~xorg~ configuration. This script is required +as the ~startx~ that comes with the ~xinit~ package on guix does not work when Xorg is +installed in a user profile. Like the original ~startx~ command, this script passes through +arguments to ~~/.xinitrc~. The included ~~/.xinitrc~ takes two optional arguments, +~SESSION_WM~ and ~SESSION_TYPE~, the window manager to run and the session type to use. The +session type can be one of ~full~ (default), ~min~, or ~new~. + +Start the default window manager (~exwm~) with the default session type (~full~). + +#+begin_src shell + startx +#+end_src + +**Note:** if using the configuration ~zsh~ or ~bash~, all ~*.sh~ +scripts linked into ~~/.bin~ are aliased to exclude the ~.sh~ suffix. + +#+begin_src shell + guix environment --ad-hoc ratpoison -- startx.sh ratpoison new +#+end_src + +**Note:** The script ~startx.sh~ must be used directly here, and not +by the ~startx~ alias mentioned above. + +This works very well for simple window managers, however for more +complicated environments, many times there are numerous packages that +will be required. Here is an example of starting xfce using this +mechanism. + +#+begin_src shell + guix environment --ad-hoc xfce xfce4-session xfconf -- startx.sh startxfce4 new +#+end_src diff --git a/channels.scm b/channels.scm new file mode 100644 index 0000000..5cee80a --- /dev/null +++ b/channels.scm @@ -0,0 +1,22 @@ +(list (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (branch "master") + (commit + "a4eae0c3adce8e4c4ac153a4959d18b9897a67e1") + (introduction + (make-channel-introduction + "9edb3f66fd807b096b48283debdcddccfea34bad" + (openpgp-fingerprint + "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA")))) + (channel + (name 'rekahsoft-guix) + (url "https://git.rekahsoft.ca/rekahsoft/rekahsoft-guix.git") + (branch "master") + (commit + "b72c13392a9ffab0dd52dcf9e30fb599e364a78e") + (introduction + (make-channel-introduction + "191cdaa0947657e0c85fe89ebbb8e7b1e7a8e0a4" + (openpgp-fingerprint + "F8D5 46F3 AF37 EF53 D1B6 48BE 7B4D EB93 212B 3022"))))) diff --git a/user-config-unused/awesome/.config/awesome/rc.lua b/user-config-unused/awesome/.config/awesome/rc.lua new file mode 100644 index 0000000..c8f0a92 --- /dev/null +++ b/user-config-unused/awesome/.config/awesome/rc.lua @@ -0,0 +1,373 @@ +-- Standard awesome library +require("awful") +require("awful.autofocus") +require("awful.rules") +-- Theme handling library +require("beautiful") +-- Notification library +require("naughty") + +-- {{{ Error handling +-- Check if awesome encountered an error during startup and fell back to +-- another config (This code will only ever execute for the fallback config) +if awesome.startup_errors then + naughty.notify({ preset = naughty.config.presets.critical, + title = "Oops, there were errors during startup!", + text = awesome.startup_errors }) +end + +-- Handle runtime errors after startup +do + local in_error = false + awesome.add_signal("debug::error", function (err) + -- Make sure we don't go into an endless error loop + if in_error then return end + in_error = true + + naughty.notify({ preset = naughty.config.presets.critical, + title = "Oops, an error happened!", + text = err }) + in_error = false + end) +end +-- }}} + +-- {{{ Variable definitions +-- Themes define colours, icons, and wallpapers +beautiful.init("/usr/share/awesome/themes/default/theme.lua") + +-- This is used later as the default terminal and editor to run. +terminal = "xterm" +editor = os.getenv("EDITOR") or "nano" +editor_cmd = terminal .. " -e " .. editor + +-- Default modkey. +-- Usually, Mod4 is the key with a logo between Control and Alt. +-- If you do not like this or do not have such a key, +-- I suggest you to remap Mod4 to another key using xmodmap or other tools. +-- However, you can use another modifier like Mod1, but it may interact with others. +modkey = "Mod4" + +-- Table of layouts to cover with awful.layout.inc, order matters. +layouts = +{ + awful.layout.suit.floating, + awful.layout.suit.tile, + awful.layout.suit.tile.left, + awful.layout.suit.tile.bottom, + awful.layout.suit.tile.top, + awful.layout.suit.fair, + awful.layout.suit.fair.horizontal, + awful.layout.suit.spiral, + awful.layout.suit.spiral.dwindle, + awful.layout.suit.max, + awful.layout.suit.max.fullscreen, + awful.layout.suit.magnifier +} +-- }}} + +-- {{{ Tags +-- Define a tag table which hold all screen tags. +tags = {} +for s = 1, screen.count() do + -- Each screen has its own tag table. + tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1]) +end +-- }}} + +-- {{{ Menu +-- Create a laucher widget and a main menu +myawesomemenu = { + { "manual", terminal .. " -e man awesome" }, + { "edit config", editor_cmd .. " " .. awesome.conffile }, + { "restart", awesome.restart }, + { "quit", awesome.quit } +} + +mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, + { "open terminal", terminal } + } + }) + +mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon), + menu = mymainmenu }) +-- }}} + +-- {{{ Wibox +-- Create a textclock widget +mytextclock = awful.widget.textclock({ align = "right" }) + +-- Create a systray +mysystray = widget({ type = "systray" }) + +-- Create a wibox for each screen and add it +mywibox = {} +mypromptbox = {} +mylayoutbox = {} +mytaglist = {} +mytaglist.buttons = awful.util.table.join( + awful.button({ }, 1, awful.tag.viewonly), + awful.button({ modkey }, 1, awful.client.movetotag), + awful.button({ }, 3, awful.tag.viewtoggle), + awful.button({ modkey }, 3, awful.client.toggletag), + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev) + ) +mytasklist = {} +mytasklist.buttons = awful.util.table.join( + awful.button({ }, 1, function (c) + if c == client.focus then + c.minimized = true + else + if not c:isvisible() then + awful.tag.viewonly(c:tags()[1]) + end + -- This will also un-minimize + -- the client, if needed + client.focus = c + c:raise() + end + end), + awful.button({ }, 3, function () + if instance then + instance:hide() + instance = nil + else + instance = awful.menu.clients({ width=250 }) + end + end), + awful.button({ }, 4, function () + awful.client.focus.byidx(1) + if client.focus then client.focus:raise() end + end), + awful.button({ }, 5, function () + awful.client.focus.byidx(-1) + if client.focus then client.focus:raise() end + end)) + +for s = 1, screen.count() do + -- Create a promptbox for each screen + mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright }) + -- Create an imagebox widget which will contains an icon indicating which layout we're using. + -- We need one layoutbox per screen. + mylayoutbox[s] = awful.widget.layoutbox(s) + mylayoutbox[s]:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), + awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), + awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), + awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) + -- Create a taglist widget + mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, mytaglist.buttons) + + -- Create a tasklist widget + mytasklist[s] = awful.widget.tasklist(function(c) + return awful.widget.tasklist.label.currenttags(c, s) + end, mytasklist.buttons) + + -- Create the wibox + mywibox[s] = awful.wibox({ position = "top", screen = s }) + -- Add widgets to the wibox - order matters + mywibox[s].widgets = { + { + mylauncher, + mytaglist[s], + mypromptbox[s], + layout = awful.widget.layout.horizontal.leftright + }, + mylayoutbox[s], + mytextclock, + s == 1 and mysystray or nil, + mytasklist[s], + layout = awful.widget.layout.horizontal.rightleft + } +end +-- }}} + +-- {{{ Mouse bindings +root.buttons(awful.util.table.join( + awful.button({ }, 3, function () mymainmenu:toggle() end), + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev) +)) +-- }}} + +-- {{{ Key bindings +globalkeys = awful.util.table.join( + awful.key({ modkey, }, "Left", awful.tag.viewprev ), + awful.key({ modkey, }, "Right", awful.tag.viewnext ), + awful.key({ modkey, }, "Escape", awful.tag.history.restore), + + awful.key({ modkey, }, "j", + function () + awful.client.focus.byidx( 1) + if client.focus then client.focus:raise() end + end), + awful.key({ modkey, }, "k", + function () + awful.client.focus.byidx(-1) + if client.focus then client.focus:raise() end + end), + awful.key({ modkey, }, "w", function () mymainmenu:show({keygrabber=true}) end), + + -- Layout manipulation + awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), + awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), + awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), + awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), + awful.key({ modkey, }, "u", awful.client.urgent.jumpto), + awful.key({ modkey, }, "Tab", + function () + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + end), + + -- Standard program + awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), + awful.key({ modkey, "Control" }, "r", awesome.restart), + awful.key({ modkey, "Shift" }, "q", awesome.quit), + + awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), + awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), + awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), + awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), + awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), + awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), + awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), + awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), + + awful.key({ modkey, "Control" }, "n", awful.client.restore), + + -- Prompt + awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end), + + awful.key({ modkey }, "x", + function () + awful.prompt.run({ prompt = "Run Lua code: " }, + mypromptbox[mouse.screen].widget, + awful.util.eval, nil, + awful.util.getdir("cache") .. "/history_eval") + end) +) + +clientkeys = awful.util.table.join( + awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), + awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), + awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), + awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), + awful.key({ modkey, }, "o", awful.client.movetoscreen ), + awful.key({ modkey, "Shift" }, "r", function (c) c:redraw() end), + awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), + awful.key({ modkey, }, "n", + function (c) + -- The client currently has the input focus, so it cannot be + -- minimized, since minimized clients can't have the focus. + c.minimized = true + end), + awful.key({ modkey, }, "m", + function (c) + c.maximized_horizontal = not c.maximized_horizontal + c.maximized_vertical = not c.maximized_vertical + end) +) + +-- Compute the maximum number of digit we need, limited to 9 +keynumber = 0 +for s = 1, screen.count() do + keynumber = math.min(9, math.max(#tags[s], keynumber)); +end + +-- Bind all key numbers to tags. +-- Be careful: we use keycodes to make it works on any keyboard layout. +-- This should map on the top row of your keyboard, usually 1 to 9. +for i = 1, keynumber do + globalkeys = awful.util.table.join(globalkeys, + awful.key({ modkey }, "#" .. i + 9, + function () + local screen = mouse.screen + if tags[screen][i] then + awful.tag.viewonly(tags[screen][i]) + end + end), + awful.key({ modkey, "Control" }, "#" .. i + 9, + function () + local screen = mouse.screen + if tags[screen][i] then + awful.tag.viewtoggle(tags[screen][i]) + end + end), + awful.key({ modkey, "Shift" }, "#" .. i + 9, + function () + if client.focus and tags[client.focus.screen][i] then + awful.client.movetotag(tags[client.focus.screen][i]) + end + end), + awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, + function () + if client.focus and tags[client.focus.screen][i] then + awful.client.toggletag(tags[client.focus.screen][i]) + end + end)) +end + +clientbuttons = awful.util.table.join( + awful.button({ }, 1, function (c) client.focus = c; c:raise() end), + awful.button({ modkey }, 1, awful.mouse.client.move), + awful.button({ modkey }, 3, awful.mouse.client.resize)) + +-- Set keys +root.keys(globalkeys) +-- }}} + +-- {{{ Rules +awful.rules.rules = { + -- All clients will match this rule. + { rule = { }, + properties = { border_width = beautiful.border_width, + border_color = beautiful.border_normal, + focus = true, + keys = clientkeys, + buttons = clientbuttons } }, + { rule = { class = "MPlayer" }, + properties = { floating = true } }, + { rule = { class = "pinentry" }, + properties = { floating = true } }, + { rule = { class = "gimp" }, + properties = { floating = true } }, + -- Set Firefox to always map on tags number 2 of screen 1. + -- { rule = { class = "Firefox" }, + -- properties = { tag = tags[1][2] } }, +} +-- }}} + +-- {{{ Signals +-- Signal function to execute when a new client appears. +client.add_signal("manage", function (c, startup) + -- Add a titlebar + -- awful.titlebar.add(c, { modkey = modkey }) + + -- Enable sloppy focus + c:add_signal("mouse::enter", function(c) + if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier + and awful.client.focus.filter(c) then + client.focus = c + end + end) + + if not startup then + -- Set the windows at the slave, + -- i.e. put it at the end of others instead of setting it master. + -- awful.client.setslave(c) + + -- Put windows in a smart way, only if they does not set an initial position. + if not c.size_hints.user_position and not c.size_hints.program_position then + awful.placement.no_overlap(c) + awful.placement.no_offscreen(c) + end + end +end) + +client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) +client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) +-- }}} diff --git a/user-config-unused/compton/.config/compton/compton.conf b/user-config-unused/compton/.config/compton/compton.conf new file mode 100644 index 0000000..afcea82 --- /dev/null +++ b/user-config-unused/compton/.config/compton/compton.conf @@ -0,0 +1,244 @@ +# Thank you code_nomad: http://9m.no/ꪯ鵞 +# and Arch Wiki contributors: https://wiki.archlinux.org/index.php/Compton + +################################# +# +# Backend +# +################################# + +# Backend to use: "xrender" or "glx". +# GLX backend is typically much faster but depends on a sane driver. +backend = "glx"; + +################################# +# +# GLX backend +# +################################# + +glx-no-stencil = true; + +# GLX backend: Copy unmodified regions from front buffer instead of redrawing them all. +# My tests with nvidia-drivers show a 10% decrease in performance when the whole screen is modified, +# but a 20% increase when only 1/4 is. +# My tests on nouveau show terrible slowdown. +# Useful with --glx-swap-method, as well. +glx-copy-from-front = false; + +# GLX backend: Use MESA_copy_sub_buffer to do partial screen update. +# My tests on nouveau shows a 200% performance boost when only 1/4 of the screen is updated. +# May break VSync and is not available on some drivers. +# Overrides --glx-copy-from-front. +# glx-use-copysubbuffermesa = true; + +# GLX backend: Avoid rebinding pixmap on window damage. +# Probably could improve performance on rapid window content changes, but is known to break things on some drivers (LLVMpipe). +# Recommended if it works. +# glx-no-rebind-pixmap = true; + +# GLX backend: GLX buffer swap method we assume. +# Could be undefined (0), copy (1), exchange (2), 3-6, or buffer-age (-1). +# undefined is the slowest and the safest, and the default value. +# copy is fastest, but may fail on some drivers, +# 2-6 are gradually slower but safer (6 is still faster than 0). +# Usually, double buffer means 2, triple buffer means 3. +# buffer-age means auto-detect using GLX_EXT_buffer_age, supported by some drivers. +# Useless with --glx-use-copysubbuffermesa. +# Partially breaks --resize-damage. +# Defaults to undefined. +glx-swap-method = "undefined"; + +################################# +# +# Shadows +# +################################# + +# Enabled client-side shadows on windows. +shadow = true; +# Don't draw shadows on DND windows. +no-dnd-shadow = true; +# Avoid drawing shadows on dock/panel windows. +no-dock-shadow = true; +# The blur radius for shadows. (default 12) +shadow-radius = 5; +# The left offset for shadows. (default -15) +shadow-offset-x = -5; +# The top offset for shadows. (default -15) +shadow-offset-y = -5; +# The translucency for shadows. (default .75) +shadow-opacity = 0.5; + +# Set if you want different colour shadows +# shadow-red = 0.0; +# shadow-green = 0.0; +# shadow-blue = 0.0; + +# The shadow exclude options are helpful if you have shadows enabled. Due to the way compton draws its shadows, certain applications will have visual glitches +# (most applications are fine, only apps that do weird things with xshapes or argb are affected). +# This list includes all the affected apps I found in my testing. The "! name~=''" part excludes shadows on any "Unknown" windows, this prevents a visual glitch with the XFWM alt tab switcher. +shadow-exclude = [ + "! name~=''", + "name = 'Notification'", + "name = 'Plank'", + "name = 'Docky'", + "name = 'Kupfer'", + "name = 'xfce4-notifyd'", + "name *= 'VLC'", + "name *= 'compton'", + "name *= 'Chromium'", + "name *= 'Chrome'", + "class_g = 'Firefox' && argb", + "class_g = 'Conky'", + "class_g = 'Kupfer'", + "class_g = 'Synapse'", + "class_g ?= 'Notify-osd'", + "class_g ?= 'Cairo-dock'", + "class_g ?= 'Xfce4-notifyd'", + "class_g ?= 'Xfce4-power-manager'", + "_GTK_FRAME_EXTENTS@:c", + "_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'" +]; +# Avoid drawing shadow on all shaped windows (see also: --detect-rounded-corners) +shadow-ignore-shaped = false; + +################################# +# +# Opacity +# +################################# + +menu-opacity = 1; +inactive-opacity = 1; +active-opacity = 1; +frame-opacity = 1; +inactive-opacity-override = false; +alpha-step = 0.06; + +# Dim inactive windows. (0.0 - 1.0) +# inactive-dim = 0.2; +# Do not let dimness adjust based on window opacity. +# inactive-dim-fixed = true; +# Blur background of transparent windows. Bad performance with X Render backend. GLX backend is preferred. +# blur-background = true; +# Blur background of opaque windows with transparent frames as well. +# blur-background-frame = true; +# Do not let blur radius adjust based on window opacity. +blur-background-fixed = false; +blur-background-exclude = [ + "window_type = 'dock'", + "window_type = 'desktop'" +]; + +################################# +# +# Fading +# +################################# + +# Fade windows during opacity changes. +fading = true; +# The time between steps in a fade in milliseconds. (default 10). +fade-delta = 4; +# Opacity change between steps while fading in. (default 0.028). +fade-in-step = 0.01; +# Opacity change between steps while fading out. (default 0.03). +fade-out-step = 0.01; +# Fade windows in/out when opening/closing +# no-fading-openclose = true; + +# Specify a list of conditions of windows that should not be faded. +fade-exclude = [ ]; + +################################# +# +# Other +# +################################# + +# Try to detect WM windows and mark them as active. +mark-wmwin-focused = true; +# Mark all non-WM but override-redirect windows active (e.g. menus). +mark-ovredir-focused = true; +# Use EWMH _NET_WM_ACTIVE_WINDOW to determine which window is focused instead of using FocusIn/Out events. +# Usually more reliable but depends on a EWMH-compliant WM. +use-ewmh-active-win = true; +# Detect rounded corners and treat them as rectangular when --shadow-ignore-shaped is on. +detect-rounded-corners = true; + +# Detect _NET_WM_OPACITY on client windows, useful for window managers not passing _NET_WM_OPACITY of client windows to frame windows. +# This prevents opacity being ignored for some apps. +# For example without this enabled my xfce4-notifyd is 100% opacity no matter what. +detect-client-opacity = true; + +# Specify refresh rate of the screen. +# If not specified or 0, compton will try detecting this with X RandR extension. +refresh-rate = 0; + +# Set VSync method. VSync methods currently available: +# none: No VSync +# drm: VSync with DRM_IOCTL_WAIT_VBLANK. May only work on some drivers. +# opengl: Try to VSync with SGI_video_sync OpenGL extension. Only work on some drivers. +# opengl-oml: Try to VSync with OML_sync_control OpenGL extension. Only work on some drivers. +# opengl-swc: Try to VSync with SGI_swap_control OpenGL extension. Only work on some drivers. Works only with GLX backend. Known to be most effective on many drivers. Does not actually control paint timing, only buffer swap is affected, so it doesn’t have the effect of --sw-opti unlike other methods. Experimental. +# opengl-mswc: Try to VSync with MESA_swap_control OpenGL extension. Basically the same as opengl-swc above, except the extension we use. +# (Note some VSync methods may not be enabled at compile time.) +vsync = "opengl"; + +# Enable DBE painting mode, intended to use with VSync to (hopefully) eliminate tearing. +# Reported to have no effect, though. +dbe = false; + +# Limit compton to repaint at most once every 1 / refresh_rate second to boost performance. +# This should not be used with --vsync drm/opengl/opengl-oml as they essentially does --sw-opti's job already, +# unless you wish to specify a lower refresh rate than the actual value. +#sw-opti = true; + +# Unredirect all windows if a full-screen opaque window is detected, to maximize performance for full-screen windows, like games. +# Known to cause flickering when redirecting/unredirecting windows. +# paint-on-overlay may make the flickering less obvious. +unredir-if-possible = false; + +# Specify a list of conditions of windows that should always be considered focused. +focus-exclude = [ ]; + +# Use WM_TRANSIENT_FOR to group windows, and consider windows in the same group focused at the same time. +detect-transient = true; +# Use WM_CLIENT_LEADER to group windows, and consider windows in the same group focused at the same time. +# WM_TRANSIENT_FOR has higher priority if --detect-transient is enabled, too. +detect-client-leader = true; + +################################# +# +# Window type settings +# +################################# + +wintypes: +{ + tooltip = + { + # fade: Fade the particular type of windows. + fade = true; + # shadow: Give those windows shadow + shadow = false; + # opacity: Default opacity for the type of windows. + opacity = 0.85; + # focus: Whether to always consider windows of this type focused. + focus = true; + }; +}; + +###################### +# +# XSync +# See: https://github.com/yshui/compton/commit/b18d46bcbdc35a3b5620d817dd46fbc76485c20d +# +###################### + +# Attempt to synchronize client applications' draw calls with `XSync()`, used on GLX backend to ensure up-to-date window content is painted. +xrender-sync = true; + +# use X Sync fence to sync clients' draw calls. Needed on nvidia-drivers with GLX backend for some users. +xrender-sync-fence = true; diff --git a/user-config-unused/dunst/.config/dunst/dunstrc b/user-config-unused/dunst/.config/dunst/dunstrc new file mode 100644 index 0000000..3b2bead --- /dev/null +++ b/user-config-unused/dunst/.config/dunst/dunstrc @@ -0,0 +1,242 @@ +[global] + font = Terminus 8 + + # Allow a small subset of html markup: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # If markup is not allowed, those tags will be stripped out of the + # message. + allow_markup = yes + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # Markup is allowed + format = "%s\n%b" + + # Sort messages by urgency. + sort = yes + + # Show how many messages are currently hidden (because of geometry). + indicate_hidden = yes + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = left + + # The frequency with wich text that is longer than the notification + # window allows bounces back and forth. + # This option conflicts with "word_wrap". + # Set to 0 to disable. + bounce_freq = 0 + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60 + + # Split notifications into multiple lines if they don't fit into + # geometry. + word_wrap = yes + + # Ignore newlines '\n' in notifications. + ignore_newline = no + + + # The geometry of the window: + # [{width}]x{height}[+/-{x}+/-{y}] + # The geometry of the message window. + # The height is measured in number of notifications everything else + # in pixels. If the width is omitted but the height is given + # ("-geometry x2"), the message window expands over the whole screen + # (dmenu-like). If width is 0, the window expands to the longest + # message displayed. A positive x is measured from the left, a + # negative from the right side of the screen. Y is measured from + # the top and down respectevly. + # The width can be negative. In this case the actual width is the + # screen width minus the width defined in within the geometry option. + geometry = "300x5-20+30" + + # Shrink window if it's smaller than the width. Will be ignored if + # width is 0. + shrink = no + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing windowmanager is + # present (e.g. xcompmgr, compiz, etc.). + transparency = 10 + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + idle_threshold = 120 + + # Which monitor should the notifications be displayed on. + monitor = 0 + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a windowmanager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern windowmanagers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = mouse + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = yes + + # Maximum amount of notifications kept in history + history_length = 20 + + # Display indicators for URLs (U) and actions (A). + show_indicators = yes + + # The height of a single line. If the height is smaller than the + # font height, it will get raised to the font height. + # This adds empty space above and under the text. + line_height = 0 + + # Draw a line of "separatpr_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 2 + + # Padding between text and separator. + padding = 8 + + # Horizontal padding. + horizontal_padding = 8 + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = frame + + # Print a notification on startup. + # This is mainly for error detection, since dbus (re-)starts dunst + # automatically after a crash. + startup_notification = true + + # dmenu path. + dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + browser = /usr/bin/conkeror + + # Align icons left/right/off + icon_position = off + + # Paths to default icons. + icon_folders = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/ +[frame] + width = 1 + color = "#2fed55" + +[shortcuts] + + # Shortcuts are specified as [modifier+][modifier+]...key + # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2", + # "mod3" and "mod4" (windows-key). + # Xev might be helpful to find names for keys. + + # Close notification. + close = ctrl+space + + # Close all notifications. + close_all = ctrl+shift+space + + # Redisplay last message(s). + # On the US keyboard layout "grave" is normally above TAB and left + # of "1". + history = ctrl+shift+grave + + # Context menu. + context = ctrl+shift+period + +[urgency_low] + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the '#' and following would be interpreted as a comment. + background = "#3b615d" + foreground = "#93a1a1" + timeout = 5 + +[urgency_normal] + background = "#38A69A" + foreground = "#000000" + timeout = 10 + +[urgency_critical] + background = "#f51f1b" + foreground = "#000000" + timeout = 0 + +# Every section that isn't one of the above is interpreted as a rules to +# override settings for certain messages. +# Messages can be matched by "appname", "summary", "body", "icon", "category", +# "msg_urgency" and you can override the "timeout", "urgency", "foreground", +# "background", "new_icon" and "format". +# Shell-like globbing will get expanded. +# +# SCRIPTING +# You can specify a script that gets run when the rule matches by +# setting the "script" option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# +# NOTE: if you don't want a notification to be displayed, set the format +# to "". +# NOTE: It might be helpful to run dunst -print in a terminal in order +# to find fitting options for rules. + +#[espeak] +# summary = "*" +# script = dunst_espeak.sh + +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + +#[ignore] +# # This notification will not be displayed +# summary = "foobar" +# format = "" + +#[signed_on] +# appname = Pidgin +# summary = "*signed on*" +# urgency = low +# +#[signed_off] +# appname = Pidgin +# summary = *signed off* +# urgency = low +# +#[says] +# appname = Pidgin +# summary = *says* +# urgency = critical +# +#[twitter] +# appname = Pidgin +# summary = *twitter.com* +# urgency = normal +# diff --git a/user-config-unused/gtk/.config/gtk-2.0/gtkfilechooser.ini b/user-config-unused/gtk/.config/gtk-2.0/gtkfilechooser.ini new file mode 100644 index 0000000..dee7ef4 --- /dev/null +++ b/user-config-unused/gtk/.config/gtk-2.0/gtkfilechooser.ini @@ -0,0 +1,11 @@ +[Filechooser Settings] +LocationMode=path-bar +ShowHidden=true +ShowSizeColumn=true +GeometryX=431 +GeometryY=715 +GeometryWidth=2978 +GeometryHeight=758 +SortColumn=modified +SortOrder=ascending +StartupMode=recent diff --git a/user-config-unused/gtk/.config/gtk-3.0/bookmarks b/user-config-unused/gtk/.config/gtk-3.0/bookmarks new file mode 100644 index 0000000..158f12b --- /dev/null +++ b/user-config-unused/gtk/.config/gtk-3.0/bookmarks @@ -0,0 +1 @@ +file:///home/collin/work/documents/PSHSA diff --git a/user-config-unused/gtk/.config/gtk-3.0/settings.ini b/user-config-unused/gtk/.config/gtk-3.0/settings.ini new file mode 100644 index 0000000..3687cf2 --- /dev/null +++ b/user-config-unused/gtk/.config/gtk-3.0/settings.ini @@ -0,0 +1,17 @@ +[Settings] +#gtk-key-theme-name=Emacs +gtk-theme-name=Arc +gtk-icon-theme-name=gnome +gtk-font-name=FreeMono 12 +gtk-cursor-theme-name=Adwaita +gtk-cursor-theme-size=0 +gtk-toolbar-style=GTK_TOOLBAR_BOTH +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=1 +gtk-menu-images=1 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=1 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle=hintfull +gtk-xft-rgba=rgb diff --git a/user-config-unused/gtk/.gtkrc-2.0 b/user-config-unused/gtk/.gtkrc-2.0 new file mode 100644 index 0000000..bdaac21 --- /dev/null +++ b/user-config-unused/gtk/.gtkrc-2.0 @@ -0,0 +1,19 @@ +# DO NOT EDIT! This file will be overwritten by LXAppearance. +# Any customization should be done in ~/.gtkrc-2.0.mine instead. + +include "/home/collin/.gtkrc-2.0.mine" +gtk-theme-name="Arc" +gtk-icon-theme-name="gnome" +gtk-font-name="FreeMono 12" +gtk-cursor-theme-name="Adwaita" +gtk-cursor-theme-size=0 +gtk-toolbar-style=GTK_TOOLBAR_BOTH +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=1 +gtk-menu-images=1 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=1 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle="hintfull" +gtk-xft-rgba="rgb" diff --git a/user-config-unused/luakit/.config/luakit/binds.lua b/user-config-unused/luakit/.config/luakit/binds.lua new file mode 100644 index 0000000..4fc718c --- /dev/null +++ b/user-config-unused/luakit/.config/luakit/binds.lua @@ -0,0 +1,588 @@ +----------------- +-- Keybindings -- +----------------- + +-- Binding aliases +local key, buf, but = lousy.bind.key, lousy.bind.buf, lousy.bind.but +local cmd, any = lousy.bind.cmd, lousy.bind.any + +-- Util aliases +local match, join = string.match, lousy.util.table.join +local strip, split = lousy.util.string.strip, lousy.util.string.split + +-- Globals or defaults that are used in binds +local scroll_step = globals.scroll_step or 20 +local zoom_step = globals.zoom_step or 0.1 + +-- Add binds to a mode +function add_binds(mode, binds, before) + assert(binds and type(binds) == "table", "invalid binds table type: " .. type(binds)) + mode = type(mode) ~= "table" and {mode} or mode + for _, m in ipairs(mode) do + local mdata = get_mode(m) + if mdata and before then + mdata.binds = join(binds, mdata.binds or {}) + elseif mdata then + mdata.binds = mdata.binds or {} + for _, b in ipairs(binds) do table.insert(mdata.binds, b) end + else + new_mode(m, { binds = binds }) + end + end +end + +-- Add commands to command mode +function add_cmds(cmds, before) + add_binds("command", cmds, before) +end + +-- Adds the default menu widget bindings to a mode +menu_binds = { + -- Navigate items + key({}, "j", function (w) w.menu:move_down() end), + key({}, "k", function (w) w.menu:move_up() end), + key({}, "Down", function (w) w.menu:move_down() end), + key({}, "Up", function (w) w.menu:move_up() end), + key({}, "Tab", function (w) w.menu:move_down() end), + key({"Shift"}, "Tab", function (w) w.menu:move_up() end), +} + +-- Add binds to special mode "all" which adds its binds to all modes. +add_binds("all", { + key({}, "Escape", "Return to `normal` mode.", + function (w) w:set_mode() end), + + key({"Control"}, "[", "Return to `normal` mode.", + function (w) w:set_mode() end), + + -- Mouse bindings + but({}, 8, "Go back.", + function (w) w:back() end), + + but({}, 9, "Go forward.", + function (w) w:forward() end), + + -- Open link in new tab or navigate to selection + but({}, 2, [[Open link under mouse cursor in new tab or navigate to the + contents of `luakit.selection.primary`.]], + function (w, m) + -- Ignore button 2 clicks in form fields + if not m.context.editable then + -- Open hovered uri in new tab + local uri = w.view.hovered_uri + if uri then + w:new_tab(uri, false) + else -- Open selection in current tab + uri = luakit.selection.primary + if uri then w:navigate(w:search_open(uri)) end + end + end + end), + + -- Open link in new tab when Ctrl-clicked. + but({"Control"}, 1, "Open link under mouse cursor in new tab.", + function (w, m) + local uri = w.view.hovered_uri + if uri then + w:new_tab(uri, false) + end + end), + + -- Zoom binds + but({"Control"}, 4, "Increase text zoom level.", + function (w, m) w:zoom_in() end), + + but({"Control"}, 5, "Reduce text zoom level.", + function (w, m) w:zoom_out() end), + + -- Horizontal mouse scroll binds + but({"Shift"}, 4, "Scroll left.", + function (w, m) w:scroll{ xrel = -scroll_step } end), + + but({"Shift"}, 5, "Scroll right.", + function (w, m) w:scroll{ xrel = scroll_step } end), +}) + +add_binds("normal", { + -- Autoparse the `[count]` before a binding and re-call the hit function + -- with the count removed and added to the opts table. + any([[Meta-binding to detect the `^[count]` syntax. The `[count]` is parsed + and stripped from the internal buffer string and the value assigned to + `state.count`. Then `lousy.bind.hit()` is re-called with the modified + buffer string & original modifier state. + + #### Example binding + + lousy.bind.key({}, "%", function (w, state) + w:scroll{ ypct = state.count } + end, { count = 0 }) + + This binding demonstrates several concepts. Firstly that you are able to + specify per-binding default values of `count`. In this case if the user + types `"%"` the document will be scrolled vertically to `0%` (the top). + + If the user types `"100%"` then the document will be scrolled to `100%` + (the bottom). All without the need to use `lousy.bind.buf` bindings + everywhere and or using a `^(%d*)` pattern prefix on every binding which + would like to make use of the `[count]` syntax.]], + function (w, m) + local count, buf + if m.buffer then + count = string.match(m.buffer, "^(%d+)") + end + if count then + buf = string.sub(m.buffer, #count + 1, (m.updated_buf and -2) or -1) + local opts = join(m, {count = tonumber(count)}) + opts.buffer = (#buf > 0 and buf) or nil + if lousy.bind.hit(w, m.binds, m.mods, m.key, opts) then + return true + end + end + return false + end), + + key({}, "i", "Enter `insert` mode.", + function (w) w:set_mode("insert") end), + + key({}, ":", "Enter `command` mode.", + function (w) w:set_mode("command") end), + + -- Scrolling + key({}, "j", "Scroll document down.", + function (w) w:scroll{ yrel = scroll_step } end), + + key({}, "k", "Scroll document up.", + function (w) w:scroll{ yrel = -scroll_step } end), + + key({}, "h", "Scroll document left.", + function (w) w:scroll{ xrel = -scroll_step } end), + + key({}, "l", "Scroll document right.", + function (w) w:scroll{ xrel = scroll_step } end), + + key({}, "Down", "Scroll document down.", + function (w) w:scroll{ yrel = scroll_step } end), + + key({}, "Up", "Scroll document up.", + function (w) w:scroll{ yrel = -scroll_step } end), + + key({}, "Left", "Scroll document left.", + function (w) w:scroll{ xrel = -scroll_step } end), + + key({}, "Right", "Scroll document right.", + function (w) w:scroll{ xrel = scroll_step } end), + + key({}, "^", "Scroll to the absolute left of the document.", + function (w) w:scroll{ x = 0 } end), + + key({}, "$", "Scroll to the absolute right of the document.", + function (w) w:scroll{ x = -1 } end), + + key({}, "0", "Scroll to the absolute left of the document.", + function (w, m) + if not m.count then w:scroll{ y = 0 } else return false end + end), + + key({"Control"}, "e", "Scroll document down.", + function (w) w:scroll{ yrel = scroll_step } end), + + key({"Control"}, "y", "Scroll document up.", + function (w) w:scroll{ yrel = -scroll_step } end), + + key({"Control"}, "d", "Scroll half page down.", + function (w) w:scroll{ ypagerel = 0.5 } end), + + key({"Control"}, "u", "Scroll half page up.", + function (w) w:scroll{ ypagerel = -0.5 } end), + + key({"Control"}, "f", "Scroll page down.", + function (w) w:scroll{ ypagerel = 1.0 } end), + + key({"Control"}, "b", "Scroll page up.", + function (w) w:scroll{ ypagerel = -1.0 } end), + + key({}, "space", "Scroll page down.", + function (w) w:scroll{ ypagerel = 1.0 } end), + + key({"Shift"}, "space", "Scroll page up.", + function (w) w:scroll{ ypagerel = -1.0 } end), + + key({}, "BackSpace", "Scroll page up.", + function (w) w:scroll{ ypagerel = -1.0 } end), + + key({}, "Page_Down", "Scroll page down.", + function (w) w:scroll{ ypagerel = 1.0 } end), + + key({}, "Page_Up", "Scroll page up.", + function (w) w:scroll{ ypagerel = -1.0 } end), + + key({}, "Home", "Go to the end of the document.", + function (w) w:scroll{ y = 0 } end), + + key({}, "End", "Go to the top of the document.", + function (w) w:scroll{ y = -1 } end), + + -- Specific scroll + buf("^gg$", "Go to the top of the document.", + function (w, b, m) w:scroll{ ypct = m.count } end, {count=0}), + + buf("^G$", "Go to the bottom of the document.", + function (w, b, m) w:scroll{ ypct = m.count } end, {count=100}), + + buf("^%%$", "Go to `[count]` percent of the document.", + function (w, b, m) w:scroll{ ypct = m.count } end), + + -- Zooming + key({}, "+", "Enlarge text zoom of the current page.", + function (w, m) w:zoom_in(zoom_step * m.count) end, {count=1}), + + key({}, "-", "Reduce text zom of the current page.", + function (w, m) w:zoom_out(zoom_step * m.count) end, {count=1}), + + key({}, "=", "Reset zoom level.", + function (w, m) w:zoom_set() end), + + buf("^z[iI]$", [[Enlarge text zoom of current page with `zi` or `zI` to + reduce full zoom.]], + function (w, b, m) + w:zoom_in(zoom_step * m.count, b == "zI") + end, {count=1}), + + buf("^z[oO]$", [[Reduce text zoom of current page with `zo` or `zO` to + reduce full zoom.]], + function (w, b, m) + w:zoom_out(zoom_step * m.count, b == "zO") + end, {count=1}), + + -- Zoom reset or specific zoom ([count]zZ for full content zoom) + buf("^z[zZ]$", [[Set current page zoom to `[count]` percent with + `[count]zz`, use `[count]zZ` to set full zoom percent.]], + function (w, b, m) + w:zoom_set(m.count/100, b == "zZ") + end, {count=100}), + + -- Fullscreen + key({}, "F11", "Toggle fullscreen mode.", + function (w) w.win.fullscreen = not w.win.fullscreen end), + + -- Clipboard + key({}, "p", [[Open a URL based on the current primary selection contents + in the current tab.]], + function (w) + local uri = luakit.selection.primary + if not uri then w:notify("No primary selection...") return end + w:navigate(w:search_open(uri)) + end), + + key({}, "P", [[Open a URL based on the current primary selection contents + in `[count=1]` new tab(s).]], + function (w, m) + local uri = luakit.selection.primary + if not uri then w:notify("No primary selection...") return end + for i = 1, m.count do w:new_tab(w:search_open(uri)) end + end, {count = 1}), + + -- Yanking + key({}, "y", "Yank current URI to primary selection.", + function (w) + local uri = string.gsub(w.view.uri or "", " ", "%%20") + luakit.selection.primary = uri + w:notify("Yanked uri: " .. uri) + end), + + -- Commands + key({"Control"}, "a", "Increment last number in URL.", + function (w) w:navigate(w:inc_uri(1)) end), + + key({"Control"}, "x", "Decrement last number in URL.", + function (w) w:navigate(w:inc_uri(-1)) end), + + key({}, "o", "Open one or more URLs.", + function (w) w:enter_cmd(":open ") end), + + key({}, "t", "Open one or more URLs in a new tab.", + function (w) w:enter_cmd(":tabopen ") end), + + key({}, "w", "Open one or more URLs in a new window.", + function (w) w:enter_cmd(":winopen ") end), + + key({}, "O", "Open one or more URLs based on current location.", + function (w) w:enter_cmd(":open " .. (w.view.uri or "")) end), + + key({}, "T", + "Open one or more URLs based on current location in a new tab.", + function (w) w:enter_cmd(":tabopen " .. (w.view.uri or "")) end), + + key({}, "W", + "Open one or more URLs based on current locaton in a new window.", + function (w) w:enter_cmd(":winopen " .. (w.view.uri or "")) end), + + -- History + key({}, "H", "Go back in the browser history `[count=1]` items.", + function (w, m) w:back(m.count) end), + + key({}, "L", "Go forward in the browser history `[count=1]` times.", + function (w, m) w:forward(m.count) end), + + key({}, "XF86Back", "Go back in the browser history.", + function (w, m) w:back(m.count) end), + + key({}, "XF86Forward", "Go forward in the browser history.", + function (w, m) w:forward(m.count) end), + + key({"Control"}, "o", "Go back in the browser history.", + function (w, m) w:back(m.count) end), + + key({"Control"}, "i", "Go forward in the browser history.", + function (w, m) w:forward(m.count) end), + + -- Tab + key({"Control"}, "Page_Up", "Go to previous tab.", + function (w) w:prev_tab() end), + + key({"Control"}, "Page_Down", "Go to next tab.", + function (w) w:next_tab() end), + + key({"Control"}, "Tab", "Go to next tab.", + function (w) w:next_tab() end), + + key({"Shift","Control"}, "Tab", "Go to previous tab.", + function (w) w:prev_tab() end), + + buf("^gT$", "Go to previous tab.", + function (w) w:prev_tab() end), + + buf("^gt$", "Go to next tab (or `[count]` nth tab).", + function (w, b, m) + if not w:goto_tab(m.count) then w:next_tab() end + end, {count=0}), + + buf("^g0$", "Go to first tab.", + function (w) w:goto_tab(1) end), + + buf("^g$$", "Go to last tab.", + function (w) w:goto_tab(-1) end), + + key({"Control"}, "t", "Open a new tab.", + function (w) w:new_tab(globals.homepage) end), + + key({"Control"}, "w", "Close current tab.", + function (w) w:close_tab() end), + + key({}, "d", "Close current tab (or `[count]` tabs).", + function (w, m) for i=1,m.count do w:close_tab() end end, {count=1}), + + key({}, "<", "Reorder tab left `[count=1]` positions.", + function (w, m) + w.tabs:reorder(w.view, w.tabs:current() - m.count) + end, {count=1}), + + key({}, ">", "Reorder tab right `[count=1]` positions.", + function (w, m) + w.tabs:reorder(w.view, + (w.tabs:current() + m.count) % w.tabs:count()) + end, {count=1}), + + buf("^gH$", "Open homepage in new tab.", + function (w) w:new_tab(globals.homepage) end), + + buf("^gh$", "Open homepage.", + function (w) w:navigate(globals.homepage) end), + + buf("^gy$", "Duplicate current tab.", + function (w) w:new_tab(w.view.history or "") end), + + key({}, "r", "Reload current tab.", + function (w) w:reload() end), + + key({}, "R", "Reload current tab (skipping cache).", + function (w) w:reload(true) end), + + key({"Control"}, "c", "Stop loading the current tab.", + function (w) w.view:stop() end), + + key({"Control", "Shift"}, "R", "Restart luakit (reloading configs).", + function (w) w:restart() end), + + -- Window + buf("^ZZ$", "Quit and save the session.", + function (w) w:save_session() w:close_win() end), + + buf("^ZQ$", "Quit and don't save the session.", + function (w) w:close_win() end), + + buf("^D$", "Quit and don't save the session.", + function (w) w:close_win() end), + + -- Enter passthrough mode + key({"Control"}, "z", + "Enter `passthrough` mode, ignores all luakit keybindings.", + function (w) w:set_mode("passthrough") end), +}) + +add_binds("insert", { + key({"Control"}, "z", + "Enter `passthrough` mode, ignores all luakit keybindings.", + function (w) w:set_mode("passthrough") end), +}) + +readline_bindings = { + key({"Shift"}, "Insert", + "Insert contents of primary selection at cursor position.", + function (w) w:insert_cmd(luakit.selection.primary) end), + + key({"Control"}, "w", "Delete previous word.", + function (w) w:del_word() end), + + key({"Control"}, "u", "Delete until beginning of current line.", + function (w) w:del_line() end), + + key({"Control"}, "h", "Delete character to the left.", + function (w) w:del_backward_char() end), + + key({"Control"}, "d", "Delete character to the right.", + function (w) w:del_forward_char() end), + + key({"Control"}, "a", "Move cursor to beginning of current line.", + function (w) w:beg_line() end), + + key({"Control"}, "e", "Move cursor to end of current line.", + function (w) w:end_line() end), + + key({"Control"}, "f", "Move cursor forward one character.", + function (w) w:forward_char() end), + + key({"Control"}, "b", "Move cursor backward one character.", + function (w) w:backward_char() end), + + key({"Mod1"}, "f", "Move cursor forward one word.", + function (w) w:forward_word() end), + + key({"Mod1"}, "b", "Move cursor backward one word.", + function (w) w:backward_word() end), +} + +add_binds({"command", "search"}, readline_bindings) + +-- Switching tabs with Mod1+{1,2,3,...} +mod1binds = {} +for i=1,10 do + table.insert(mod1binds, + key({"Mod1"}, tostring(i % 10), "Jump to tab at index "..i..".", + function (w) w.tabs:switch(i) end)) +end +add_binds("normal", mod1binds) + +-- Command bindings which are matched in the "command" mode from text +-- entered into the input bar. +add_cmds({ + buf("^%S+!", + [[Detect bang syntax in `:command!` and recursively calls + `lousy.bind.match_cmd(..)` removing the bang from the command string + and setting `bang = true` in the bind opts table.]], + function (w, cmd, opts) + local cmd, args = string.match(cmd, "^(%S+)!+(.*)") + if cmd then + opts = join(opts, { bang = true }) + return lousy.bind.match_cmd(w, opts.binds, cmd .. args, opts) + end + end), + + cmd("c[lose]", "Close current tab.", + function (w) w:close_tab() end), + + cmd("print", "Print current page.", + function (w) w.view:eval_js("print()") end), + + cmd("stop", "Stop loading.", + function (w) w.view:stop() end), + + cmd("reload", "Reload page", + function (w) w:reload() end), + + cmd("restart", "Restart browser (reload config files).", + function (w) w:restart() end), + + cmd("write", "Save current session.", + function (w) w:save_session() end), + + cmd("noh[lsearch]", "Clear search highlighting.", + function (w) w:clear_search() end), + + cmd("back", "Go back in the browser history `[count=1]` items.", + function (w, a) w:back(tonumber(a) or 1) end), + + cmd("f[orward]", "Go forward in the browser history `[count=1]` items.", + function (w, a) w:forward(tonumber(a) or 1) end), + + cmd("inc[rease]", "Increment last number in URL.", + function (w, a) w:navigate(w:inc_uri(tonumber(a) or 1)) end), + + cmd("o[pen]", "Open one or more URLs.", + function (w, a) w:navigate(w:search_open(a)) end), + + cmd("t[abopen]", "Open one or more URLs in a new tab.", + function (w, a) w:new_tab(w:search_open(a)) end), + + cmd("w[inopen]", "Open one or more URLs in a new window.", + function (w, a) window.new{w:search_open(a)} end), + + cmd({"javascript", "js"}, "Evaluate JavaScript snippet.", + function (w, a) w.view:eval_js(a) end), + + -- Tab manipulation commands + cmd("tab", "Execute command and open result in new tab.", + function (w, a) w:new_tab() w:run_cmd(":" .. a) end), + + cmd("tabd[o]", "Execute command in each tab.", + function (w, a) w:each_tab(function (v) w:run_cmd(":" .. a) end) end), + + cmd("tabdu[plicate]", "Duplicate current tab.", + function (w) w:new_tab(w.view.history) end), + + cmd("tabfir[st]", "Switch to first tab.", + function (w) w:goto_tab(1) end), + + cmd("tabl[ast]", "Switch to last tab.", + function (w) w:goto_tab(-1) end), + + cmd("tabn[ext]", "Switch to the next tab.", + function (w) w:next_tab() end), + + cmd("tabp[revious]", "Switch to the previous tab.", + function (w) w:prev_tab() end), + + cmd("q[uit]", "Close the current window.", + function (w, a, o) w:close_win(o.bang) end), + + cmd({"viewsource", "vs"}, "View the source code of the current document.", + function (w, a, o) w:toggle_source(not o.bang and true or nil) end), + + cmd({"wqall", "wq"}, "Save the session and quit.", + function (w, a, o) w:save_session() w:close_win(o.bang) end), + + cmd("lua", "Evaluate Lua snippet.", function (w, a) + if a then + local ret = assert( + loadstring("return function(w) return "..a.." end"))()(w) + if ret then print(ret) end + else + w:set_mode("lua") + end + end), + + cmd("dump", "Dump current tabs html to file.", + function (w, a) + local fname = string.gsub(w.win.title, '[^%w%.%-]', '_')..'.html' -- sanitize filename + local file = a or luakit.save_file("Save file", w.win, xdg.download_dir or '.', fname) + if file then + local fd = assert(io.open(file, "w"), "failed to open: " .. file) + local html = assert(w.view:eval_js("document.documentElement.outerHTML"), "Unable to get HTML") + assert(fd:write(html), "unable to save html") + io.close(fd) + w:notify("Dumped HTML to: " .. file) + end + end), +}) + +-- vim: et:sw=4:ts=8:sts=4:tw=80 diff --git a/user-config-unused/luakit/.config/luakit/globals.lua b/user-config-unused/luakit/.config/luakit/globals.lua new file mode 100644 index 0000000..b8b4a25 --- /dev/null +++ b/user-config-unused/luakit/.config/luakit/globals.lua @@ -0,0 +1,85 @@ +-- Global variables for luakit +globals = { + homepage = "http://luakit.org/", + -- homepage = "http://github.com/mason-larobina/luakit", + scroll_step = 40, + zoom_step = 0.1, + max_cmd_history = 100, + max_srch_history = 100, + -- http_proxy = "http://example.com:3128", + default_window_size = "800x600", + + -- Disables loading of hostnames from /etc/hosts (for large host files) + -- load_etc_hosts = false, + -- Disables checking if a filepath exists in search_open function + -- check_filepath = false, +} + +-- Make useragent +local _, arch = luakit.spawn_sync("uname -sm") +-- Only use the luakit version if in date format (reduces identifiability) +local lkv = string.match(luakit.version, "^(%d+.%d+.%d+)") +globals.useragent = string.format("Mozilla/5.0 (%s) AppleWebKit/%s+ (KHTML, like Gecko) WebKitGTK+/%s luakit%s", + string.sub(arch, 1, -2), luakit.webkit_user_agent_version, + luakit.webkit_version, (lkv and ("/" .. lkv)) or "") + +-- Search common locations for a ca file which is used for ssl connection validation. +local ca_files = { + -- $XDG_DATA_HOME/luakit/ca-certificates.crt + luakit.data_dir .. "/ca-certificates.crt", + "/etc/certs/ca-certificates.crt", + "/etc/ssl/certs/ca-certificates.crt", +} +-- Use the first ca-file found +for _, ca_file in ipairs(ca_files) do + if os.exists(ca_file) then + soup.ssl_ca_file = ca_file + break + end +end + +-- Change to stop navigation sites with invalid or expired ssl certificates +soup.ssl_strict = false + +-- Set cookie acceptance policy +cookie_policy = { always = 0, never = 1, no_third_party = 2 } +soup.accept_policy = cookie_policy.always + +-- List of search engines. Each item must contain a single %s which is +-- replaced by URI encoded search terms. All other occurances of the percent +-- character (%) may need to be escaped by placing another % before or after +-- it to avoid collisions with lua's string.format characters. +-- See: http://www.lua.org/manual/5.1/manual.html#pdf-string.format +search_engines = { + duckduckgo = "https://duckduckgo.com/?q=%s", + github = "https://github.com/search?q=%s", + google = "https://google.com/search?q=%s", + imdb = "http://www.imdb.com/find?s=all&q=%s", + wikipedia = "https://en.wikipedia.org/wiki/Special:Search?search=%s", +} + +-- Set google as fallback search engine +search_engines.default = search_engines.google +-- Use this instead to disable auto-searching +--search_engines.default = "%s" + +-- Per-domain webview properties +-- See http://webkitgtk.org/reference/webkitgtk/stable/WebKitWebSettings.html +domain_props = { --[[ + ["all"] = { + enable_scripts = false, + enable_plugins = false, + enable_private_browsing = false, + user_stylesheet_uri = "", + }, + ["youtube.com"] = { + enable_scripts = true, + enable_plugins = true, + }, + ["bbs.archlinux.org"] = { + user_stylesheet_uri = "file://" .. luakit.data_dir .. "/styles/dark.css", + enable_private_browsing = true, + }, ]] +} + +-- vim: et:sw=4:ts=8:sts=4:tw=80 diff --git a/user-config-unused/luakit/.config/luakit/modes.lua b/user-config-unused/luakit/.config/luakit/modes.lua new file mode 100644 index 0000000..bd15c67 --- /dev/null +++ b/user-config-unused/luakit/.config/luakit/modes.lua @@ -0,0 +1,163 @@ +------------------------------- +-- luakit mode configuration -- +------------------------------- + +-- Table of modes and their callback hooks +local modes = {} +local lousy = require "lousy" +local join = lousy.util.table.join +local order = 0 + +-- Add new mode table (optionally merges with original mode) +function new_mode(name, desc, mode, replace) + assert(string.match(name, "^[%w-_]+$"), "invalid mode name: " .. name) + -- Detect optional description + if type(desc) == "table" then + desc, mode, replace = nil, desc, mode + end + local traceback = debug.traceback("Creation traceback:", 2) + order = order + 1 + modes[name] = join({ order = order, traceback = traceback }, + (not replace and modes[name]) or {}, mode or {}, + { name = name, desc = desc }) +end + +-- Get mode table +function get_mode(name) return modes[name] end + +function get_modes() return lousy.util.table.clone(modes) end + +-- Attach window & input bar signals for mode hooks +window.init_funcs.modes_setup = function (w) + -- Calls the `enter` and `leave` mode hooks. + w:add_signal("mode-changed", function (_, name, ...) + local leave = (w.mode or {}).leave + + -- Get new modes functions/hooks/data + local mode = assert(modes[name], "invalid mode: " .. name) + + -- Call last modes leave hook. + if leave then leave(w) end + + -- Create w.mode object + w.mode = mode + + -- Update window binds + w:update_binds(name) + + -- Call new modes enter hook. + if mode.enter then mode.enter(w, ...) end + + w:emit_signal("mode-entered", mode) + end) + + local input = w.ibar.input + + -- Calls the changed hook on input widget changed. + input:add_signal("changed", function () + local changed = w.mode.changed + if changed then changed(w, input.text) end + end) + + input:add_signal("property::position", function () + local move_cursor = w.mode.move_cursor + if move_cursor then move_cursor(w, input.position) end + end) + + -- Calls the `activate` hook on input widget activate. + input:add_signal("activate", function () + local mode = w.mode + if mode and mode.activate then + local text, hist = input.text, mode.history + if mode.activate(w, text) == false then return end + -- Check if last history item is identical + if hist and hist.items and hist.items[hist.len or -1] ~= text then + table.insert(hist.items, text) + end + end + end) +end + +-- Add mode related window methods +window.methods.set_mode = lousy.mode.set +local mget = lousy.mode.get +window.methods.is_mode = function (w, name) return name == mget(w) end + +-- Setup normal mode +new_mode("normal", [[When luakit first starts you will find yourself in this + mode.]], { + enter = function (w) + w:set_prompt() + w:set_input() + end, +}) + +new_mode("all", [[Special meta-mode in which the bindings for this mode are + present in all modes.]]) + +-- Setup insert mode +new_mode("insert", [[When clicking on form fields luakit will enter the insert + mode which allows you to enter text in form fields without accidentally + triggering normal mode bindings.]], { + enter = function (w) + w:set_prompt("-- INSERT --") + w:set_input() + w.view:focus() + end, + -- Send key events to webview + passthrough = true, +}) + +new_mode("passthrough", [[Luakit will pass every key event to the WebView + until the user presses Escape.]], { + enter = function (w) + w:set_prompt("-- PASS THROUGH --") + w:set_input() + end, + -- Send key events to webview + passthrough = true, + -- Don't exit mode when clicking outside of form fields + reset_on_focus = false, + -- Don't exit mode on navigation + reset_on_navigation = false, +}) + +-- Setup command mode +new_mode("command", [[Enter commands.]], { + enter = function (w) + w:set_prompt() + w:set_input(":") + end, + changed = function (w, text) + -- Auto-exit command mode if user backspaces ":" in the input bar. + if not string.match(text, "^:") then w:set_mode() end + end, + activate = function (w, text) + w:set_mode() + local cmd = string.sub(text, 2) + if not string.find(cmd, "%S") then return end + + local success, match = xpcall( + function () return w:match_cmd(cmd) end, + function (err) w:error(debug.traceback(err, 3)) end) + + if success and not match then + w:error(string.format("Not a browser command: %q", cmd)) + end + end, + history = {maxlen = 50}, +}) + +new_mode("lua", [[Execute arbitrary Lua commands within the luakit + environment.]], { + enter = function (w) + w:set_prompt(">") + w:set_input("") + end, + activate = function (w, text) + w:set_input("") + local ret = assert(loadstring("return function(w) return "..text.." end"))()(w) + if ret then print(ret) end + end, + history = {maxlen = 50}, +}) diff --git a/user-config-unused/luakit/.config/luakit/rc.lua b/user-config-unused/luakit/.config/luakit/rc.lua new file mode 100644 index 0000000..c03a6bd --- /dev/null +++ b/user-config-unused/luakit/.config/luakit/rc.lua @@ -0,0 +1,181 @@ +----------------------------------------------------------------------- +-- luakit configuration file, more information at http://luakit.org/ -- +----------------------------------------------------------------------- + +require "lfs" + +if unique then + unique.new("org.luakit") + -- Check for a running luakit instance + if unique.is_running() then + if uris[1] then + for _, uri in ipairs(uris) do + if lfs.attributes(uri) then uri = os.abspath(uri) end + unique.send_message("tabopen " .. uri) + end + else + unique.send_message("winopen") + end + luakit.quit() + end +end + +-- Load library of useful functions for luakit +require "lousy" + +-- Small util functions to print output (info prints only when luakit.verbose is true) +function warn(...) io.stderr:write(string.format(...) .. "\n") end +function info(...) if luakit.verbose then io.stdout:write(string.format(...) .. "\n") end end + +-- Load users global config +-- ("$XDG_CONFIG_HOME/luakit/globals.lua" or "/etc/xdg/luakit/globals.lua") +require "globals" + +-- Load users theme +-- ("$XDG_CONFIG_HOME/luakit/theme.lua" or "/etc/xdg/luakit/theme.lua") +lousy.theme.init(lousy.util.find_config("theme.lua")) +theme = assert(lousy.theme.get(), "failed to load theme") + +-- Load users window class +-- ("$XDG_CONFIG_HOME/luakit/window.lua" or "/etc/xdg/luakit/window.lua") +require "window" + +-- Load users webview class +-- ("$XDG_CONFIG_HOME/luakit/webview.lua" or "/etc/xdg/luakit/webview.lua") +require "webview" + +-- Load users mode configuration +-- ("$XDG_CONFIG_HOME/luakit/modes.lua" or "/etc/xdg/luakit/modes.lua") +require "modes" + +-- Load users keybindings +-- ("$XDG_CONFIG_HOME/luakit/binds.lua" or "/etc/xdg/luakit/binds.lua") +require "binds" + +---------------------------------- +-- Optional user script loading -- +---------------------------------- + +require "webinspector" + +-- Add sqlite3 cookiejar +require "cookies" + +-- Cookie blocking by domain (extends cookies module) +-- Add domains to the whitelist at "$XDG_CONFIG_HOME/luakit/cookie.whitelist" +-- and blacklist at "$XDG_CONFIG_HOME/luakit/cookie.blacklist". +-- Each domain must be on it's own line and you may use "*" as a +-- wildcard character (I.e. "*google.com") +--require "cookie_blocking" + +-- Block all cookies by default (unless whitelisted) +--cookies.default_allow = false + +-- Add uzbl-like form filling +require "formfiller" + +-- Add proxy support & manager +require "proxy" + +-- Add quickmarks support & manager +require "quickmarks" + +-- Add session saving/loading support +require "session" + +-- Add command to list closed tabs & bind to open closed tabs +require "undoclose" + +-- Add command to list tab history items +require "tabhistory" + +-- Add greasemonkey-like javascript userscript support +require "userscripts" + +-- Add bookmarks support +require "bookmarks" +require "bookmarks_chrome" + +-- Add download support +require "downloads" +require "downloads_chrome" + +-- Example using xdg-open for opening downloads / showing download folders +--downloads.add_signal("open-file", function (file, mime) +-- luakit.spawn(string.format("xdg-open %q", file)) +-- return true +--end) + +-- Add vimperator-like link hinting & following +require "follow" + +-- Use a custom charater set for hint labels +--local s = follow.label_styles +--follow.label_maker = s.sort(s.reverse(s.charset("asdfqwerzxcv"))) + +-- Match only hint labels +--follow.pattern_maker = follow.pattern_styles.match_label + +-- Add command history +require "cmdhist" + +-- Add search mode & binds +require "search" + +-- Add ordering of new tabs +require "taborder" + +-- Save web history +require "history" +require "history_chrome" + +require "introspector" + +-- Add command completion +require "completion" + +-- NoScript plugin, toggle scripts and or plugins on a per-domain basis. +-- `,ts` to toggle scripts, `,tp` to toggle plugins, `,tr` to reset. +-- Remove all "enable_scripts" & "enable_plugins" lines from your +-- domain_props table (in config/globals.lua) as this module will conflict. +--require "noscript" + +require "follow_selected" +require "go_input" +require "go_next_prev" +require "go_up" + +----------------------------- +-- End user script loading -- +----------------------------- + +-- Restore last saved session +local w = (session and session.restore()) +if w then + for i, uri in ipairs(uris) do + w:new_tab(uri, i == 1) + end +else + -- Or open new window + window.new(uris) +end + +------------------------------------------- +-- Open URIs from other luakit instances -- +------------------------------------------- + +if unique then + unique.add_signal("message", function (msg, screen) + local cmd, arg = string.match(msg, "^(%S+)%s*(.*)") + local w = lousy.util.table.values(window.bywidget)[1] + if cmd == "tabopen" then + w:new_tab(arg) + elseif cmd == "winopen" then + w = window.new((arg ~= "") and { arg } or {}) + end + w.win.screen = screen + w.win.urgency_hint = true + end) +end + +-- vim: et:sw=4:ts=8:sts=4:tw=80 diff --git a/user-config-unused/luakit/.config/luakit/theme.lua b/user-config-unused/luakit/.config/luakit/theme.lua new file mode 100644 index 0000000..6ac6c17 --- /dev/null +++ b/user-config-unused/luakit/.config/luakit/theme.lua @@ -0,0 +1,69 @@ +-------------------------- +-- Default luakit theme -- +-------------------------- + +local theme = {} + +-- Default settings +theme.font = "monospace normal 9" +theme.fg = "#fff" +theme.bg = "#000" + +-- Genaral colours +theme.success_fg = "#0f0" +theme.loaded_fg = "#33AADD" +theme.error_fg = "#FFF" +theme.error_bg = "#F00" + +-- Warning colours +theme.warning_fg = "#F00" +theme.warning_bg = "#FFF" + +-- Notification colours +theme.notif_fg = "#444" +theme.notif_bg = "#FFF" + +-- Menu colours +theme.menu_fg = "#000" +theme.menu_bg = "#fff" +theme.menu_selected_fg = "#000" +theme.menu_selected_bg = "#FF0" +theme.menu_title_bg = "#fff" +theme.menu_primary_title_fg = "#f00" +theme.menu_secondary_title_fg = "#666" + +-- Proxy manager +theme.proxy_active_menu_fg = '#000' +theme.proxy_active_menu_bg = '#FFF' +theme.proxy_inactive_menu_fg = '#888' +theme.proxy_inactive_menu_bg = '#FFF' + +-- Statusbar specific +theme.sbar_fg = "#fff" +theme.sbar_bg = "#000" + +-- Downloadbar specific +theme.dbar_fg = "#fff" +theme.dbar_bg = "#000" +theme.dbar_error_fg = "#F00" + +-- Input bar specific +theme.ibar_fg = "#000" +theme.ibar_bg = "#fff" + +-- Tab label +theme.tab_fg = "#888" +theme.tab_bg = "#222" +theme.tab_ntheme = "#ddd" +theme.selected_fg = "#fff" +theme.selected_bg = "#000" +theme.selected_ntheme = "#ddd" +theme.loading_fg = "#33AADD" +theme.loading_bg = "#000" + +-- Trusted/untrusted ssl colours +theme.trust_fg = "#0F0" +theme.notrust_fg = "#F00" + +return theme +-- vim: et:sw=4:ts=8:sts=4:tw=80 diff --git a/user-config-unused/luakit/.config/luakit/webview.lua b/user-config-unused/luakit/.config/luakit/webview.lua new file mode 100644 index 0000000..a7a7a59 --- /dev/null +++ b/user-config-unused/luakit/.config/luakit/webview.lua @@ -0,0 +1,350 @@ +-------------------------- +-- WebKit WebView class -- +-------------------------- + +-- Webview class table +webview = {} + +-- Table of functions which are called on new webview widgets. +webview.init_funcs = { + -- Set useragent + set_useragent = function (view, w) + view.user_agent = globals.useragent + end, + + -- Check if checking ssl certificates + checking_ssl = function (view, w) + local ca_file = soup.ssl_ca_file + if ca_file and os.exists(ca_file) then + w.checking_ssl = true + end + end, + + -- Update window and tab titles + title_update = function (view, w) + view:add_signal("property::title", function (v) + w:update_tablist() + if w.view == v then + w:update_win_title() + end + end) + end, + + -- Update uri label in statusbar + uri_update = function (view, w) + view:add_signal("property::uri", function (v) + w:update_tablist() + if w.view == v then + w:update_uri() + end + end) + end, + + -- Update history indicator + hist_update = function (view, w) + view:add_signal("load-status", function (v, status) + if w.view == v then + w:update_hist() + end + end) + end, + + -- Update tab titles + tablist_update = function (view, w) + view:add_signal("load-status", function (v, status) + if status == "provisional" or status == "finished" or status == "failed" then + w:update_tablist() + end + end) + end, + + -- Update scroll widget + scroll_update = function (view, w) + view:add_signal("expose", function (v) + if w.view == v then + w:update_scroll() + end + end) + end, + + -- Update progress widget + progress_update = function (view, w) + for _, sig in ipairs({"load-status", "property::progress"}) do + view:add_signal(sig, function (v) + if w.view == v then + w:update_progress() + w:update_ssl() + end + end) + end + end, + + -- Display hovered link in statusbar + link_hover_display = function (view, w) + view:add_signal("link-hover", function (v, link) + if w.view == v and link then + w:update_uri(link) + end + end) + view:add_signal("link-unhover", function (v) + if w.view == v then + w:update_uri() + end + end) + end, + + -- Clicking a form field automatically enters insert mode. + form_insert_mode = function (view, w) + view:add_signal("button-press", function (v, mods, button, context) + -- Clear start search marker + (w.search_state or {}).marker = nil + + if button == 1 and context.editable then + view:emit_signal("form-active") + end + end) + -- Emit root-active event in button release to prevent "missing" + -- buttons or links when the input bar hides. + view:add_signal("button-release", function (v, mods, button, context) + if button == 1 and not context.editable then + view:emit_signal("root-active") + end + end) + view:add_signal("form-active", function () + if not w.mode.passthrough then + w:set_mode("insert") + end + end) + view:add_signal("root-active", function () + if w.mode.reset_on_focus ~= false then + w:set_mode() + end + end) + end, + + -- Catch keys in non-passthrough modes + mode_key_filter = function (view, w) + view:add_signal("key-press", function () + if not w.mode.passthrough then + return true + end + end) + end, + + -- Try to match a button event to a users button binding else let the + -- press hit the webview. + button_bind_match = function (view, w) + view:add_signal("button-release", function (v, mods, button, context) + (w.search_state or {}).marker = nil + if w:hit(mods, button, { context = context }) then + return true + end + end) + end, + + -- Reset the mode on navigation + mode_reset_on_nav = function (view, w) + view:add_signal("load-status", function (v, status) + if status == "provisional" and w.view == v then + if w.mode.reset_on_navigation ~= false then + w:set_mode() + end + end + end) + end, + + -- Domain properties + domain_properties = function (view, w) + view:add_signal("load-status", function (v, status) + if status ~= "committed" or v.uri == "about:blank" then return end + -- Get domain + local domain = lousy.uri.parse(v.uri).host + -- Strip leading www. + domain = string.match(domain or "", "^www%.(.+)") or domain or "all" + -- Build list of domain props tables to join & load. + -- I.e. for luakit.org load .luakit.org, luakit.org, .org + local props = {domain_props.all or {}, domain_props[domain] or {}} + repeat + table.insert(props, 2, domain_props["."..domain] or {}) + domain = string.match(domain, "%.(.+)") + until not domain + -- Join all property tables + for k, v in pairs(lousy.util.table.join(unpack(props))) do + info("Domain prop: %s = %s (%s)", k, tostring(v), domain) + view[k] = v + end + end) + end, + + -- Action to take on mime type decision request. + mime_decision = function (view, w) + -- Return true to accept or false to reject from this signal. + view:add_signal("mime-type-decision", function (v, uri, mime) + info("Requested link: %s (%s)", uri, mime) + -- i.e. block binary files like *.exe + --if mime == "application/octet-stream" then + -- return false + --end + end) + end, + + -- Action to take on window open request. + --window_decision = function (view, w) + -- view:add_signal("new-window-decision", function (v, uri, reason) + -- if reason == "link-clicked" then + -- window.new({uri}) + -- else + -- w:new_tab(uri) + -- end + -- return true + -- end) + --end, + + create_webview = function (view, w) + -- Return a newly created webview in a new tab + view:add_signal("create-web-view", function (v) + return w:new_tab() + end) + end, + + -- Creates context menu popup from table (and nested tables). + -- Use `true` for menu separators. + --populate_popup = function (view, w) + -- view:add_signal("populate-popup", function (v) + -- return { + -- true, + -- { "_Toggle Source", function () w:toggle_source() end }, + -- { "_Zoom", { + -- { "Zoom _In", function () w:zoom_in() end }, + -- { "Zoom _Out", function () w:zoom_out() end }, + -- true, + -- { "Zoom _Reset", function () w:zoom_set() end }, }, }, + -- } + -- end) + --end, + + -- Action to take on resource request. + resource_request_decision = function (view, w) + view:add_signal("resource-request-starting", function(v, uri) + info("Requesting: %s", uri) + -- Return false to cancel the request. + end) + end, +} + +-- These methods are present when you index a window instance and no window +-- method is found in `window.methods`. The window then checks if there is an +-- active webview and calls the following methods with the given view instance +-- as the first argument. All methods must take `view` & `w` as the first two +-- arguments. +webview.methods = { + -- Reload with or without ignoring cache + reload = function (view, w, bypass_cache) + if bypass_cache then + view:reload_bypass_cache() + else + view:reload() + end + end, + + -- Toggle source view + toggle_source = function (view, w, show) + if show == nil then + view.view_source = not view.view_source + else + view.view_source = show + end + view:reload() + end, + + -- Zoom functions + zoom_in = function (view, w, step, full_zoom) + view.full_content_zoom = not not full_zoom + step = step or globals.zoom_step or 0.1 + view.zoom_level = view.zoom_level + step + end, + + zoom_out = function (view, w, step, full_zoom) + view.full_content_zoom = not not full_zoom + step = step or globals.zoom_step or 0.1 + view.zoom_level = math.max(0.01, view.zoom_level) - step + end, + + zoom_set = function (view, w, level, full_zoom) + view.full_content_zoom = not not full_zoom + view.zoom_level = level or 1.0 + end, + + -- History traversing functions + back = function (view, w, n) + view:go_back(n or 1) + end, + + forward = function (view, w, n) + view:go_forward(n or 1) + end, +} + +function webview.methods.scroll(view, w, new) + local s = view.scroll + for _, axis in ipairs{ "x", "y" } do + -- Relative px movement + if rawget(new, axis.."rel") then + s[axis] = s[axis] + new[axis.."rel"] + + -- Relative page movement + elseif rawget(new, axis .. "pagerel") then + s[axis] = s[axis] + math.ceil(s[axis.."page_size"] * new[axis.."pagerel"]) + + -- Absolute px movement + elseif rawget(new, axis) then + local n = new[axis] + if n == -1 then + s[axis] = s[axis.."max"] + else + s[axis] = n + end + + -- Absolute page movement + elseif rawget(new, axis.."page") then + s[axis] = math.ceil(s[axis.."page_size"] * new[axis.."page"]) + + -- Absolute percent movement + elseif rawget(new, axis .. "pct") then + s[axis] = math.ceil(s[axis.."max"] * (new[axis.."pct"]/100)) + end + end +end + +function webview.new(w) + local view = widget{type = "webview"} + + view.show_scrollbars = false + view.enforce_96_dpi = false + + -- Call webview init functions + for k, func in pairs(webview.init_funcs) do + func(view, w) + end + return view +end + +-- Insert webview method lookup on window structure +table.insert(window.indexes, 1, function (w, k) + if k == "view" then + local view = w.tabs[w.tabs:current()] + if view and type(view) == "widget" and view.type == "webview" then + w.view = view + return view + end + end + -- Lookup webview method + local func = webview.methods[k] + if not func then return end + local view = w.view + if view then + return function (_, ...) return func(view, w, ...) end + end +end) + +-- vim: et:sw=4:ts=8:sts=4:tw=80 diff --git a/user-config-unused/luakit/.config/luakit/window.lua b/user-config-unused/luakit/.config/luakit/window.lua new file mode 100644 index 0000000..5e921d6 --- /dev/null +++ b/user-config-unused/luakit/.config/luakit/window.lua @@ -0,0 +1,859 @@ +------------------ +-- Window class -- +------------------ + +require "lfs" + +-- Window class table +window = {} + +-- List of active windows by window widget +window.bywidget = setmetatable({}, { __mode = "k" }) + +-- Widget construction aliases +local function entry() return widget{type="entry"} end +local function eventbox() return widget{type="eventbox"} end +local function hbox() return widget{type="hbox"} end +local function label() return widget{type="label"} end +local function notebook() return widget{type="notebook"} end +local function vbox() return widget{type="vbox"} end + +-- Build and pack window widgets +function window.build() + -- Create a table for widgets and state variables for a window + local w = { + win = widget{type="window"}, + ebox = eventbox(), + layout = vbox(), + paned = widget{type="vpaned"}, + tabs = notebook(), + -- Tablist widget + tablist = lousy.widget.tablist(), + -- Status bar widgets + sbar = { + layout = hbox(), + ebox = eventbox(), + -- Left aligned widgets + l = { + layout = hbox(), + ebox = eventbox(), + uri = label(), + hist = label(), + loaded = label(), + }, + -- Fills space between the left and right aligned widgets + sep = eventbox(), + -- Right aligned widgets + r = { + layout = hbox(), + ebox = eventbox(), + buf = label(), + ssl = label(), + tabi = label(), + scroll = label(), + }, + }, + + -- Vertical menu window widget (completion results, bookmarks, qmarks, ..) + menu = lousy.widget.menu(), + + -- Input bar widgets + ibar = { + layout = hbox(), + ebox = eventbox(), + prompt = label(), + input = entry(), + }, + closed_tabs = {} + } + + -- Assemble window + w.ebox.child = w.paned + w.paned:pack1(w.layout) + w.win.child = w.ebox + + -- Pack tablist + w.layout:pack(w.tablist.widget) + + -- Pack notebook + w.layout:pack(w.tabs, { expand = true, fill = true }) + + -- Pack left-aligned statusbar elements + local l = w.sbar.l + l.layout:pack(l.uri) + l.layout:pack(l.hist) + l.layout:pack(l.loaded) + l.ebox.child = l.layout + + -- Pack right-aligned statusbar elements + local r = w.sbar.r + r.layout:pack(r.buf) + r.layout:pack(r.ssl) + r.layout:pack(r.tabi) + r.layout:pack(r.scroll) + r.ebox.child = r.layout + + -- Pack status bar elements + local s = w.sbar + s.layout:pack(l.ebox) + s.layout:pack(s.sep, { expand = true, fill = true }) + s.layout:pack(r.ebox) + s.ebox.child = s.layout + w.layout:pack(s.ebox) + + -- Pack menu widget + w.layout:pack(w.menu.widget) + w.menu:hide() + + -- Pack input bar + local i = w.ibar + i.layout:pack(i.prompt) + i.layout:pack(i.input, { expand = true, fill = true }) + i.ebox.child = i.layout + w.layout:pack(i.ebox) + + -- Other settings + i.input.show_frame = false + w.tabs.show_tabs = false + l.loaded:hide() + l.hist:hide() + l.uri.selectable = true + r.ssl:hide() + + -- Allows indexing of window struct by window widget + window.bywidget[w.win] = w + + return w +end + +-- Table of functions to call on window creation. Normally used to add signal +-- handlers to the new windows widgets. +window.init_funcs = { + -- Attach notebook widget signals + notebook_signals = function (w) + w.tabs:add_signal("page-added", function (nbook, view, idx) + luakit.idle_add(function () + w:update_tab_count() + w:update_tablist() + return false + end) + end) + w.tabs:add_signal("switch-page", function (nbook, view, idx) + w.view = nil + w:set_mode() + -- Update widgets after tab switch + luakit.idle_add(function () + w:update_tab_count() + w:update_win_title() + w:update_uri() + w:update_progress() + w:update_tablist() + w:update_buf() + w:update_ssl() + w:update_hist() + return false + end) + end) + w.tabs:add_signal("page-reordered", function (nbook, view, idx) + w:update_tab_count() + w:update_tablist() + end) + end, + + last_win_check = function (w) + w.win:add_signal("destroy", function () + -- call the quit function if this was the last window left + if #luakit.windows == 0 then luakit.quit() end + if w.close_win then w:close_win() end + end) + end, + + key_press_match = function (w) + w.win:add_signal("key-press", function (_, mods, key) + -- Match & exec a bind + local success, match = xpcall( + function () return w:hit(mods, key) end, + function (err) w:error(debug.traceback(err, 3)) end) + + if success and match then + return true + end + end) + end, + + tablist_tab_click = function (w) + w.tablist:add_signal("tab-clicked", function (_, index, mods, button) + if button == 1 then + w.tabs:switch(index) + return true + elseif button == 2 then + w:close_tab(w.tabs[index]) + return true + end + end) + end, + + apply_window_theme = function (w) + local s, i = w.sbar, w.ibar + + -- Set foregrounds + for wi, v in pairs({ + [s.l.uri] = theme.uri_sbar_fg, + [s.l.hist] = theme.hist_sbar_fg, + [s.l.loaded] = theme.sbar_loaded_fg, + [s.r.buf] = theme.buf_sbar_fg, + [s.r.tabi] = theme.tabi_sbar_fg, + [s.r.scroll] = theme.scroll_sbar_fg, + [i.prompt] = theme.prompt_ibar_fg, + [i.input] = theme.input_ibar_fg, + }) do wi.fg = v end + + -- Set backgrounds + for wi, v in pairs({ + [s.l.ebox] = theme.sbar_bg, + [s.r.ebox] = theme.sbar_bg, + [s.sep] = theme.sbar_bg, + [s.ebox] = theme.sbar_bg, + [i.ebox] = theme.ibar_bg, + [i.input] = theme.input_ibar_bg, + }) do wi.bg = v end + + -- Set fonts + for wi, v in pairs({ + [s.l.uri] = theme.uri_sbar_font, + [s.l.hist] = theme.hist_sbar_font, + [s.l.loaded] = theme.sbar_loaded_font, + [s.r.buf] = theme.buf_sbar_font, + [s.r.ssl] = theme.ssl_sbar_font, + [s.r.tabi] = theme.tabi_sbar_font, + [s.r.scroll] = theme.scroll_sbar_font, + [i.prompt] = theme.prompt_ibar_font, + [i.input] = theme.input_ibar_font, + }) do wi.font = v end + end, + + set_default_size = function (w) + local size = globals.default_window_size or "800x600" + if string.match(size, "^%d+x%d+$") then + w.win:set_default_size(string.match(size, "^(%d+)x(%d+)$")) + else + warn("E: window.lua: invalid window size: %q", size) + end + end, + + set_window_icon = function (w) + local path = (luakit.dev_paths and os.exists("./extras/luakit.png")) or + os.exists("/usr/share/pixmaps/luakit.png") + if path then w.win.icon = path end + end, + + clear_urgency_hint = function (w) + w.win:add_signal("focus", function () + w.win.urgency_hint = false + end) + end, +} + +-- Helper functions which operate on the window widgets or structure. +window.methods = { + -- Wrapper around the bind plugin's hit method + hit = function (w, mods, key, opts) + local opts = lousy.util.table.join(opts or {}, { + enable_buffer = w:is_mode("normal"), + buffer = w.buffer, + }) + + local caught, newbuf = lousy.bind.hit(w, w.binds, mods, key, opts) + if w.win then -- Check binding didn't cause window to exit + w.buffer = newbuf + w:update_buf() + end + return caught + end, + + -- Wrapper around the bind plugin's match_cmd method + match_cmd = function (w, buffer) + return lousy.bind.match_cmd(w, get_mode("command").binds, buffer) + end, + + -- enter command or characters into command line + enter_cmd = function (w, cmd, opts) + w:set_mode("command") + w:set_input(cmd, opts) + end, + + -- run command as if typed into the command line + run_cmd = function (w, cmd, opts) + w:enter_cmd(cmd, opts) + w:activate() + end, + + -- insert a string into the command line at the current cursor position + insert_cmd = function (w, str) + if not str then return end + local i = w.ibar.input + local text = i.text + local pos = i.position + local left, right = string.sub(text, 1, pos), string.sub(text, pos+1) + i.text = left .. str .. right + i.position = pos + #str + end, + + -- Emulates pressing the Return key in input field + activate = function (w) + w.ibar.input:emit_signal("activate") + end, + + del_word = function (w) + local i = w.ibar.input + local text = i.text + local pos = i.position + if text and #text > 1 and pos > 1 then + local left, right = string.sub(text, 2, pos), string.sub(text, pos+1) + if not string.find(left, "%s") then + left = "" + elseif string.find(left, "%w+%s*$") then + left = string.sub(left, 0, string.find(left, "%w+%s*$") - 1) + elseif string.find(left, "%W+%s*$") then + left = string.sub(left, 0, string.find(left, "%W+%s*$") - 1) + end + i.text = string.sub(text, 1, 1) .. left .. right + i.position = #left + 1 + end + end, + + del_line = function (w) + local i = w.ibar.input + if not string.match(i.text, "^[:/?]$") then + i.text = string.sub(i.text, 1, 1) + i.position = -1 + end + end, + + del_backward_char = function (w) + local i = w.ibar.input + local text = i.text + local pos = i.position + + if pos > 1 then + i.text = string.sub(text, 0, pos - 1) .. string.sub(text, pos + 1) + i.position = pos - 1 + end + end, + + del_forward_char = function (w) + local i = w.ibar.input + local text = i.text + local pos = i.position + + i.text = string.sub(text, 0, pos) .. string.sub(text, pos + 2) + i.position = pos + end, + + beg_line = function (w) + local i = w.ibar.input + i.position = 1 + end, + + end_line = function (w) + local i = w.ibar.input + i.position = -1 + end, + + forward_char = function (w) + local i = w.ibar.input + i.position = i.position + 1 + end, + + backward_char = function (w) + local i = w.ibar.input + local pos = i.position + if pos > 1 then + i.position = pos - 1 + end + end, + + forward_word = function (w) + local i = w.ibar.input + local text = i.text + local pos = i.position + if text and #text > 1 then + local right = string.sub(text, pos+1) + if string.find(right, "%w+") then + local _, move = string.find(right, "%w+") + i.position = pos + move + end + end + end, + + backward_word = function (w) + local i = w.ibar.input + local text = i.text + local pos = i.position + if text and #text > 1 and pos > 1 then + local left = string.reverse(string.sub(text, 2, pos)) + if string.find(left, "%w+") then + local _, move = string.find(left, "%w+") + i.position = pos - move + end + end + end, + + -- Shows a notification until the next keypress of the user. + notify = function (w, msg, set_mode) + if set_mode ~= false then w:set_mode() end + w:set_prompt(msg, { fg = theme.notif_fg, bg = theme.notif_bg }) + end, + + warning = function (w, msg, set_mode) + if set_mode ~= false then w:set_mode() end + w:set_prompt(msg, { fg = theme.warning_fg, bg = theme.warning_bg }) + end, + + error = function (w, msg, set_mode) + if set_mode ~= false then w:set_mode() end + w:set_prompt("Error: "..msg, { fg = theme.error_fg, bg = theme.error_bg }) + end, + + -- Set and display the prompt + set_prompt = function (w, text, opts) + local prompt, ebox, opts = w.ibar.prompt, w.ibar.ebox, opts or {} + prompt:hide() + -- Set theme + fg, bg = opts.fg or theme.ibar_fg, opts.bg or theme.ibar_bg + if prompt.fg ~= fg then prompt.fg = fg end + if ebox.bg ~= bg then ebox.bg = bg end + -- Set text or remain hidden + if text then + prompt.text = lousy.util.escape(text) + prompt:show() + end + end, + + -- Set display and focus the input bar + set_input = function (w, text, opts) + local input, opts = w.ibar.input, opts or {} + input:hide() + -- Set theme + fg, bg = opts.fg or theme.ibar_fg, opts.bg or theme.ibar_bg + if input.fg ~= fg then input.fg = fg end + if input.bg ~= bg then input.bg = bg end + -- Set text or remain hidden + if text then + input.text = "" + input:show() + input:focus() + input.text = text + input.position = opts.pos or -1 + end + end, + + -- GUI content update functions + update_tab_count = function (w) + w.sbar.r.tabi.text = string.format("[%d/%d]", w.tabs:current(), w.tabs:count()) + end, + + update_win_title = function (w) + local uri, title = w.view.uri, w.view.title + title = (title or "luakit") .. ((uri and " - " .. uri) or "") + local max = globals.max_title_len or 80 + if #title > max then title = string.sub(title, 1, max) .. "..." end + w.win.title = title + end, + + update_uri = function (w, link) + w.sbar.l.uri.text = lousy.util.escape((link and "Link: " .. link) + or (w.view and w.view.uri) or "about:blank") + end, + + update_progress = function (w) + local p = w.view.progress + local loaded = w.sbar.l.loaded + if not w.view:loading() or p == 1 then + loaded:hide() + else + loaded:show() + loaded.text = string.format("(%d%%)", p * 100) + end + end, + + update_scroll = function (w) + local scroll, label = w.view.scroll, w.sbar.r.scroll + local y, max, text = scroll.y, scroll.ymax + if max == 0 then text = "All" + elseif y == 0 then text = "Top" + elseif y == max then text = "Bot" + else text = string.format("%2d%%", (y / max) * 100) + end + if label.text ~= text then label.text = text end + end, + + update_ssl = function (w) + local trusted = w.view:ssl_trusted() + local ssl = w.sbar.r.ssl + if trusted ~= nil and not w.checking_ssl then + ssl.fg = theme.notrust_fg + ssl.text = "(nocheck)" + ssl:show() + elseif trusted == true then + ssl.fg = theme.trust_fg + ssl.text = "(trust)" + ssl:show() + elseif trusted == false then + ssl.fg = theme.notrust_fg + ssl.text = "(notrust)" + ssl:show() + else + ssl:hide() + end + end, + + update_hist = function (w) + local hist = w.sbar.l.hist + local back, forward = w.view:can_go_back(), w.view:can_go_forward() + local s = (back and "+" or "") .. (forward and "-" or "") + if s ~= "" then + hist.text = '['..s..']' + hist:show() + else + hist:hide() + end + end, + + update_buf = function (w) + local buf = w.sbar.r.buf + if w.buffer then + buf.text = lousy.util.escape(string.format(" %-3s", w.buffer)) + buf:show() + else + buf:hide() + end + end, + + update_binds = function (w, mode) + -- Generate the list of active key & buffer binds for this mode + w.binds = lousy.util.table.join((get_mode(mode) or {}).binds or {}, get_mode('all').binds or {}) + -- Clear & hide buffer + w.buffer = nil + w:update_buf() + end, + + update_tablist = function (w) + local current = w.tabs:current() + local fg, bg, nfg, snfg = theme.tab_fg, theme.tab_bg, theme.tab_ntheme, theme.selected_ntheme + local lfg, bfg, gfg = theme.tab_loading_fg, theme.tab_notrust_fg, theme.tab_trust_fg + local escape = lousy.util.escape + local tabs, tfmt = {}, ' %s %s' + + for i, view in ipairs(w.tabs.children) do + -- Get tab number theme + local ntheme = nfg + if view:loading() then -- Show loading on all tabs + ntheme = lfg + elseif current == i then -- Show ssl trusted/untrusted on current tab + local trusted = view:ssl_trusted() + ntheme = snfg + if trusted == false or (trusted ~= nil and not w.checking_ssl) then + ntheme = bfg + elseif trusted then + ntheme = gfg + end + end + local title = view.title or view.uri or "(Untitled)" + tabs[i] = { + title = string.format(tfmt, ntheme or fg, i, escape(title)), + fg = (current == i and theme.tab_selected_fg) or fg, + bg = (current == i and theme.tab_selected_bg) or bg, + } + end + + if #tabs < 2 then tabs, current = {}, 0 end + w.tablist:update(tabs, current) + end, + + new_tab = function (w, arg, switch, order) + local view + -- Use blank tab first + if w.has_blank and w.tabs:count() == 1 and w.tabs[1].uri == "about:blank" then + view = w.tabs[1] + end + w.has_blank = nil + -- Make new webview widget + if not view then + view = webview.new(w) + -- Get tab order function + if not order and taborder then + order = (switch == false and taborder.default_bg) + or taborder.default + end + pos = w.tabs:insert((order and order(w, view)) or -1, view) + if switch ~= false then w.tabs:switch(pos) end + end + -- Load uri or webview history table + if type(arg) == "string" then view.uri = arg + elseif type(arg) == "table" then view.history = arg end + -- Update statusbar widgets + w:update_tab_count() + w:update_tablist() + return view + end, + + -- close the current tab + close_tab = function (w, view, blank_last) + view = view or w.view + -- Treat a blank last tab as an empty notebook (if blank_last=true) + if blank_last ~= false and w.tabs:count() == 1 then + if not view:loading() and view.uri == "about:blank" then return end + w:new_tab("about:blank", false) + w.has_blank = true + end + -- Save tab history + local tab = {hist = view.history,} + -- And relative location + local index = w.tabs:indexof(view) + if index ~= 1 then tab.after = w.tabs[index-1] end + table.insert(w.closed_tabs, tab) + view:destroy() + w:update_tab_count() + w:update_tablist() + end, + + close_win = function (w, force) + -- Ask plugins if it's OK to close last window + if not force and (#luakit.windows == 1) then + local emsg = luakit.emit_signal("can-close", w) + if emsg then + assert(type(emsg) == "string", "invalid exit error message") + w:error(string.format("Can't close luakit: %s (force close " + .. "with :q! or :wq!)", emsg)) + return false + end + end + + w:emit_signal("close") + + -- Close all tabs + while w.tabs:count() ~= 0 do + w:close_tab(nil, false) + end + + -- Destroy tablist + w.tablist:destroy() + + -- Remove from window index + window.bywidget[w.win] = nil + + -- Clear window struct + w = setmetatable(w, {}) + + -- Recursively remove widgets from window + local children = lousy.util.recursive_remove(w.win) + -- Destroy all widgets + for i, c in ipairs(lousy.util.table.join(children, {w.win})) do + if c.hide then c:hide() end + c:destroy() + end + + -- Remove all window table vars + for k, _ in pairs(w) do w[k] = nil end + + -- Quit if closed last window + if #luakit.windows == 0 then luakit.quit() end + end, + + -- Navigate current view or open new tab + navigate = function (w, uri, view) + view = view or w.view + if view then + local js = string.match(uri, "^javascript:(.+)$") + if js then + return view:eval_js(luakit.uri_decode(js)) + end + view.uri = uri + else + return w:new_tab(uri) + end + end, + + -- Save, restart luakit and reload session. + restart = function (w) + -- Generate luakit launch command. + local args = {({string.gsub(luakit.execpath, " ", "\\ ")})[1]} + if luakit.verbose then table.insert(args, "-v") end + -- Relaunch without libunique bindings? + if luakit.nounique then table.insert(args, "-U") end + + -- Get new config path + local conf + if luakit.confpath ~= "/etc/xdg/luakit/rc.lua" and os.exists(luakit.confpath) then + conf = luakit.confpath + table.insert(args, string.format("-c %q", conf)) + end + + -- Check config has valid syntax + local cmd = table.concat(args, " ") + if luakit.spawn_sync(cmd .. " -k") ~= 0 then + return w:error("Cannot restart, syntax error in configuration file"..((conf and ": "..conf) or ".")) + end + + -- Save session. + local wins = {} + for _, w in pairs(window.bywidget) do table.insert(wins, w) end + session.save(wins) + + -- Replace current process with new luakit instance. + luakit.exec(cmd) + end, + + -- Intelligent open command which can detect a uri or search argument. + search_open = function (w, arg) + local lstring = lousy.util.string + local match, find = string.match, string.find + + -- Detect blank uris + if not arg or match(arg, "^%s*$") then return "about:blank" end + + -- Strip whitespace and split by whitespace into args table + local args = lstring.split(lstring.strip(arg)) + + -- Guess if first argument is an address, search engine, file + if #args == 1 then + local uri = args[1] + if uri == "about:blank" then return uri end + + -- Check if search engine name + if search_engines[uri] then + return string.format(search_engines[uri], "") + end + + -- Navigate if . or / in uri (I.e. domains, IP's, scheme://) + if find(uri, "%.") or find(uri, "/") then return uri end + + -- Navigate if this is a javascript-uri + if find(uri, "^javascript:") then return uri end + + -- Valid hostnames to check + local hosts = { "localhost" } + if globals.load_etc_hosts ~= false then + hosts = lousy.util.get_etc_hosts() + end + + -- Check hostnames + for _, h in pairs(hosts) do + if h == uri or match(uri, "^"..h..":%d+$") then return uri end + end + + -- Check for file in filesystem + if globals.check_filepath ~= false then + if lfs.attributes(uri) then return "file://" .. uri end + end + end + + -- Find search engine (or use search_engines.default) + local engine = "default" + if args[1] and search_engines[args[1]] then + engine = args[1] + table.remove(args, 1) + end + + -- URI encode search terms + local terms = luakit.uri_encode(table.concat(args, " ")) + return string.format(search_engines[engine], terms) + end, + + -- Increase (or decrease) the last found number in the current uri + inc_uri = function (w, arg) + local uri = string.gsub(w.view.uri, "(%d+)([^0-9]*)$", function (num, rest) + return string.format("%0"..#num.."d", tonumber(num) + (arg or 1)) .. rest + end) + return uri + end, + + -- Tab traversing functions + next_tab = function (w, n) + w.tabs:switch((((n or 1) + w.tabs:current() -1) % w.tabs:count()) + 1) + end, + + prev_tab = function (w, n) + w.tabs:switch(((w.tabs:current() - (n or 1) -1) % w.tabs:count()) + 1) + end, + + goto_tab = function (w, n) + if n and (n == -1 or n > 0) then + return w.tabs:switch((n <= w.tabs:count() and n) or -1) + end + end, + + -- For each tab, switches to that tab and calls the given function passing + -- it the view contained in the tab. + each_tab = function (w, fn) + for index = 1, w.tabs:count() do + w:goto_tab(index) + fn(w.tabs[index]) + end + end, + + -- If argument is form-active or root-active, emits signal. Ignores all + -- other signals. + emit_form_root_active_signal = function (w, s) + if s == "form-active" then + w.view:emit_signal("form-active") + elseif s == "root-active" then + w.view:emit_signal("root-active") + end + end, +} + +-- Ordered list of class index functions. Other classes (E.g. webview) are able +-- to add their own index functions to this list. +window.indexes = { + -- Find function in window.methods first + function (w, k) return window.methods[k] end +} + +-- Create new window +function window.new(uris) + local w = window.build() + + -- Set window metatable + setmetatable(w, { + __index = function (_, k) + -- Check widget structure first + local v = rawget(w, k) + if v then return v end + -- Call each window index function + for _, index in ipairs(window.indexes) do + v = index(w, k) + if v then return v end + end + end, + }) + + -- Setup window widget for signals + lousy.signal.setup(w) + + -- Call window init functions + for _, func in pairs(window.init_funcs) do + func(w) + end + + -- Populate notebook with tabs + for _, uri in ipairs(uris or {}) do + w:new_tab(w:search_open(uri), false) + end + + -- Make sure something is loaded + if w.tabs:count() == 0 then + w:new_tab(w:search_open(globals.homepage), false) + end + + -- Set initial mode + w:set_mode() + + -- Show window + w.win:show() + + return w +end + +-- vim: et:sw=4:ts=8:sts=4:tw=80 diff --git a/user-config-unused/mc/.config/mc/edit.indent.rc b/user-config-unused/mc/.config/mc/edit.indent.rc new file mode 100755 index 0000000..92f82d5 --- /dev/null +++ b/user-config-unused/mc/.config/mc/edit.indent.rc @@ -0,0 +1,31 @@ +#! /bin/sh +# *** External Formatter (Indenter) for GNU Midnight Commander. +# arguments: +# $1 - Name of the file being edited +# $2 - Name of the file to be processed + +exec >/dev/null + +case `echo $1 |sed 's/^.*\.//'` in + c|h) + # ftp://ftp.gnu.org/pub/gnu/indent/ + # Please add options to your ~/.indent.pro, not here. + indent "$2" + ;; + C|cc|CC|cxx|CXX|cpp|CPP) + # http://astyle.sourceforge.net/ + astyle "$2" + ;; + java|JAVA) + # http://astyle.sourceforge.net/ + astyle --style=java --mode=java "$2" + ;; + htm|html|HTM|HTML) + # http://tidy.sourceforge.net/ + tidy -q -m -ascii -wrap 80 "$2" + ;; + *) + # http://www.gnu.org/software/coreutils/ + fmt "$2" >"$2.tmp" && rm -f "$2" && mv -f "$2.tmp" "$2" + ;; +esac diff --git a/user-config-unused/mc/.config/mc/filehighlight.ini b/user-config-unused/mc/.config/mc/filehighlight.ini new file mode 100644 index 0000000..8bc1722 --- /dev/null +++ b/user-config-unused/mc/.config/mc/filehighlight.ini @@ -0,0 +1,47 @@ +[executable] + type=FILE_EXE + +[directory] + type=DIR + +[device] + type=DEVICE + +[special] + type=SPECIAL + +[stalelink] + type=STALE_LINK + +[symlink] + type=SYMLINK + +[hardlink] + type=HARDLINK + +[core] + regexp=^core\\.*\\d*$ + +[temp] + extensions=tmp;$$$;~;bak + extensions_case=false + regexp=(^#.*|.*~$) + +[archive] + extensions=gz;bz2;tar;tgz;rpm;Z;rar;zip;arj;cab;lzh;lha;zoo;arc;ark;xz;tbz;tbz2;7z;ace + +[doc] + extensions=txt;doc;rtf;diz;ctl;me;ps;pdf;xml;xsd;xslt;dtd;html;shtml;htm;mail;msg;lsm;po;nroff;man;tex;sgml;css;text;letter;chm;docx;docm;xlsx;xlsm;pptx;pptm + +[source] + extensions=c;h;cc;hh;cpp;cxx;hpp;asm;py;pl;pm;inc;cgi;php;phps;js;java;jav;jasm;sh;bash;diff;patch;pas;tcl;tk;awk;m4;st;mak;sl;ada;caml;ml;mli;mly;mll;mlp;sas;prg;hs;hi;erl + +[media] + extensions=mp2;mp3;mpg;ogg;ogv;mpeg;wav;avi;asf;mov;mol;mpl;xm;mod;it;med;mid;midi;s3m;umx;vob;mkv;flv;mp4;m3u;flac;ape;wma;wmv;3gp;webm + +[graph] + extensions=jpg;jpeg;gif;png;tif;pcx;bmp;xpm;xbm;eps;pic;rle;ico;wmf;omf;ai;cdr + +[database] + extensions=dbf;mdn;db;mdb;dat;fox;dbx;mdx;sql;mssql;msql;ssql;pgsql;xls;cdx;dbi + diff --git a/user-config-unused/mc/.config/mc/hotlist b/user-config-unused/mc/.config/mc/hotlist new file mode 100644 index 0000000..d3935e1 --- /dev/null +++ b/user-config-unused/mc/.config/mc/hotlist @@ -0,0 +1,14 @@ +ENTRY "~/" URL "/home/collin" +ENTRY "/media" URL "/media" +ENTRY "/media/dm" URL "/media/dm" +ENTRY "/media/dm/Downloads" URL "/media/dm/Downloads" +ENTRY "/home/collin/.code" URL "/home/collin/.code" +ENTRY "/home/collin/.scratch" URL "/home/collin/.scratch" +GROUP "Network" + ENTRY "/sh://omicron/home/collin" URL "/sh://omicron/home/collin" + ENTRY "/sftp://rekah742@64.34.157.170:22/home/rekah742" URL "/sftp://rekah742@64.34.157.170:22/home/rekah742" + GROUP "Local Network" + ENTRY "sh:alpha/~" URL "/home/collin/#sh:alpha/~" + ENTRY "/ftp://rekah742@ftp.rekahsoft.ca/" URL "/ftp://rekah742@ftp.rekahsoft.ca/" + ENDGROUP +ENDGROUP diff --git a/user-config-unused/mc/.config/mc/ini b/user-config-unused/mc/.config/mc/ini new file mode 100644 index 0000000..50a289a --- /dev/null +++ b/user-config-unused/mc/.config/mc/ini @@ -0,0 +1,212 @@ + +[Midnight-Commander] +verbose=true +pause_after_run=1 +shell_patterns=true +auto_save_setup=true +auto_menu=false +use_internal_view=false +use_internal_edit=false +clear_before_exec=true +confirm_delete=true +confirm_overwrite=true +confirm_execute=false +confirm_history_cleanup=true +confirm_exit=true +confirm_directory_hotlist_delete=true +safe_delete=true +mouse_repeat_rate=100 +double_click_speed=250 +use_8th_bit_as_meta=false +confirm_view_dir=false +mouse_move_pages_viewer=true +mouse_close_dialog=false +fast_refresh=false +drop_menus=false +wrap_mode=true +old_esc_mode=true +old_esc_mode_timeout=1000000 +cd_symlinks=true +show_all_if_ambiguous=false +max_dirt_limit=10 +torben_fj_mode=0 +use_file_to_guess_type=true +alternate_plus_minus=false +only_leading_plus_minus=true +show_output_starts_shell=false +xtree_mode=false +num_history_items_recorded=60 +file_op_compute_totals=true +classic_progressbar=true +vfs_timeout=60 +ftpfs_directory_timeout=900 +use_netrc=true +ftpfs_retry_seconds=30 +ftpfs_always_use_proxy=false +ftpfs_use_passive_connections=true +ftpfs_use_passive_connections_over_proxy=false +ftpfs_use_unix_list_options=true +ftpfs_first_cd_then_ls=true +fish_directory_timeout=900 +editor_tab_spacing=8 +editor_word_wrap_line_length=72 +editor_fill_tabs_with_spaces=false +editor_return_does_auto_indent=true +editor_backspace_through_tabs=false +editor_fake_half_tabs=true +editor_option_save_mode=0 +editor_option_save_position=true +editor_option_auto_para_formatting=false +editor_option_typewriter_wrap=false +editor_edit_confirm_save=true +editor_syntax_highlighting=true +editor_persistent_selections=true +editor_cursor_beyond_eol=false +editor_visible_tabs=true +editor_visible_spaces=true +editor_line_state=false +editor_simple_statusbar=false +editor_check_new_line=false +editor_show_right_margin=false +nice_rotating_dash=true +mcview_remember_file_position=false +auto_fill_mkdir_name=true +copymove_persistent_attr=true +select_flags=6 +editor_backup_extension=~ +mcview_eof= +kilobyte_si=0 +mix_all_files=0 +show_backups=1 +show_dot_files=1 +fast_reload=0 +fast_reload_msg_shown=0 +mark_moves_down=1 +reverse_files_only=1 +navigate_with_arrows=0 +scroll_pages=1 +mouse_move_pages=1 +filetype_mode=1 +permission_mode=0 +quick_search_case_sensitive=2 +ignore_ftp_chattr_errors=true +keymap=mc.keymap +skin=gotar-mod + +filepos_max_saved_entries=1024 + +preallocate_space=false +editor_cursor_after_inserted_block=false +editor_group_undo=false + +editor_ask_filename_before_edit=false + +editor_filesize_threshold=64M + +editor_drop_selection_on_copy=true +editor_stop_format_chars=-+*\\,.;:&> + +editor_state_full_filename=false + +safe_overwrite=false + +[Layout] +message_visible=1 +keybar_visible=1 +xterm_title=1 +output_lines=0 +command_prompt=1 +menubar_visible=1 +show_mini_info=1 +free_space=1 + +horizontal_split=0 +vertical_equal=1 +left_panel_size=84 +horizontal_equal=1 +top_panel_size=29 + +[Misc] +timeformat_recent=%b %e %H:%M +timeformat_old=%b %e %Y +ftp_proxy_host=gate +ftpfs_password=anonymous@ +display_codepage=UTF-8 +source_codepage=Other_8_bit +autodetect_codeset= +clipboard_store= +clipboard_paste= + +[Colors] +base_color= +screen= +color_terminals= + +rxvt-unicode-256color= + +xterm= + +color_terminals= + +xterm-kitty= + +[Panels] +kilobyte_si=false +mix_all_files=false +show_backups=true +show_dot_files=false +fast_reload=false +fast_reload_msg_shown=false +mark_moves_down=true +reverse_files_only=true +auto_save_setup_panels=true +navigate_with_arrows=false +panel_scroll_pages=true +mouse_move_pages=true +filetype_mode=true +permission_mode=false +quick_search_mode=2 + +simple_swap=false + +show_mini_info=true +torben_fj_mode=false + +select_flags=6 + +panel_scroll_center=false + +[HotlistConfig] +expanded_view_of_groups=0 + +[FindFile] +ignore_dirs= +file_case_sens=true +file_shell_pattern=true +file_find_recurs=true +file_skip_hidden=false +file_all_charsets=false +content_use=true +content_case_sens=true +content_regexp=false +content_first_hit=false +content_whole_words=false +content_all_charsets=false + +ignore_dirs_enable=true + +[DiffView] +show_symbols=true +show_numbers=false +tab_size=8 +diff_quality=0 +diff_ignore_tws=false +diff_ignore_all_space=false +diff_ignore_space_change=false +diff_tab_expansion=false +diff_ignore_case=false + +[Panelize] +Find *.orig after patching=find . -name \\*.orig -print +Find SUID and SGID programs=find . \\( \\( -perm -04000 -a -perm +011 \\) -o \\( -perm -02000 -a -perm +01 \\) \\) -print +Find rejects after patching=find . -name \\*.rej -print diff --git a/user-config-unused/mc/.config/mc/mc.ext b/user-config-unused/mc/.config/mc/mc.ext new file mode 100644 index 0000000..dbd48ca --- /dev/null +++ b/user-config-unused/mc/.config/mc/mc.ext @@ -0,0 +1,793 @@ +# Midnight Commander 3.0 extension file +# Warning: Structure of this file has changed completely with version 3.0 +# +# All lines starting with # or empty lines are thrown away. +# Lines starting in the first column should have following format: +# +# keyword/descNL, i.e. everything after keyword/ until new line is desc +# +# keyword can be: +# +# shell (desc is, when starting with a dot, any extension (no wildcars), +# i.e. matches all the files *desc . Example: .tar matches *.tar; +# if it doesn't start with a dot, it matches only a file of that name) +# +# shell/i (desc is, when starting with a dot, any extension (no wildcars), +# The same as shell but with case insensitive. +# +# regex (desc is an extended regular expression) +# Please note that we are using the GNU regex library and thus +# \| matches the literal | and | has special meaning (or) and +# () have special meaning and \( \) stand for literal ( ). +# +# regex/i (desc is an extended regular expression) +# The same as regex but with case insensitive. +# +# type (file matches this if `file %f` matches regular expression desc +# (the filename: part from `file %f` is removed)) +# +# type/i (file matches this if `file %f` matches regular expression desc) +# The same as type but with case insensitive. +# +# directory (matches any directory matching regular expression desc) +# +# include (matches an include directive) +# +# default (matches any file no matter what desc is) +# +# Other lines should start with a space or tab and should be in the format: +# +# keyword=commandNL (with no spaces around =), where keyword should be: +# +# Open (if the user presses Enter or doubleclicks it), +# +# View (F3), Edit (F4) +# +# Include is the keyword used to add any further entries from an include/ +# section +# +# command is any one-line shell command, with the following substitutions: +# +# %% -> % character +# %p -> name of the current file (without path, but pwd is its path). +# Also provided to external application as MC_EXT_BASENAME +# global variable +# %f -> name of the current file. Unlike %p, if file is located on a +# non-local virtual filesystem, i.e. either tarfs or ftpfs, +# then the file will be temporarily copied into a local directory +# and %f will be the full path to this local temporal file. +# If you don't want to get a local copy and want to get the +# virtual fs path (like /#ftp:ftp.cvut.cz/pub/hungry/xword), then +# use %d/%p instead of %f. +# Also provided to external application as MC_EXT_FILENAME +# global variable +# %d -> name of the current directory (pwd, without trailing slash) +# Also provided to external application as MC_EXT_CURRENTDIR +# global variable +# %s -> "selected files", i.e. space separated list of tagged files if any +# or name of the current file. +# Also provided to external application as MC_EXT_SELECTED +# global variable +# %t -> list of tagged files +# Also provided to external application as MC_EXT_ONLYTAGGED +# global variable +# %u -> list of tagged files (they'll be untaged after the command) +# +# (If these 6 letters are in uppercase, they refer to the other panel. +# But you shouldn't have to use it in this file.) +# +# +# %cd -> the rest is a path mc should change into (cd won't work, since it's +# a child process). %cd handles even vfs names. +# +# %view -> the command you type will be piped into mc's internal file viewer +# if you type only the %view and no command, viewer will load %f file +# instead (i.e. no piping, so it is different to %view cat %f) +# %view may be directly followed by {} with a list of any of +# ascii (Ascii mode), hex (Hex mode), nroff (color highlighting for +# text using backspace for bold and underscore) and unform +# (no highlighting for nroff sequences) separated by commas. +# +# %var -> You use it like this: %var{VAR:default}. This macro will expand +# to the value of the VAR variable in the environment if it's set +# otherwise the value in default will be used. This is similar to +# the Bourne shell ${VAR-default} construct. +# +# Rules are applied from top to bottom, thus the order is important. +# If some actions are missing, search continues as if this target didn't +# match (i.e. if a file matches the first and second entry and View action +# is missing in the first one, then on pressing F3 the View action from +# the second entry will be used. default should catch all the actions. +# +# Any new entries you develop for you are always welcome if they are +# useful on more than one system. You can post your modifications +# as tickets at www.midnight-commander.org + + +### Changes ### +# +# Reorganization: 2012-03-07 Slava Zanko + + +### GIT Repo ### +# gitfs changeset +regex/^\[git\] + Open=%cd %p/changesetfs:// + View=%cd %p/patchsetfs:// + +### Archives ### + +# .tgz, .tpz, .tar.gz, .tar.z, .tar.Z, .ipk, .gem, .war +regex/\.t([gp]?z|ar\.g?[zZ])$|\.ipk$|\.gem$|\.war$ + Open=%cd %p/utar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view tar.gz + +shell/.tar.bz + # Open=%cd %p/utar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view tar.bzip + +regex/\.t(ar\.bz2|bz2?|b2)$ + Open=%cd %p/utar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view tar.bzip2 + +# .tar.lzma, .tlz +regex/\.t(ar\.lzma|lz)$ + Open=%cd %p/utar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view tar.lzma + +# .tar.xz, .txz +regex/\.t(ar\.xz|xz)$ + Open=%cd %p/utar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view tar.xz + +# .tar.F - used in QNX +shell/.tar.F + # Open=%cd %p/utar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view tar.F + +# .qpr/.qpk - QNX Neutrino package installer files +regex/\.qp[rk]$ + Open=%cd %p/utar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view tar.qpr + +# tar +shell/i/.tar + Open=%cd %p/utar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view tar + +# lha +type/^LHa\ .*archive + Open=%cd %p/ulha:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view lha + +# arj +regex/i/\.a(rj|[0-9][0-9])$ + Open=%cd %p/uarj:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view arj + +# cab +shell/i/.cab + Open=%cd %p/ucab:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view cab + +# ha +shell/i/.ha + Open=%cd %p/uha:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view ha + +# rar +regex/i/\.r(ar|[0-9][0-9])$ + Open=%cd %p/urar:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view rar + +# ALZip +shell/i/.alz + Open=%cd %p/ualz:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view alz + +# cpio +shell/.cpio.Z + Open=%cd %p/ucpio:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view cpio.z + +shell/.cpio.xz + Open=%cd %p/ucpio:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view cpio.xz + +shell/.cpio.gz + Open=%cd %p/ucpio:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view cpio.gz + +shell/i/.cpio + Open=%cd %p/ucpio:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view cpio + +# 7zip archives (they are not man pages) +shell/i/.7z + Open=%cd %p/u7z:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view 7z + +# patch +regex/\.(diff|patch)(\.bz2)$ + Open=%cd %p/patchfs:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view bz2 + +regex/\.(diff|patch)(\.(gz|Z))$ + Open=%cd %p/patchfs:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view gz + +# ls-lR +regex/(^|\.)ls-?lR(\.gz|Z|bz2)$ + Open=%cd %p/lslR:// + +# trpm +shell/.trpm + Open=%cd %p/trpm:// + View=%view{ascii} /usr/lib/mc/ext.d/package.sh view trpm + +# RPM packages (SuSE uses *.spm for source packages) +regex/\.(src\.rpm|spm)$ + Open=%cd %p/rpm:// + View=%view{ascii} /usr/lib/mc/ext.d/package.sh view src.rpm + +shell/.rpm + Open=%cd %p/rpm:// + View=%view{ascii} /usr/lib/mc/ext.d/package.sh view rpm + +# deb +regex/\.u?deb$ + Open=%cd %p/deb:// + View=%view{ascii} /usr/lib/mc/ext.d/package.sh view deb + +# dpkg +shell/.debd + Open=%cd %p/debd:// + View=%view{ascii} /usr/lib/mc/ext.d/package.sh view debd + +# apt +shell/.deba + Open=%cd %p/deba:// + View=%view{ascii} /usr/lib/mc/ext.d/package.sh view deba + +# ISO9660 +shell/i/.iso + Open=%cd %p/iso9660:// + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view iso9660 + + +regex/\.(diff|patch)$ + Open=%cd %p/patchfs:// + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view cat + +# ar library +regex/\.s?a$ + Open=%cd %p/uar:// + #Open=%view{ascii} ar tv %f + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view ar + +# gplib +shell/i/.lib + Open=%cd %p/ulib:// + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view lib + + +# Mailboxes +type/^ASCII\ mail\ text + Open=%cd %p/mailfs:// + + +### Sources ### + +# C/C++ +regex/i/\.(c|cc|cpp)$ + Include=editor + +# C/C++ header +regex/i/\.(h|hh|hpp)$ + Include=editor + +# Fortran +shell/i/.f + Include=editor + +# Assembler +regex/i/\.(s|asm)$ + Include=editor + +# Shell +regex/i/\.sh$ + Include=editor + +# Python +regex/i/\.py$ + Include=editor + +# Racket +regex/i/\.rkt$ + Include=editor + +# General Scheme +regex/i/\.scm$ + Include=editor + +# Lisp +regex/i/\.lisp$ + Include=editor + +# Haskell +regex/i/\.hs$ + Include=editor + +# OCaml +regex/i/\.ml$ + Include=editor + +# Standard ML +regex/i/\.sml$ + Include=editor + +# Ruby +regex/i/\.rb$ + Include=editor + +# Clojure +regex/i/\.clj$ + Include=editor + +# Lua +regex/i/\.lua$ + Include=editor + +# PHP +regex/i/\.php$ + Include=editor + +# Erlang +regex/i/\.erl$ + Include=editor + +include/editor + Open=%var{EDITOR:emacsclient -nw} %f + +# .so libraries +regex/\.(so|so\.[0-9\.]*)$ + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view so + +# Object +type/^ELF + #Open=%var{PAGER:more} %f + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view elf + +### Documentation ### + +# Texinfo +#regex/\.(te?xi|texinfo)$ + +# GNU Info page +type/^Info\ text + Open=/usr/lib/mc/ext.d/text.sh open info + +shell/.info + Open=/usr/lib/mc/ext.d/text.sh open info + +# Exception: .3gp are video files not manual pages +shell/i/.3gp + Include=video + +# Manual page +regex/(([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])|\.man)$ + Open=/usr/lib/mc/ext.d/text.sh open man %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view man %var{PAGER:more} + +# Perl pod page +shell/.pod + Open=/usr/lib/mc/ext.d/text.sh open pod %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view pod %var{PAGER:more} + +# Troff with me macros. +# Exception - "read.me" is not a nroff file. +shell/read.me + Open= + View= + +shell/.me + Open=/usr/lib/mc/ext.d/text.sh open nroff.me %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view nroff.me %var{PAGER:more} + +# Troff with ms macros. +shell/.ms + Open=/usr/lib/mc/ext.d/text.sh open nroff.ms %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view nroff.ms %var{PAGER:more} + +# Manual page - compressed +regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.g?[Zz]$ + Open=/usr/lib/mc/ext.d/text.sh open man.gz %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view man.gz %var{PAGER:more} + +regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.bz$ + Open=/usr/lib/mc/ext.d/text.sh open man.bz %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view man.bz %var{PAGER:more} + +regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.bz2$ + Open=/usr/lib/mc/ext.d/text.sh open man.bz2 %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view man.bz2 %var{PAGER:more} + +regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.lzma$ + Open=/usr/lib/mc/ext.d/text.sh open man.lzma %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view man.lzma %var{PAGER:more} + +regex/([^0-9]|^[^\.]*)\.([1-9][A-Za-z]*|[ln])\.xz$ + Open=/usr/lib/mc/ext.d/text.sh open man.xz %var{PAGER:more} + View=%view{ascii,nroff} /usr/lib/mc/ext.d/text.sh view man.xz %var{PAGER:more} + +# CHM +shell/i/.chm + Open=/usr/lib/mc/ext.d/text.sh open chm + +### Images ### + +type/^GIF + Include=image + +type/^JPEG + View=%view{ascii} /usr/lib/mc/ext.d/image.sh view jpeg + Include=image + +type/^PC\ bitmap + Include=image + +type/^PNG + Include=image + +type/^JNG + Include=image + +type/^MNG + Include=image + +type/^TIFF + Include=image + +type/^PBM + Include=image + +type/^PGM + Include=image + +type/^PPM + Include=image + +type/^Netpbm + Include=image + +shell/.xcf + Open=/usr/lib/mc/ext.d/image.sh open xcf + +shell/.xbm + Open=/usr/lib/mc/ext.d/image.sh open xbm + +shell/.xpm + Include=image + View=/usr/lib/mc/ext.d/image.sh view xpm %f + +shell/.ico + Include=image + +shell/i/.svg + View=%view{ascii} /usr/lib/mc/ext.d/image.sh view svg + Open=/usr/lib/mc/ext.d/image.sh open svg + +include/image + Open=/usr/lib/mc/ext.d/image.sh open ALL_FORMATS + View=%view{ascii} /usr/lib/mc/ext.d/image.sh view ALL_FORMATS + + +### Sound files ### + +regex/i/\.(wav|snd|voc|au|smp|aiff|snd|m4a|ape|aac|wv)$ + Open=/usr/lib/mc/ext.d/sound.sh open common + +regex/i/\.(mod|s3m|xm|it|mtm|669|stm|ult|far)$ + Open=/usr/lib/mc/ext.d/sound.sh open mod + +shell/i/.waw22 + Open=/usr/lib/mc/ext.d/sound.sh open wav22 + +shell/i/.mp3 + Open=/usr/lib/mc/ext.d/sound.sh open mp3 + View=%view{ascii} /usr/lib/mc/ext.d/sound.sh view mp3 + +regex/i/\.og[gax]$ + Open=/usr/lib/mc/ext.d/sound.sh open ogg + View=%view{ascii} /usr/lib/mc/ext.d/sound.sh view ogg + +regex/i/\.(spx|flac)$ + Open=/usr/lib/mc/ext.d/sound.sh open common + +regex/i/\.(midi?|rmid?)$ + Open=/usr/lib/mc/ext.d/sound.sh open midi + +shell/i/.wma + Open=/usr/lib/mc/ext.d/sound.sh open wma + View=%view{ascii} /usr/lib/mc/ext.d/sound.sh view wma + + +### Play lists ### + +regex/i/\.(m3u|pls)$ + Open=/usr/lib/mc/ext.d/sound.sh open playlist + + +### Video ### + +shell/i/.avi + Include=video + +regex/i/\.as[fx]$ + Include=video + +shell/i/.divx + Include=video + +shell/i/.mkv + Include=video + +regex/i/\.(mov|qt)$ + Include=video + +regex/i/\.(mp4|m4v|mpe?g)$ + Include=video + +# MPEG-2 TS container + H.264 codec +shell/i/.mts + Include=video + +shell/i/.ts + Include=video + +shell/i/.vob + Include=video + +shell/i/.wmv + Include=video + +regex/i/\.fl[icv]$ + Include=video + +shell/i/.ogv + Include=video + +regex/i/\.ra?m$ + Open=/usr/lib/mc/ext.d/video.sh open ram + +# WebM +shell/i/.webm + Include=video + +type/WebM + Include=video + +include/video + Open=/usr/lib/mc/ext.d/video.sh open ALL_FORMATS + View=%view{ascii} /usr/lib/mc/ext.d/video.sh view ALL_FORMATS + + +### Documents ### + +# Postscript +type/^PostScript + Open=/usr/lib/mc/ext.d/doc.sh open ps + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view ps + +# PDF +type/^PDF + Open=/usr/lib/mc/ext.d/doc.sh open pdf + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view pdf + +# html +regex/i/\.html?$ + Open=/usr/lib/mc/ext.d/web.sh open html + View=%view{ascii} /usr/lib/mc/ext.d/web.sh view html + +# StarOffice 5.2 +shell/.sdw + Open=/usr/lib/mc/ext.d/doc.sh open ooffice + +# StarOffice 6 and OpenOffice.org formats +regex/i/\.(odt|ott|sxw|stw|ods|ots|sxc|stc|odp|otp|sxi|sti|odg|otg|sxd|std|odb|odf|sxm|odm|sxg)$ + Open=/usr/lib/mc/ext.d/doc.sh open ooffice + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view odt + +# AbiWord +shell/.abw + Open=/usr/lib/mc/ext.d/doc.sh open abw + +# Gnumeric +shell/i/.gnumeric + Open=/usr/lib/mc/ext.d/doc.sh open gnumeric + +# Microsoft Word Document +regex/i/\.(do[ct]|wri)$ + Open=/usr/lib/mc/ext.d/doc.sh open msdoc + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view msdoc +type/^Microsoft\ Word + Open=/usr/lib/mc/ext.d/doc.sh open msdoc + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view msdoc + +# RTF document +shell/i/.rtf + Open=/usr/lib/mc/ext.d/doc.sh open msdoc + +# Microsoft Excel Worksheet +regex/i/\.xl[sw]$ + Open=/usr/lib/mc/ext.d/doc.sh open msxls + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view msxls +type/^Microsoft\ Excel + Open=/usr/lib/mc/ext.d/doc.sh open msxls + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view msxls + +regex/i/\.(ppt|pps)$ + Open=/usr/lib/mc/ext.d/doc.sh open msppt + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view msppt + +# Use OpenOffice.org to open any MS Office documents +type/^Microsoft\ Office\ Document + Open=/usr/lib/mc/ext.d/doc.sh open ooffice + +# Framemaker +type/^FrameMaker + Open=/usr/lib/mc/ext.d/doc.sh open framemaker + +# DVI +shell/i/.dvi + Open=/usr/lib/mc/ext.d/doc.sh open dvi + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view dvi + +# TeX +shell/i/.tex + Include=editor + +# DjVu +regex/i/\.djvu?$ + Open=/usr/lib/mc/ext.d/doc.sh open djvu + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view djvu + +# Comic Books +regex/i/\.cb[zr]$ + Open=/usr/lib/mc/ext.d/doc.sh open comic + +# Epub +shell/i/.epub + Open=/usr/lib/mc/ext.d/doc.sh open epub + View=%view{ascii} /usr/lib/mc/ext.d/doc.sh view epub + + +### Miscellaneous ### + +# Compiled Java classes +shell/.class + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view javaclass + +# Makefile +regex/[Mm]akefile$ + Open=make -f %f %{Enter parameters} + +# Imakefile +shell/Imakefile + Open=/usr/lib/mc/ext.d/misc.sh open imakefile + +# Makefile.PL (MakeMaker) +regex/^Makefile.(PL|pl)$ + Open=%var{PERL:perl} %f + +# sqlite3.db +type/^SQLite 3.x database + Open=/usr/lib/mc/ext.d/misc.sh open sqlite + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view sqlite + +# dbf +shell/i/.dbf + Open=/usr/lib/mc/ext.d/misc.sh open dbf + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view dbf + +# REXX script +regex/\.(rexx?|cmd)$ + Open=rexx %f %{Enter parameters};echo "Press ENTER";read y + +# Disk images for Commodore computers (VIC20, C64, C128) +shell/i/.d64 + Open=%cd %p/uc1541:// + View=%view{ascii} c1541 %f -list + Extract=c1541 %f -extract + +# Glade, a user interface designer for GTK+ and GNOME +shell/i/.glade + Open=/usr/lib/mc/ext.d/misc.sh open glade + +# Gettext Catalogs +shell/.mo + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view mo + +# lyx +shell/i/.lyx + Open=/usr/lib/mc/ext.d/misc.sh open lyx + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view lyx + +# torrent +shell/i/.torrent + View=%view{ascii} /usr/lib/mc/ext.d/misc.sh view torrent + +### Plain compressed files ### + +# ace +shell/i/.ace + Open=%cd %p/uace:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view ace + Extract=unace x %f + +# arc +shell/i/.arc + Open=%cd %p/uarc:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view arc + Extract=arc x %f '*' + Extract (with flags)=I=%{Enter any Arc flags:}; if test -n "$I"; then arc x $I %f; fi + +# zip +type/i/^zip\ archive + Open=%cd %p/uzip:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view zip + +# zoo +shell/i/.zoo + Open=%cd %p/uzoo:// + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view zoo + +# gzip +type/^gzip + Open=/usr/lib/mc/ext.d/archive.sh view gz %var{PAGER:more} + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view gz + +regex/\.(gz|Z)$ + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view gz + +# bzip2 +type/^bzip2 + Open=/usr/lib/mc/ext.d/archive.sh view bzip2 %var{PAGER:more} + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view bz2 + +regex/\.bz2?$ + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view bz2 + +# bzip +type/^bzip + Open=/usr/lib/mc/ext.d/archive.sh view bzip %var{PAGER:more} + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view bzip + +# compress +type/^compress + Open=/usr/lib/mc/ext.d/archive.sh view gz %var{PAGER:more} + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view gz + +# lzma +regex/\.lzma$ + Open=/usr/lib/mc/ext.d/archive.sh view lzma %var{PAGER:more} + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view lzma + +# xz +regex/\.xz$ + Open=/usr/lib/mc/ext.d/archive.sh view xz %var{PAGER:more} + View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view xz + +# Parity Archive +type/^Parity\ Archive\ Volume\ Set + Open=/usr/lib/mc/ext.d/archive.sh open par2 + +### Default ### + +# Default target for anything not described above +default/* + Open= + View= + + +### EOF ### diff --git a/user-config-unused/mc/.config/mc/mc.keymap b/user-config-unused/mc/.config/mc/mc.keymap new file mode 100644 index 0000000..6d503b4 --- /dev/null +++ b/user-config-unused/mc/.config/mc/mc.keymap @@ -0,0 +1,456 @@ +[main] +Help = f1 +UserMenu = f2 +View = f3 +# ViewFile = +Edit = f4 +# EditForceInternal = +Copy = f5 +Move = f6 +MakeDir = f7 +Delete = f8 +Menu = f9 +Quit = f10 +MenuLastSelected = f19 +QuitQuiet = f20 +Find = alt-question +CdQuick = alt-c +HotList = ctrl-backslash +Reread = ctrl-r +DirSize = ctrl-space +Suspend = ctrl-z +Swap = ctrl-u +History = alt-h +# PanelListing = +PanelListingSwitch = alt-t +# PanelListingChange = +ShowHidden = alt-dot +SplitVertHoriz = alt-comma +SplitEqual = alt-equal +SplitMore = alt-shift-right +SplitLess = alt-shift-left +Shell = ctrl-o +PutCurrentPath = alt-a +PutOtherPath = alt-shift-a +ViewFiltered = alt-exclamation +Select = kpplus +Unselect = kpminus +SelectInvert = kpasterisk +ScreenList = alt-prime +# OptionsLayout = +# OptionsPanel = +# OptionsConfirm = +# OptionsDisplayBits = +# OptionsVfs = +# LearnKeys = +# SaveSetup = +# EditExtensionsFile = +# EditFileHighlightFile = +# Filter = +# ConnectFish = +# ConnectFtp = +# ConnectSmb = +# Undelete = +ExtendedKeyMap = ctrl-x + +[main:xmap] +ChangeMode = c +ChangeOwn = o +CompareDirs = d +CompareFiles = ctrl-d +HotListAdd = h +LinkSymbolicEdit = ctrl-s +Link = l +LinkSymbolic = s +LinkSymbolicRelative = v +PanelInfo = i +PanelQuickView = q +ExternalPanelize = exclamation +VfsList = a +Jobs = j +PutCurrentPath = p +PutOtherPath = ctrl-p +PutCurrentTagged = t +PutOtherTagged = ctrl-t +PutCurrentLink = r +PutOtherLink = ctrl-r + +[panel] +Search = ctrl-s; alt-s +Mark = insert; ctrl-t +MarkUp = shift-up +MarkDown = shift-down +# MarkLeft = +# MarkRight = +Down = down; ctrl-n +Up = up; ctrl-p +Left = left +Right = right +PageUp = pgup; alt-v +PageDown = pgdn; ctrl-v +Enter = enter +PanelOtherCd = alt-o +PanelOtherCdLink = alt-l +ViewRaw = f13 +EditNew = f14 +CopySingle = f15 +MoveSingle = f16 +DeleteSingle = f18 +Select = alt-plus +Unselect = alt-minus +SelectInvert = alt-asterisk +CdChild = ctrl-pgdn +CdParent = ctrl-pgup +# CdParentSmart = +# Panelize = +History = alt-shift-h +HistoryNext = alt-u +HistoryPrev = alt-y +BottomOnScreen = alt-j +MiddleOnScreen = alt-r +TopOnScreen = alt-g +PanelOtherSync = alt-i +SelectCodepage = alt-e +Top = alt-lt; home; a1 +Bottom = alt-gt; end; c1 +# Sort = +# SortPrev = +# SortNext = +# SortReverse = +# SortByName = +# SortByExt = +# SortBySize = +# SortByMTime = +# ScrollLeft = +# ScrollRight = + +[dialog] +Ok = enter +Cancel = f10; esc +Up = left; up +#Left = left; up +Down = right; down +#Right = right; down +Help = f1 +Suspend = ctrl-z +Refresh = ctrl-l +ScreenList = alt-prime +ScreenNext = alt-rbrace +ScreenPrev = alt-lbrace + +[input] +Home = ctrl-a; alt-lt; home; a1 +End = ctrl-e; alt-gt; end; c1 +Left = left; alt-left; ctrl-b +Right = right; alt-right; ctrl-f +WordLeft = ctrl-left; alt-b +WordRight = ctrl-right; alt-f +Backspace = backspace +Delete = delete +DeleteToWordBegin = alt-backspace +DeleteToWordEnd = alt-d +# Mark = +Remove = ctrl-w +# Cut = +Store = alt-w +# Paste = +Yank = ctrl-y +DeleteToEnd = ctrl-k +HistoryPrev = alt-p; ctrl-down +HistoryNext = alt-n; ctrl-up +History = alt-h +Complete = alt-tab +# Clear = +# MarkLeft = +# MarkRight = +# MarkToWordBegin = +# MarkToWordEnd = +# MarkToHome = +# MarkToEnd = + +[listbox] +Up = up; ctrl-p +Down = down; ctrl-n +Top = home; alt-lt; a1 +Bottom = end; alt-gt; c1 +PageUp = pgup; alt-v +PageDown = pgdn; ctrl-v +Delete = delete; d +Clear = shift-delete; shift-d + +[tree] +Help = f1 +Reread = f2; ctrl-r +Forget = f3 +ToggleNavigation = f4 +Copy = f5 +Move = f6 +Up = up; ctrl-p +Down = down; ctrl-n +Left = left +Right = right +Top = home; alt-lt; a1 +Bottom = end; alt-gt; c1 +PageUp = pgup; alt-v +PageDown = pgdn; ctrl-v +Enter = enter +Search = ctrl-s; alt-s +Delete = f8; delete + +[help] +Help = f1 +Index = f2; c +Back = f3; left; l +Quit = f10; esc; ctrl-g +Up = up; ctrl-p +Down = down; ctrl-n +PageDown = f; space; pgdn; ctrl-v +PageUp = b; pgup; alt-v; backspace +HalfPageDown = d +HalfPageUp = u +Top = home; ctrl-home; ctrl-pgup; a1; alt-lt; g +Bottom = end; ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g +Enter = right; enter +LinkNext = tab +LinkPrev = alt-tab +NodeNext = n +NodePrev = p + +[editor] +Store = alt-w +Paste = ctrl-y +Cut = ctrl-w +Up = up; ctrl-p +Down = down; ctrl-n +Left = left; ctrl-b +Right = right; ctrl-f +WordLeft = ctrl-left; alt-b +WordRight = ctrl-right; alt-f +Enter = enter +Return = shift-enter +BackSpace = backspace +Delete = delete +PageUp = pgup; alt-v +PageDown = pgdn; ctrl-v +Home = home; ctrl-a +End = end; ctrl-e +Tab = tab +Undo = ctrl-u +# Redo = +Top = ctrl-home; alt-lt +Bottom = ctrl-end; alt-gt +ScrollUp = ctrl-up +ScrollDown = ctrl-down +TopOnScreen = ctrl-pgup +BottomOnScreen = ctrl-pgdn +DeleteToWordBegin = alt-backspace +DeleteToWordEnd = alt-d +DeleteLine = ctrl-y +DeleteToEnd = ctrl-k +# DeleteToHome = +# ParagraphUp = +# ParagraphDown = +Save = f2 +# EditFile = +SaveAs = f12; ctrl-f2 +# Close = +Mark = f3; ctrl-at +Copy = f5 +Move = f6 +Remove = f8 +# MarkLine = +# MarkWord = +# MarkAll = +# Unmark = +Search = f7; ctrl-s +SearchContinue = f17 +# BlockShiftLeft = +# BlockShiftRight = +MarkPageUp = shift-pgup +MarkPageDown = shift-pgdn +MarkLeft = shift-left +MarkRight = shift-right +MarkToWordBegin = ctrl-shift-left +MarkToWordEnd = ctrl-shift-right +MarkUp = shift-up +MarkDown = shift-down +MarkToHome = shift-home +MarkToEnd = shift-end +MarkToFileBegin = ctrl-shift-home +MarkToFileEnd = ctrl-shift-end +MarkToPageBegin = ctrl-shift-pgup +MarkToPageEnd = ctrl-shift-pgdn +MarkScrollUp = ctrl-shift-up +MarkScrollDown = ctrl-shift-down +# MarkParagraphUp = +# MarkParagraphDown = +MarkColumnPageUp = alt-pgup +MarkColumnPageDown = alt-pgdn +MarkColumnLeft = alt-left +MarkColumnRight = alt-right +MarkColumnUp = alt-up +MarkColumnDown = alt-down +# MarkColumnScrollUp = +# MarkColumnScrollDown = +# MarkColumnParagraphUp = +# MarkColumnParagraphDown = +# BlockSave = +MarkColumn = f13 +Replace = f4 +ReplaceContinue = f14 +Complete = alt-tab +InsertFile = f15 +Quit = f10; esc +InsertOverwrite = insert +Help = f1 +# Date = +Refresh = ctrl-l +Goto = alt-l +Sort = alt-t +# Mail = +ParagraphFormat = alt-p +# MatchBracket = +ExternalCommand = alt-u +UserMenu = f11 +Menu = f9 +# Bookmark = +# BookmarkFlush = +# BookmarkNext = +# BookmarkPrev = +# History = +Shell = ctrl-o +InsertLiteral = ctrl-q +# MacroStartRecord = +# MacroStopRecord = +MacroStartStopRecord = ctrl-r +# MacroDelete = +ShowNumbers = alt-n +ShowTabTws = alt-underline +SyntaxOnOff = ctrl-s +# SyntaxChoose = +# ShowMargin = +Find = alt-enter +FilePrev = alt-minus +FileNext = alt-plus +# RepeatStartStopRecord = +SelectCodepage = alt-e +# Options = +# OptionsSaveMode = +# SpellCheck = +# SpellCheckCurrentWord = +# SpellCheckSelectLang = +# LearnKeys = +# WindowMove = +# WindowResize = +# WindowFullscreen = +# WindowList = +# WindowNext = +# WindowPrev = +ExtendedKeyMap = ctrl-x + +[editor:xmap] +EditNew = k + +[viewer] +Help = f1 +WrapMode = f2 +Quit = f3; f10; q; esc +HexMode = f4 +Goto = f5 +Search = f7 +SearchForward = slash +SearchBackward = question +SearchContinue = f17; n +SearchForwardContinue = ctrl-s +SearchBackwardContinue = ctrl-r +MagicMode = f8 +NroffMode = f9 +Home = ctrl-a +End = ctrl-e +Left = h; left +Right = l; right +LeftQuick= ctrl-left +RightQuick = ctrl-right +Up = k; y; insert; up; ctrl-p +Down = j; e; delete; down; enter; ctrl-n +PageDown = f; space; pgdn; ctrl-v +PageUp = b; pgup; alt-v; backspace +HalfPageDown = d +HalfPageUp = u +Top = home; ctrl-home; ctrl-pgup; a1; alt-lt; g +Bottom = end; ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g +BookmarkGoto = m +Bookmark = r +FileNext = ctrl-f +FilePrev = ctrl-b +SelectCodepage = alt-e +Shell = ctrl-o +Ruler = alt-r + +[viewer:hex] +Help = f1 +HexEditMode = f2 +Quit = f3; f10; q; esc +HexMode = f4 +Goto = f5 +Save = f6 +Search = f7 +SearchForward = slash +SearchBackward = question +SearchContinue = f17; n +SearchForwardContinue = ctrl-s +SearchBackwardContinue = ctrl-r +MagicMode = f8 +NroffMode = f9 +ToggleNavigation = tab +Home = ctrl-a; home +End = ctrl-e; end +Left = b; left +Right = f; right +Up = k; y; up +Down = j; delete; down +PageDown = pgdn; ctrl-v +PageUp = pgup; alt-v +Top = ctrl-home; ctrl-pgup; a1; alt-lt; g +Bottom = ctrl-end; ctrl-pgdn; c1; alt-gt; shift-g + +[diffviewer] +ShowSymbols = alt-s; s +ShowNumbers = alt-n; l +SplitFull = f +SplitEqual = equal +SplitMore = gt +SplitLess = lt +Tab2 = 2 +Tab3 = 3 +Tab4 = 4 +Tab8 = 8 +Swap = ctrl-u +Redo = ctrl-r +HunkNext = n; enter; space +HunkPrev = p; backspace +Goto = g; shift-g +Save = f2 +Edit = f4 +EditOther = f14 +Merge = f5 +MergeOther = f15 +Search = f7 +SearchContinue = f17 +Options = f9 +Top = ctrl-home +Bottom = ctrl-end +Down = down +Up = up +LeftQuick = ctrl-left +RightQuick = ctrl-right +Left = left +Right = right +PageDown = pgdn +PageUp = pgup +Home = home +End = end +Help = f1 +Quit = f10; q; shift-q; esc +Shell = ctrl-o +SelectCodepage = alt-e diff --git a/user-config-unused/mc/.config/mc/mc.menu b/user-config-unused/mc/.config/mc/mc.menu new file mode 100644 index 0000000..58daeeb --- /dev/null +++ b/user-config-unused/mc/.config/mc/mc.menu @@ -0,0 +1,365 @@ +shell_patterns=0 ++ ! t t +@ Do something on the current file + CMD=%{Enter command} + $CMD %f + ++ t t +@ Do something on the tagged files + set %t; CMD=%{Enter command} + while [ -n "$1" ]; do + $CMD "$1" + shift + done + + +0 Edit a bug report and send it to root + I=`mktemp "${MC_TMPDIR:-/tmp}/mail.XXXXXX"` || exit 1 + ${EDITOR-vi} "$I" + test -r $I && mail root < $I + rm -f "$I" + +=+ f \.1$ | f \.3$ | f \.4$ | f \.5$ | f \.6$ | f \.7$ | f \.8$ | f \.man$ & t r +1 Display the file with roff -man + nroff -man %f | less + +2 Call the info hypertext browser + info + += t d +3 Compress the current subdirectory (tar.gz) + Pwd=`basename %d /` + echo -n "Name of the compressed file (without extension) [$Pwd]: " + read tar + if [ "$tar"x = x ]; then tar="$Pwd"; fi + cd .. && \ + tar cf - "$Pwd" | gzip -f9 > "$tar.tar.gz" && \ + echo "../$tar.tar.gz created." + +4 Compress the current subdirectory (tar.bz2) + Pwd=`basename %d /` + echo -n "Name of the compressed file (without extension) [$Pwd]: " + read tar + if [ "$tar"x = x ]; then tar="$Pwd"; fi + cd .. && \ + tar cf - "$Pwd" | bzip2 -f > "$tar.tar.bz2" && \ + echo "../$tar.tar.bz2 created." + +5 Compress the current subdirectory (tar.7z) + Pwd=`basename %d /` + echo -n "Name of the compressed file (without extension) [$Pwd]: " + read tar + if [ "$tar"x = x ]; then tar="$Pwd"; fi + cd .. && \ + tar cf - "$Pwd" | 7za a -si "$tar.tar.7z" && \ + echo "../$tar.tar.7z created." + +6 Compress the current subdirectory (tar.xz) + Pwd=`basename %d /` + echo -n "Name of the compressed file (without extension) [$Pwd]: " + read tar + if [ "$tar"x = x ]; then tar="$Pwd"; fi + cd .. && \ + tar cf - "$Pwd" | xz -f > "$tar.tar.xz" && \ + echo "../$tar.tar.xz created." + += f \.c$ & t r ++ f \.c$ & t r & ! t t +с Compile and link current .c file + make `basename %f .c` 2>/dev/null || cc -O -o `basename %f .c` %f + ++ t r & ! t t +a Append file to opposite + cat %f >> %D/%f + ++ t t +A Append files to opposite files + set %t + while [ -n "$1" ]; do + cat "$1" >> "%D/$1" + shift + done + ++ t r & ! t t +d Delete file if a copy exists in the other directory. + if [ "%d" = "%D" ]; then + echo "The two directories must be different." + exit 1 + fi + if [ -f %D/%f ]; then # if two of them, then + if cmp -s %D/%f %f; then + rm %f && echo "%f: DELETED." + else + echo "%f and %D/%f differ: NOT deleted." + echo -n "Press RETURN " + read key + fi + else + echo "%f: No copy in %D/%f: NOT deleted." + fi + ++ t t +D Delete tagged files if a copy exists in the other directory. + if [ "%d" = "%D" ]; then + echo "The two directores must be different." + exit 1 + fi + for i in %t + do + if [ -f "%D/$i" ]; then + SUM1="`sum $i`" + SUM2="`sum %D/$i`" + if [ "$SUM1" = "$SUM2" ]; then + rm "$i" && echo "${i}: DELETED." + else + echo "$i and %D/$i differ: NOT deleted." + fi + else + echo "%i has no copy in %D: NOT deleted." + fi + done + +m View manual page + MAN=%{Enter manual name} + %view man -P cat $MAN + += f \.gz$ & t r ++ ! t t +n Inspect gzip'ed newsbatch file + dd if=%f bs=1 skip=12|zcat|${PAGER-more} + # assuming the cunbatch header is 12 bytes long. + += t r & ++ ! t t +h Strip headers from current newsarticle + CHECK=`awk '{print $1 ; exit}' %f` 2>/dev/null + case "$CHECK" in + Newsgroups:|Path:) + I=`mktemp "${MC_TMPDIR:-/tmp}/news.XXXXXX"` || exit 1 + cp %f "$I" && sed '/^'"$CHECK"' /,/^$/d' "$I" > %f + [ "$?" = "0" ] && rm "$I" + echo "%f: header removed." + ;; + *) + echo "%f is not a news article." + ;; + esac + ++ t t +H Strip headers from the marked newsarticles + set %t + while [ -n "$1" ]; do + CHECK=`awk '{print $1 ; exit}' $1` 2>/dev/null + WFILE=`mktemp "${MC_TMPDIR:-/tmp}/news.XXXXXX"` || exit 1 + case "$CHECK" in + Newsgroups:|Path:) + cp "$1" "$WFILE" && sed '/^'"$CHECK"' /,/^$/d' "$WFILE" > "$1" + if [ "$?" = "0" ]; then + rm "$WFILE"; echo "$1 header removed. OK." + else + echo "Oops! Please check $1 against $WFILE." + fi + ;; + *) + echo "$1 skipped: Not a news article." + ;; + esac + shift + done + += t r ++ ! t t +r Copy file to remote host + echo -n "To which host?: " + read Host + echo -n "To which directory on $Host?: " + read Dir + rcp -p %f "${Host}:$Dir" + ++ t t +R Copy files to remote host (no error checking) + echo -n "Copy files to which host?: " + read Host + echo -n "To which directory on $Host? :" + read Dir + rcp -pr %u "${Host}:$Dir" + += f \.tex$ & t r ++ f \.tex$ & t r & ! t t +t Run latex on file and show it with xdvi + latex %f && xdvi `basename %f .tex`.dvi + +=+ f ^part | f ^Part | f uue & t r ++ t t +U Uudecode marked news articles (needs work) + set %t + ( + while [ -n "$1" ]; do # strip headers + FIRST=`awk '{print $1 ; exit}' "$1"` + cat "$1" | sed '/^'"$FIRST"' /,/^$/d'; shift + done + ) |sed '/^$/d' |sed -n '/^begin 6/,/^end$/p' | uudecode + if [ "$?" != "0" ]; then + echo "Cannot decode %t." + fi + echo "Please test the output file before deleting anything." + +=+ f \.tar\.gz$ | f \.tar\.z$ | f \.tgz$ | f \.tpz$ | f \.tar\.lz$ | f \.tar\.lzma$ | f \.tar\.7z$ | f \.tar\.xz$ | f \.tar\.Z$ | f \.tar\.bz2$ & t r +x Extract the contents of a compressed tar file + unset PRG + case %f in + *.tar.bz2) + PRG="bunzip2 -c" + ;; + *.tar.gz|*.tar.z|*.tgz|*.tpz|*.tar.Z) + PRG="gzip -dc" + ;; + *.tar.lzma) + PRG="lzma -dc" + ;; + *.tar.lz) + PRG="lzip -dc" + ;; + *.tar.xz) + PRG="xz -dc" + ;; + *.tar.7z) + PRG="7za e -so" + ;; + *) + exit 1 + ;; + esac + $PRG %f | tar xvf - + += t r ++ ! t t +y Gzip or gunzip current file + unset DECOMP + case %f in + *.gz) DECOMP=-d;; + *.[zZ]) DECOMP=-d;; + esac + gzip $DECOMP -v %f + ++ t t +Y Gzip or gunzip tagged files + for i in %t + do + unset DECOMP + case "$i" in + *.gz) DECOMP=-d;; + *.[zZ]) DECOMP=-d;; + esac + gzip $DECOMP -v "$i" + done + ++ ! t t +b Bzip2 or bunzip2 current file + unset DECOMP + case %f in + *.bz2) DECOMP=-d;; + esac + bzip2 $DECOMP -v %f + ++ t t +B Bzip2 or bunzip2 tagged files + for i in %t + do + unset DECOMP + case "$i" in + *.bz2) DECOMP=-d;; + esac + bzip2 $DECOMP -v "$i" + done + ++ f \.tar.gz$ | f \.tgz$ | f \.tpz$ | f \.tar.Z$ | f \.tar.z$ | f \.tar.bz2$ | f \.tar.F$ & t r & ! t t +z Extract compressed tar file to subdirectory + unset D + set gzip -cd + case %f in + *.tar.gz) D="`basename %f .tar.gz`";; + *.tgz) D="`basename %f .tgz`";; + *.tpz) D="`basename %f .tpz`";; + *.tar.Z) D="`basename %f .tar.Z`";; + *.tar.z) D="`basename %f .tar.z`";; + *.tar.bz2) D="`basename %f .tar.bz2`"; set bunzip2 -c ;; + *.tar.F) D="`basename %f .tar.F`"; set freeze -dc; + esac + mkdir "$D"; cd "$D" && ("$1" "$2" ../%f | tar xvf -) + ++ t t +Z Extract compressed tar files to subdirectories + for i in %t + do + set gzip -dc + unset D + case "$i" in + *.tar.gz) D="`basename $i .tar.gz`";; + *.tgz) D="`basename $i .tgz`";; + *.tpz) D="`basename $i .tpz`";; + *.tar.Z) D="`basename $i .tar.Z`";; + *.tar.z) D="`basename $i .tar.z`";; + *.tar.F) D="`basename $i .tar.F`"; set freeze -dc;; + *.tar.bz2) D="`basename $i .tar.bz2`"; set bunzip2 -c;; + esac + mkdir "$D"; (cd "$D" && "$1" "$2" "../$i" | tar xvf -) + done + ++ f \.gz$ | f \.tgz$ | f \.tpz$ | f \.Z$ | f \.z$ | f \.bz2$ & t r & ! t t +c Convert gz<->bz2, tar.gz<->tar.bz2 & tgz->tar.bz2 + unset D + unset EXT + case %f in + *.tgz) EXT=tgz;; + *.tpz) EXT=tpz;; + *.Z) EXT=Z;; + *.z) EXT=z;; + *.gz) EXT=gz;; + *.bz2) EXT=bz2;; + esac + case $EXT in + tgz|tpz) D="`basename %f .$EXT`.tar";; + gz|Z|z) D="`basename %f .$EXT`";; + bz2) D="`basename %f .bz2`";; + esac + if [ "$EXT" = "bz2" ]; then + bunzip2 -v %f ; gzip -f9 -v "$D" + else + gunzip -v %f ; bzip2 -v "$D" + fi + ++ t t +C Convert gz<->bz2, tar.gz<->tar.bz2 & tgz->tar.bz2 + set %t + while [ -n "$1" ] + do + unset D + unset EXT + case "$1" in + *.tgz) EXT=tgz;; + *.tpz) EXT=tpz;; + *.Z) EXT=Z;; + *.z) EXT=z;; + *.gz) EXT=gz;; + *.bz2) EXT=bz2;; + esac + case $EXT in + tgz) D="`basename $1 .tgz`.tar";; + tpz) D="`basename $1 .tpz`.tar";; + gz|Z|z) D="`basename $1 .$EXT`";; + bz2) D="`basename $1 .bz2`";; + esac + if [ "$EXT" = "bz2" ]; then + bunzip2 -v "$1" + gzip -f9 -v "$D" + else + gunzip -v "$1" + bzip2 -v "$D" + fi + shift + done + ++ x /usr/bin/open | x /usr/local/bin/open & x /bin/sh +o Open next a free console + open -s -- sh diff --git a/user-config-unused/mc/.config/mc/mc.menu.sr b/user-config-unused/mc/.config/mc/mc.menu.sr new file mode 100644 index 0000000..6a505f4 --- /dev/null +++ b/user-config-unused/mc/.config/mc/mc.menu.sr @@ -0,0 +1,344 @@ +shell_patterns=0 ++ ! t t +@ Ради нешто над текућом датотеком + CMD=%{Унесите наредбу} + $CMD %f + ++ t t +@ Ради нешто над означеним датотекама + set %t; CMD=%{Унесите наредбу} + while [ -n "$1" ]; do + $CMD "$1" + shift + done + + +0 Уреди пријаву грешке и пошаљи је администратору + ${EDITOR-vi} /tmp/mail.$$ + test -r /tmp/mail.$$ && mail root < /tmp/mail.$$ + rm -f /tmp/mail.$$ + +=+ f \.1$ | f \.3$ | f \.4$ | f \.5$ | f \.6$ | f \.7$ | f \.8$ | f \.man$ & t r +1 Прикажи датотеку уз помоћ roff -man + nroff -man %f | less + +2 Позови читач хипертекста info + info + += t d +3 Компримуј текући поддиректоријум (tar.gz) + Pwd=`basename "%d" /` + echo -n "Назив компримоване датотеке (без врсте) [$Pwd]: " + read tar + if [ "$tar"x = x ]; then tar="$Pwd"; fi + cd .. && \ + tar cf - "$Pwd" | gzip -f9 > "$tar.tar.gz" && \ + echo "Датотека ../$tar.tar.gz је створена." + +4 Компримуј текући поддиректоријум (tar.bz2) + Pwd=`basename %d /` + echo -n "Назив компримоване датотеке (без врсте) [$Pwd]: " + read tar + if [ "$tar"x = x ]; then tar="$Pwd"; fi + cd .. && \ + tar cf - "$Pwd" | bzip2 -f > "$tar.tar.bz2" && \ + echo "Датотека ../$tar.tar.bz2 је створена." + += f \.c$ & t r ++ f \.c$ & t r & ! t t +5 Преведи и повежи текућу датотеку врсте `.c' + make `basename %f .c` 2>/dev/null || cc -O -o `basename %f .c` %f + ++ t r & ! t t +a Надовежи датотеку на ону из другог окна + cat %f >>%D/%f + ++ t t +A Надовежи датотеке на оне из другог окна + set %t + while [ -n "$1" ]; do + cat "$1" >> "%D/$1" + shift + done + ++ t r & ! t t +d Обриши датотеку ако њена копија постоји у другом окну. + if [ "%d" = "%D" ]; then + echo "Два директоријума морају да буду различити." + exit 1 + fi + if [ -f %D/%f ]; then # if two of them, then + if cmp -s %D/%f %f; then + rm %f && echo "%f: ОБРИСАНА." + else + echo "%f и %D/%f се разликују: НИЈЕ обрисана." + echo -n "Притисните `RETURN' " + read тастер + fi + else + echo "%f: Нема копије у %D/%f: НИЈЕ обрисана." + fi + ++ t t +D Обриши означене датотеке ако постоји копија у другом окну. + if [ "%d" = "%D" ]; then + echo "Два директоријума морају да буду различити." + exit 1 + fi + for i in %t + do + if [ -f "%D/$i" ]; then + SUM1="`sum $i`" + SUM2="`sum %D/$i`" + if [ "$SUM1" = "$SUM2" ]; then + rm "$i" && echo "${i}: ОБРИСАНА." + else + echo "$i и %D/$i се разликују: НИЈЕ обрисана." + fi + else + echo "%f нема копију у %D: НИЈЕ обрисана." + fi + done + +m Погледај страницу упутства + MAN=%{Унесите назив упутства} + %view man -P cat $MAN + += f \.gz$ & t r ++ ! t t +n Прегледај датотеку вести компримовану програмом gzip + dd if=%f bs=1 skip=12|zcat|${PAGER-more} + # assuming the cunbatch header is 12 bytes long. + += t r & ++ ! t t +h Скини заглавља из текућег чланка вести + CHECK=`awk '{print $1 ; exit}' %f` 2>/dev/null + case "$CHECK" in + Newsgroups:|Path:) + cp %f /tmp/%f.$$ && sed '/^'"$CHECK"' /,/^$/d' /tmp/%f.$$ > %f + [ "$?" = "0" ] && rm "/tmp/%f.$$" + echo "%f: уклоњено заглавље." + ;; + *) + echo "%f није чланак вести." + ;; + esac + ++ t t +H Скини заглавља из означених чланака вести + set %t + while [ -n "$1" ]; do + CHECK=`awk '{print $1 ; exit}' "$1"` 2>/dev/null + WFILE=/tmp/${1}.$$ + case "$CHECK" in + Newsgroups:|Path:) + cp "$1" "$WFILE" && sed '/^'"$CHECK"' /,/^$/d' "$WFILE" > "$1" + if [ "$?" = "0" ]; then + rm "$WFILE"; echo "$1 заглавље уклоњено. У реду." + else + echo "Уупс! Молим да проверите $1 са $WFILE." + fi + ;; + *) + echo "$1 прескочена: Није чланак вести." + ;; + esac + shift + done + += t r ++ ! t t +r Копирај датотеку на удаљеног домаћина + echo -n "На ког домаћина?: " + read Домаћин + echo -n "У који директоријум на $Домаћин?: " + read Дир + rcp -p %f "${Домаћин}:$Дир" + ++ t t +R Копирај датотеке на удаљеног домаћина (без провере грешака) + echo -n "На ког домаћина да копирам датотеке?: " + read Домаћин + echo -n "У који директоријум на $Домаћин? :" + read Дир + rcp -pr %u "${Домаћин}:$Дир" + += f \.tex$ & t r ++ f \.tex$ & t r & ! t t +t Покрени ЛаТеХ над датотеком и прикажи је преко програма `xdvi' + latex %f && xdvi `basename %f .tex`.dvi + +=+ f ^part | f ^Part | f uue & t r ++ t t +U Уудекодирај означени чланак вести (требало би разрадити) + set %t + ( + while [ -n "$1" ]; do # strip headers + FIRST=`awk '{print $1 ; exit}' "$1"` + cat "$1" | sed '/^'"$FIRST"' /,/^$/d'; shift + done + ) |sed '/^$/d' |sed -n '/^begin 6/,/^end$/p' | uudecode + if [ "$?" != "0" ]; then + echo "Не могу да декодирам %t." + fi + echo "Молим да проверите излазну датотеку пре било каквог брисања." + +=+ f \.tar\.gz$ | f \.tar\.z$ | f \.tgz$ | f \.tpz$ | f \.tar\.lz$ | f \.tar\.lzma$ | f \.tar\.7z$ | f \.tar\.xz$ | f \.tar\.Z$ | f \.tar\.bz2$ & t r +x Издвој садржај компримоване датотеке врсте `tar' + unset PRG + case %f in + *.tar.bz2) + PRG="bunzip2 -c" + ;; + *.tar.gz|*.tar.z|*.tgz|*.tpz|*.tar.Z) + PRG="gzip -dc" + ;; + *.tar.lzma) + PRG="lzma -dc" + ;; + *.tar.lz) + PRG="lzip -dc" + ;; + *.tar.xz) + PRG="xz -dc" + ;; + *.tar.7z) + PRG="7za e -so" + ;; + *) + exit 1 + ;; + esac + $PRG %f | tar xvf - + += t r ++ ! t t +y Пакуј или расп. тек. дат. програмима `gzip' или `gunzip' + unset DECOMP + case %f in + *.gz) DECOMP=-d;; + *.[zZ]) DECOMP=-d;; + esac + gzip $DECOMP -v %f + ++ t t +Y Пакуј или расп. означ. дат. програмима `gzip' или `gunzip' + for i in %t + do + unset DECOMP + case "$i" in + *.gz) DECOMP=-d;; + *.[zZ]) DECOMP=-d;; + esac + gzip $DECOMP -v "$i" + done + ++ ! t t +b Пакуј или расп. тек. дат. програмима `bzip2' или `bunzip2' + unset DECOMP + case %f in + *.bz2) DECOMP=-d;; + esac + bzip2 $DECOMP -v %f + ++ t t +B Пакуј или расп. означ. дат. програмима `bzip2' или `bunzip2' + for i in %t + do + unset DECOMP + case "$i" in + *.bz2) DECOMP=-d;; + esac + bzip2 $DECOMP -v "$i" + done + ++ f \.tar.gz$ | f \.tgz$ | f \.tpz$ | f \.tar.Z$ | f \.tar.z$ | f \.tar.bz2$ | f \.tar.F$ & t r & ! t t +z Издвој компримовану датотеку врсте `tar' у поддиректоријум + unset D + set gzip -cd + case %f in + *.tar.gz) D="`basename %f .tar.gz`";; + *.tgz) D="`basename %f .tgz`";; + *.tpz) D="`basename %f .tpz`";; + *.tar.Z) D="`basename %f .tar.Z`";; + *.tar.z) D="`basename %f .tar.z`";; + *.tar.bz2) D="`basename %f .tar.bz2`"; set bunzip2 -c ;; + *.tar.F) D="`basename %f .tar.F`"; set freeze -dc; + esac + mkdir "$D"; cd "$D" && ("$1" "$2" ../%f | tar xvf -) + ++ t t +Z Издвој компримовану датотеке врсте `tar' у поддиректоријуме + for i in %t + do + set gzip -dc + unset D + case "$i" in + *.tar.gz) D="`basename $i .tar.gz`";; + *.tgz) D="`basename $i .tgz`";; + *.tpz) D="`basename $i .tpz`";; + *.tar.Z) D="`basename $i .tar.Z`";; + *.tar.z) D="`basename $i .tar.z`";; + *.tar.F) D="`basename $i .tar.F`"; set freeze -dc;; + *.tar.bz2) D="`basename $i .tar.bz2`"; set bunzip2 -c;; + esac + mkdir "$D"; (cd "$D" && "$1" "$2" "../$i" | tar xvf -) + done + ++ f \.gz$ | f \.tgz$ | f \.tpz$ | f \.Z$ | f \.z$ | f \.bz2$ & t r & ! t t +c Пребаци gz<->bz2, tar.gz<->tar.bz2 и tgz->tar.bz2 + unset D + case "%f" in + *.tgz) EXT=tgz;; + *.tpz) EXT=tpz;; + *.Z) EXT=Z;; + *.z) EXT=z;; + *.gz) EXT=gz;; + *.bz2) EXT=bz2;; + esac + case $EXT in + tgz|tpz) D="`basename %f .$EXT`.tar";; + gz|Z|z) D="`basename %f .$EXT`";; + bz2) D="`basename %f .bz2`";; + esac + if [ "$EXT" = "bz2" ]; then + bunzip2 -v "%f" ; gzip -f9 -v "$D" + else + gunzip -v "%f" ; bzip2 -v "$D" + fi + ++ t t +C Пребаци gz<->bz2, tar.gz<->tar.bz2 и tgz->tar.bz2 + set %t + while [ -n "$1" ] + do + unset D + case "$1" in + *.tgz) EXT=tgz;; + *.tpz) EXT=tpz;; + *.Z) EXT=Z;; + *.z) EXT=z;; + *.gz) EXT=gz;; + *.bz2) EXT=bz2;; + esac + case $EXT in + tgz) D="`basename $1 .tgz`.tar";; + tpz) D="`basename $1 .tpz`.tar";; + gz|Z|z) D="`basename $1 .$EXT`";; + bz2) D="`basename $1 .bz2`";; + esac + if [ "$EXT" = "bz2" ]; then + bunzip2 -v "$1" + gzip -f9 -v "$D" + else + gunzip -v "$1" + bzip2 -v "$D" + fi + shift + done + ++ x /usr/bin/open | x /usr/local/bin/open & x /bin/sh +o Отвори следећу слободну конзолу + open -s -- sh + diff --git a/user-config-unused/mc/.config/mc/mcedit.menu b/user-config-unused/mc/.config/mc/mcedit.menu new file mode 100644 index 0000000..3d11d96 --- /dev/null +++ b/user-config-unused/mc/.config/mc/mcedit.menu @@ -0,0 +1,486 @@ +shell_patterns=0 # expression type + +# The macros are: +# +# %c The cursor column position number. For edit menu only. +# %i The indent of blank space, equal the cursor column +# position. For edit menu only. +# %y The syntax type of current file. For edit menu only. +# %b The block file name. +# %f The current file name. +# %n Only the current file name without extension. +# %x The extension of current file name. +# %d The current directory name. +# %F The current file in the unselected panel. +# %D The directory name of the unselected panel. +# %t The currently tagged files. +# %T The tagged files in the unselected panel. +# %u and %U Similar to the %t and %T macros, but in +# addition the files are untagged. You can use this macro +# only once per menu file entry or extension file entry, +# because next time there will be no tagged files. +# %s and %S The selected files: The tagged files if +# there are any. Otherwise the current file. +# +# %% The % character +# +# %{some text} Prompt for the substitution. An input box +# is shown and the text inside the braces is used as a +# prompt. The macro is substituted by the text typed by the +# user. The user can press ESC or F10 to cancel. This macro +# doesn't work on the command line yet. + +#----------------------- Begin [perl] language template ----------------------- ++ y Perl\ Program | f \.pl$ +1 Author description header + unset LANG + unset LANGUAGE + LC_ALL= + MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" + AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" + cat >>%b < + # Created at: `date` + # Computer: `uname -n` + # System: `uname -sr` on `uname -m` + # + # Copyright (c) `date +%%Y` $AUTHOR All rights reserved. + # + #---------------------------------------------------------------------- + # Configure section: + + #---------------------------------------------------------------------- + # + # main() + + EOF + ++ y Perl\ Program | f \.pl$ +2 while () + cat < %b + %iwhile() { + %i} + EOF + ++ y Perl\ Program | f \.pl$ +3 for () + cat < %b + %ifor ($i = ; $i < ; $i++) { + %i} + EOF + ++ y Perl\ Program | f \.pl$ +4 foreach () + cat < %b + %iforeach ($ ) { + %i} + EOF + ++ y Perl\ Program | f \.pl$ +5 if () + cat < %b + %iif () { + %i} + EOF + ++ y Perl\ Program | f \.pl$ +6 if () else + cat < %b + %iif () { + %i} else { + %i} + EOF + ++ y Perl\ Program | f \.pl$ +7 if () elsif () + cat < %b + %iif () { + %i} elsif () { + %i} + EOF + ++ y Perl\ Program | f \.pl$ +8 substr () + echo "%i$ = substr(\$str, \$off, \$cnt);" >%b + ++ y Perl\ Program | f \.pl$ +9 opendir () + cat < %b + %iopendir(DIR, \$dir) || die("\$0: can't open \$dir\n"); + EOF + ++ y Perl\ Program | f \.pl$ +a sub () + NAME=%{ Enter name of subroutine: } + cat < %b + sub + $NAME () + { + } # end of $NAME() + EOF +#----------------------- End [perl] language template ------------------------- + +#---------------------- Begin [shell] language template ----------------------- ++ y Shell\ Script | f \.sh$ +1 Author description header + unset LANG + unset LANGUAGE + LC_ALL= + MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" + AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" + cat >>%b < + # Created at: `date` + # Computer: `uname -n` + # System: `uname -sr` on `uname -m` + # + # Copyright (c) `date +%%Y` $AUTHOR All rights reserved. + # + #---------------------------------------------------------------------- + # Configure section: + + #---------------------------------------------------------------------- + # + # main() + + EOF + ++ y Shell\ Script | f \.sh$ +3 for + cat < %b + %ifor i in \$ + %ido + %idone + EOF + ++ y Shell\ Script | f \.sh$ +4 while + cat < %b + %iwhile + %ido + %idone + EOF + ++ y Shell\ Script | f \.sh$ +5 if [] then else + cat <> %b + %iif [ ];then + %ielse + %ifi + EOF + ++ y Shell\ Script | f \.sh$ +6 case + NUMBER=%{ Enter number elements of case:} + cat < %b + %icase "\$" in + EOF + while [ "$NUMBER" -gt 0 ] + do + cat <> %b + %i) + %i ;; + EOF + let NUMBER=$NUMBER-1 + done + cat <> %b + %i*) + %iesac + EOF + ++ y Shell\ Script | f \.sh$ +7 function + NAME=%{ Enter name of function:} + cat <> %b + $NAME() { + } # end of $NAME() + EOF + ++ y Shell\ Script | f \.sh$ +8 select of bash + cat <> %b + %iselect i in \$l + %ido + %i if [ -n "\$i" ];then + %i break + %i else + %i continue + %i fi + %idone + EOF + +#----------------------- End [shell] language template ------------------------ + +#------------------------- Begin [c] language template ------------------------ ++ f \.h$ | f \.c$ | f \.cc$ +1 Author description header + unset LANG + unset LANGUAGE + LC_ALL= + MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" + AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" + cat >> %b < + * Created at: `date` + * Computer: `uname -n` + * System: `uname -sr` on `uname -m` + * + * Copyright (c) `date +%%Y` $AUTHOR All rights reserved. + * + ********************************************************************/ + EOF + ++ f \.h$ | f \.c$ | f \.cc$ +2 GPL description header + cat >>%b <. + */ + EOF + ++ f \.c$ | f \.cc$ +3 if () + cat < %b + %iif () { + %i} + EOF + ++ f \.c$ | f \.cc$ +4 if () else + cat < %b + %iif () { + %i} else { + %i} + EOF + ++ f \.c$ | f \.cc$ +5 if () else if () + cat < %b + %iif ( ) { + %i} else if ( ) { + %i} + EOF + ++ f \.c$ | f \.cc$ +6 switch () + NUMBER=%{ Enter number elements of switch:} + echo "%iswitch () {" >%b + while [ "$NUMBER" -gt 0 ] + do + echo "%icase '':" >>%b + echo "%i break;" >>%b + let NUMBER=$NUMBER-1 + done + echo "%i default:" >>%b + echo "%i}" >>%b + ++ f \.c$ | f \.cc$ +7 for () + cat < %b + %ifor (i = ; i < ; i++) { + %i} + EOF + ++ f \.c$ | f \.cc$ +8 while () + cat < %b + %iwhile () { + %i} + EOF + ++ f \.c$ | f \.cc$ +9 do {} while () + cat < %b + %ido { + %i} while () + EOF + ++ f \.c$ | f \.cc$ +a array + cat < %b + %ichar const x[] = { + %i, , + %i}; + EOF + ++ f \.c$ | f \.cc$ +b enum + cat < %b + %ienum x { + %i, , + %i}; + EOF + ++ f \.c$ | f \.cc$ +c struct + cat < %b + %istruct ? { + %i; + %i}; + EOF + ++ f \.c$ | f \.cc$ +d union + cat < %b + %iunion ? { + %i; + %i}; + EOF + ++ f \.c$ | f \.cc$ +e typedef struct + cat < %b + %itypedef struct { + %i; + %i} ?; + EOF + ++ f \.c$ | f \.cc$ +f function + NAME=%{ Enter name of function:} + cat <> %b + $NAME() + { + } /* end of $NAME() */ + EOF + ++ f \.c$ | f \.h$ | f \.cc$ +g #include + INC=%{ Enter include name: } + if [ -r "$INC" ];then + echo \#include \"$INC\" >%b + else + echo \#include \<$INC\> >%b + fi + ++ f \.c$ | f \.h$ | f \.cc$ +d #define + echo "#define " >%b + ++ f \.c$ | f \.h$ | f \.cc$ +d #ifdef + cat < %b + #ifdef + #else + #endif + EOF + ++ f \.c$ | f \.h$ | f \.cc$ +............................................................................... + ++ f \.c$ | f \.h$ | f \.cc$ +h View all *.h into current directory + cat *.h |less + ++ f \.c$ | f \.cc$ +d Run gdb for current file + [ -x "./%n" ] && gdb ./%n + += f \.c$ | f \.cc$ ++ f \.c$ | f \.cc$ +c Compile, link and run the current .c file + export CFLAGS="-g -Wall -O2" + make || make %n || cc $CFLAGS -o %n %f + [ -r "%n" ] && (echo "*** press any key for run... ***"; read) + [ -x "%n" ] && ./%n + (echo -ne "\n--- Press any key for return to edit. ---"; read) + ++ f \.c$ | f \.h$ +t Indent `C' formatter + indent -kr -pcs %b 1>/dev/null 2> %e + +#--------------------- End [c/c++] language template -------------------------- + +#------------------------- Begin unknown template ----------------------------- ++ y unknown & t r +s #! /bin/sh + echo "#! /bin/sh" >%b + ++ y unknown & t r +p #! /usr/bin/perl + echo "#! /usr/bin/perl" >%b + ++ y unknown & t r +a Author description header + unset LANG + unset LANGUAGE + LC_ALL= + MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" + AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" + cat >>%b < + Created at: `date` + Computer: `uname -n` + System: `uname -sr` on `uname -m` + + Copyright (c) `date +%%Y` $AUTHOR All rights reserved. + ---------------------------------------------------------------------- + + EOF +#--------------------------- End unknown template ----------------------------- + +------------------------------------------------------------------------------- + +#----------------------- Begin common section --------------------------------- +S Sort selection + TMPFILE=`mktemp ${MC_TMPDIR:-/tmp}/up.XXXXXX` || exit 1 + cat %b > $TMPFILE + cat $TMPFILE| sort >%b + rm -f $TMPFILE + +I Insert `Changelog' string + DATE="`date +%%Y-%%m-%%d`" + MY_UID="`id | sed 's/^.*uid=\([^(]*\).*$/\1/'`" + AUTHOR="`awk -F: '$3 == '$MY_UID' {print $5}' /etc/passwd`" + EMAIL="<$REPLYTO>" + echo "$DATE $AUTHOR $EMAIL" >%b + +s Invoke `shell' + sh + +m view `man' + MAN=%{Enter name of man:} + TMPFILE=`mktemp ${MC_TMPDIR:-/tmp}/mcview.$MAN.XXXXXX` || exit 1 + man -Pcat $MAN >$TMPFILE + mcview $TMPFILE + rm -f $TMPFILE + +i Insert a out of command to cursor. + CMD=%{ Enter command: } + eval $CMD > %b + +o Open bash to next free console + open -s -- /bin/bash + +u Upper case selection + TMPFILE=`mktemp ${MC_TMPDIR:-/tmp}/up.XXXXXX` || exit 1 + cat %b > $TMPFILE + cat $TMPFILE| sed 's/\(.*\)/\U\1/' >%b + rm -f $TMPFILE + +l Lower case selection + TMPFILE=`mktemp ${MC_TMPDIR:-/tmp}/up.XXXXXX` || exit 1 + cat %b > $TMPFILE + cat $TMPFILE| sed 's/\(.*\)/\U\1/' >%b + rm -f $TMPFILE + +#-------------------------- End of common section ----------------------------- diff --git a/user-config-unused/mc/.config/mc/sfs.ini b/user-config-unused/mc/.config/mc/sfs.ini new file mode 100644 index 0000000..522cca1 --- /dev/null +++ b/user-config-unused/mc/.config/mc/sfs.ini @@ -0,0 +1,28 @@ +# +# This is config for Single File fileSystem +# +# Notice that output files (%3) are pre-created atomically in /tmp +# with 0600 rights, so it is safe to > %3 +# +gz/1 gzip < %1 > %3 +ugz/1 gzip -cdf < %1 > %3 +bz/1 bzip < %1 > %3 +ubz/1 bzip -d < %1 > %3 +bz2/1 bzip2 < %1 > %3 +ubz2/1 bzip2 -d < %1 > %3 +lzma/1 lzma < %1 > %3 +ulzma/1 lzma -d < %1 > %3 +xz/1 xz < %1 > %3 +uxz/1 xz -d < %1 > %3 +tar/1 tar cf %3 %1 +tgz/1 tar czf %3 %1 +uhtml/1 lynx -force_html -dump %1 > %3 +uman/1 groff -Tascii -man %1 > %3 +uue/1 uuenpipe < %1 > %3 +uude/1 uudepipe < %1 > %3 +crlf/1 todos < %1 > %3 +cr/1 fromdos < %1 > %3 +# Fixme: we need it to fail whenever it should +url:2 lynx -source `echo "%2" | sed 's-|-/-g'` > %3 +nop/1 cat %1 > %3 +strings/1 strings %1 > %3 diff --git a/user-config-unused/ncmpcpp/.ncmpcpp/bindings b/user-config-unused/ncmpcpp/.ncmpcpp/bindings new file mode 100644 index 0000000..dca6280 --- /dev/null +++ b/user-config-unused/ncmpcpp/.ncmpcpp/bindings @@ -0,0 +1,522 @@ +########################################################## +## +##### General rules ##### +## +## 1) Because each action has runtime checks whether it's +## ok to run it, a few actions can be bound to one key. +## Actions will be bound in order given in configuration +## file. When a key is pressed, first action in order +## will test itself whether it's possible to run it. If +## test succeeds, action is executed and other actions +## bound to this key are ignored. If it doesn't, next +## action in order tests itself etc. +## +## 2) It's possible to bind more that one action at once +## to a key. It can be done using the following syntax: +## +## def_key "key" +## action1 +## action2 +## ... +## +## This creates chain of actions. When such chain is +## executed, each action in chain is run until the end of +## chain is reached or one of actions failed to execute +## due to its requirements not being met. Note that +## execution of chain of actions ALWAYS succeeds, no +## matter if one of actions from the chain failed (even +## if it was the first one in order and thus nothing +## was really executed). Because of that, if you decide +## to bind both actions and chains to a single key, make +## sure that chain is defined in the end. Otherwise, all +## actions bound to the key after chain will never be run. +## +## 3) When ncmpcpp starts, bindings configuration file is +## parsed and then ncmpcpp provides "missing pieces" +## of default keybindings. If you want to disable some +## bindings, there is a special action called 'dummy' +## for that purpose. Eg. if you want to disable ability +## to crop playlists, you need to put the following +## into configuration file: +## +## def_key "C" +## dummy +## +## After that ncmpcpp will not bind any default action +## to this key. +## +## 4) To let you write simple macros, the following special +## actions are provided: +## +## - push_character "character" - pushes given special +## character into input queue, so it will be immediately +## picked by ncmpcpp upon next call to readKey function. +## Accepted values: mouse, up, down, page_up, page_down, +## home, end, space, enter, insert, delete, left, right, +## tab, shift_tab, ctrl_a, ctrl_b, ..., ctrl_z, f1, f2, +## ..., f12, backspace, backspace_2. +## +## - push_characters "string" - pushes given string into +## input queue. +## +## - require_runnable "action" - checks whether given action +## is runnable and fails if it isn't. This is especially +## useful when mixed with previous two functions. Consider +## the following macro definition: +## +## def_key "key" +## push_characters "custom_filter" +## apply_filter +## +## If apply_filter can't be currently run, we end up with +## sequence of characters in input queue which will be +## treated just as we typed them. This may lead to unexpected +## results (in this case 'c' will most likely clear current +## playlist, 'u' will trigger database update, 's' will stop +## playback etc.). To prevent such thing from happening, we +## need to change above definition to this one: +## +## def_key "key" +## require_runnable "apply_filter" +## push_characters "custom_filter" +## apply_filter +## +## Here, first we test whether apply_filter can be actually run +## before we stuff characters into input queue, so if condition +## is not met, whole chain is aborted and we're fine. +## +## - require_screen "screen" - checks whether given screen is +## currently active. accepted values: browser, clock, help, +## media_library, outputs, playlist, playlist_editor, +## search_engine, tag_editor, visualizer, last_fm, lyrics, +## selected_items_adder, server_info, song_info, +## sort_playlist_dialog, tiny_tag_editor. +## +## - run_external_command "command" - runs given command using +## system() function. +## +## 5) In addition to binding to a key, you can also bind actions +## or chains of actions to a command. If it comes to commands, +## syntax is very similar to defining keys. Here goes example +## definition of a command: +## +## def_command "quit" [deferred] +## stop +## quit +## +## If you execute the above command (which can be done by +## invoking action execute_command, typing 'quit' and pressing +## enter), ncmpcpp will stop the player and then quit. Note the +## presence of word 'deferred' enclosed in square brackets. It +## tells ncmpcpp to wait for confirmation (ie. pressing enter) +## after you typed quit. Instead of 'deferred', 'immediate' +## could be used. Then ncmpcpp will not wait for confirmation +## (enter) and will execute the command the moment it sees it. +## +## Note: Both 'backspace' and 'backspace_2' are used because some +## terminals interpret backspace using keycode of 'backspace' +## and some the one of 'backspace_2'. You can get away with +## binding once if all your terminal emulators use the same +## value. +## +## Note: There is a difference between: +## +## def_key "key" +## action1 +## +## def_key "key" +## action2 +## +## and +## +## def_key "key" +## action1 +## action2 +## +## First one binds two single actions to the same key whilst +## second one defines a chain of actions. The behavior of +## these two is different and is described in (1) and (2). +## +## Note: Function def_key accepts non-ascii characters. +## +##### List of unbound actions ##### +## +## The following actions are not bound to any key/command: +## +## - set_volume +## - filter_playlist_on_priorities +## + +# Use j and k for scrolling up and down +def_key "j" + scroll_down + +def_key "k" + scroll_up + +def_key "d" + delete_playlist_items + +#def_key "mouse" +# mouse_event +# +#def_key "up" +# scroll_up +# +#def_key "down" +# scroll_down +# +#def_key "[" +# scroll_up_album +# +#def_key "]" +# scroll_down_album +# +#def_key "{" +# scroll_up_artist +# +#def_key "}" +# scroll_down_artist +# +#def_key "page_up" +# page_up +# +#def_key "page_down" +# page_down +# +#def_key "home" +# move_home +# +#def_key "end" +# move_end +# +#def_key "space" +# press_space +# +#def_key "enter" +# press_enter +# +#def_key "delete" +# delete_playlist_items +# +#def_key "delete" +# delete_stored_playlist +# +#def_key "right" +# next_column +# +#def_key "right" +# slave_screen +# +#def_key "right" +# volume_up +# +#def_key "+" +# volume_up +# +#def_key "left" +# previous_column +# +#def_key "left" +# master_screen +# +#def_key "left" +# volume_down +# +#def_key "-" +# volume_down +# +#def_key ":" +# execute_command +# +#def_key "tab" +# next_screen +# +#def_key "shift_tab" +# previous_screen +# +#def_key "f1" +# show_help +# +#def_key "1" +# show_playlist +# +#def_key "2" +# show_browser +# +#def_key "2" +# change_browse_mode +# +#def_key "3" +# show_search_engine +# +#def_key "3" +# reset_search_engine +# +#def_key "4" +# show_media_library +# +#def_key "4" +# toggle_media_library_columns_mode +# +#def_key "5" +# show_playlist_editor +# +#def_key "6" +# show_tag_editor +# +#def_key "7" +# show_outputs +# +#def_key "8" +# show_visualizer +# +#def_key "=" +# show_clock +# +#def_key "@" +# show_server_info +# +#def_key "s" +# stop +# +#def_key "p" +# pause +# +#def_key ">" +# next +# +#def_key "<" +# previous +# +#def_key "ctrl_h" +# jump_to_parent_directory +# +#def_key "ctrl_h" +# replay_song +# +#def_key "backspace" +# jump_to_parent_directory +# +#def_key "backspace" +# replay_song +# +#def_key "backspace_2" +# jump_to_parent_directory +# +#def_key "backspace_2" +# replay_song +# +#def_key "f" +# seek_forward +# +#def_key "b" +# seek_backward +# +#def_key "r" +# toggle_repeat +# +#def_key "z" +# toggle_random +# +#def_key "y" +# save_tag_changes +# +#def_key "y" +# start_searching +# +#def_key "y" +# toggle_single +# +#def_key "R" +# toggle_consume +# +#def_key "Y" +# toggle_replay_gain_mode +# +#def_key "t" +# toggle_space_mode +# +#def_key "T" +# toggle_add_mode +# +#def_key "|" +# toggle_mouse +# +#def_key "#" +# toggle_bitrate_visibility +# +#def_key "Z" +# shuffle +# +#def_key "x" +# toggle_crossfade +# +#def_key "X" +# set_crossfade +# +#def_key "u" +# update_database +# +#def_key "ctrl_v" +# sort_playlist +# +#def_key "ctrl_r" +# reverse_playlist +# +#def_key "ctrl_f" +# apply_filter +# +#def_key "/" +# find +# +#def_key "/" +# find_item_forward +# +#def_key "?" +# find +# +#def_key "?" +# find_item_backward +# +#def_key "." +# next_found_item +# +#def_key "," +# previous_found_item +# +#def_key "w" +# toggle_find_mode +# +#def_key "e" +# edit_song +# +#def_key "e" +# edit_library_tag +# +#def_key "e" +# edit_library_album +# +#def_key "e" +# edit_directory_name +# +#def_key "e" +# edit_playlist_name +# +#def_key "e" +# edit_lyrics +# +#def_key "i" +# show_song_info +# +#def_key "I" +# show_artist_info +# +#def_key "g" +# jump_to_position_in_song +# +#def_key "l" +# show_lyrics +# +#def_key "v" +# reverse_selection +# +#def_key "V" +# remove_selection +# +#def_key "B" +# select_album +# +#def_key "a" +# add_selected_items +# +#def_key "c" +# clear_playlist +# +#def_key "c" +# clear_main_playlist +# +#def_key "C" +# crop_playlist +# +#def_key "C" +# crop_main_playlist +# +#def_key "m" +# move_sort_order_up +# +#def_key "m" +# move_selected_items_up +# +#def_key "m" +# toggle_media_library_sort_mode +# +#def_key "n" +# move_sort_order_down +# +#def_key "n" +# move_selected_items_down +# +#def_key "M" +# move_selected_items_to +# +#def_key "A" +# add +# +#def_key "S" +# save_playlist +# +#def_key "o" +# jump_to_playing_song +# +#def_key "G" +# jump_to_browser +# +#def_key "G" +# jump_to_playlist_editor +# +#def_key "~" +# jump_to_media_library +# +#def_key "E" +# jump_to_tag_editor +# +#def_key "U" +# toggle_playing_song_centering +# +#def_key "P" +# toggle_display_mode +# +#def_key "\\" +# toggle_interface +# +#def_key "!" +# toggle_separators_between_albums +# +#def_key "L" +# toggle_lyrics_fetcher +# +#def_key "F" +# toggle_fetching_lyrics_in_background +# +#def_key "ctrl_l" +# toggle_screen_lock +# +#def_key "`" +# toggle_browser_sort_mode +# +#def_key "`" +# toggle_library_tag_type +# +#def_key "`" +# refetch_lyrics +# +#def_key "`" +# add_random_items +# +#def_key "ctrl_p" +# set_selected_items_priority +# +#def_key "q" +# quit +# diff --git a/user-config-unused/ncmpcpp/.ncmpcpp/config b/user-config-unused/ncmpcpp/.ncmpcpp/config new file mode 100644 index 0000000..bd5437c --- /dev/null +++ b/user-config-unused/ncmpcpp/.ncmpcpp/config @@ -0,0 +1,29 @@ +#################################################### +## this is example configuration file, copy it to ## +## ~/.ncmpcpp/config and set up your preferences ## +#################################################### +# +##### connection settings ##### +# +## set it in order to make tag editor and renaming files work properly +# +mpd_host = "patchMeIn@localhost" +# +mpd_port = "6600" +# +mpd_music_dir = "/home/collin/Music" +# +#mpd_connection_timeout = "5" + +#execute_on_song_change = "notify-send -t 3000 \"$(ncmpcpp --now-playing '{%t\n%b - %a}|{%f}')\"" +execute_on_song_change = "notify-send -t 3000 "$(mpc status | sed -n 1p | sed 's/ - /\n/g')"" +playlist_display_mode = "columns" +browser_display_mode = "columns" +search_engine_display_mode = "columns" +#fancy_scrolling = "yes" #DEPRECIATED +user_interface = "alternative" + +visualizer_fifo_path = "/home/collin/.mpd/mpd.fifo" +visualizer_output_name = "RekahSoft FIFO" +visualizer_sync_interval = "30" +visualizer_type = "spectrum" # (spectrum/wave/wave_filled/ellipse) diff --git a/user-config-unused/obmenugen/.config/obmenugen/exclusions b/user-config-unused/obmenugen/.config/obmenugen/exclusions new file mode 100644 index 0000000..e0530a8 --- /dev/null +++ b/user-config-unused/obmenugen/.config/obmenugen/exclusions @@ -0,0 +1,13 @@ +# OpenBox Menu Generator exclusions file +# +# Lines starting with a '#' character and empty lines are ignored. +# Put one exclusion per line. +# Exclusions are case sensitive and are matched against +# the 'Name' of the entry (the text that appears in menuitems). +# +# Exclusions format examples: +# ^example$ exact match with 'example'. +# ^example match any string that begins whith 'example'. +# example$ match any string that ends with 'example'. +# example match any string containing 'example'. + diff --git a/user-config-unused/obmenugen/.config/obmenugen/obmenugen.cfg b/user-config-unused/obmenugen/.config/obmenugen/obmenugen.cfg new file mode 100644 index 0000000..699163c --- /dev/null +++ b/user-config-unused/obmenugen/.config/obmenugen/obmenugen.cfg @@ -0,0 +1,35 @@ +# OpenBox Menu Generator config file +# +# Lines starting with a '#' character and empty lines are ignored. +# Keys and values are case sensitive. Keep all keys lowercase. +# Removing or commenting any config line will cause an error. + +# Top Menu section +# 'terminal' and 'editor' are REQUIRED +# 'filemanager', 'webbrowser' and 'run command' are optional. +# Leaving optional values empty causes the corresponding +# menu item to be hidden, no matter what show/hide option says. +terminal = urxvt +editor = emacs +filemanager = urxvt -e mc +webbrowser = firefox +instant messaging = +run command = gmrun + +# Lock Screen menuitem +# Also leaving it empty causes menuitem to be hidden +lock command = xscreensaver-command -lock + +# Exit menuitem +# Giving this an empty value don't hides the menuitem +# but uses the default OpenBox action "Exit" +exit command = + +# OnlyShowIn Exclusions +# There is a 'OnlyShowIn' directive in .desktop files. +# This directive is self-descriptive :) +# You can put here (in lowercase) any directive's posible value +# you want to be excluded from the menu, comma-separeted. +# Leaving this value empty won't exclude any entry by this criteria. +exclude onlyshowin = kde,gnome + diff --git a/user-config-unused/obmenugen/.config/obmenugen/obmenugen.schema b/user-config-unused/obmenugen/.config/obmenugen/obmenugen.schema new file mode 100644 index 0000000..93f1bdc --- /dev/null +++ b/user-config-unused/obmenugen/.config/obmenugen/obmenugen.schema @@ -0,0 +1,43 @@ +# OpenBox Menu Generator Schema file + +# Each (non-empty or non-comment) line of this file must be in the form: +# 'type:options' +# +# 'type' could be one of the following values: +# 'item', 'submenu', 'sep', 'cat', 'raw', 'file' +# +# Posible values for each of this types are: +# For 'item': 'terminal', 'filemanager', 'webbrowser', 'instantmessaging', 'editor', 'runcommand', 'lock', 'exit' +# For 'submenu': 'windowsanddesktops', 'openbox' +# For 'sep': A string representing the LABEL for the separator or none +# For 'cat': Any of the posible categories. See obmenugen --help +# For 'raw': A hardcoded XML line in the OpenBox's menu.xml file format +# Example: raw:lbreakout2 +# For file: The name of a file with a chunk of XML in the OpenBox's menu.xml file format. +# The file must be in ~/.config/obmenugen/ +# Example: file:extras.xml +# +# Comments are lines begining with a # character, to the end of the line. +item:terminal +item:filemanager +item:webbrowser +item:instantmessaging +item:editor +item:runcommand +submenu:windowsanddesktops +sep:Applications +cat:accesories +cat:graphics +cat:audiovideo +cat:education +cat:office +cat:games +cat:network +cat:development +cat:settings +cat:system +submenu:openbox +sep: +item:lock +item:exit + diff --git a/user-config-unused/openbox/.config/openbox/autostart.sh b/user-config-unused/openbox/.config/openbox/autostart.sh new file mode 100755 index 0000000..a9bf588 --- /dev/null +++ b/user-config-unused/openbox/.config/openbox/autostart.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/user-config-unused/openbox/.config/openbox/menu.xml b/user-config-unused/openbox/.config/openbox/menu.xml new file mode 100644 index 0000000..286b0af --- /dev/null +++ b/user-config-unused/openbox/.config/openbox/menu.xml @@ -0,0 +1,91 @@ + + + + urxvt + urxvt -e mc + firefox + emacs + gmrun + + + + + pcmanfm + graveman + parcellite + speedcrunch + + + gimp-2.6 + gpicview + + + easytag + smplayer -add-to-playlist + mplayer -really-quiet + smplayer + vlc + + + htmldoc + openoffice -base + openoffice -calc + openoffice -draw + openoffice -impress + openoffice -math + openoffice-printeradmin + openoffice -writer + openoffice + zathura + + + /usr/bin/doom3 + + + /usr/bin/bssh + /usr/bin/bvnc + deluge-gtk + firefox -safe-mode + firefox-beta-bin -safe-mode + firefox-beta-bin + firefox + /usr/share/zenmap/su-to-zenmap.sh + zenmap + unison-x11 + + + cmake-gui + drracket + emacs + /usr/bin/assistant + /usr/bin/designer + /usr/bin/linguist + + + /usr/bin/nvidia-settings + libfm-pref-apps + /usr/bin/qtconfig + xscreensaver-demo + + + /usr/bin/avahi-discover + urxvt -e htop + ophcrack + VirtualBox + urxvt + + + + + emacs /home/collin/.config/openbox/autostart.sh + emacs /home/collin/.config/openbox/rc.xml + + emacs /home/collin/.config/obmenugen/obmenugen.cfg + emacs /home/collin/.config/obmenugen/exclusions + emacs /home/collin/.config/obmenugen/obmenugen.schema + + + xscreensaver-command -lock + + + diff --git a/user-config-unused/openbox/.config/openbox/rc.xml b/user-config-unused/openbox/.config/openbox/rc.xml new file mode 100644 index 0000000..55690dd --- /dev/null +++ b/user-config-unused/openbox/.config/openbox/rc.xml @@ -0,0 +1,732 @@ + + + + + + + + 10 + 20 + + + + yes + + no + + yes + + no + + 200 + + no + + + + + Smart + +
yes
+ + Active + + 1 + +
+ + + Clearlooks + NLIMC + + yes + yes + + sans + 8 + + bold + + normal + + + + sans + 8 + + bold + + normal + + + + sans + 9 + + normal + + normal + + + + sans + 9 + + normal + + normal + + + + sans + 9 + + bold + + normal + + + + + + + 4 + 1 + + + + 875 + + + + + yes + Nonpixel + + Center + + + + + 10 + + 10 + + + + + + + 0 + 0 + 0 + 0 + + + + TopLeft + + 0 + 0 + no + Above + + Vertical + + no + 300 + + 300 + + Middle + + + + + C-g + + + + gmrun + + + + + nono + + + nono + + + nono + + + nono + + + nono + + + nono + + + nono + + + nono + + + 1 + + + 2 + + + 3 + + + 4 + + + + + + + + + + + + + + + + client-menu + + + + + + + + + + + + yesyes + + + + + + + + true + Konqueror + + kfmclient openProfile filemanagement + + + + + + 8 + + 200 + + 400 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + client-menu + + + + + + + + + + + top + + + + + + + + + + left + + + + + + client-menu + + + + + + + + + + right + + + + + + client-menu + + + + + + + + + + bottom + + + + + + + + + + + + client-menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + client-menu + + + + + client-menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + client-list-combined-menu + + + root-menu + + + + + + + + + + + + + + + + + + + + + + + + menu.xml + 200 + + no + + 100 + + 400 + + if this is a negative value, then the delay is infinite and the + submenu will not be hidden until a different submenu is opened --> + yes + + yes + + + + + + + +
diff --git a/user-config-unused/pekwm/.pekwm/config b/user-config-unused/pekwm/.pekwm/config new file mode 100644 index 0000000..5093160 --- /dev/null +++ b/user-config-unused/pekwm/.pekwm/config @@ -0,0 +1,108 @@ +Files { + Keys = "~/.pekwm/keys" + Mouse = "~/.pekwm/mouse" + Menu = "~/.pekwm/menu" + Start = "~/.pekwm/start" + AutoProps = "~/.pekwm/autoproperties" + Theme = "$_PEKWM_THEME_PATH/" + Icons = "~/.pekwm/icons/" +} + +MoveResize { + EdgeAttract = "10" + EdgeResist = "10" + WindowAttract = "5" + WindowResist = "5" + OpaqueMove = "True" + OpaqueResize = "False" +} + +Screen { + Workspaces = "9" + WorkspacesPerRow = "3" + WorkspaceNames = "Main;Web;E-mail;Music;Work 05;Work 06;Work 07;Work 08;Work 09" + ShowFrameList = "True" + ShowStatusWindow = "True" + ShowStatusWindowCenteredOnRoot = "False" + ShowClientID = "False" + ShowWorkspaceIndicator = "500" + PlaceNew = "True" + FocusNew = "True" + + ReportAllClients = "False" + + TrimTitle = "..." + FullscreenAbove = "True" + FullscreenDetect = "True" + HonourRandr = "True" + HonourAspectRatio = "True" + EdgeSize = "1 1 1 1" + EdgeIndent = "False" + PixmapCacheSize = "20" + DoubleClickTime = "250" + + Placement { + Model = "CenteredOnParent Smart MouseNotUnder" + Smart { + Row = "True" + TopToBottom = "True" + LeftToRight = "True" + OffsetX = "0" + OffsetY = "0" + } + } + + UniqueNames { + SetUnique = "False" + Pre = " #" + Post = "" + } +} + +Menu { + DisplayIcons = "True" + + Icons = "DEFAULT" { + Minimum = "16x16" + Maximum = "16x16" + } + + # To enable make separate window have other icon size restrictions, + # for example wallpaper menu found in pekwm_menu_tools, set the following + # for each menu you want to "free". + + # Icons = "Wallpaper" { + # Minimum = "64x64" + # Maximum = "64x64" + # } + + # Defines how menus act on mouse input. + # Possible values are: "ButtonPress ButtonRelease DoubleClick Motion" + # To make submenus open on mouse over, comment the default Enter, + # uncomment the alternative, and reload pekwm. + + Select = "Motion MotionPressed" + Enter = "MotionPressed ButtonPress" + # Enter = "Motion" + Exec = "ButtonRelease" +} + +CmdDialog { + HistoryUnique = "True" + HistorySize = "1024" + HistoryFile = "~/.pekwm/history" + HistorySaveInterval = "16" +} + +Harbour { + OnTop = "True" + MaximizeOver = "False" + Placement = "Right" + Orientation = "TopToBottom" + Head = "0" + + DockApp { + SideMin = "64" + SideMax = "0" + } +} diff --git a/user-config-unused/pekwm/.pekwm/keys b/user-config-unused/pekwm/.pekwm/keys new file mode 100644 index 0000000..6002088 --- /dev/null +++ b/user-config-unused/pekwm/.pekwm/keys @@ -0,0 +1,315 @@ +INCLUDE = "vars" + +Global { +# - - ----------------------------------------------- - - +# Simple bindings to most frequently used actions. +# +# Adding your own frequently used actions is easy - +# just copy it over from CHAINS and edit the keypress! + # Moving in frames + KeyPress = "Mod1 Tab" { Actions = "NextFrame EndRaise" } + KeyPress = "Mod1 Shift Tab" { Actions = "PrevFrame EndRaise" } + KeyPress = "Mod1 Ctrl Tab" { Actions = "NextFrameMRU EndRaise" } + KeyPress = "Mod1 Ctrl Shift Tab" { Actions = "PrevFrameMRU EndRaise" } + KeyPress = "Mod4 Tab" { Actions = "ActivateClientRel 1" } + KeyPress = "Mod4 Shift Tab" { Actions = "ActivateClientRel -1" } + KeyPress = "Mod4 Ctrl Right" { Actions = "MoveClientRel 1" } + KeyPress = "Mod4 Ctrl Left" { Actions = "MoveClientRel -1" } + KeyPress = "Mod4 Left" { Actions = "FocusDirectional Left" } + KeyPress = "Mod4 Right" { Actions = "FocusDirectional Right" } + KeyPress = "Mod4 Up" { Actions = "FocusDirectional Up" } + KeyPress = "Mod4 Down" { Actions = "FocusDirectional Down" } + # Moving in workspaces + KeyPress = "Ctrl Mod1 Left" { Actions = "GotoWorkspace Left" } + KeyPress = "Ctrl Mod1 Right" { Actions = "GotoWorkspace Right" } + KeyPress = "Ctrl Mod1 Up" { Actions = "GotoWorkspace Up" } + KeyPress = "Ctrl Mod1 Down" { Actions = "GotoWorkspace Down" } + KeyPress = "Mod4 1" { Actions = "GotoWorkspace 1" } + KeyPress = "Mod4 2" { Actions = "GotoWorkspace 2" } + KeyPress = "Mod4 3" { Actions = "GotoWorkspace 3" } + KeyPress = "Mod4 4" { Actions = "GotoWorkspace 4" } + KeyPress = "Mod4 5" { Actions = "GotoWorkspace 5" } + KeyPress = "Mod4 6" { Actions = "GotoWorkspace 6" } + KeyPress = "Mod4 7" { Actions = "GotoWorkspace 7" } + KeyPress = "Mod4 8" { Actions = "GotoWorkspace 8" } + KeyPress = "Mod4 9" { Actions = "GotoWorkspace 9" } + KeyPress = "Ctrl Mod1 Shift Left" { Actions = "SendToWorkspace Next; GoToWorkspace Next" } + KeyPress = "Ctrl Mod1 Shift Right" { Actions = "SendToWorkspace Prev; GoToWorkspace Prev" } + KeyPress = "Ctrl Mod1 Shift Up" { Actions = "SendToWorkspace NextV; GoToWorkspace NextV" } + KeyPress = "Ctrl Mod1 Shift Down" { Actions = "SendToWorkspace PrevV; GoToWorkspace PrevV" } + KeyPress = "Mod4 F1" { Actions = "SendToWorkspace 1" } + KeyPress = "Mod4 F2" { Actions = "SendToWorkspace 2" } + KeyPress = "Mod4 F3" { Actions = "SendToWorkspace 3" } + KeyPress = "Mod4 F4" { Actions = "SendToWorkspace 4" } + KeyPress = "Mod4 F5" { Actions = "SendToWorkspace 5" } + KeyPress = "Mod4 F6" { Actions = "SendToWorkspace 6" } + KeyPress = "Mod4 F7" { Actions = "SendToWorkspace 7" } + KeyPress = "Mod4 F8" { Actions = "SendToWorkspace 8" } + KeyPress = "Mod4 F9" { Actions = "SendToWorkspace 9" } + # Simple window management + KeyPress = "Mod4 M" { Actions = "Toggle Maximized True True" } + KeyPress = "Mod4 G" { Actions = "Maxfill True True" } + KeyPress = "Mod4 F" { Actions = "Toggle FullScreen" } + KeyPress = "Mod4 Return" { Actions = "MoveResize" } + KeyPress = "Mod4 Q" { Actions = "Close" } + KeyPress = "Mod4 S" { Actions = "Toggle Shaded" } + KeyPress = "Mod4 I" { Actions = "Toggle Iconified" } + # Marking + KeyPress = "Mod4 Z" { Actions = "Toggle Marked" } + KeyPress = "Mod4 A" { Actions = "AttachMarked" } + # Tagging + KeyPress = "Mod4 T" { Actions = "Toggle Tagged False" } + # Menus + KeyPress = "Mod4 R" { Actions = "ShowMenu Root" } + KeyPress = "Mod4 W" { Actions = "ShowMenu Window" } + KeyPress = "Mod4 L" { Actions = "ShowMenu Goto" } + KeyPress = "Mod4 C" { Actions = "ShowMenu GotoClient" } + KeyPress = "Mod4 Shift I" { Actions = "ShowMenu Icon" } + KeyPress = "Mod4 X" { Actions = "HideAllMenus" } + # External Commands + KeyPress = "Mod4 E" { Actions = "Exec $TERM" } + # Pekwm control + KeyPress = "Ctrl Mod1 Delete" { Actions = "Reload" } + KeyPress = "Mod4 D" { Actions = "ShowCmdDialog" } + KeyPress = "Mod4 V" { Actions = "ShowSearchDialog" } + KeyPress = "Mod4 H" { Actions = "Toggle HarbourHidden" } + +# - - ----------------------------------------------- - - +# CHAINS. These give you access to just about everything. + # Move to Corner + Chain = "Ctrl Mod1 C" { + KeyPress = "Q" { Actions = "MoveToEdge TopLeft" } + KeyPress = "Y" { Actions = "MoveToEdge TopCenterEdge" } + KeyPress = "W" { Actions = "MoveToEdge TopCenterEdge" } + KeyPress = "Shift Y" { Actions = "MoveToEdge TopEdge" } + KeyPress = "Shift W" { Actions = "MoveToEdge TopEdge" } + KeyPress = "P" { Actions = "MoveToEdge TopRight" } + KeyPress = "E" { Actions = "MoveToEdge TopRight" } + KeyPress = "A" { Actions = "MoveToEdge LeftCenterEdge" } + KeyPress = "Shift A" { Actions = "MoveToEdge LeftEdge" } + KeyPress = "L" { Actions = "MoveToEdge RightCenterEdge" } + KeyPress = "D" { Actions = "MoveToEdge RightCenterEdge" } + KeyPress = "Shift L" { Actions = "MoveToEdge RightEdge" } + KeyPress = "Shift D" { Actions = "MoveToEdge RightEdge" } + KeyPress = "Z" { Actions = "MoveToEdge BottomLeft" } + KeyPress = "B" { Actions = "MoveToEdge BottomCenterEdge" } + KeyPress = "X" { Actions = "MoveToEdge BottomCenterEdge" } + KeyPress = "Shift B" { Actions = "MoveToEdge BottomEdge" } + KeyPress = "Shift X" { Actions = "MoveToEdge BottomEdge" } + KeyPress = "M" { Actions = "MoveToEdge BottomRight" } + KeyPress = "C" { Actions = "MoveToEdge BottomRight" } + KeyPress = "H" { Actions = "MoveToEdge Center" } + KeyPress = "S" { Actions = "MoveToEdge Center" } + } + # Menus + Chain = "Ctrl Mod1 M" { + KeyPress = "R" { Actions = "ShowMenu Root" } + KeyPress = "W" { Actions = "ShowMenu Window" } + KeyPress = "I" { Actions = "ShowMenu Icon" } + KeyPress = "G" { Actions = "ShowMenu Goto" } + KeyPress = "C" { Actions = "ShowMenu GotoClient" } + KeyPress = "D" { Actions = "ShowMenu Decor" } + KeyPress = "A" { Actions = "ShowMenu AttachClientInFrame" } + KeyPress = "F" { Actions = "ShowMenu AttachFrameInFrame" } + Keypress = "Shift A" { Actions = "ShowMenu AttachClient" } + Keypress = "Shift F" { Actions = "ShowMenu AttachFrame" } + KeyPress = "X" { Actions = "HideAllMenus" } + } + # Grouping + Chain = "Ctrl Mod1 T" { + KeyPress = "T" { Actions = "Toggle Tagged False" } + KeyPress = "B" { Actions = "Toggle Tagged True" } + KeyPress = "C" { Actions = "Unset Tagged" } + KeyPress = "G" { Actions = "Toggle GlobalGrouping" } + KeyPress = "M" { Actions = "Toggle Marked" } + KeyPress = "A" { Actions = "AttachMarked" } + KeyPress = "D" { Actions = "Detach" } + Keypress = "P" { Actions = "AttachClientInNextFrame" } + KeyPress = "O" { Actions = "AttachClientInPrevFrame" } + Keypress = "I" { Actions = "AttachFrameInNextFrame" } + KeyPress = "U" { Actions = "AttachFrameInPrevFrame" } + } + # Decor Toggles + Chain = "Ctrl Mod1 D" { + KeyPress = "B" { Actions = "Toggle DecorBorder" } + KeyPress = "T" { Actions = "Toggle DecorTitlebar" } + KeyPress = "D" { Actions = "Toggle DecorBorder; Toggle DecorTitlebar" } + } + # Window Actions + Chain = "Ctrl Mod1 A" { + Chain = "G" { + KeyPress = "G" { Actions = "MaxFill True True" } + KeyPress = "V" { Actions = "MaxFill False True" } + KeyPress = "H" { Actions = "MaxFill True False" } + } + Chain = "M" { + KeyPress = "M" { Actions = "Toggle Maximized True True" } + KeyPress = "V" { Actions = "Toggle Maximized False True" } + KeyPress = "H" { Actions = "Toggle Maximized True False" } + } + Chain = "Q" { + KeyPress = "Q" { Actions = "Close" } + KeyPress = "F" { Actions = "CloseFrame" } + KeyPress = "K" { Actions = "Kill" } + } + KeyPress = "S" { Actions = "Toggle Shaded" } + KeyPress = "A" { Actions = "Toggle Sticky" } + KeyPress = "O" { Actions = "Toggle AlwaysOnTop" } + KeyPress = "B" { Actions = "Toggle AlwaysBelow" } + KeyPress = "I" { Actions = "Set Iconified" } + KeyPress = "R" { Actions = "Raise" } + KeyPress = "Shift R" { Actions = "Raise True" } + KeyPress = "L" { Actions = "Lower" } + KeyPress = "Shift L" { Actions = "Lower True" } + KeyPress = "X" { Actions = "ActivateOrRaise" } + KeyPress = "Return" { Actions = "MoveResize" } + KeyPress = "F" { Actions = "Toggle Fullscreen" } + KeyPress = "Left" { Actions = "GrowDirection Left" } + KeyPress = "Right" { Actions = "GrowDirection Right" } + KeyPress = "Up" { Actions = "GrowDirection Up" } + KeyPress = "Down" { Actions = "GrowDirection Down" } + } + # Moving in Frames + Chain = "Ctrl Mod1 F" { + KeyPress = "P" { Actions = "NextFrame AlwaysRaise" } + KeyPress = "O" { Actions = "PrevFrame AlwaysRaise" } + KeyPress = "Shift P" { Actions = "NextFrameMRU EndRaise" } + KeyPress = "Shift O" { Actions = "PrevFrameMRU EndRaise" } + KeyPress = "I" { Actions = "ActivateClientRel 1" } + KeyPress = "U" { Actions = "ActivateClientRel -1" } + KeyPress = "Shift I" { Actions = "MoveClientRel 1" } + KeyPress = "Shift U" { Actions = "MoveClientRel -1" } + KeyPress = "Up" { Actions = "FocusDirectional Up" } + KeyPress = "Down" { Actions = "FocusDirectional Down" } + KeyPress = "Left" { Actions = "FocusDirectional Left" } + Keypress = "Right" { Actions = "FocusDirectional Right" } + KeyPress = "1" { Actions = "ActivateClientNum 1" } + KeyPress = "2" { Actions = "ActivateClientNum 2" } + KeyPress = "3" { Actions = "ActivateClientNum 3" } + KeyPress = "4" { Actions = "ActivateClientNum 4" } + KeyPress = "5" { Actions = "ActivateClientNum 5" } + KeyPress = "6" { Actions = "ActivateClientNum 6" } + KeyPress = "7" { Actions = "ActivateClientNum 7" } + KeyPress = "8" { Actions = "ActivateClientNum 8" } + KeyPress = "9" { Actions = "ActivateClientNum 9" } + KeyPress = "0" { Actions = "ActivateClientNum 10" } + KeyPress = "C" { Actions = "ShowCmdDialog GotoClientID " } + } + # Workspaces + Chain = "Ctrl Mod1 W" { + KeyPress = "Right" { Actions = "GoToWorkspace Right" } + KeyPress = "Left" { Actions = "GoToWorkspace Left" } + KeyPress = "N" { Actions = "GoToWorkspace Next" } + KeyPress = "P" { Actions = "GoToWorkspace Prev" } + KeyPress = "1" { Actions = "GoToWorkspace 1" } + KeyPress = "2" { Actions = "GoToWorkspace 2" } + KeyPress = "3" { Actions = "GoToWorkspace 3" } + KeyPress = "4" { Actions = "GoToWorkspace 4" } + KeyPress = "5" { Actions = "GoToWorkspace 5" } + KeyPress = "6" { Actions = "GoToWorkspace 6" } + KeyPress = "7" { Actions = "GoToWorkspace 7" } + KeyPress = "8" { Actions = "GoToWorkspace 8" } + KeyPress = "9" { Actions = "GoToWorkspace 9" } + KeyPress = "Up" { Actions = "SendToWorkspace Next; GoToWorkspace Next" } + KeyPress = "Down" { Actions = "SendToWorkspace Prev; GoToWorkspace Prev" } + KeyPress = "F1" { Actions = "SendToWorkspace 1" } + KeyPress = "F2" { Actions = "SendToWorkspace 2" } + KeyPress = "F3" { Actions = "SendToWorkspace 3" } + KeyPress = "F4" { Actions = "SendToWorkspace 4" } + KeyPress = "F5" { Actions = "SendToWorkspace 5" } + KeyPress = "F6" { Actions = "SendToWorkspace 6" } + KeyPress = "F7" { Actions = "SendToWorkspace 7" } + KeyPress = "F8" { Actions = "SendToWorkspace 8" } + KeyPress = "F9" { Actions = "SendToWorkspace 9" } + } + # External commands + Chain = "Ctrl Mod1 E" { + KeyPress = "E" { Actions = "Exec $TERM" } + KeyPress = "L" { Actions = "Exec xlock -mode blank &" } + KeyPress = "S" { Actions = "Exec scrot &" } + KeyPress = "C" { Actions = "ShowCmdDialog" } + } + # Wm actions + Chain = "Ctrl Mod1 P" { + KeyPress = "Delete" { Actions = "Reload" } + KeyPress = "Next" { Actions = "Restart" } + KeyPress = "End" { Actions = "Exit" } + KeyPress = "Prior" { Actions = "RestartOther twm" } + KeyPress = "D" { Actions = "ShowCmdDialog" } + KeyPress = "H" { Actions = "Toggle HarbourHidden" } + } + # Skipping + Chain = "Ctrl Mod1 S" { + Keypress = "M" { Actions = "Toggle Skip Menus" } + Keypress = "F" { Actions = "Toggle Skip FocusToggle" } + Keypress = "S" { Actions = "Toggle Skip Snap" } + } +} + +# Keys when MoveResize is active +MoveResize { + KeyPress = "Left" { Actions = "MoveHorizontal -10" } + KeyPress = "Right" { Actions = "MoveHorizontal 10" } + KeyPress = "Up" { Actions = "MoveVertical -10" } + KeyPress = "Down" { Actions = "MoveVertical 10" } + Keypress = "Shift Left" { Actions = "MoveHorizontal -1" } + Keypress = "Shift Right" { Actions = "MoveHorizontal 1" } + Keypress = "Shift Up" { Actions = "MoveVertical -1" } + Keypress = "Shift Down" { Actions = "MoveVertical 1" } + Keypress = "Mod4 Left" { Actions = "ResizeHorizontal -10" } + Keypress = "Mod4 Right" { Actions = "ResizeHorizontal 10" } + Keypress = "Mod4 Up" { Actions = "ResizeVertical -10" } + Keypress = "Mod4 Down" { Actions = "ResizeVertical 10" } + Keypress = "Mod1 Left" { Actions = "ResizeHorizontal -10" } + Keypress = "Mod1 Right" { Actions = "ResizeHorizontal 10" } + Keypress = "Mod1 Up" { Actions = "ResizeVertical -10" } + Keypress = "Mod1 Down" { Actions = "ResizeVertical 10" } + Keypress = "Shift Mod4 Left" { Actions = "ResizeHorizontal -1" } + Keypress = "Shift Mod4 Right" { Actions = "ResizeHorizontal 1" } + Keypress = "Shift Mod4 Up" { Actions = "ResizeVertical -1" } + Keypress = "Shift Mod4 Down" { Actions = "ResizeVertical 1" } + Keypress = "Shift Mod1 Left" { Actions = "ResizeHorizontal -1" } + Keypress = "Shift Mod1 Right" { Actions = "ResizeHorizontal 1" } + Keypress = "Shift Mod1 Up" { Actions = "ResizeVertical -1" } + Keypress = "Shift Mod1 Down" { Actions = "ResizeVertical 1" } + Keypress = "s" { Actions = "MoveSnap" } + Keypress = "Escape" { Actions = "Cancel" } + Keypress = "q" { Actions = "Cancel" } + Keypress = "Return" { Actions = "End" } +} + +# Keys for CmdDialog editing +InputDialog { + KeyPress = "Left" { Actions = "CursPrev" } + KeyPress = "Right" { Actions = "CursNext" } + KeyPress = "Ctrl A" { Actions = "CursBegin" } + KeyPress = "Ctrl E" { Actions = "CursEnd" } + KeyPress = "BackSpace" { Actions = "Erase;CompleteAbort" } + KeyPress = "Ctrl K" { Actions = "ClearFromCursor" } + KeyPress = "Ctrl C" { Actions = "Clear" } + KeyPress = "Return" { Actions = "Exec" } + KeyPress = "Escape" { Actions = "Close" } + KeyPress = "Up" { Actions = "HistPrev" } + KeyPress = "Down" { Actions = "HistNext" } + KeyPress = "Ctrl P" { Actions = "HistPrev" } + KeyPress = "Ctrl N" { Actions = "HistNext" } + KeyPress = "Ctrl B" { Actions = "CursPrev" } + KeyPress = "Ctrl F" { Actions = "CursNext" } + KeyPress = "Tab" { Actions = "Complete" } + KeyPress = "Any Any" { Actions = "Insert" } +} + +# Keys working in menus +Menu { + KeyPress = "Down" { Actions = "NextItem" } + KeyPress = "Up" { Actions = "PrevItem" } + KeyPress = "Ctrl N" { Actions = "NextItem" } + KeyPress = "Ctrl P" { Actions = "PrevItem" } + KeyPress = "Left" { Actions = "LeaveSubmenu" } + KeyPress = "Right" { Actions = "EnterSubmenu" } + KeyPress = "Return" { Actions = "Select" } + KeyPress = "space" { Actions = "Select" } + KeyPress = "Escape" { Actions = "Close" } + KeyPress = "Q" { Actions = "Close" } +} + diff --git a/user-config-unused/pekwm/.pekwm/menu b/user-config-unused/pekwm/.pekwm/menu new file mode 100644 index 0000000..3e22e98 --- /dev/null +++ b/user-config-unused/pekwm/.pekwm/menu @@ -0,0 +1,147 @@ +# Menu config for pekwm + +# Variables +INCLUDE = "vars" + +RootMenu = "Pekwm" { + Entry = "Terminal" { Actions = "Exec $TERM &" } + Entry = "Run.." { Actions = "ShowCmdDialog" } + + Separator {} + + Submenu = "Editors" { + Entry = "vim" { Actions = "Exec $TERM -title vim -e vim &" } + Entry = "gvim" { Actions = "Exec gvim &" } + Entry = "Emacs" { Actions = "Exec emacs &" } + Entry = "Emacs Terminal" { Actions = "Exec $TERM -title emacs -e emacs -nw &" } + Entry = "Kate" { Actions = "Exec kate &" } + } + Submenu = "Graphics" { + Entry = "display" { Actions = "Exec display &" } + Entry = "Gimp" { Actions = "Exec gimp &" } + Entry = "Gv" { Actions = "Exec gv &" } + Entry = "Xpdf" { Actions = "Exec xpdf &" } + Entry = "gqview" { Actions = "Exec gqview &" } + } + Submenu = "Multimedia" { + Entry = "Amarok" { Actions = "Exec amarok &" } + Entry = "Quod Libet" { Actions = "Exec quodlibet &" } + Entry = "Xmms" { Actions = "Exec xmms &" } + Entry = "MPlayer" { Actions = "Exec gnome-mplayer &" } + Entry = "Xine" { Actions = "Exec xine &" } + Entry = "xawtv" { Actions = "Exec xawtv &" } + Entry = "Totem" { actions = "exec totem &" } + Entry = "alsamixer" { Actions = "Exec $TERM -title alsamixer -e alsamixer &" } + } + Submenu = "Utils" { + Entry = "Calculator" { Actions = "Exec gcalctool &" } + Entry = "Xpdf" { Actions = "Exec xpdf &" } + Entry = "Evince" { Actions = "Exec evince &" } + Entry = "gucharmap" { Actions = "Exec gucharmap &" } + Entry = "Gkrellm" { Actions = "Exec gkrellm &" } + } + Submenu = "WWW" { + Entry = "Dillo" { Actions = "Exec dillo &" } + Entry = "Konqueror" { Actions = "Exec konqueror &" } + Entry = "Firefox" { Actions = "Exec firefox &" } + } + Submenu = "FTP" { + Entry = "gftp" { Actions = "Exec gftp &" } + Entry = "lftp" { Actions = "Exec $TERM -title lftp -e lftp &" } + } + Submenu = "Communication" { + Entry = "Mutt" { Actions = "Exec $TERM -title mutt -e mutt &" } + Entry = "Alpine" { Actions = "Exec $TERM -title alpine -e alpine &" } + Entry = "Thunderbird" { Actions = "Exec thunderbird &" } + Entry = "Evolution" { Actions = "Exec evolution &" } + Entry = "KMail" { Actions = "Exec kmail &" } + Entry = "Pidgin" { Actions = "Exec pidgin &" } + Entry = "Irssi" { Actions = "Exec $TERM -title irssi -e irssi &" } + Entry = "Kopete" { Actions = "Exec kopete &" } + } + Submenu = "Office" { + Entry = "KOffice Workspace" { Actions = "Exec koshell &" } + Entry = "OpenOffice" { Actions = "Exec ooffice &" } + } + Submenu = "Development" { + Entry = "Anjuta" { Actions = "Exec anjuta &" } + Entry = "Eclipse" { Actions = "Exec eclipse &" } + Entry = "KDevelop" { Actions = "Exec kdevelop &" } + } + + Separator {} + + Submenu = "Go to" { + SubMenu = "Workspace" { + # Create goto menu once per pekwm config reload. The fast way that + # will work for most if not all users. + COMMAND = "$_PEKWM_SCRIPT_PATH/pekwm_ws_menu.sh goto" + # Create goto menu every time the menu is opened. The slow way. + # This is what you want if you are using external tools to make + # the amount of workspaces something else than what you define in + # ~/.pekwm/config. You will know if you want this. + # Entry = "" { Actions = "Dynamic $_PEKWM_SCRIPT_PATH/pekwm_ws_menu.sh goto dynamic" } + } + Entry = "Window.." { Actions = "ShowMenu GotoClient True" } + } + Submenu = "Pekwm" { + Submenu = "Themes" { + Entry { Actions = "Dynamic $_PEKWM_SCRIPT_PATH/pekwm_themeset.sh $_PEKWM_THEME_PATH" } + Entry { Actions = "Dynamic $_PEKWM_SCRIPT_PATH/pekwm_themeset.sh ~/.pekwm/themes" } + } + Entry = "Reload" { Actions = "Reload" } + Entry = "Restart" { Actions = "Restart" } + Entry = "Exit" { Actions = "Exit" } + Submenu = "Exit to" { + Entry = "Xterm" { Actions = "RestartOther xterm" } + Entry = "TWM" { Actions = "RestartOther twm" } + } + } +} + +WindowMenu = "Window Menu" { + Entry = "(Un)Stick" { Actions = "Toggle Sticky" } + Entry = "(Un)Shade" { Actions = "Toggle Shaded" } + Entry = "Iconify" { Actions = "Set Iconified" } + Entry = "Command.." { Actions = "ShowCmdDialog" } + + Submenu = "Maximize" { + Entry = "Toggle Full" { Actions = "Toggle Maximized True True" } + Entry = "Toggle Horizontal" { Actions = "Toggle Maximized True False" } + Entry = "Toggle Vertical" { Actions = "Toggle Maximized False True" } + } + Submenu = "Fill" { + Entry = "Full" { Actions = "MaxFill True True" } + Entry = "Horizontal" { Actions = "MaxFill True False" } + Entry = "Vertical" { Actions = "MaxFill False True" } + } + Submenu = "Stacking" { + Entry = "Raise" { Actions = "Raise" } + Entry = "Lower" { Actions = "Lower" } + Entry = "Toggle Always On Top" { Actions = "Toggle AlwaysOnTop" } + Entry = "Toggle Always Below" { Actions = "Toggle AlwaysBelow" } + } + Submenu = "Decorations" { + Entry = "Toggle Decorations" { Actions = "Toggle DecorBorder; Toggle DecorTitlebar" } + Entry = "Toggle Borders" { Actions = "Toggle DecorBorder" } + Entry = "Toggle Titlebar" { Actions = "Toggle DecorTitlebar" } + } + Submenu = "Skip" { + Entry = "Toggle showing this frame in menus" { Actions = "Toggle Skip Menus" } + Entry = "Toggle including this frame in focus toggle" { Actions = "Toggle Skip FocusToggle" } + Entry = "Toggle if this frame snaps to other windows" { Actions = "Toggle Skip Snap" } + } + SubMenu = "Send To" { + # Create sendto menu once per pekwm config reload. The fast way that + # will work for most if not all users. + COMMAND = "$_PEKWM_SCRIPT_PATH/pekwm_ws_menu.sh send" + # Create sendto menu every time the menu is opened. The slow way. + # This is what you want if you are using external tools to make + # the amount of workspaces something else than what you define in + # ~/.pekwm/config. You will know if you want this. + # Entry = "" { Actions = "Dynamic $_PEKWM_SCRIPT_PATH/pekwm_ws_menu.sh send dynamic" } + } + Separator {} + Entry = "Close" { Actions = "Close" } + Submenu = "Kill" { Entry = "Kill application" { Actions = "Kill" } } +} diff --git a/user-config-unused/pekwm/.pekwm/mouse b/user-config-unused/pekwm/.pekwm/mouse new file mode 100644 index 0000000..3aa9ae8 --- /dev/null +++ b/user-config-unused/pekwm/.pekwm/mouse @@ -0,0 +1,182 @@ +FrameTitle { + ButtonRelease = "1" { Actions = "Raise; Focus; ActivateClient" } + ButtonRelease = "Mod1 1" { Actions = "Focus; Raise" } + ButtonRelease = "Mod4 1" { Actions = "Focus; Raise" } + ButtonRelease = "2" { Actions = "ActivateClient" } + ButtonRelease = "Mod4 3" { Actions = "Close" } + ButtonRelease = "3" { Actions = "ShowMenu Window" } + ButtonRelease = "4" { Actions = "ActivateClientRel 1" } + ButtonRelease = "5" { Actions = "ActivateClientRel -1" } + ButtonRelease = "Mod1 4" { Actions = "SendToWorkspace Next; GotoWorkspace Next" } + ButtonRelease = "Mod1 5" { Actions = "SendToWorkspace Prev; GotoWorkspace Prev" } + ButtonRelease = "Mod1 Shift 4" { Actions = "SendToWorkspace PrevV; GotoWorkspace PrevV" } + ButtonRelease = "Mod1 Shift 5" { Actions = "SendToWorkspace NextV; GotoWorkspace NextV" } + ButtonRelease = "Ctrl 4" { Actions = "MoveClientRel 1" } + ButtonRelease = "Ctrl 5" { Actions = "MoveClientRel -1" } + ButtonRelease = "Ctrl Mod1 1" { Actions = "Focus; Raise True" } + DoubleClick = "2" { Actions = "Toggle Shaded" } + DoubleClick = "Mod1 2" { Actions = "Toggle Shaded" } + DoubleClick = "1" { Actions = "MaxFill True True" } + DoubleClick = "Mod1 1" { Actions = "Toggle Maximized True True" } + Motion = "1" { Threshold = "4"; Actions = "Raise; Move" } + Motion = "Mod1 1" { Threshold = "4"; Actions = "Raise; Move" } + Motion = "Mod4 1" { Threshold = "4"; Actions = "Raise; Move" } + Motion = "2" { Threshold = "4"; Actions = "GroupingDrag True" } + Motion = "Mod1 3" { Actions = "Resize" } + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } +} + +OtherTitle { + ButtonRelease = "1" { Actions = "Raise; Focus" } + ButtonRelease = "2" { Actions = "Focus" } + ButtonRelease = "3" { Actions = "Close" } + ButtonRelease = "Mod4 3" { Actions = "ShowMenu Window" } + ButtonRelease = "Mod1 4" { Actions = "SendToWorkspace Next; GotoWorkspace Next" } + ButtonRelease = "Mod1 5" { Actions = "SendToWorkspace Prev; GotoWorkspace Prev" } + ButtonRelease = "Mod1 Shift 4" { Actions = "SendToWorkspace PrevV; GotoWorkspace PrevV" } + ButtonRelease = "Mod1 Shift 5" { Actions = "SendToWorkspace NextV; GotoWorkspace NextV" } + Motion = "1" { Threshold = "4"; Actions = "Raise; Move" } + Motion = "Mod1 1" { Threshold = "4"; Actions = "Raise; Move" } + Motion = "Mod4 1" { Threshold = "4"; Actions = "Raise; Move" } + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } +} + +Border { + TopLeft { + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } + ButtonPress = "1" { Actions = "Focus; Resize TopLeft" } } + Top { + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } + ButtonPress = "1" { Actions = "Focus; Resize Top" } } + TopRight { + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } + ButtonPress = "1" { Actions = "Focus; Resize TopRight" } } + Left { + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } + ButtonPress = "1" { Actions = "Focus; Resize Left" } } + Right { + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } + ButtonPress = "1" { Actions = "Focus; Resize Right" } } + BottomLeft { + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } + ButtonPress = "1" { Actions = "Focus; Resize BottomLeft" } } + Bottom { + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } + ButtonPress = "1" { Actions = "Focus; Resize Bottom" } } + BottomRight { + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } + ButtonPress = "1" { Actions = "Focus; Resize BottomRight" } } +} + +ScreenEdge { + Down { + Enter = "Mod1 Any" { Actions = "GoToWorkspace Down" } + ButtonRelease = "3" { Actions = "ShowMenu Root" } + ButtonRelease = "2" { Actions = "ShowMenu Goto" } + ButtonRelease = "1" { Actions = "GoToWorkspace Down" } + ButtonRelease = "Mod4 2" { Actions = "ShowMenu GotoClient" } + ButtonRelease = "4" { Actions = "GoToWorkspace Up" } + ButtonRelease = "5" { Actions = "GoToWorkspace Down" } + ButtonRelease = "Mod1 4" { Actions = "GoToWorkspace PrevV" } + ButtonRelease = "Mod1 5" { Actions = "GoToWorkspace NextV" } + EnterMoving = "Any Any" { Actions = "WarpToWorkspace Down" } + } + Up { + Enter = "Mod1 Any" { Actions = "GoToWorkspace Up" } + ButtonRelease = "3" { Actions = "ShowMenu Root" } + ButtonRelease = "2" { Actions = "ShowMenu Goto" } + ButtonRelease = "1" { Actions = "GoToWorkspace Up" } + ButtonRelease = "Mod4 2" { Actions = "ShowMenu GotoClient" } + ButtonRelease = "4" { Actions = "GoToWorkspace Up" } + ButtonRelease = "5" { Actions = "GoToWorkspace Down" } + ButtonRelease = "Mod1 4" { Actions = "GoToWorkspace PrevV" } + ButtonRelease = "Mod1 5" { Actions = "GoToWorkspace NextV" } + EnterMoving = "Any Any" { Actions = "WarpToWorkspace Up" } + } + Left { + Enter = "Mod1 Any" { Actions = "GoToWorkspace Left" } + ButtonRelease = "3" { Actions = "ShowMenu Root" } + ButtonRelease = "1" { Actions = "GoToWorkspace Left" } + DoubleClick = "1" { Actions = "GoToWorkspace Left" } + ButtonRelease = "2" { Actions = "ShowMenu Goto" } + ButtonRelease = "Mod4 2" { Actions = "ShowMenu GotoClient" } + ButtonRelease = "4" { Actions = "GoToWorkspace Right" } + ButtonRelease = "5" { Actions = "GoToWorkspace Left" } + ButtonRelease = "Mod1 4" { Actions = "GoToWorkspace Next" } + ButtonRelease = "Mod1 5" { Actions = "GoToWorkspace Prev" } + EnterMoving = "Any Any" { Actions = "WarpToWorkspace Left" } + } + Right { + Enter = "Mod1 Any" { Actions = "GoToWorkspace Right" } + ButtonRelease = "3" { Actions = "ShowMenu Root" } + ButtonRelease = "1" { Actions = "GoToWorkspace Right" } + DoubleClick = "1" { Actions = "GoToWorkspace Right" } + ButtonRelease = "2" { Actions = "ShowMenu Goto" } + ButtonRelease = "Mod4 2" { Actions = "ShowMenu GotoClient" } + ButtonRelease = "4" { Actions = "GoToWorkspace Right" } + ButtonRelease = "5" { Actions = "GoToWorkspace Left" } + ButtonRelease = "Mod1 4" { Actions = "GoToWorkspace Next" } + ButtonRelease = "Mod1 5" { Actions = "GoToWorkspace Prev" } + EnterMoving = "Any Any" { Actions = "WarpToWorkspace Right" } + } +} + +Client { + # Remove the following line and uncomment the alternative if windows should raise when clicked. + ButtonPress = "1" { Actions = "Focus" } + # Uncomment the following line if windows should raise when clicked. + # ButtonPress = "1" { Actions = "Focus; Raise" } + + ButtonRelease = "Mod1 1" { Actions = "Focus; Raise" } + ButtonRelease = "Mod4 1" { Actions = "Lower" } + ButtonRelease = "Mod1 4" { Actions = "SendToWorkspace Next; GotoWorkspace Next" } + ButtonRelease = "Mod1 5" { Actions = "SendToWorkspace Prev; GotoWorkspace Prev" } + ButtonRelease = "Mod1 Shift 4" { Actions = "SendToWorkspace PrevV; GotoWorkspace PrevV" } + ButtonRelease = "Mod1 Shift 5" { Actions = "SendToWorkspace NextV; GotoWorkspace NextV" } + ButtonRelease = "Ctrl Mod1 1" { Actions = "Focus; Raise True" } + Motion = "Mod1 1" { Threshold = "4"; Actions = "Focus; Raise; Move" } + Motion = "Mod4 1" { Threshold = "4"; Actions = "Focus; Raise; Move" } + Motion = "Mod1 2" { Threshold = "4"; Actions = "GroupingDrag True" } + Motion = "Mod1 3" { Actions = "Resize" } + # Remove the following line if you want to use click to focus. + Enter = "Any Any" { Actions = "Focus" } +} + +Root { + ButtonRelease = "3" { Actions = "ShowMenu Root" } + ButtonRelease = "2" { Actions = "ShowMenu Goto" } + ButtonRelease = "Mod4 2" { Actions = "ShowMenu GotoClient" } + # Horizontal movement + ButtonRelease = "4" { Actions = "GoToWorkspace Right" } + ButtonRelease = "5" { Actions = "GoToWorkspace Left" } + ButtonRelease = "Mod1 4" { Actions = "GoToWorkspace Next" } + ButtonRelease = "Mod1 5" { Actions = "GoToWorkspace Prev" } + # Vertical movement + ButtonRelease = "Shift 4" { Actions = "GoToWorkspace Up" } + ButtonRelease = "Shift 5" { Actions = "GoToWorkspace Down" } + ButtonRelease = "Mod1 Shift 4" { Actions = "GoToWorkspace NextV" } + ButtonRelease = "Mod1 Shift 5" { Actions = "GoToWorkspace PrevV" } + ButtonRelease = "1" { Actions = "HideAllMenus" } +} + +Menu { + Enter = "Any Any" { Actions = "Focus" } + Motion = "Mod1 1" { Threshold = "4"; Actions = "Focus; Raise; Move" } +} + +Other { + Enter = "Any Any" { Actions = "Focus" } + ButtonRelease = "3" { Actions = "Close" } + Motion = "1" { Actions = "Focus; Raise; Move" } + Motion = "Mod1 1" { Threshold = "4"; Actions = "Focus; Raise; Move" } +} diff --git a/user-config-unused/pekwm/.pekwm/start b/user-config-unused/pekwm/.pekwm/start new file mode 100644 index 0000000..ba11dda --- /dev/null +++ b/user-config-unused/pekwm/.pekwm/start @@ -0,0 +1,18 @@ +#!/bin/sh +# PekWM start file +# This file is a simple shell script; It gets run on pekwm startup, after +# the theme and all config has loaded if it is set executable +# (chmod +x start). +# +# This is different from ~/.xinitrc because a normal configuration of +# .xinitrc you'll run all commands, then launch the window manager last. +# +# It also gets re-run every time pekwm is restarted. +# +# As for it's usefulness, well, it's up to you. I actually set my background +# from my start file; since it runs after the theme gets loaded, this +# effectively overrides whatever's in the theme. +# +# There's probably a few other good uses for it, too. I mainly pushed for it +# because when I was doing fluxbox's docs, people used to complain that there +# wasn't one, and I wanted to avoid that for pekwm. ;) --eyez diff --git a/user-config-unused/pekwm/.pekwm/vars b/user-config-unused/pekwm/.pekwm/vars new file mode 100644 index 0000000..cd1027e --- /dev/null +++ b/user-config-unused/pekwm/.pekwm/vars @@ -0,0 +1 @@ +$TERM="xterm -fn fixed +sb -bg white -fg black" diff --git a/user-config-unused/psd/.config/psd/psd.conf b/user-config-unused/psd/.config/psd/psd.conf new file mode 100644 index 0000000..0e60643 --- /dev/null +++ b/user-config-unused/psd/.config/psd/psd.conf @@ -0,0 +1,57 @@ +# +# $XDG_HOME_CONFIG/psd/psd.conf +# +# For documentation, refer to the psd man page or the wiki page +# https://wiki.archlinux.org/index.php/Profile-sync-daemon + +## NOTE the following: +## To protect data from corruption, in the event that you do make an edit while +## psd is active, any changes made will be applied the next time you start psd. + +# Uncomment and set to "yes" to use overlayfs instead of a full copy to reduce +# the memory costs and to improve sync/unsync operations. Note that your kernel +# MUST have this module available in order to use this mode +# +USE_OVERLAYFS="yes" + +# List browsers separated by spaces to include in the sync. Useful if you do not +# wish to have all possible browser profiles sync'ed which is the default if +# this variable is left commented. +# +# Possible values: +# chromium +# chromium-dev +# conkeror.mozdev.org +# epiphany +# firefox +# firefox-trunk +# google-chrome +# google-chrome-beta +# google-chrome-unstable +# heftig-aurora +# icecat +# inox +# luakit +# midori +# opera +# opera-beta +# opera-developer +# opera-legacy +# otter-browser +# qupzilla +# palemoon +# rekonq +# seamonkey +# surf +# vivaldi +# vivaldi-snapshot +# +BROWSERS="chromium conkeror.mozdev.org" + +# Uncomment and set to "no" to completely disable the crash recovery feature. +# +# The default is to create crash recovery backups if the system is ungracefully +# powered-down due to a kernel panic, hitting the reset switch, battery going +# dead, etc. Some users keep very diligent backups and don't care to have this +# feature enabled. +#USE_BACKUPS="yes" diff --git a/user-config-unused/ratpoison/.ratpoisonrc b/user-config-unused/ratpoison/.ratpoisonrc new file mode 100644 index 0000000..82bda83 --- /dev/null +++ b/user-config-unused/ratpoison/.ratpoisonrc @@ -0,0 +1,28 @@ +#File: ~/.ratpoisonrc +#Author: Collin J. Doering +#Date: Mar 25, 2011 +#Description: ratpoison userland configuration file +#Note: it is imporant to have comments have a character immediately after the '#' + +#turnoff startup messages +startup_message off + +#escape C-z + +#virtual desks +gnewbg one +gnewbg two + +definekey top M-l exec ratpoison -c "select -" -c "gprev" -c "next" +definekey top M-h exec ratpoison -c "select -" -c "gnext" -c "next" + +#switch between windows +definekey top M-j next +definekey top M-k prev + +#apps +unbind c +bind c exec urxvt + +bind e exec emacs +bind f exec firefox2 diff --git a/user-config-unused/rkd-conf/.local/share/applications/transmission-remote.desktop b/user-config-unused/rkd-conf/.local/share/applications/transmission-remote.desktop new file mode 100644 index 0000000..5f1fe9d --- /dev/null +++ b/user-config-unused/rkd-conf/.local/share/applications/transmission-remote.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=transmission-remote +Exec=transmission-remote -a %u +Icon=transmission +Terminal=false +Type=Application +Categories=Network;FileTransfer;P2P; +StartupNotify=false +MimeType=application/x-bittorrent;x-scheme-handler/magnet; diff --git a/user-config-unused/rkd-conf/.local/share/fonts/.uuid b/user-config-unused/rkd-conf/.local/share/fonts/.uuid new file mode 100644 index 0000000..a88cc69 --- /dev/null +++ b/user-config-unused/rkd-conf/.local/share/fonts/.uuid @@ -0,0 +1 @@ +2cf226f6-0ec7-434c-b00a-b29d3d6dfa6b \ No newline at end of file diff --git a/user-config-unused/rkd-conf/.local/share/fonts/all-the-icons.ttf b/user-config-unused/rkd-conf/.local/share/fonts/all-the-icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..634d48e99f20948a9864b445fe9ec21f55f62b07 GIT binary patch literal 44732 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 Q`2ay0j*BvS>wW+J3s^76TmS$7 literal 0 HcmV?d00001 diff --git a/user-config-unused/rkd-conf/.local/share/fonts/file-icons.ttf b/user-config-unused/rkd-conf/.local/share/fonts/file-icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5302538bd0d7d1bdd9907ba78d5cdcb136008f7c GIT binary patch literal 173892 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� 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

=v_rA!CPE#mM^4@)}X7qf;At+v)G*FZd&; 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 ALjV8( literal 0 HcmV?d00001 diff --git a/user-config-unused/rkd-conf/.local/share/fonts/material-design-icons.ttf b/user-config-unused/rkd-conf/.local/share/fonts/material-design-icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/user-config-unused/rkd-conf/.local/share/fonts/octicons.ttf b/user-config-unused/rkd-conf/.local/share/fonts/octicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6f3edd66791e5ad76e6a9e2c56650afac6d2d05a GIT binary patch literal 52544 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 z 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%0D#Rj$k_pOl`WL;%6e`2iA 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 C!5iiP literal 0 HcmV?d00001 diff --git a/user-config-unused/rkd-conf/.local/share/mc/skins/gotar-mod.ini b/user-config-unused/rkd-conf/.local/share/mc/skins/gotar-mod.ini new file mode 100644 index 0000000..316b7ea --- /dev/null +++ b/user-config-unused/rkd-conf/.local/share/mc/skins/gotar-mod.ini @@ -0,0 +1,131 @@ +[skin] + description=GoTaR @PLD Linux + +[Lines] + horiz=─ + vert=│ + lefttop=┌ + righttop=┐ + leftbottom=└ + rightbottom=┘ + topmiddle=─ + bottommiddle=─ + leftmiddle=├ + rightmiddle=┤ + cross=┼ + dhoriz=─ + dvert=│ + dlefttop=┌ + drighttop=┐ + dleftbottom=└ + drightbottom=┘ + dtopmiddle=─ + dbottommiddle=─ + dleftmiddle=├ + drightmiddle=┤ + +[core] + _default_=green;default + selected=brightcyan;gray + marked=brightred; + markselect=yellow; + gauge=;yellow + input=brightgreen; + disabled=gray;default + reverse=brightgreen;default + header=brightred; + inputhistory= + commandhistory= + +[dialog] + _default_=brightcyan;default + dfocus=brightred;default + dhotnormal=brightred; + dhotfocus=yellow;gray + dtitle=brightred; + +[error] + _default_=white;red + errdfocus=brightgreen;default + errdhotnormal=yellow; + errdhotfocus=yellow;default + errdtitle=yellow; + +[filehighlight] + directory=brightcyan; + executable=brightgreen; + symlink=red; + hardlink= + stalelink=yellow;default + device=green; + special=brightblue; + core=red; + temp=gray; + archive=cyan; + doc=brown; + source=green; + media=white; + graph=magenta; + database=; + +[menu] + _default_=green;default + menuhot=brightred; + menusel=brightcyan;gray + menuhotsel=yellow; + menuinactive=lightgray; + +[buttonbar] + hotkey=lightgray;default + button=green;default;bold+underline + +[statusbar] + _default_=white;default + +[help] + _default_=brightred;default + helpitalic=brightcyan; + helpbold=brightgreen; + helplink=white; + helpslink=yellow;default + helptitle=brightgreen; + +[editor] + _default_=lightgray;default + editbold=yellow;default + editmarked=brightgreen;red + editwhitespace=brightblue;default + editlinestate=brightgreen + bookmark=white;red + bookmarkfound=black;green + editrightmargin=brightblue;default +# editbg= +# editframe= + editframeactive=white; + editframedrag=green; + window-state-char = * + window-close-char = X + +[viewer] + viewbold=brightred;default + viewunderline=brightgreen;default + viewselected=yellow;default + +[diffviewer] + _default_=lightgray;default + added=brightgreen; + changedline=cyan; + changednew=yellow; + changed=;brown + removed=;default + folder=brightblue; + error=white;red + +[popupmenu] + _default_=brightgreen;default + menusel=brightcyan;default + menutitle=brightcyan;default + +[widget-panel] + filename-scroll-left-char = { + filename-scroll-right-char = } diff --git a/user-config-unused/rkd-conf/.unison/default.prf b/user-config-unused/rkd-conf/.unison/default.prf new file mode 100644 index 0000000..1bd444a --- /dev/null +++ b/user-config-unused/rkd-conf/.unison/default.prf @@ -0,0 +1 @@ +# Unison preferences file diff --git a/user-config-unused/rkd-conf/.unison/org.prf b/user-config-unused/rkd-conf/.unison/org.prf new file mode 100644 index 0000000..289b17b --- /dev/null +++ b/user-config-unused/rkd-conf/.unison/org.prf @@ -0,0 +1,15 @@ +root = /home/collin/.org +root = ssh://collin@rekahsoft.ca/.org + +#ignore = Regex .* +ignore = BelowPath .git +ignore = BelowPath bugtracker/.git +ignore = Regex #.*# + +backupcurrent = Name *.org +backuplocation = local +maxbackups = 0 + +#sshargs = -i /home/collin/.ssh/sync_id_rsa + +merge = Name *.org -> emacsclient -c --eval '(ediff-merge-files-with-ancestor "CURRENT1" "CURRENT2" "CURRENTARCH" nil "NEW")' diff --git a/user-config-unused/rkd-conf/.vimrc b/user-config-unused/rkd-conf/.vimrc new file mode 100644 index 0000000..7759d2e --- /dev/null +++ b/user-config-unused/rkd-conf/.vimrc @@ -0,0 +1,17 @@ +" File: ~/.vimrc +" Date: May 26, 2011 +" Author: Collin J. Doering + +" strip off file menu and toolbar +set guioptions-=m +set guioptions-=T + +" set color scheme to a dark one +colorscheme slate + +" enable syntax highlighting +syntax enable + +" number the lines +set number + diff --git a/user-config-unused/rkd-conf/.vnc/xstartup b/user-config-unused/rkd-conf/.vnc/xstartup new file mode 100755 index 0000000..d4a2877 --- /dev/null +++ b/user-config-unused/rkd-conf/.vnc/xstartup @@ -0,0 +1,67 @@ +#!/bin/sh + +# (C) Copyright Collin Doering @!@YEAR@!@ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# File: .vnc/xstartup +# Author: Collin J. Doering +# Date: Jul 12, 2012 +# Description: Acts as a window-manager selector for vnc/freenx sessions + +# TODO: - use retval in the case that Xdialog fails to display some message/log +# - remove use of retval for window close and cancel button as they're disabled +# - support a nicer way to add wm's to the radiolist +# - a custom pekwm config so that there are no clicky menus and such + +# Set desktop default size +xrandr --output default --mode 640x480 + +# Start pekwm and keep its pid +pekwm & +PEKWM_PID=$! + +# Offer a Xdialog session selector +Xdialog --title "Session Selection" \ + --no-cancel \ + --no-close \ + --radiolist "Choose a session to run:" 25 112 5 \ + "XMonad" "a dynamically tiling X11 window manager" off \ + "OpenBox" "a highly configurable, next generation WM with extensive standards support" off \ + "PekWM" "a window manager that once up on a time was based on the aewm++ window manager" off \ + "Awesome" "a highly configurable, next generation framework window manager for X" off \ + "StumpWM" "a tiling, keyboard driven X11 Window Manager written entirely in Common Lisp" ON 2>/tmp/wmlist.tmp.$$ + +# Retain the return value of Xdialog and its choices saved in /tmp/wmlist.tmp.pid where pid is the pid of this shell +retval=$? +choice=`cat /tmp/wmlist.tmp.$$ | tr '[A-Z]' '[a-z]'` + +# Remove the temporary file containing Xdialogs choices +rm -f /tmp/wmlist.tmp.$$ + +# Stop pekwm +kill $PEKWM_PID + +# Run a session depending on the return value and choice from Xdialog +case $retval in + 0) + exec $HOME/.xinitrc $choice remote + ;; + # 1) + # echo "Cancel pressed." + # ;; + # 255) + # echo "Box closed." + # ;; +esac diff --git a/user-config-unused/screen/.screenrc b/user-config-unused/screen/.screenrc new file mode 100644 index 0000000..1764a10 --- /dev/null +++ b/user-config-unused/screen/.screenrc @@ -0,0 +1,21 @@ +# Open several named screens at startup and run different commands in each +screen -t zsh 0 zsh +#screen -t weechat 1 weechat-curses + +#screen -t ncmpcpp 2 ncmpcpp +#screen -t alsamixer 3 alsamixer +#screen -t mc 4 mc +#screen -t cmus 5 cmus +#screen -t nvlc 5 nvlc + +# Set default prefix from C-a to C-t +escape ^Tt + +# Switch to window 1 (irssi) *TODO* +#screen -p select irssi + +# Use 256 colors +terminfo rxvt-unicode 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm' + +# Set hard status line +hardstatus alwayslastline '%{gk}[ %{G}%H %{g}][%= %{wk}%?%-Lw%?%{=b kR}[%{W}%n%f %t%?(%u)%?%{=b kR}]%{= kw}%?%+Lw%?%?%=%{g}][%{Y}%l%{g}]%{=b C}[ %D %m/%d %C%a ]%{W}' diff --git a/user-config-unused/stumpwm/.stumpwmrc b/user-config-unused/stumpwm/.stumpwmrc new file mode 100644 index 0000000..116be5d --- /dev/null +++ b/user-config-unused/stumpwm/.stumpwmrc @@ -0,0 +1,62 @@ + +;; (C) Copyright Collin Doering @!@YEAR@!@ +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: .stumpwmrc +;; Author: Collin J. Doering +;; Date: Aug 11, 2011 + +;; TODO: write some nice custom config for stumpwm +;(set-contrib-dir "/usr/share/stumpwm") + +;; Add the date to the modeline +;; (setf stumpwm:*screen-mode-line-format* +;; (list "%w | " +;; '(:eval (remove #\Newline (stumpwm:run-shell-command "date '+%a %b %_d %l:%M %p'" t))))) + +;; Enable the modeline +(stumpwm:toggle-mode-line (stumpwm:current-screen) (stumpwm:current-head)) + +;; Disable some of the defaults +(stumpwm:undefine-key stumpwm:*root-map* (stumpwm:kbd "c")) +(stumpwm:undefine-key stumpwm:*root-map* (stumpwm:kbd "C-e")) + +;; Create some keybindings to make life easier +(stumpwm:define-key stumpwm:*root-map* (stumpwm:kbd ">") "gnext") +(stumpwm:define-key stumpwm:*root-map* (stumpwm:kbd "<") "gprev") +(stumpwm:define-key stumpwm:*root-map* (stumpwm:kbd "d") "gkill") +(stumpwm:define-key stumpwm:*root-map* (stumpwm:kbd "N") "gnew") +(stumpwm:define-key stumpwm:*root-map* (stumpwm:kbd "c") "exec kitty") +;;(stumpwm:define-key stumpwm:*root-map* (stumpwm:kbd "C-e") "exec emacsclient -c") +(stumpwm:define-key stumpwm:*root-map* (stumpwm:kbd "P") "exec rofi -combi-modi window,drun -modi combi,drun,window,run,ssh,keys -show combi") + +;; Center message and input windows +(setq stumpwm:*message-window-gravity* :center) +(setq stumpwm:*input-window-gravity* :center) + +;; ;; Load swank for emacs to connect to stumpwm's lisp process +;; (load "/usr/share/emacs/site-lisp/slime/swank-loader.lisp") +;; (swank-loader:init) + +;; (defcommand swank () () +;; (setf stumpwm:*top-level-error-action* :break) +;; (swank:create-server :port 5005 +;; :style swank:*communication-style* +;; :dont-close t) +;; (echo-string (current-screen) +;; "Starting swank. M-x slime-connect RET RET, then (in-package stumpwm).")) + +;; ;; Start swank +;; (swank) diff --git a/user-config-unused/surfraw/.config/surfraw/conf b/user-config-unused/surfraw/.config/surfraw/conf new file mode 100644 index 0000000..90bd740 --- /dev/null +++ b/user-config-unused/surfraw/.config/surfraw/conf @@ -0,0 +1,3 @@ +SURFRAW_graphical_browser=/usr/bin/firefox-developer-edition +#SURFRAW_text_browser=/usr/bin/elinks +SURFRAW_graphical=yes diff --git a/user-config-unused/transmission/.config/transmission/settings.json b/user-config-unused/transmission/.config/transmission/settings.json new file mode 100644 index 0000000..aa00944 --- /dev/null +++ b/user-config-unused/transmission/.config/transmission/settings.json @@ -0,0 +1,68 @@ +{ + "alt-speed-down": 50, + "alt-speed-enabled": false, + "alt-speed-time-begin": 540, + "alt-speed-time-day": 127, + "alt-speed-time-enabled": false, + "alt-speed-time-end": 1020, + "alt-speed-up": 50, + "bind-address-ipv4": "0.0.0.0", + "bind-address-ipv6": "::", + "blocklist-enabled": false, + "blocklist-url": "http://www.example.com/blocklist", + "cache-size-mb": 4, + "dht-enabled": true, + "download-dir": "Downloads", + "download-queue-enabled": true, + "download-queue-size": 5, + "encryption": 1, + "idle-seeding-limit": 30, + "idle-seeding-limit-enabled": false, + "incomplete-dir": "/home/collin/Downloads", + "incomplete-dir-enabled": false, + "lpd-enabled": false, + "message-level": 2, + "peer-congestion-algorithm": "", + "peer-id-ttl-hours": 6, + "peer-limit-global": 200, + "peer-limit-per-torrent": 50, + "peer-port": 51413, + "peer-port-random-high": 65535, + "peer-port-random-low": 49152, + "peer-port-random-on-start": false, + "peer-socket-tos": "default", + "pex-enabled": true, + "port-forwarding-enabled": true, + "preallocation": 1, + "prefetch-enabled": true, + "queue-stalled-enabled": true, + "queue-stalled-minutes": 30, + "ratio-limit": 2, + "ratio-limit-enabled": false, + "rename-partial-files": true, + "rpc-authentication-required": false, + "rpc-bind-address": "0.0.0.0", + "rpc-enabled": false, + "rpc-host-whitelist": "", + "rpc-host-whitelist-enabled": true, + "rpc-password": "{a29bb9f4fb2729cd46809610c53b59ccd94091f4Aq5YHZYK", + "rpc-port": 9091, + "rpc-url": "/transmission/", + "rpc-username": "", + "rpc-whitelist": "127.0.0.1", + "rpc-whitelist-enabled": true, + "scrape-paused-torrents-enabled": true, + "script-torrent-done-enabled": false, + "script-torrent-done-filename": "", + "seed-queue-enabled": false, + "seed-queue-size": 10, + "speed-limit-down": 100, + "speed-limit-down-enabled": false, + "speed-limit-up": 100, + "speed-limit-up-enabled": false, + "start-added-torrents": true, + "trash-original-torrent-files": false, + "umask": 18, + "upload-slots-per-torrent": 14, + "utp-enabled": true +} diff --git a/user-config-unused/xbindkeys/.xbindkeysrc b/user-config-unused/xbindkeys/.xbindkeysrc new file mode 100644 index 0000000..2942350 --- /dev/null +++ b/user-config-unused/xbindkeys/.xbindkeysrc @@ -0,0 +1,115 @@ +# File: .xbindkeysrc +# Date: Sept 23, 2010 +# Author: Collin J. Doering +# Description: File that contains key bindings independant of any DE (using xbindkeys). This file is in the following format: + +## () +# = +#" + c: +#< keycode name> +## END of + +# Power Button Key +"xmonadClose.sh" + m:0x0 + c:124 + XF86PowerOff + +## Multimedia keys + +# play/pause key = toggle play pause +"mpc -h patchMeIn@localhost toggle" + m:0x10 + c:172 + XF86AudioPlay +"mpc -h patchMeIn@localhost toggle" + m:0x58 + c:33 + Alt+Mod2+Mod4 + p + +# next key = next song +"mpc -h patchMeIn@localhost next" + m:0x10 + c:171 + XF86AudioNext +"mpc -h patchMeIn@localhost next" + m:0x58 + c:60 + Alt+Mod2+Mod4 + period + +# prev key = previous song +"mpc -h patchMeIn@localhost prev" + m:0x10 + c:173 + XF86AudioPrev +"mpc -h patchMeIn@localhost prev" + m:0x58 + c:59 + Alt+Mod2+Mod4 + comma + +# volume up key = Master volume up +"ponymix increase 3" + m:0x10 + c:123 + XF86AudioRaiseVolume +"ponymix increase 3" + m:0x58 + c:30 + Alt+Mod2+Mod4 + u + +# volume down key = Master volume down 1 +"ponymix decrease 3" + m:0x10 + c:122 + XF86AudioLowerVolume +"ponymix decrease 3" + m:0x58 + c:40 + Alt+Mod2+Mod4 + d + +# mute volume key = mute alsa Master channel +"ponymix toggle" + m:0x10 + c:121 + XF86AudioMute +"ponymix toggle" + m:0x58 + c:58 + Alt+Mod2+Mod4 + m + +## End of Multimedia keys + +# Super + Calculator = (speed crunch) +#"speedcrunch" +# m:0x10 + c:148 +# XF86Calculator + +# Super + Calculator = mathematica +#"mathematica" +# m:0x50 + c:148 +# XF86Calculator + +# Sleep key = lock screen with xscreensaver +"xscreensaver-command -lock" + m:0x10 + c:150 + XF86Sleep + +# WWW key +"conkeror" + m:0x10 + c:158 + XF86WWW + +# Search PC key +#"" +#m:0x10 + c:225 +#XF86Search + +## Monitor Brighness Keys + +"xbacklight -inc 10" + m:0x0 + c:233 + XF86MonBrightnessUp +"xbacklight -dec 10" + m:0x0 + c:232 + XF86MonBrightnessDown + +"screen-bright -set 100" + m:0x1 + c:50 + Shift + Shift_L +"screen-bright -set 25" + m:0x1 + c:50 + Shift + Shift_L + +## End Monitory Brighness Keys + +#"x86_energy_perf_policy performance" +#"x86_energy_perf_policy normal" +#"x86_energy_perf_policy powersave" diff --git a/user-config-unused/xmonad/.bin/xmonadClose.sh b/user-config-unused/xmonad/.bin/xmonadClose.sh new file mode 100755 index 0000000..787cf66 --- /dev/null +++ b/user-config-unused/xmonad/.bin/xmonadClose.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +# (C) Copyright Collin Doering 2011 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# File: xmonadClose.sh +# Author: Collin J. Doering +# Date: May 13, 2011 +# Description: A simple script to allow a nice dmenu gui when logging out, +# shutting down, or rebooting +# TODO: * Support sleep and hibernate +# * Needs to check whether a reboot/shutdown is allowed (user must be in the group +# 'power' and must be the only user logged in or they will be prompted for sudo's +# password to override) +# * Add support for the user to specify a timer *needs some work yet* +# - Needs to provide a way to cancel the time +# - Would be nice if there was some notification when there's n min left in the timer +# * re-write in haskell direct into ~/.xmonad/xmonad.hs using the dmenu extension(?) +# - issue with that is then the script could only be used within xmonad +# - perhaps consider taking a second argument when logout is passed as the first +# so that the second argument could be used as a 'logout command' and thus +# this script could be used with any wm + +actionNames=(logout suspend hibernate hybrid-sleep shutdown restart) +actionExecs=("xdotool key super+control+shift+End" + "~/.bin/keyboard.sh on && (xautolock -locknow &) && sleep 3s && systemctl suspend" + "~/.bin/keyboard.sh on && (xautolock -locknow &) && sleep 3s && systemctl hibernate" + "~/.bin/keyboard.sh on && (xautolock -locknow &) && sleep 3s && systemctl hybrid-sleep" + "shutdown -h now" + "reboot") + +#dmenu_cmd="rofi -dmenu" +dmenu_cmd="dmenu -b -i -nb #040404 -nf #525252 -sf #ffa0ff -sb #000000 -fn FreeMono-12" + +# Ask the user whether they want to logout, cancel, suspend, hibernate, hybrid-sleep, shutdown +ask=`echo "cancel ${actionNames[*]} timed-action" | tr ' ' '\n' | $dmenu_cmd` + +case "$ask" in + logout|suspend|hibernate|hybrid-sleep|shutdown|restart|timed-action) + if [[ "$ask" == "timed-action" ]]; then + time=`echo "1m 3m 5m 10m 15m 20m 30m 45m 1h 1.5h 2h 3h" | tr ' ' '\n' | $dmenu_cmd -p "How long?"` + # TODO: validate input to ensure form: +(s|m|h|d)? + for ((i=0; i < ${#actionNames[*]}; i++)); do + actionExecs[$i]="sleep $time && notify-send 'WARNING! Computer set to ${actionNames[$i]} in 15 seconds!' -u critical && sleep 15s && ${actionExecs[$i]}" + done + ask=`echo "cancel ${actionNames[*]}" | tr ' ' '\n' | $dmenu_cmd` + fi + + if [[ "$ask" != "cancel" && `echo "" | $dmenu_cmd -p "Are you sure you want to $ask? [yes/no] "` == 'yes' ]]; then + for ((i=0; i < ${#actionNames[*]}; i++)); do + if [[ "$ask" == "${actionNames[$i]}" ]]; then + sh -c "${actionExecs[$i]}" + break + fi + done + fi + ;; + cancel|*) + # Do nothing; the user entered cancel or a invalid input + ;; +esac + +# Exit successfully +exit 0 diff --git a/user-config-unused/xmonad/.xmobarrc b/user-config-unused/xmonad/.xmobarrc new file mode 100644 index 0000000..6f2e454 --- /dev/null +++ b/user-config-unused/xmonad/.xmobarrc @@ -0,0 +1,43 @@ +-- (C) Copyright Collin Doering @!@YEAR@!@ +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +-- File: .xmobarrc +-- Author: Collin J. Doering +-- Date: Jan 11, 2012 + +Config { font = "xft:FreeMono:size=10" + , bgColor = "#000000" + , fgColor = "#00FFFF" + , position = TopW L 100 + , lowerOnStart = True + , commands = [ Run DynNetwork ["-L", "0", "-H", "32", "-l", "green", "--normal", "orange", "--high", "red"] 40 + , Run Brightness ["-t", "Blght: %", "--", "-D", "intel_backlight"] 10 + , Run Com "/home/collin/.bin/vol.sh" [] "vol" 10 + , Run MultiCpu ["-t", "Cpu: % : - - - ", "-L", "3", "-H", "50", "--high", "#f0c040"] 10 + , Run Memory ["-t", "Mem: %", "-l", "green", "--normal", "orange", "--high", "red"] 40 + , Run Swap ["-t", "Swap: %", "-l", "green", "--normal", "orange", "--high", "red"] 60 + , Run Date "%a %b %_d %l:%M %p" "date" 100 + , Run Uptime ["-t", "Up: dhm", "-l", "green", "--normal", "orange", "--high", "red"] 100 + , Run Battery ["-t", ": % / ", + "-L", "10", "-H", "80", "-p", "3", + "--", "-O", "AC", "-i", "Idle", "-o", "Batt", + "-L", "10", "-H", "12", + "-l", "red", "-m", "blue", "-h", "green"] 25 + , Run StdinReader + ] + , sepChar = "%" + , alignSep = "}{" + , template = " %StdinReader% }{ %multicpu% | %memory% | %swap% | %dynnetwork% | %vol% | %bright% | %uptime% | %battery% | %date% | " + } diff --git a/user-config-unused/xmonad/.xmonad/xmonad.hs b/user-config-unused/xmonad/.xmonad/xmonad.hs new file mode 100644 index 0000000..9617b64 --- /dev/null +++ b/user-config-unused/xmonad/.xmonad/xmonad.hs @@ -0,0 +1,615 @@ +{-# LANGUAGE FlexibleContexts #-} + +-- File: ~/.xmonad/xmonad.hs +-- Date: Sept 14, 2010 +-- Description: User configuration file for xmonad + +-- +-- Based off of xmonad example config file for xmonad-0.9 +-- + +-- A template showing all available configuration hooks, +-- and how to override the defaults in your own xmonad.hs conf file. +-- +-- Normally, you'd only override those defaults you care about. +-- +-- NOTE: Those updating from earlier xmonad versions, who use +-- EwmhDesktops, safeSpawn, WindowGo, or the simple-status-bar +-- setup functions (dzen, xmobar) probably need to change +-- xmonad.hs, please see the notes below, or the following +-- link for more details: +-- +-- http://www.haskell.org/haskellwiki/Xmonad/Notable_changes_since_0.8 +-- + +import System.IO +import System.Exit +import qualified Data.Map as M + +import XMonad +import XMonad.Actions.UpdatePointer +import XMonad.Actions.GridSelect +import XMonad.Actions.FloatKeys +import XMonad.Actions.Submap +import XMonad.Actions.SpawnOn +import XMonad.Actions.WindowBringer + +import XMonad.Util.Run(spawnPipe) +import XMonad.Util.NamedScratchpad + +import XMonad.Layout.NoBorders(noBorders) +import XMonad.Layout.ResizableTile +import XMonad.Layout.Grid +import XMonad.Layout.ToggleLayouts +import XMonad.Layout.Tabbed +import XMonad.Layout.Accordion +import XMonad.Layout.Spacing +import XMonad.Layout.SubLayouts +import XMonad.Layout.WindowNavigation +import XMonad.Layout.Simplest +import XMonad.Layout.BoringWindows + +import XMonad.Hooks.ManageDocks +import XMonad.Hooks.DynamicLog +import XMonad.Hooks.UrgencyHook +import XMonad.Hooks.ManageHelpers +import XMonad.Hooks.FadeInactive +import XMonad.Hooks.EwmhDesktops + +import qualified XMonad.StackSet as W + + +-- The preferred terminal program, which is used in a binding below and by +-- certain contrib modules. +-- +myTerminal :: String +myTerminal = "kitty -1" + +-- Whether focus follows the mouse pointer. +myFocusFollowsMouse :: Bool +myFocusFollowsMouse = False + +-- Width of the window border in pixels. +-- +myBorderWidth :: Dimension +myBorderWidth = 3 + +-- modMask lets you specify which modkey you want to use. The default +-- is mod1Mask ("left alt"). You may also consider using mod3Mask +-- ("right alt"), which does not conflict with emacs keybindings. The +-- "windows key" is usually mod4Mask. +-- +myModMask :: KeyMask +myModMask = mod4Mask + +-- NOTE: from 0.9.1 on numlock mask is set automatically. The numlockMask +-- setting should be removed from configs. +-- +-- You can safely remove this even on earlier xmonad versions unless you +-- need to set it to something other than the default mod2Mask, (e.g. OSX). +-- +-- The mask for the numlock key. Numlock status is "masked" from the +-- current modifier status, so the keybindings will work with numlock on or +-- off. You may need to change this on some systems. +-- +-- You can find the numlock modifier by running "xmodmap" and looking for a +-- modifier with Num_Lock bound to it: +-- +-- > $ xmodmap | grep Num +-- > mod2 Num_Lock (0x4d) +-- +-- Set numlockMask = 0 if you don't have a numlock key, or want to treat +-- numlock status separately. +-- +-- myNumlockMask = mod2Mask -- deprecated in xmonad-0.9.1 +------------------------------------------------------------ + + +-- The default number of workspaces (virtual screens) and their names. +-- By default we use numeric strings, but any string may be used as a +-- workspace name. The number of workspaces is determined by the length +-- of this list. +-- +-- A tagging example: +-- +-- > workspaces = ["web", "irc", "code" ] ++ map show [4..9] +-- +myWorkspaces :: [String] +myWorkspaces = ["1:web", "2:hack", "3:code", "4:prog", "5:emacs", "6:mail", "7:media", "8:www", "9:com", "0:net", "esc:emc", "-:11", "=:12", "\\:13", "`:14"] + +-- Border colors for unfocused and focused windows, respectively. +-- +myNormalBorderColor, myFocusedBorderColor :: String +myNormalBorderColor = "#3B615D" -- "#dddddd" +myFocusedBorderColor = "#2FED55" -- "#ff0000" + +------------------------------------------------------------------------ +-- Key bindings. Add, modify or remove key bindings here. +-- +myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $ + + -- launch a terminal + [ ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf) + + -- launch rofi + , ((modm, xK_p), spawn "rofi -combi-modi window,drun -modi combi,drun,window,run,ssh,keys -show combi") + -- OR + -- launch dmenu + --, ((modm, xK_p), spawn "dmenu_run -i -nb '#040404' -nf '#00FFFF' -sf '#ffa0ff' -sb '#000000' -fn 'FreeMono-12'") + + -- launch passmenu (uses dmenu to access pass password store) + --, ((modm .|. shiftMask, xK_p), spawn "passmenu -i -nb '#040404' -nf '#00FFFF' -sf '#ffa0ff' -sb '#000000' -fn 'FreeMono-12'") + -- OR + -- launch rofi-pass (uses rofi to access pass password store) + , ((modm .|. shiftMask, xK_p), spawn "rofi-pass") + + -- close focused window + , ((modm .|. shiftMask, xK_c), kill) + + -- Rotate through the available layout algorithms + , ((modm, xK_space ), sendMessage NextLayout) + + -- Reset the layouts on the current workspace to default + , ((modm .|. shiftMask, xK_space), setLayout $ XMonad.layoutHook conf) + + -- Resize viewed windows to the correct size + , ((modm, xK_n), refresh) + + -- Move focus to the next window + --, ((modm, xK_Tab), windows W.focusDown) + + -- Move focus to the next window + --, ((modm, xK_j), windows W.focusDown) + + -- Move focus to the previous window + --, ((modm, xK_k), windows W.focusUp) + + -- Move focus to the master window + --, ((modm, xK_m), windows W.focusMaster) + + -- Swap the focused window and the master window + , ((modm, xK_Return), windows W.swapMaster) + + -- Swap the focused window with the next window + , ((modm .|. shiftMask, xK_j), windows W.swapDown) + + -- Swap the focused window with the previous window + , ((modm .|. shiftMask, xK_k), windows W.swapUp) + + -- Shrink the master area + , ((modm, xK_h), sendMessage Shrink) + + -- Expand the master area + , ((modm, xK_l), sendMessage Expand) + + -- Push window back into tiling + , ((modm, xK_t), withFocused $ windows . W.sink) + + -- Increment the number of windows in the master area + , ((modm, xK_comma), sendMessage (IncMasterN 1)) + + -- Deincrement the number of windows in the master area + , ((modm, xK_period), sendMessage (IncMasterN (-1))) + + -- Toggle the status bar gap + -- Use this binding with avoidStruts from Hooks.ManageDocks. + -- See also the statusBar function from Hooks.DynamicLog. + -- + , ((modm, xK_b), sendMessage ToggleStruts) + + -- Quit xmonad (no questions) + , ((modm .|. shiftMask .|. controlMask, xK_End), io (exitWith ExitSuccess)) + + -- Quit xmonad (user friendly) + , ((modm .|. shiftMask, xK_q), spawn "~/.bin/xmonadClose.sh") + + -- Unmount automounted disks by udiskie + , ((modm .|. shiftMask .|. controlMask, xK_u), spawn "udiskie-umount -as && notify-send 'External media safely disconnected!'") + + -- Restart xmonad + , ((modm, xK_q), spawn "pkill -9 xmobar; xmonad --recompile; xmonad --restart") ] + ++ + + -- + -- mod-[1..9], Switch to workspace N + -- + -- mod-[1..9], Switch to workspace N + -- mod-shift-[1..9], Move client to workspace N + -- + [((m .|. modm, k), windows $ f i) + | (i, k) <- zip (XMonad.workspaces conf) ([xK_1 .. xK_9] ++ [xK_0, xK_Escape, xK_minus, xK_equal, xK_backslash, xK_grave]) + , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]] + + -- Add custom key bindings + ++ myGenericKeys + + ++ + -- Modification due to xinerama screens being in the wrong order + [((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f)) + | (key, sc) <- zip [xK_w, xK_e, xK_r] [1,0,2] -- was [1,0,2] *** change to match your screen order *** + , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] + +-- Custom generic key bindings +-- Note: Use mod4Mask and controlMask to launch non-standard apps +myGenericKeys = + + -- Lock the screen using i3lock-fancy via xautolock + [ ((modm .|. shiftMask, xK_v), spawn "xautolock -locknow") + + -- Toggle full-screen mode + , ((modm .|. controlMask, xK_space), sendMessage (Toggle "Full")) + + -- Use window bringer + , ((modm .|. shiftMask, xK_g), gotoMenu) + , ((modm .|. shiftMask, xK_b), bringMenu) + + -- Enable switching of windows with gridselect + , ((modm, xK_g), goToSelected myGSConfig) + + -- Launch kitty terminal + , ((modm .|. controlMask, xK_Return), spawn $ myTerminal ++ " --name default") + + -- Launch tab-less urxvtc + , ((modm .|. controlMask .|. shiftMask, xK_Return), spawn "urxvtc -pe -tabbedex") + + -- Launch a backup terminal + , ((modm, xK_BackSpace), spawn "xterm") + + -- Launch firefox-developer + , ((modm .|. controlMask, xK_f), spawn "firefox-developer-edition") + + -- Launch firefox-developer private window + , ((modm .|. controlMask .|. shiftMask, xK_f), spawn "firefox-developer-edition --private-window") + + -- Launch emacs + , ((modm .|. controlMask, xK_e), spawn "emacsclient -c") + + -- Launch tuxcmd + --, ((modm .|. controlMask, xK_t), spawn "tuxcmd") + + -- Launch zathura + , ((modm .|. controlMask, xK_z), spawn "zathura") + + -- Launch openoffice (now libreoffice) + , ((modm .|. controlMask, xK_o), spawn "libreoffice") + + -- Launch vlc + , ((modm .|. controlMask, xK_v), spawn "vlc") + + -- Launch a emacs scratchpad (key binding for HHKB) + , ((modm .|. controlMask, xK_Escape), namedScratchpadAction scratchpads "emacs-scratch") + + -- Launch a emacs scratchpad (key binding for normal layout) + , ((modm .|. controlMask, xK_grave), namedScratchpadAction scratchpads "emacs-scratch") + + -- Launch a screen scratchpad terminal + , ((modm .|. controlMask, xK_1), namedScratchpadAction scratchpads "screen-terminal") + + -- Launch a maintainance scratchpad + , ((modm .|. controlMask, xK_2), namedScratchpadAction scratchpads "maintenance-terminal") + + -- Launch another (smaller) emacs scratchpad + , ((modm .|. controlMask, xK_3), namedScratchpadAction scratchpads "emacs-mini-scratch") + + -- Launch ncmpcpp scratchpad + , ((modm .|. controlMask, xK_4), namedScratchpadAction scratchpads "ncmpcpp-scratch") + + -- Launch pavucontrol scratchpad + , ((modm .|. controlMask, xK_5), namedScratchpadAction scratchpads "pavucontrol-scratch") + + -- Enable movement and resizing of floating windows + , ((modm, xK_d), withFocused (keysMoveWindow (10,0))) -- move floating window right + , ((modm, xK_a), withFocused (keysMoveWindow (-10,0))) -- move floating window left + , ((modm, xK_s), withFocused (keysMoveWindow (0,-10))) -- move floating window up + , ((modm, xK_x), withFocused (keysMoveWindow (0,10))) -- move floating window down + -- , ((modm .|. shiftMask, xK_a), withFocused (keysResizeWindow (-10,0) (0,0))) -- resize floating window (left) + -- , ((modm .|. shiftMask, xK_d), withFocused (keysResizeWindow (10,0) (0,0))) -- resize floating window (right) + -- , ((modm .|. shiftMask, xK_s), withFocused (keysResizeWindow (0,-10) (0,0))) -- resize floating window (up) + -- , ((modm .|. shiftMask, xK_x), withFocused (keysResizeWindow (0,-10) (0,1))) -- resize floating window (down) + + -- Enable subLayouts + , ((modm .|. controlMask, xK_h), sendMessage $ pullGroup L) + , ((modm .|. controlMask, xK_l), sendMessage $ pullGroup R) + , ((modm .|. controlMask, xK_k), sendMessage $ pullGroup U) + , ((modm .|. controlMask, xK_j), sendMessage $ pullGroup D) + + , ((modm .|. controlMask, xK_m), withFocused (sendMessage . MergeAll)) + , ((modm .|. controlMask, xK_u), withFocused (sendMessage . UnMerge)) + + , ((modm .|. controlMask, xK_period), onGroup W.focusDown') + , ((modm .|. controlMask, xK_comma ), onGroup W.focusUp') + , ((modm, xK_Tab ), onGroup W.focusDown') + + , ((modm, xK_j), focusDown) + , ((modm, xK_k), focusUp) + , ((modm, xK_m), focusMaster) + + , ((modm, xK_z), asks config >>= submap . defaultSublMap) + + -- Enable 2D directional movement from window to window + , ((modm, xK_Right), sendMessage $ Go R) + , ((modm, xK_Left ), sendMessage $ Go L) + , ((modm, xK_Up ), sendMessage $ Go U) + , ((modm, xK_Down ), sendMessage $ Go D) + , ((modm .|. controlMask, xK_Right), sendMessage $ Swap R) + , ((modm .|. controlMask, xK_Left ), sendMessage $ Swap L) + , ((modm .|. controlMask, xK_Up ), sendMessage $ Swap U) + , ((modm .|. controlMask, xK_Down ), sendMessage $ Swap D) + + -- Expand a mirror pane + , ((modm .|. shiftMask, xK_l), sendMessage MirrorShrink) + + -- Shrink a mirror pane + , ((modm .|. shiftMask, xK_h), sendMessage MirrorExpand)] + where modm = mod4Mask + myGSConfig = def { gs_font = "xft:FreeMono:size=13" + , gs_cellheight = 100 + , gs_cellwidth = 1000 + } + +------------------------------------------------------------------------ +-- Mouse bindings: default actions bound to mouse events +-- +myMouseBindings (XConfig {XMonad.modMask = modm}) = M.fromList $ + + -- mod-button1, Set the window to floating mode and move by dragging + [ ((modm, button1), (\w -> focus w >> mouseMoveWindow w + >> windows W.shiftMaster)) + + -- mod-button2, Raise the window to the top of the stack + , ((modm, button2), (\w -> focus w >> windows W.shiftMaster)) + + -- mod-button3, Set the window to floating mode and resize by dragging + , ((modm, button3), (\w -> focus w >> mouseResizeWindow w + >> windows W.shiftMaster)) + + -- you may also bind events to the mouse scroll wheel (button4 and button5) + ] + +------------------------------------------------------------------------ +-- Layouts: + +-- You can specify and transform your layouts by modifying these values. +-- If you change layout bindings be sure to use 'mod-shift-space' after +-- restarting (with 'mod-q') to reset your layout state to the new +-- defaults, as xmonad preserves your old layout settings by default. +-- +-- NOTE: XMonad.Hooks.EwmhDesktops users must remove the obsolete +-- ewmhDesktopsLayout modifier from layoutHook. It no longer exists. +-- Instead use the 'ewmh' function from that module to modify your +-- defaultConfig as a whole. (See also logHook, handleEventHook, and +-- startupHook ewmh notes.) +-- +-- The available layouts. Note that each layout is separated by |||, +-- which denotes layout choice. +-- +myLayout = avoidStruts . + toggleLayouts (noBorders Full) . + windowNavigation . + boringWindows . + subTabbedThemed . + smartSpacing 5 $ + rztiled ||| (Mirror rztiled) ||| Accordion ||| Grid + where + -- TODO: addTabs (used by subTabbedThemed defined below, called above) breaks the top-level + -- tabbed layout (doesn't repaint properly). The tabbed layout (now disabled) can be + -- created using: "tabbed shrinkText myTabConfig" + -- TODO2: sublayouts remember their internal layout dependent upon their location (thus when moving + -- sublayout groups, the layout will change depending on where the group moves to. To + -- avoid this issue, simply don't have any other sublayouts + subTabbedThemed x = addTabs shrinkText myTabConfig $ subLayout [] Simplest x + + -- default tiling algorithm pshamons the screen into two panes + tiled = Tall nmaster delta ratio + + -- ResizeableTall arguments + rztiled = ResizableTall nmaster delta ratio [] + + -- The default number of windows in the master pane + nmaster = 1 + + -- Default proportion of screen occupied by master pane + ratio = 1/2 + + -- Percent of screen to increment by when resizing panes + delta = 3/100 + + myTabConfig = def { activeColor = "#7f718f" + , inactiveColor = "#2b2f3b" + , urgentColor = "#008000" + , activeBorderColor = "#57e3ff" + , inactiveBorderColor = "#00afff" + , urgentBorderColor = "#ff0000" + , activeTextColor = "#ffa0ff" + , inactiveTextColor = "#f2f2f2" + , urgentTextColor = "#ff0000" + , fontName = "xft:FreeMono:size=12" + , decoWidth = 200 + , decoHeight = 35 + , windowTitleAddons = [] + , windowTitleIcons = [] + } + +------------------------------------------------------------------------ +-- Thanks to OODavo from #haskell on freenode; used for applications +-- that do not doFullFloat well (they request a window size smaller +-- then the widgets they contain) +maxFloat = flip W.float $ rectWithBorder 0.05 + where rectWithBorder x = let lt = x + wh = 1 - 2*x + in W.RationalRect lt lt wh wh + +doMaxFloat = ask >>= doF . maxFloat + +-- removes duplicate code in my manage hook following the pattern: +-- resource =? "a" <||> resource =? "b" <||> ... +resourceIsOneOf = foldl (<||>) (return False) . fmap (resource =?) + +------------------------------------------------------------------------ +-- Window rules: + +-- Execute arbitrary actions and WindowSet manipulations when managing +-- a new window. You can use this to, for example, always float a +-- particular program, or have a client always appear on a particular +-- workspace. +-- +-- To find the property name associated with a program, use +-- > xprop | grep WM_CLASS +-- and click on the client you're interested in. +-- +-- To match on the WM_NAME, you can use 'title' in the same way that +-- 'className' and 'resource' are used below. +-- +myManageHook = composeAll + [ resource =? "supertux2" --> doCenterFloat + , title =? "DOOM 3" --> doFullFloat + , resource =? "vncviewer" --> doCenterFloat + , resource =? "opennx" --> doMaxFloat + , resource =? "Steam" --> doCenterFloat + , title =? "Xnest" --> doCenterFloat + , resource =? "pinentry-gtk-2" --> doCenterFloat + , resource =? "pavucontrol" --> doMaxFloat + , resource =? "qemu-system-x86_64" --> doFullFloat + , resource =? "desktop_window" --> doIgnore + + -- , resource =? "Qt-subapplication" <&&> title /=? "Oracle VM VirtualBox Manager" --> doFloat + -- , resource =? "Halo.exe" --> doCenterFloat + -- , resource =? "UnrealTournament.exe" --> doCenterFloat + -- , resource =? "hl2_linux" --> doFullFloat + + , className =? "mpv" --> doShift "7:media" + + , isFullscreen --> (doF W.focusDown <+> doFullFloat) + , resourceIsOneOf ["emacs","gvim"] --> ask >>= (liftX . flip setOpacity (15/16)) >> idHook + ] <+> namedScratchpadManageHook scratchpads <+> manageDocks <+> manageSpawn + +-- NamedScratchPad Hook +scratchpads = [ NS "emacs-scratch" spawnEmacsScratch findEmacsScratch manageEmacsScratch + , NS "maintenance-terminal" spawnMaintenanceTerminal findMaintenanceTerminal manageMaintenanceTerminal + , NS "screen-terminal" spawnScreenTerminal findScreenTerminal manageScreenTerminal + , NS "emacs-mini-scratch" spawnEmacsMiniScratch findEmacsMiniScratch manageEmacsMiniScratch + , NS "ncmpcpp-scratch" spawnNcmpcppScratch findNcmpcppScratch manageNcmpcppScratch + , NS "pavucontrol-scratch" spawnPavucontrolScratch findPavucontrolScratch managePavucontrolScratch ] + where + findEmacsScratch = title =? "emacs-scratch" + findMaintenanceTerminal = resource =? "scratchpad" + findScreenTerminal = title =? "screen-scratch" + findEmacsMiniScratch = resource =? "emacs-mini-scratch" + findNcmpcppScratch = resource =? "ncmpcpp-scratch" + findPavucontrolScratch = resource =? "pavucontrol" + + spawnEmacsScratch = "emacsclient -c -F \"'(name . \\\"emacs-scratch\\\")\"" + spawnMaintenanceTerminal = myTerminal ++ " --name scratchpad" + spawnScreenTerminal = "emacsclient -c -F \"'(name . \\\"screen-scratch\\\")\"" + spawnEmacsMiniScratch = "emacsclient -c -F \"'(name . \\\"emacs-mini-scratch\\\")\"" + spawnNcmpcppScratch = myTerminal ++ " --name ncmpcpp-scratch ncmpcpp" + spawnPavucontrolScratch = "pavucontrol" + + manageEmacsScratch = doMaxFloat + manageMaintenanceTerminal = customFloating $ W.RationalRect 0 0.66 1 0.34 + manageScreenTerminal = doFullFloat + manageEmacsMiniScratch = customFloating $ W.RationalRect 0.125 0.125 0.75 0.75 + manageNcmpcppScratch = customFloating $ W.RationalRect 0.225 0.10 0.55 0.80 + managePavucontrolScratch = doMaxFloat + + -- manageScreenTerminal = customFloating $ W.RationalRect l t w h + -- where + -- h = 1 -- terminal height (%) + -- w = 1 -- terminal width (%) + -- t = 1 - h -- distance from top edge (%) + -- l = 1 - w -- distance from left edge (%) + +------------------------------------------------------------------------ +-- Event handling + +-- Defines a custom handler function for X Events. The function should +-- return (All True) if the default handler is to be run afterwards. To +-- combine event hooks use mappend or mconcat from Data.Monoid. +-- +-- NOTE: EwmhDesktops users should use the 'ewmh' function from +-- XMonad.Hooks.EwmhDesktops to modify their defaultConfig as a whole. +-- It will add EWMH event handling to your custom event hooks by +-- combining them with ewmhDesktopsEventHook. +-- +myEventHook = handleEventHook defaultConfig <+> fullscreenEventHook + +------------------------------------------------------------------------ +-- Status bars and logging + +-- Perform an arbitrary action on each internal state change or X event. +-- See the 'XMonad.Hooks.DynamicLog' extension for examples. +-- +-- +-- * NOTE: EwmhDesktops users should use the 'ewmh' function from +-- XMonad.Hooks.EwmhDesktops to modify their defaultConfig as a whole. +-- It will add EWMH logHook actions to your custom log hook by +-- combining it with ewmhDesktopsLogHook. +-- +myLogHook h = do + fadeInactiveCurrentWSLogHook 0.95 + dynamicLogWithPP . namedScratchpadFilterOutWorkspacePP $ xmobarPP + { ppOutput = hPutStrLn h + , ppUrgent = xmobarColor "yellow" "red" . xmobarStrip + , ppHidden = (\ ws -> "") } + +------------------------------------------------------------------------ +-- Startup hook + +-- Perform an arbitrary action each time xmonad starts or is restarted +-- with mod-q. Used by, e.g., XMonad.Layout.PerWorkspace to initialize +-- per-workspace layout choices. +-- +-- By default, do nothing. +-- +-- * NOTE: EwmhDesktops users should use the 'ewmh' function from +-- XMonad.Hooks.EwmhDesktops to modify their defaultConfig as a whole. +-- It will add initialization of EWMH support to your custom startup +-- hook by combining it with ewmhDesktopsStartup. +-- +myStartupHook = return () + -- TODO: auto-spawn and setup desktop + -- spawnOn "1:web" "conkeror" + -- spawnOn "2:hack" "emacsclient -c" + -- spawnOn "3:code" "emacsclient -c" + -- spawnOn "4:prog" "emacsclient -c" + -- spawnOn "0:mail" "emacsclient -c -eval '(mu4e)'" + +------------------------------------------------------------------------ +-- Now run xmonad with all the defaults we set up. + +-- Run xmonad with the settings you specify. No need to modify this. +-- +main :: IO () +main = do + xmproc <- spawnPipe "xmobar" + xmonad $ docks $ withUrgencyHook (borderUrgencyHook "#000000") $ defaults xmproc + +-- A structure containing your configuration settings, overriding +-- fields in the default config. Any you don't override, will +-- use the defaults defined in xmonad/XMonad/Config.hs +-- +-- No need to modify this. +-- +defaults sxmproc = ewmh defaultConfig { + -- simple stuff + terminal = myTerminal, + focusFollowsMouse = myFocusFollowsMouse, + borderWidth = myBorderWidth, + modMask = myModMask, + -- numlockMask deprecated in 0.9.1 + -- numlockMask = myNumlockMask, + workspaces = myWorkspaces, + normalBorderColor = myNormalBorderColor, + focusedBorderColor = myFocusedBorderColor, + + -- key bindings + keys = myKeys, + mouseBindings = myMouseBindings, + + -- hooks, layouts + layoutHook = myLayout, + manageHook = myManageHook, + handleEventHook = myEventHook, + logHook = myLogHook sxmproc, -- >> updatePointer (Relative 0.5 0.5), -- TODO: Investigate why Relative is out of scope? + startupHook = myStartupHook + } diff --git a/user-config/alacritty/.config/alacritty/alacritty.yml b/user-config/alacritty/.config/alacritty/alacritty.yml new file mode 100644 index 0000000..8159ba3 --- /dev/null +++ b/user-config/alacritty/.config/alacritty/alacritty.yml @@ -0,0 +1,697 @@ +# Configuration for Alacritty, the GPU enhanced terminal emulator. + +# Any items in the `env` entry below will be added as +# environment variables. Some entries may override variables +# set by alacritty itself. +#env: + # TERM variable + # + # This value is used to set the `$TERM` environment variable for + # each instance of Alacritty. If it is not present, alacritty will + # check the local terminfo database and use `alacritty` if it is + # available, otherwise `xterm-256color` is used. + #TERM: alacritty + +window: + # Window dimensions (changes require restart) + # + # Specified in number of columns/lines, not pixels. + # If both are `0`, this setting is ignored. + #dimensions: + # columns: 0 + # lines: 0 + + # Window position (changes require restart) + # + # Specified in number of pixels. + # If the position is not set, the window manager will handle the placement. + #position: + # x: 0 + # y: 0 + + # Window padding (changes require restart) + # + # Blank space added around the window in pixels. This padding is scaled + # by DPI and the specified value is always added at both opposing sides. + #padding: + # x: 0 + # y: 0 + + # Spread additional padding evenly around the terminal content. + #dynamic_padding: false + + # Window decorations + # + # Values for `decorations`: + # - full: Borders and title bar + # - none: Neither borders nor title bar + # + # Values for `decorations` (macOS only): + # - transparent: Title bar, transparent background and title bar buttons + # - buttonless: Title bar, transparent background, but no title bar buttons + decorations: full + + # Startup Mode (changes require restart) + # + # Values for `startup_mode`: + # - Windowed + # - Maximized + # - Fullscreen + # + # Values for `startup_mode` (macOS only): + # - SimpleFullscreen + startup_mode: Windowed + + # Window title + #title: Alacritty + + # Allow terminal applications to change Alacritty's window title. + #dynamic_title: true + + # Window class (Linux/BSD only): + #class: + # Application instance name + #instance: Alacritty + # General application class + #general: Alacritty + + # GTK theme variant (Linux/BSD only) + # + # Override the variant of the GTK theme. Commonly supported values are `dark` and `light`. + # Set this to `None` to use the default theme variant. + #gtk_theme_variant: None + +scrolling: + # Maximum number of lines in the scrollback buffer. + # Specifying '0' will disable scrolling. + history: 10000 + + # Scrolling distance multiplier. + #multiplier: 3 + +# Font configuration +font: + # Normal (roman) font face + normal: + # Font family + # + # Default: + # - (macOS) Menlo + # - (Linux/BSD) monospace + # - (Windows) Consolas + family: FreeMono + + # The `style` can be specified to pick a specific face. + #style: Regular + + # Bold font face + #bold: + # Font family + # + # If the bold family is not specified, it will fall back to the + # value specified for the normal font. + #family: monospace + + # The `style` can be specified to pick a specific face. + #style: Bold + + # Italic font face + #italic: + # Font family + # + # If the italic family is not specified, it will fall back to the + # value specified for the normal font. + #family: monospace + + # The `style` can be specified to pick a specific face. + #style: Italic + + # Bold italic font face + #bold_italic: + # Font family + # + # If the bold italic family is not specified, it will fall back to the + # value specified for the normal font. + #family: monospace + + # The `style` can be specified to pick a specific face. + #style: Bold Italic + + # Point size + #size: 11.0 + + # Offset is the extra space around each character. `offset.y` can be thought of + # as modifying the line spacing, and `offset.x` as modifying the letter spacing. + #offset: + # x: 0 + # y: 0 + + # Glyph offset determines the locations of the glyphs within their cells with + # the default being at the bottom. Increasing `x` moves the glyph to the right, + # increasing `y` moves the glyph upward. + #glyph_offset: + # x: 0 + # y: 0 + + # Thin stroke font rendering (macOS only) + # + # Thin strokes are suitable for retina displays, but for non-retina screens + # it is recommended to set `use_thin_strokes` to `false`. + #use_thin_strokes: true + +# If `true`, bold text is drawn using the bright color variants. +#draw_bold_text_with_bright_colors: false + +# Colors (Tomorrow Night) +#colors: + # Default colors + #primary: + # background: '#1d1f21' + # foreground: '#c5c8c6' + + # Bright and dim foreground colors + # + # The dimmed foreground color is calculated automatically if it is not present. + # If the bright foreground color is not set, or `draw_bold_text_with_bright_colors` + # is `false`, the normal foreground color will be used. + #dim_foreground: '#828482' + #bright_foreground: '#eaeaea' + + # Cursor colors + # + # Colors which should be used to draw the terminal cursor. + # + # Allowed values are CellForeground and CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #cursor: + # text: CellBackground + # cursor: CellForeground + + # Vi mode cursor colors + # + # Colors for the cursor when the vi mode is active. + # + # Allowed values are CellForeground and CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #vi_mode_cursor: + # text: CellBackground + # cursor: CellForeground + + # Selection colors + # + # Colors which should be used to draw the selection area. + # + # Allowed values are CellForeground and CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #selection: + # text: CellBackground + # background: CellForeground + + # Search colors + # + # Colors used for the search bar and match highlighting. + #search: + # Allowed values are CellForeground and CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #matches: + # foreground: '#000000' + # background: '#ffffff' + + #bar: + # background: '#c5c8c6' + # foreground: '#1d1f21' + + # Normal colors + #normal: + # black: '#1d1f21' + # red: '#cc6666' + # green: '#b5bd68' + # yellow: '#f0c674' + # blue: '#81a2be' + # magenta: '#b294bb' + # cyan: '#8abeb7' + # white: '#c5c8c6' + + # Bright colors + #bright: + # black: '#666666' + # red: '#d54e53' + # green: '#b9ca4a' + # yellow: '#e7c547' + # blue: '#7aa6da' + # magenta: '#c397d8' + # cyan: '#70c0b1' + # white: '#eaeaea' + + # Dim colors + # + # If the dim colors are not set, they will be calculated automatically based + # on the `normal` colors. + #dim: + # black: '#131415' + # red: '#864343' + # green: '#777c44' + # yellow: '#9e824c' + # blue: '#556a7d' + # magenta: '#75617b' + # cyan: '#5b7d78' + # white: '#828482' + + # Indexed Colors + # + # The indexed colors include all colors from 16 to 256. + # When these are not set, they're filled with sensible defaults. + # + # Example: + # `- { index: 16, color: '#ff00ff' }` + # + #indexed_colors: [] + +# Bell +# +# The bell is rung every time the BEL control character is received. +#bell: + # Visual Bell Animation + # + # Animation effect for flashing the screen when the visual bell is rung. + # + # Values for `animation`: + # - Ease + # - EaseOut + # - EaseOutSine + # - EaseOutQuad + # - EaseOutCubic + # - EaseOutQuart + # - EaseOutQuint + # - EaseOutExpo + # - EaseOutCirc + # - Linear + #animation: EaseOutExpo + + # Duration of the visual bell flash. A `duration` of `0` will disable the + # visual bell animation. + #duration: 0 + + # Visual bell animation color. + #color: '#ffffff' + + # Bell Command + # + # This program is executed whenever the bell is rung. + # + # When set to `command: None`, no command will be executed. + # + # Example: + # command: + # program: notify-send + # args: ["Hello, World!"] + # + #command: None + +# Background opacity +# +# Window opacity as a floating point number from `0.0` to `1.0`. +# The value `0.0` is completely transparent and `1.0` is opaque. +#background_opacity: 1.0 + +#selection: + #semantic_escape_chars: ",│`|:\"' ()[]{}<>\t" + + # When set to `true`, selected text will be copied to the primary clipboard. + #save_to_clipboard: false + +#cursor: + # Cursor style + # + # Values for `style`: + # - ▇ Block + # - _ Underline + # - | Beam + #style: Block + + # Vi mode cursor style + # + # If the vi mode cursor style is `None` or not specified, it will fall back to + # the style of the active value of the normal cursor. + # + # See `cursor.style` for available options. + #vi_mode_style: None + + # If this is `true`, the cursor will be rendered as a hollow box when the + # window is not focused. + #unfocused_hollow: true + + # Thickness of the cursor relative to the cell width as floating point number + # from `0.0` to `1.0`. + #thickness: 0.15 + +# Live config reload (changes require restart) +#live_config_reload: true + +# Shell +# +# You can set `shell.program` to the path of your favorite shell, e.g. `/bin/fish`. +# Entries in `shell.args` are passed unmodified as arguments to the shell. +# +# Default: +# - (macOS) /bin/bash --login +# - (Linux/BSD) user login shell +# - (Windows) powershell +#shell: +# program: /bin/bash +# args: +# - --login + +# Startup directory +# +# Directory the shell is started in. If this is unset, or `None`, the working +# directory of the parent process will be used. +#working_directory: None + +# WinPTY backend (Windows only) +# +# Alacritty defaults to using the newer ConPTY backend if it is available, +# since it resolves a lot of bugs and is quite a bit faster. If it is not +# available, the WinPTY backend will be used instead. +# +# Setting this option to `true` makes Alacritty use the legacy WinPTY backend, +# even if the ConPTY backend is available. +#winpty_backend: false + +# Send ESC (\x1b) before characters when alt is pressed. +#alt_send_esc: true + +#mouse: + # Click settings + # + # The `double_click` and `triple_click` settings control the time + # alacritty should wait for accepting multiple clicks as one double + # or triple click. + #double_click: { threshold: 300 } + #triple_click: { threshold: 300 } + + # If this is `true`, the cursor is temporarily hidden when typing. + #hide_when_typing: false + + #url: + # URL launcher + # + # This program is executed when clicking on a text which is recognized as a URL. + # The URL is always added to the command as the last parameter. + # + # When set to `launcher: None`, URL launching will be disabled completely. + # + # Default: + # - (macOS) open + # - (Linux/BSD) xdg-open + # - (Windows) explorer + #launcher: + # program: xdg-open + # args: [] + + # URL modifiers + # + # These are the modifiers that need to be held down for opening URLs when clicking + # on them. The available modifiers are documented in the key binding section. + #modifiers: None + +# Mouse bindings +# +# Mouse bindings are specified as a list of objects, much like the key +# bindings further below. +# +# To trigger mouse bindings when an application running within Alacritty captures the mouse, the +# `Shift` modifier is automatically added as a requirement. +# +# Each mouse binding will specify a: +# +# - `mouse`: +# +# - Middle +# - Left +# - Right +# - Numeric identifier such as `5` +# +# - `action` (see key bindings) +# +# And optionally: +# +# - `mods` (see key bindings) +#mouse_bindings: +# - { mouse: Middle, action: PasteSelection } + +# Key bindings +# +# Key bindings are specified as a list of objects. For example, this is the +# default paste binding: +# +# `- { key: V, mods: Control|Shift, action: Paste }` +# +# Each key binding will specify a: +# +# - `key`: Identifier of the key pressed +# +# - A-Z +# - F1-F24 +# - Key0-Key9 +# +# A full list with available key codes can be found here: +# https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants +# +# Instead of using the name of the keys, the `key` field also supports using +# the scancode of the desired key. Scancodes have to be specified as a +# decimal number. This command will allow you to display the hex scancodes +# for certain keys: +# +# `showkey --scancodes`. +# +# Then exactly one of: +# +# - `chars`: Send a byte sequence to the running application +# +# The `chars` field writes the specified string to the terminal. This makes +# it possible to pass escape sequences. To find escape codes for bindings +# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside +# of tmux. Note that applications use terminfo to map escape sequences back +# to keys. It is therefore required to update the terminfo when changing an +# escape sequence. +# +# - `action`: Execute a predefined action +# +# - ToggleViMode +# - SearchForward +# - SearchBackward +# - Copy +# - Paste +# - PasteSelection +# - IncreaseFontSize +# - DecreaseFontSize +# - ResetFontSize +# - ScrollPageUp +# - ScrollPageDown +# - ScrollHalfPageUp +# - ScrollHalfPageDown +# - ScrollLineUp +# - ScrollLineDown +# - ScrollToTop +# - ScrollToBottom +# - ClearHistory +# - Hide +# - Minimize +# - Quit +# - ToggleFullscreen +# - SpawnNewInstance +# - ClearLogNotice +# - ClearSelection +# - ReceiveChar +# - None +# +# (`mode: Vi` only): +# - Open +# - Up +# - Down +# - Left +# - Right +# - First +# - Last +# - FirstOccupied +# - High +# - Middle +# - Low +# - SemanticLeft +# - SemanticRight +# - SemanticLeftEnd +# - SemanticRightEnd +# - WordRight +# - WordLeft +# - WordRightEnd +# - WordLeftEnd +# - Bracket +# - ToggleNormalSelection +# - ToggleLineSelection +# - ToggleBlockSelection +# - ToggleSemanticSelection +# - SearchNext +# - SearchPrevious +# - SearchStart +# - SearchEnd +# +# (macOS only): +# - ToggleSimpleFullscreen: Enters fullscreen without occupying another space +# +# (Linux/BSD only): +# - CopySelection: Copies into selection buffer +# +# - `command`: Fork and execute a specified command plus arguments +# +# The `command` field must be a map containing a `program` string and an +# `args` array of command line parameter strings. For example: +# `{ program: "alacritty", args: ["-e", "vttest"] }` +# +# And optionally: +# +# - `mods`: Key modifiers to filter binding actions +# +# - Command +# - Control +# - Option +# - Super +# - Shift +# - Alt +# +# Multiple `mods` can be combined using `|` like this: +# `mods: Control|Shift`. +# Whitespace and capitalization are relevant and must match the example. +# +# - `mode`: Indicate a binding for only specific terminal reported modes +# +# This is mainly used to send applications the correct escape sequences +# when in different modes. +# +# - AppCursor +# - AppKeypad +# - Alt +# +# A `~` operator can be used before a mode to apply the binding whenever +# the mode is *not* active, e.g. `~Alt`. +# +# Bindings are always filled by default, but will be replaced when a new +# binding with the same triggers is defined. To unset a default binding, it can +# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for +# a no-op if you do not wish to receive input characters for that binding. +# +# If the same trigger is assigned to multiple actions, all of them are executed +# in the order they were defined in. +#key_bindings: + #- { key: Paste, action: Paste } + #- { key: Copy, action: Copy } + #- { key: L, mods: Control, action: ClearLogNotice } + #- { key: L, mods: Control, mode: ~Vi, 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 } + + # Vi Mode + #- { key: Space, mods: Shift|Control, mode: Vi, action: ScrollToBottom } + #- { key: Space, mods: Shift|Control, action: ToggleViMode } + #- { key: Escape, mode: Vi, action: ClearSelection } + #- { key: I, mode: Vi, action: ScrollToBottom } + #- { key: I, mode: Vi, action: ToggleViMode } + #- { key: Y, mods: Control, mode: Vi, action: ScrollLineUp } + #- { key: E, mods: Control, mode: Vi, action: ScrollLineDown } + #- { key: G, mode: Vi, action: ScrollToTop } + #- { key: G, mods: Shift, mode: Vi, action: ScrollToBottom } + #- { key: B, mods: Control, mode: Vi, action: ScrollPageUp } + #- { key: F, mods: Control, mode: Vi, action: ScrollPageDown } + #- { key: U, mods: Control, mode: Vi, action: ScrollHalfPageUp } + #- { key: D, mods: Control, mode: Vi, action: ScrollHalfPageDown } + #- { key: Y, mode: Vi, action: Copy } + #- { key: Y, mode: Vi, action: ClearSelection } + #- { key: Copy, mode: Vi, action: ClearSelection } + #- { key: V, mode: Vi, action: ToggleNormalSelection } + #- { key: V, mods: Shift, mode: Vi, action: ToggleLineSelection } + #- { key: V, mods: Control, mode: Vi, action: ToggleBlockSelection } + #- { key: V, mods: Alt, mode: Vi, action: ToggleSemanticSelection } + #- { key: Return, mode: Vi, action: Open } + #- { key: K, mode: Vi, action: Up } + #- { key: J, mode: Vi, action: Down } + #- { key: H, mode: Vi, action: Left } + #- { key: L, mode: Vi, action: Right } + #- { key: Up, mode: Vi, action: Up } + #- { key: Down, mode: Vi, action: Down } + #- { key: Left, mode: Vi, action: Left } + #- { key: Right, mode: Vi, action: Right } + #- { key: Key0, mode: Vi, action: First } + #- { key: Key4, mods: Shift, mode: Vi, action: Last } + #- { key: Key6, mods: Shift, mode: Vi, action: FirstOccupied } + #- { key: H, mods: Shift, mode: Vi, action: High } + #- { key: M, mods: Shift, mode: Vi, action: Middle } + #- { key: L, mods: Shift, mode: Vi, action: Low } + #- { key: B, mode: Vi, action: SemanticLeft } + #- { key: W, mode: Vi, action: SemanticRight } + #- { key: E, mode: Vi, action: SemanticRightEnd } + #- { key: B, mods: Shift, mode: Vi, action: WordLeft } + #- { key: W, mods: Shift, mode: Vi, action: WordRight } + #- { key: E, mods: Shift, mode: Vi, action: WordRightEnd } + #- { key: Key5, mods: Shift, mode: Vi, action: Bracket } + #- { key: Slash, mode: Vi, action: SearchForward } + #- { key: Slash, mods: Shift, mode: Vi, action: SearchBackward } + #- { key: N, mode: Vi, action: SearchNext } + #- { key: N, mods: Shift, mode: Vi, action: SearchPrevious } + + # (Windows, Linux, and BSD only) + #- { key: V, mods: Control|Shift, action: Paste } + #- { key: C, mods: Control|Shift, action: Copy } + #- { key: F, mods: Control|Shift, action: SearchForward } + #- { key: B, mods: Control|Shift, action: SearchBackward } + #- { key: C, mods: Control|Shift, mode: Vi, action: ClearSelection } + #- { key: Insert, mods: Shift, action: PasteSelection } + #- { key: Key0, mods: Control, action: ResetFontSize } + #- { key: Equals, mods: Control, action: IncreaseFontSize } + #- { key: Add, mods: Control, action: IncreaseFontSize } + #- { key: Subtract, mods: Control, action: DecreaseFontSize } + #- { key: Minus, mods: Control, action: DecreaseFontSize } + + # (Windows only) + #- { key: Return, mods: Alt, action: ToggleFullscreen } + + # (macOS only) + #- { key: K, mods: Command, mode: ~Vi, chars: "\x0c" } + #- { key: Key0, mods: Command, action: ResetFontSize } + #- { key: Equals, mods: Command, action: IncreaseFontSize } + #- { key: Add, mods: Command, action: IncreaseFontSize } + #- { key: Minus, mods: Command, action: DecreaseFontSize } + #- { key: K, mods: Command, action: ClearHistory } + #- { key: V, mods: Command, action: Paste } + #- { key: C, mods: Command, action: Copy } + #- { key: C, mods: Command, mode: Vi, action: ClearSelection } + #- { key: H, mods: Command, action: Hide } + #- { key: M, mods: Command, action: Minimize } + #- { key: Q, mods: Command, action: Quit } + #- { key: W, mods: Command, action: Quit } + #- { key: N, mods: Command, action: SpawnNewInstance } + #- { key: F, mods: Command|Control, action: ToggleFullscreen } + #- { key: F, mods: Command, action: SearchForward } + #- { key: B, mods: Command, action: SearchBackward } + +#debug: + # Display the time it takes to redraw each frame. + #render_timer: false + + # Keep the log file after quitting Alacritty. + #persistent_logging: false + + # Log level + # + # Values for `log_level`: + # - None + # - Error + # - Warn + # - Info + # - Debug + # - Trace + #log_level: Warn + + # Print all received window events. + #print_events: false diff --git a/user-config/bash/.bash_profile b/user-config/bash/.bash_profile new file mode 100644 index 0000000..34ae99a --- /dev/null +++ b/user-config/bash/.bash_profile @@ -0,0 +1,4 @@ +[[ -f ~/.bashrc ]] && . ~/.bashrc + +# Create variable GENERAL_SCREEN which is the pid of one or more screens called "general" +export GENERAL_SCREEN=`screen -ls | grep general | cut -f1 -d'.' | sed 's/\W//g'` diff --git a/user-config/bash/.bashrc b/user-config/bash/.bashrc new file mode 100644 index 0000000..2d210e7 --- /dev/null +++ b/user-config/bash/.bashrc @@ -0,0 +1,15 @@ +# +# ~/.bashrc +# + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +alias ls='ls --color=auto' +alias ll='ls -l' +alias la='ls -a' +alias lal='ls -al' + +PS1='[\u@\h \W]\$ ' + +source /usr/share/nvm/init-nvm.sh diff --git a/user-config/emacs/.bin/emacs-mail.sh b/user-config/emacs/.bin/emacs-mail.sh new file mode 100755 index 0000000..821bb2c --- /dev/null +++ b/user-config/emacs/.bin/emacs-mail.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +exec emacsclient -c --eval "(browse-url-mail \"$@\")" diff --git a/user-config/emacs/.bin/org-protocol-open.sh b/user-config/emacs/.bin/org-protocol-open.sh new file mode 100755 index 0000000..b1003ca --- /dev/null +++ b/user-config/emacs/.bin/org-protocol-open.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +exec emacsclient -e ' +(progn + (when (= (length (window-list)) 0) + (split-window-vertically)) + (other-window 1) + (org-roam--find-file + (substring + (url-filename + (url-generic-parse-url + (url-unhex-string "'"$@"'"))) + 6)))' diff --git a/user-config/emacs/.emacs.d/.mc-lists.el b/user-config/emacs/.emacs.d/.mc-lists.el new file mode 100644 index 0000000..a000f25 --- /dev/null +++ b/user-config/emacs/.emacs.d/.mc-lists.el @@ -0,0 +1,16 @@ +;; This file is automatically generated by the multiple-cursors extension. +;; It keeps track of your preferences for running commands with multiple cursors. + +(setq mc/cmds-to-run-for-all + '( + backward-sexp + forward-sexp + kill-region + org-beginning-of-line + org-delete-char + org-self-insert-command + )) + +(setq mc/cmds-to-run-once + '( + )) diff --git a/user-config/emacs/.emacs.d/config.org b/user-config/emacs/.emacs.d/config.org new file mode 100644 index 0000000..7175250 --- /dev/null +++ b/user-config/emacs/.emacs.d/config.org @@ -0,0 +1,3054 @@ +#+TITLE: Emacs Configuration +#+AUTHOR: [[https://www.blog.rekahsoft.ca/contact.html][Collin J. Doering]] +#+SETUPFILE: ~/.guix-profile/var/org-themes/org-html-themes/theme-readtheorg-local.setup +#+HTML_HEAD: +#+PROPERTY: header-args:emacs-lisp :tangle yes :tangle-mode (identity #o444) + +#+CATEGORY: emacs + +* Overview + +This is a literate emacs configuration which leverages [[https://orgmode.org/][org-mode]]. + +- Sections marked with ~non_guix~ will only be enabled on machines using the guix system + distribution. +- Sections marked with ~not_tangled~ will not appear/execute (be tangled) as part of this + emacs configuration or any related source file that is generated. Instead these code blocks + are meant for reference purposes. +- All emacs lisp code blocks are tangled unless their section is marked with ~not_tangled~. + Other language code blocks may or may not be tangled. See their [[https://www.gnu.org/software/emacs/manual/html_node/org/Using-Header-Arguments.html][code block header]]. +- Works with emacs version ~26+~. + +* Usage :not_tangled: + +To use this configuration, it must be 'tangled' then evaluated by emacs upon startup. This +can be facilitated by placing the following in ~.emacs.d/init.el~. + +#+begin_src emacs-lisp :tangle no + (let* ((filename (concat (file-name-directory load-file-name) "config")) + (config (concat filename ".org"))) + (when (file-exists-p config) + (org-babel-load-file config t))) +#+end_src + +Because the source version of this file is tangled upon emacs startup, it must exist so that +it can be tangled, leaving us with a bootstrapping problem. There are a few options to +overcome this: + +1. Have a step that runs an initial tangle over this document, which results in the + appropriate ~.emacs.d/init.el~ file. In this case, if this file is ever removed, it will + need to be manually regenerated. +2. Manage ~.emacs.d/init.el~ outside of this configuration. That is, expect the user has + placed the above snippet in place at ~.emacs.d/init.el~ (which is the case in the + repository this is distributed in). + +Option ~2~ is what is currently used, but both could be supported in the future. + +** Test Drive + +It is useful for testing, debugging an experimentation purposes to use this configuration +without modifying an existing emacs configuration that is already in place. To achieve this, +the following can be used. + +#+begin_src shell + emacs -q --eval '(load-file "/path/to/dotfiles/clone/user-config/emacs/.emacs.d/init.el")' +#+end_src + +On guix systems, all emacs packages should already be installed via a [[file:./../../../user-manifest.scm::(define %emacs-manifest][guix manifest]], so the +above will work without an issue. However, on non-guix systems, the emacs package manager +can be used to fetch missing packages. Later in this configuration ~use-package~ is setup, +and in the future the fetching of missing packages will be automated (even in this case, +see: [[*Automatically Fetch Packages][Automatically Fetch Packages]]). Until then, the above will result in an error when run +on a non-guix system, as ~use-package~ will be missing (as well as all other required +packages). Once ~use-package~ is installed in the instance of emacs launched by the above +command, running the command again should result in a working 'test drive' instance of +emacs. Alternatively, on non-guix distributions where the required packages have already +been installed for an existing configuration, simply sym-link the existing package directory +to ~~/.emacs.d/elpa~. + +* Conditions + +This configuration must take differing forms depending on the system it is executed on. Here +we set some variables that can be later used to modify what code blocks are executed at run +time. An alternative to this would be to generate (or 'tangle' in org-babel speak) different +versions of this file. Yet another alternative would be to use both methods interchangeably. +However, for this configuration I have chosen to handles these conditions at emacs run time, +instead of at ~org-babel~ tangle time (which occurs during emacs startup). + +#+begin_src emacs-lisp + (defvar is-guix-system-p (or (file-exists-p "/run/current-system/provenance") + (string-prefix-p (expand-file-name "~/.guix-profile") + (locate-file "emacs" exec-path))) + "Variable that is t if on a guix system, nil otherwise.") + + (defvar is-work-system-p (string-equal (system-name) "rekahsoft-work") + "Variable that is t if on a work system, nil otherwise.") +#+end_src + +* Turn off GC for Startup + +As [[https://github.com/nilcons/emacs-use-package-fast#a-trick-less-gc-during-startup][a startup performance enhancement]], turn off emacs garbage collection during +initialization. Turn it back on once initialization has completed. + +#+begin_src emacs-lisp + (setq gc-cons-threshold 64000000) + (add-hook 'after-init-hook + #'(lambda () + ;; Restore default after startup + (setq gc-cons-threshold 800000))) +#+end_src + +* Clean ~.emacs.d~ + +Use [[https://github.com/emacscollective/no-littering][no-littering]] to keep ~.emacs.d~ clean. + +#+begin_src emacs-lisp + (require 'no-littering) +#+end_src + +* Setup ~package.el~ :non_guix: + +Use the [[https://wikemacs.org/wiki/Package.el][package.el]] emacs package manager on non-guix systems. It is not needed (or wanted) on +guix systems as instead emacs packages should be installed via the package manager. + +#+begin_src emacs-lisp + (when (not is-guix-system-p) + ;; Set repos for package.el + (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("melpa-stable" . "https://stable.melpa.org/packages/"))) + + ;; This needs to be a the start of ~/.emacs since package-initialize is run after the user + ;; init file is read but before after-init-hook. It autoloads packages installed by + ;; package.el including updating the load-path and running/loading/requiring + ;; pkgname-autoload.el for all packages (where pkgname is replaced with the appropriate + ;; package name). To disable package.el's autoloading functionality use: + ;; (setq package-enabled-at-startup nil) + ;; The reason to use package-initialize here is so one can modify the installed modules + ;; later in this .emacs file but still retain the autoloading functionality of package.el + (package-initialize)) +#+end_src + +* Leverage ~use-package~ + +This configuration makes use of [[https://github.com/jwiegley/use-package][use-package]]. + +#+BEGIN_SRC emacs-lisp + ;; Use use-package to autoload packages for a faster emacs start-up + (require 'use-package) +#+END_src + +Sometimes its useful to turn this on for debugging purposes. + +#+begin_src emacs-lisp + ;; Enable use-package verbosity + ;; (setq use-package-verbose t) +#+end_src + +** Automatically Fetch Packages :non_guix: + +When on non-guix systems, that may or may not have the appropriate packages, it is useful to +use the ensure option of ~use-package~. + +*Note:* This currently expects ~use-package~ to already be installed. This will be resolved +as a TODO item. + +#+begin_src emacs-lisp :tangle no + (when (not is-guix-system-p) + (require 'use-package-ensure) + (setq use-package-always-ensure t)) +#+end_src + +* Activate modes with a set of hooks + +*This can likely be improved/removed - see TODOs* + +#+begin_src emacs-lisp + ;; Variables and functions that will be used in files in config folder + ;; Note: This should be put into another file (eg. lib.el) that could be loaded from here + ;; adds the given function mode to each element of the given-hooks + + (defun activate-mode-with-hooks (mode given-hooks) + (while given-hooks + (add-hook (car given-hooks) + mode) + (setq given-hooks (cdr given-hooks)))) + + ;; code-modes is a list of mode hooks (for programming langs only) + (defvar code-modes '(yaml-mode-hook sql-mode-hook sml-mode-hook scheme-mode-hook emacs-lisp-mode-hook c-mode-hook c++-mode-hook python-mode-hook lua-mode-hook python-mode-hook haskell-mode-hook php-mode-hook perl-mode-hook lisp-mode-hook clojure-mode-hook ruby-mode-hook erlang-mode-hook sh-mode-hook java-mode-hook scala-mode-hook js-mode-hook vue-mode-hook yaml-mode vhdl-mode rust-mode-hook graphql-mode makefile-mode-hook terraform-mode-hook asm-mode-hook go-mode-hook)) +#+end_src + +* Setup Custom + +#+begin_src emacs-lisp + ;; Load customization's made by customize + (setq custom-file (no-littering-expand-etc-file-name "custom.el")) + (load custom-file) +#+end_src + +* Setup auth-source Backend + +Use password store backend disabling netrc and gpg encrypted netrc options. See [[info:auth#Help for + users][info:auth#Help for users]] for more details. + +#+begin_src emacs-lisp + (auth-source-pass-enable) + (setq auth-sources '(password-store)) +#+end_src + +* Theme + +#+begin_src emacs-lisp + ;; TODO: This doesn't actually work when emacs is run as a daemon + ;; Set emoji font + (set-fontset-font t '(#x1f000 . #x1faff) + (font-spec :family "Noto Color Emoji")) + + ;; Turn off menu-bar when running in terminal + ;; Note: When run as a Xwindow, .Xresources turns off the menu-bar and tool-bar + (unless window-system (menu-bar-mode -1)) + + ;; Stop startup screen + (setq inhibit-startup-screen t) + + (defun doom|init-theme () + (load-theme 'doom-city-lights t) + (doom-modeline-init)) + + (defun doom|init-theme-in-frame (frame) + (with-selected-frame frame + (doom|init-theme)) + + ;; Unregister this hook once its run + (remove-hook 'after-make-frame-functions + 'doom|init-theme-in-frame)) + + (use-package all-the-icons-dired + :config (add-hook 'dired-mode-hook 'all-the-icons-dired-mode)) + + (use-package doom-themes + :config (progn + (setq doom-themes-enable-bold t ; if nil, bold is universally disabled + doom-themes-enable-italic t) ; if nil, italics is universally disabled + + (if (daemonp) + (add-hook 'after-make-frame-functions + 'doom|init-theme-in-frame) + (doom|init-theme)) + + ;; Enable flashing mode-line on errors + (doom-themes-visual-bell-config) + + ;; Corrects (and improves) org-modes's native fontification + (doom-themes-org-config))) + + ;; Enable treemacs theme + (use-package doom-themes-ext-treemacs + :after treemacs doom-themes + :config (treemacs-load-theme 'doom-colors)) + + (use-package doom-modeline + :defer t) +#+end_src + +* EXWM + +Define some interactive helper functions to launch various programs + +#+begin_src emacs-lisp + (defun launch-browser () + (interactive) + (start-process "kitty" "browser-output" "icecat")) + + (defun launch-kitty () + (interactive) + (start-process "kitty" "kitty-output" "kitty" "-1")) + + (global-set-key (kbd "C-s-f") 'launch-browser) + (global-set-key (kbd "") 'launch-kitty) +#+end_src + +Define a function ~start-as-window-manager~ that allows a user to optionally start emacs as a +window manager. + +#+begin_src emacs-lisp + (defun start-as-window-manager () + (use-package exwm + :config (setq exwm-workspace-show-all-buffers t + exwm-layout-show-all-buffers t)) + + (use-package exwm-config + :after (exwm)) + + (use-package exwm-randr + :after (exwm exwm-config) + :config + (progn + (exwm-randr-enable) + (exwm-config-default)))) +#+end_src + +To start emacs as a window manager, add something like this to ~~/.xinitrc~. + +#+begin_src shell + exec emacs -f start-as-window-manager +#+end_src + +** System Tray + +#+begin_src emacs-lisp + (use-package exwm-systemtray + :config (exwm-systemtray-enable)) +#+end_src + +* Window Management + +#+begin_src emacs-lisp + (use-package ace-window + :bind + (:map global-map + ("M-o" . ace-window))) +#+end_src + +#+begin_src emacs-lisp + ;; Make C-x O cycle backwards a pane (oposite to C-x o) + (global-set-key "\C-xO" #'(lambda () + (interactive) + (other-window -1))) +#+end_src + +#+begin_src emacs-lisp + ;; Use this function to create a X11 emacs frame with a static name so it can + ;; be treated specially by xmonad (as a scratch-pad in this case). This is expected + ;; to be run from command-line like so: + ;; emacsclient --eval '(make-frame-with-static-name "emacs-scratch")' + (defun make-frame-with-static-name (given-name) + "Makes a (X11) frame with a unchanging name for the purposes of finding it with + a window manager, and treating it specially." + (make-frame-on-display ":0" `((name . ,given-name)))) + + ;; Toggles windows split orientation of 2 adjecent windows + ;; Thanks to http://www.emacswiki.org/cgi-bin/wiki?ToggleWindowSplit + (defun toggle-window-split () + (interactive) + (if (= (count-windows) 2) + (let* ((this-win-buffer (window-buffer)) + (next-win-buffer (window-buffer (next-window))) + (this-win-edges (window-edges (selected-window))) + (next-win-edges (window-edges (next-window))) + (this-win-2nd (not (and (<= (car this-win-edges) + (car next-win-edges)) + (<= (cadr this-win-edges) + (cadr next-win-edges))))) + (splitter + (if (= (car this-win-edges) + (car (window-edges (next-window)))) + 'split-window-horizontally + 'split-window-vertically))) + (delete-other-windows) + (let ((first-win (selected-window))) + (funcall splitter) + (if this-win-2nd (other-window 1)) + (set-window-buffer (selected-window) this-win-buffer) + (set-window-buffer (next-window) next-win-buffer) + (select-window first-win) + (if this-win-2nd (other-window 1)))))) + + ;; TODO: this breaks treemacs when its the buffer thats rotated + ;; Rotates windows + ;; See: http://www.emacswiki.org/emacs/TransposeWindows + (defun rotate-windows (arg) + "Rotate your windows; use the prefix argument to rotate the other direction" + (interactive "P") + (if (not (> (count-windows) 1)) + (message "You can't rotate a single window!") + (let* ((rotate-times (if (and (numberp arg) (not (= arg 0))) arg 1)) + (direction (if (or (< rotate-times 0) (equal arg '(4))) + 'reverse + (lambda (x) x))) + (i 0)) + (while (not (= rotate-times 0)) + (while (< i (- (count-windows) 1)) + (let* ((w1 (elt (funcall direction (window-list)) i)) + (w2 (elt (funcall direction (window-list)) (+ i 1))) + (b1 (window-buffer w1)) + (b2 (window-buffer w2)) + (s1 (window-start w1)) + (s2 (window-start w2)) + (p1 (window-point w1)) + (p2 (window-point w2))) + (set-window-buffer-start-and-point w1 b2 s2 p2) + (set-window-buffer-start-and-point w2 b1 s1 p1) + (setq i (1+ i)))) + + (setq i 0 + rotate-times + (if (< rotate-times 0) (1+ rotate-times) (1- rotate-times))))))) + + ;; Assign keybinding to toggle split orientation of 2 adjacent windows, and to rotate windows + (define-key ctl-x-4-map "t" 'toggle-window-split) + (global-set-key "\C-cr" 'rotate-windows) +#+end_src + +* Features +** Scratches + +#+begin_src emacs-lisp + (defvar scratch-buffer-alist '((python-mode . "# This buffer is for notes you don't want to save, and for Lisp evaluation.\n# If you want to create a file, visit that file with C-x C-f,\n# then enter the text in that file's own buffer."))) + + (defun open-scratch-buffer (&optional buf-mode buf-name msg) + "Opens a scratch buffer; if none exists creates one. When called with the universal argument (C-u) will ask what mode to use for the scratch buffer." + (interactive + (cond ((equal current-prefix-arg nil) ;; universal argument not called + (list initial-major-mode "*scratch*" initial-scratch-message)) + ((equal current-prefix-arg '(4)) ;; Universal argument called (C-u) + (let* ((buf-mode (read-command "Mode: " initial-major-mode)) + (buf-name (if (equal buf-mode initial-major-mode) + "*scratch*" + (concat "*scratch:" (symbol-name buf-mode) "*"))) + (msg "")) + (list buf-mode buf-name msg))))) + (let* ((scratch-buffer (get-buffer buf-name))) + ;; check if the scratchpad is open. If not create it, change its mode and insert message text at the top of the buffer + (if (null scratch-buffer) + (with-current-buffer (get-buffer-create buf-name) + (funcall buf-mode) + (insert msg))) + (switch-to-buffer buf-name))) + + ;; Bind a key to grab a scratchpad + (define-key ctl-x-4-map "s" 'open-scratch-buffer) +#+end_src + +** Pastebins + +Setup access to ix.io pastebin + +#+begin_src emacs-lisp + (use-package ix) +#+end_src + +** Flyspell + +#+begin_src emacs-lisp + ;; Thanks to: http://www.emacswiki.org/emacs/FlySpell#toc11 + (defun flyspell-emacs-popup-textual (event poss word) + "A textual flyspell popup menu." + (require 'popup) + (let* ((corrects (if flyspell-sort-corrections + (sort (car (cdr (cdr poss))) 'string<) + (car (cdr (cdr poss))))) + (cor-menu (if (consp corrects) + (mapcar (lambda (correct) + (list correct correct)) + corrects) + '())) + (affix (car (cdr (cdr (cdr poss))))) + show-affix-info + (base-menu (let ((save (if (and (consp affix) show-affix-info) + (list + (list (concat "Save affix: " (car affix)) + 'save) + '("Accept (session)" session) + '("Accept (buffer)" buffer)) + '(("Save word" save) + ("Accept (session)" session) + ("Accept (buffer)" buffer))))) + (if (consp cor-menu) + (append cor-menu (cons "" save)) + save))) + (menu (mapcar + (lambda (arg) (if (consp arg) (car arg) arg)) + base-menu))) + (cadr (assoc (popup-menu* menu :scroll-bar t) base-menu)))) + + (use-package flyspell + :after auto-complete auto-complete-config + :config (progn + (ac-flyspell-workaround) + (activate-mode-with-hooks 'flyspell-prog-mode code-modes) + (activate-mode-with-hooks 'flyspell-mode '(text-mode-hook markdown-mode-hook latex-mode-hook org-mode-hook magit-log-edit-mode-hook mu4e-compose-mode-hook)) + (fset 'flyspell-emacs-popup 'flyspell-emacs-popup-textual))) +#+end_src + +** TODO Language Server Protocol Support + +#+begin_src emacs-lisp :tangle no + ;; Set prefix for lsp-command-keymap (few alternatives - "s-l", "C-l", "C-c l") + (setq lsp-keymap-prefix "C-l") + + (use-package lsp-mode + :hook (;; TODO: replace XXX-mode with concrete major-mode(e. g. python-mode) + ;; (XXX-mode . lsp) + ;; TODO: if you want which-key integration + ;;(lsp-mode . lsp-enable-which-key-integration) + ) + :commands lsp) + + (use-package lsp-ui :commands lsp-ui-mode) + + (use-package helm-lsp :commands helm-lsp-workspace-symbol) + + ;; ;; optionally if you want to use debugger + ;; (use-package dap-mode) + ;; (use-package dap-LANGUAGE) to load the dap adapter for your language + + ;; ;; optional if you want which-key integration + ;; (use-package which-key + ;; :config + ;; (which-key-mode)) +#+end_src + +** Helm + +#+begin_src emacs-lisp + ;; Setup helm + (use-package helm + :bind (("C-c y" . helm-show-kill-ring) + ("C-x b" . helm-mini) + ("C-x C-f" . helm-find-files) + ("M-x" . helm-M-x) + ("C-x c i" . helm-semantic-or-imenu) + ("C-x c o" . helm-occur) + ("C-x c t" . helm-top) + ("C-x c r" . helm-register) + ("C-x c g" . helm-do-grep) + ("C-x c f" . helm-for-files) + ("C-x c m" . helm-man-woman) + ("C-x c a" . helm-apropos) + ("C-x c u" . helm-surfraw) ;; TODO: this keybinding is unused + ("C-x c c" . helm-colors) + ("C-c h i" . helm-info) + ("s-p" . helm-run-external-command) + :map helm-map + ("" . helm-execute-persistent-action) ;; Rebind tab to run persistent action + ("C-i" . helm-execute-persistent-action) ;; Make TAB works in terminal + ("C-z" . helm-select-action) ;; List actions using C-z + ) + :config (progn + (setq helm-quick-update t + helm-buffers-fuzzy-matching t + helm-split-window-inside-p t ; open helm buffer inside current window, not occupy whole other window + helm-move-to-line-cycle-in-source t ; move to end or beginning of source when reaching top or bottom of source. + helm-ff-search-library-in-sexp t ; search for library in `require' and `declare-function' sexp. + helm-scroll-amount 8 ; scroll 8 lines other window using M-/M- + helm-ff-file-name-history-use-recentf t + helm-follow-mode-persistent t) + + (helm-mode 1) + (helm-adaptive-mode))) + + ;; See: https://github.com/emacs-helm/helm-org/issues/3 + (use-package helm-org + :after helm + :config (add-to-list 'helm-completing-read-handlers-alist '(org-set-tags-command . helm-org-completing-read-tags))) + + (use-package helm-rg + :after helm + :config (setq helm-rg-default-extra-args "--hidden")) + + ;; Setup helm-swoop + ;; See: https://github.com/ShingoFukuyama/helm-swoop + (use-package helm-swoop + :after helm + :bind (("C-x c s" . helm-swoop))) + + ;; Setup helm-ls-git to quickly select files from the current vc dir + (use-package helm-ls-git + :after helm + :bind (("C-x C-d" . helm-browse-project))) + + (use-package helm-descbinds + :after helm + :commands helm-descbinds-mode + :config (helm-descbinds-mode) + :bind (("C-h k" . helm-descbinds))) + + (use-package helm-unicode + :after helm + :bind (("C-x 8 RET" . helm-unicode))) + + ;; TODO: this appears to be broken with the latest version of mu4e + ;; Likely due to the fact that the packaged version installed via guix + ;; is old compared to upstream: https://github.com/emacs-helm/helm-mu + (use-package helm-mu + :after helm mu4e + :bind (("C-x c M" . helm-mu) + ("C-x c C" . helm-mu-contacts) + :map mu4e-main-mode-map + ("s" . helm-mu) + :map mu4e-headers-mode-map + ("s" . helm-mu) + :map mu4e-view-mode-map + ("s" . helm-mu))) + + (use-package helm-tramp + :after helm + :bind (("C-x c d" . helm-tramp))) + + (use-package helm-exwm + :after helm + :bind (("C-x c e" . helm-exwm))) +#+end_src + +** TODO Projectile + +- [ ] helm-projectile is not available until explicitly run + +#+begin_src emacs-lisp + ;; Use projectile to manage projects (with helm completion) + (use-package projectile + :init (setq + projectile-indexing-method 'native + projectile-switch-project-action 'projectile-vc + projectile-project-search-path '("~/Code/" "~/work/" "~/.scratch")) + :bind (("C-c p" . 'projectile-command-map)) + :config (projectile-mode 1)) + + (use-package helm-projectile + :after helm projectile + :config (helm-projectile-on)) +#+end_src + +It is useful to sync projectile projects into treemacs if they are not there already. The +~sync-projectile-projects-to-treemacs~ below can be used interactively to achieve this. + +#+begin_src emacs-lisp + (defun sync-projectile-projects-to-treemacs () + "Sync all projectile projects into treemacs." + (interactive) + + (with-current-buffer (find-file-noselect projectile-known-projects-file) + (goto-char (point-min)) + (loop for i in (read (current-buffer)) + for filepath = (expand-file-name i) do + (letf ((treemacs-override-workspace (treemacs--find-workspace filepath))) + (unless (treemacs--find-project-for-path filepath) + (message "Adding %s to treemacs workspace %s" i (treemacs-workspace->name (treemacs-current-workspace))) + (treemacs-add-project-to-workspace i (file-name-sans-extension i))))))) +#+end_src + +** TODO Perspectives :not_tangled: + +This is currently disabled as it has not been used thoroughly and is still has usage issues +that require investigation. + +#+begin_src emacs-lisp :tangle no + ;; Taken and modified from spacemacs + ;; See: https://github.com/syl20bnr/spacemacs/blob/master/layers/+spacemacs/spacemacs-layouts/funcs.el#L329 + (defun helm-persp-switch-project (arg) + "Switch to a projectile perspective using helm. + ARG is unused" + (interactive "P") + (helm + :sources + (helm-build-in-buffer-source "*Helm Switch Project Layout*" + :data (lambda () + (if (projectile-project-p) + (cons (abbreviate-file-name (projectile-project-root)) + (projectile-relevant-known-projects)) + projectile-known-projects)) + :fuzzy-match helm-projectile-fuzzy-match + :mode-line helm-read-file-name-mode-line-string + :action '(("Switch to Project Perspective" . + (lambda (project) + (let ((persp-reset-windows-on-nil-window-conf t) + (project-name (file-name-nondirectory (directory-file-name project)))) + (persp-switch project) + (persp-rename project-name) + (let ((projectile-completion-system 'helm)) + (projectile-switch-project-by-name project))))))) + :buffer "*Helm Projectile Layouts*")) + + ;; Taken and modified from spacemacs + ;; See: https://github.com/syl20bnr/spacemacs/blob/master/layers/+spacemacs/spacemacs-layouts/funcs.el#L313 + (defun helm-persp-kill () + "Kill perspectives with all their buffers." + (interactive) + (helm + :buffer "*Helm Kill Perspectives with all their buffers*" + :sources (helm-build-in-buffer-source + (s-concat "Current Perspective: " + (persp-name (get-current-persp))) + :data (seq-filter (lambda (n) (not (string-equal n "main"))) (persp-names)) + :fuzzy-match t + :action + '(("Kill perspective(s)" . + (lambda (candidate) + (mapcar 'persp-kill + (helm-marked-candidates)))))))) + + (use-package persp-mode + :diminish + :init (progn + (setq persp-nil-name "main") + (add-hook 'after-init-hook (lambda () (persp-mode +1))))) + + (use-package persp-projectile + :after persp-mode + :bind (("C-x x P" . projectile-persp-switch-project) + ("C-c p p" . helm-persp-switch-project) + ("C-x x c" . helm-persp-kill))) + + (use-package persp-mode-projectile-bridge + :disabled ;; TODO: BROKEN + :after projectile persp-mode + :commands (persp-mode-projectile-bridge-find-perspectives-for-all-buffers + persp-mode-projectile-bridge-kill-perspectives) + :hook ((persp-mode . persp-mode-projectile-bridge-mode) + (persp-mode-projectile-bridge-mode + . (lambda () + (if persp-mode-projectile-bridge-mode + (persp-mode-projectile-bridge-find-perspectives-for-all-buffers) + (persp-mode-projectile-bridge-kill-perspectives)))))) +#+end_src + +** TODO Desktop Save + +#+begin_src emacs-lisp + ;; TODO: Disabled as this causes frames to no longer open in daemon-mode + ;; ;; Enable desktop-save-mode. + ;; ;; When running as a daemon, defer loading of saved desktop until first frame is created + ;; (add-hook 'after-make-frame-functions + ;; (lambda () + ;; (if (daemonp) + ;; (progn + ;; (desktop-save-mode 1) + ;; (desktop-read)) + ;; (desktop-save-mode 1)))) +#+end_src + +** IBuffer + +#+begin_src emacs-lisp + (use-package ibuffer + :bind ("C-x C-b" . ibuffer) + :config (progn + (use-package ibuf-ext) + (use-package ibuffer-vc) + (use-package ibuffer-projectile) + ;; Require ibuffer extentions (used for ibuffer-never-show-predicates) + (add-to-list 'ibuffer-never-show-predicates "^\\*slime-events\\*$") + (add-to-list 'ibuffer-never-show-predicates "^\\*Completions\\*$") + (add-to-list 'ibuffer-never-show-predicates "^\\*tramp/.*\\*$") + + ;; Add vc-status line to ibuffer + (setq ibuffer-formats '((mark modified read-only vc-status-mini " " + (name 18 18 :left :elide) " " + (size 9 -1 :right) " " + (mode 16 16 :left :elide) " " + (vc-status 16 16 :left) " " + filename-and-process) + (mark " " (name 16 -1) " " filename))) + + ;; Merge the results of filtering by creating filter groups first for projectile + ;; then for each major mode (of currently open buffers + (add-hook 'ibuffer-mode-hook + (lambda () + (setq ibuffer-filter-groups + (append + (ibuffer-projectile-generate-filter-groups) + (mapcar (lambda (mode) + (cons (format "%s" mode) `((mode . ,mode)))) + (let ((modes + (ibuffer-remove-duplicates + (mapcar (lambda (buf) + (buffer-local-value 'major-mode buf)) + (buffer-list))))) + (if ibuffer-view-ibuffer + modes + (delq 'ibuffer-mode modes)))))) + (let ((ibuf (get-buffer "*Ibuffer*"))) + (when ibuf + (with-current-buffer ibuf + (pop-to-buffer ibuf) + (ibuffer-update nil t)))))))) +#+end_src + +*** ibuffer Icons + +Leverage [[https://github.com/seagle0128/all-the-icons-ibuffer][all-the-icons-ibuffer]] to show pretty icons beside buffers in iBuffer. + +#+begin_src emacs-lisp + (use-package all-the-icons-ibuffer + :after all-the-icons + :config (all-the-icons-ibuffer-mode 1)) +#+end_src + +** Insert Templates + +#+begin_src emacs-lisp + ;; + ;; Considering phasing this out in-place of yasnippet + ;; + + (setq auto-insert-query nil ;; If you don't want to be prompted before insertion + autoinsert-tpl-author "Collin J. Doering" + autoinsert-tpl-email "collin.doering@rekahsoft.ca" + auto-insert-directory (no-littering-expand-etc-file-name "templates/") ;; Trailing slash important + auto-insert-alist + '(("\\.c$" . ["c-template.c" auto-update-generic-template]) + ("\\.cc\\|cpp$" . ["cpp-template.cc" auto-update-generic-template]) + ("\\.php$" . ["php-template.php" auto-update-generic-template]) + ("\\.rb$" . ["ruby-template.rb" auto-update-generic-template]) + ("\\.lua$" . ["lua-template.lua" auto-update-generic-template]) + ("\\.erl$" . ["erlang-template.erl" auto-update-generic-template]) + ("\\.sh$" . ["shell-template.sh" auto-update-generic-template]) + ("\\.rkt$" . ["racket-template.rkt" auto-update-generic-template]) + ("\\.scm$" . ["scheme-template.scm" auto-update-generic-template]) + ("\\.clj$" . ["clojure-template.clj" auto-update-generic-template]) + ("\\.lisp$" . ["lisp-template.lisp" auto-update-generic-template]) + ("\\.el$" . ["emacs-lisp-template.el" auto-update-generic-template]) + ("\\.hs$" . ["haskell-template.hs" auto-update-generic-template]) + ("\\.ml$" . ["ocaml-template.ml" auto-update-generic-template]) + ("\\.sml$" . ["sml-template.sml" auto-update-generic-template]) + ("\\.py$" . ["python-template.py" auto-update-generic-template]) + ("\\.java$" . ["java-template.java" auto-update-generic-template]) + ("\\.scala$" . ["scala-template.scala" auto-update-generic-template]) + ("\\.htm\\|html$" . ["html-template.html" auto-update-generic-template]) + ("\\.js$" . ["java-script-template.js" auto-update-generic-template]) + ("\\.css$" . ["css-template.css" auto-update-generic-template]) + ("\\.scss$" . ["scss-template.scss" auto-update-generic-template]) + ("\\.sass$" . ["sass-template.sass" auto-update-generic-template]) + ("\\.haml$" . ["haml-template.haml" auto-update-generic-template]) + ("\\.markdown$" . ["markdown-template.markdown" auto-update-generic-template]) + ("\\.tex$" . ["latex-template.tex" auto-update-generic-template])) + auto-insert 'other) + + ;; auto-insert options template and auto-completion + (add-hook 'find-file-hooks 'auto-insert) + + ;; TODO: remove interactive-ness from auto-update-generic-template as it's not needed + ;; and there only as a workaround. Python and PHP templates are not filled for + ;; some unknown reason. + (defun auto-update-generic-template () + (interactive) + (save-excursion + ;; Replace @!@FILENAME@!@ with file name sans suffix + (while (search-forward "@!@FILENAME@!@" nil t) + (save-restriction + (narrow-to-region (match-beginning 0) (match-end 0)) + (replace-match (file-name-sans-extension (file-name-nondirectory buffer-file-name)) t)))) + (save-excursion + ;; Replace @!@FILE@!@ with file name + (while (search-forward "@!@FILE@!@" nil t) + (save-restriction + (narrow-to-region (match-beginning 0) (match-end 0)) + (replace-match (file-name-nondirectory buffer-file-name) t)))) + (save-excursion + ;; replace @!@DATE@!@ with today's date + (while (search-forward "@!@DATE@!@" nil t) + (save-restriction + (narrow-to-region (match-beginning 0) (match-end 0)) + (replace-match "") + (insert-date)))) + (save-excursion + ;; Replace @!@YEAR@!@ with the current year + (while (search-forward "@!@YEAR@!@" nil t) + (save-restriction + (narrow-to-region (match-beginning 0) (match-end 0)) + (replace-match (format-time-string "%Y" (current-time)))))) + (save-excursion + ;; Replace @!@AUTHOR@!@ with the current year + (while (search-forward "@!@AUTHOR@!@" nil t) + (save-restriction + (narrow-to-region (match-beginning 0) (match-end 0)) + (replace-match "") + (insert-author)))) + (save-excursion + ;; Replace @!@EMAIL@!@ with the current year + (while (search-forward "@!@EMAIL@!@" nil t) + (save-restriction + (narrow-to-region (match-beginning 0) (match-end 0)) + (replace-match "") + (insert-author-email))))) + + ;; Insert current date at cursor in the currently active buffer + (defun insert-date () + "Insert today's date into buffer" + (interactive) + (insert (format-time-string "%b %e, %Y" (current-time)))) + + (defun insert-author () + "Insert author name at point" + (interactive) + (insert autoinsert-tpl-author)) + + (defun insert-author-email () + "Insert author email at point" + (interactive) + (insert autoinsert-tpl-email)) +#+end_src + +** Terminal + +#+begin_src emacs-lisp + ;; Setup multi-term + ;; See: http://www.emacswiki.org/MultiTerm + (use-package multi-term + :init ;; Fixes issue with tab key + ;; See: https://github.com/capitaomorte/yasnippet/issues/289&sa=U&ei=8HJ2VLnbFvHhsASa0oGYBw&ved=0CBgQFjAB&sig2=3GORWPQWDpRVgReLr40nkw&usg=AFQjCNFvbeuG4bRq4nbWTPwuu7-5S4UChA + (add-hook 'term-mode-hook (lambda () + (yas-minor-mode -1))) + :bind (("C-c t" . multi-term) + ("C-c T" . multi-term-dedicated-toggle) + ("C-c F" . multi-term-next) + ("C-c B" . multi-term-prev))) + + (use-package vterm + :config + (setq vterm-kill-buffer-on-exit t + vterm-max-scrollback 100000 ;; Max 100000 + vterm-eval-cmds '(("man" man) + ("info" info-other-window) + ("find-file" find-file) + ("message" message) + ("vterm-clear-scrollback" vterm-clear-scrollback)))) +#+end_src + +** Hydra + +#+begin_src emacs-lisp + (use-package hydra) +#+end_src + +* Programs +** IRC - rcirc + +#+begin_src emacs-lisp + ;; Use rcirc for irc; see: http://www.emacswiki.org/emacs/rcirc + ;; Use rcirc-notify extension; see: http://www.emacswiki.org/emacs/rcircNotify + (use-package rcirc + :demand t + :if (daemonp) + :bind ("C-c I" . rcirc) + :hook ((rcirc-mode . flyspell-mode)) ;; Turn on flyspell mode in rcirc buffers + :config (progn + (use-package dbus + :config (progn + (defun nm-is-connected() + (equal 70 (dbus-get-property + :system "org.freedesktop.NetworkManager" "/org/freedesktop/NetworkManager" + "org.freedesktop.NetworkManager" "State"))))) + + (use-package rcirc-notify + :config (rcirc-notify-add-hooks)) + + ;; Change user info + (setq rcirc-default-nick "rekahsoft" + rcirc-default-user-name "rekahsoft" + rcirc-default-full-name "rekahsoft" + rcirc-time-format "%Y-%m-%d %H:%M " + rcirc-log-flag t + + rcirc-server-alist + '(("irc.libera.chat" :port 6697 :encryption tls + :channels ("#emacs" "#haskell" "#racket" "#xmonad" "#guix" "#guile")) + ("localhost" :port 6667 :channels () :method 'bitlbee))) + + ;; Advice rcirc function to read credentials from via auth-source api + (defun rcirc--read-from-auth-source (&optional args) + (unless args + (setq rcirc-authinfo + (seq-reduce (lambda (rst x) + (let* ((host (car x)) + (rec (cdr x)) + (user (or (plist-get rec :user) + rcirc-default-user-name)) + (method (or (plist-get rec :method) + 'nickserv)) + (p (auth-source-search :host host :user user :require '(:user :secret) :max 1)) + (secret (if p (plist-get (car p) :secret)))) + (cons (list host method user (if (functionp secret) + (funcall secret) + secret)) rst))) + rcirc-server-alist nil)))) + (advice-add 'rcirc :before #'rcirc--read-from-auth-source) + + ;; TODO: this function uses the first password and encryption in rcirc-server-alist + ;; where it should use the one for server being reconnected to + ;; Thanks to: http://www.emacswiki.org/emacs/rcircReconnect + (defun-rcirc-command reconnect (arg) + "Reconnect the server process." + (interactive "i") + (unless process + (error "There's no process for this target")) + (let* ((server (car (process-contact process))) + (port (process-contact process :service)) + (nick (rcirc-nick process)) + channels query-buffers) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (when (eq process (rcirc-buffer-process)) + (remove-hook 'change-major-mode-hook + 'rcirc-change-major-mode-hook) + (if (rcirc-channel-p rcirc-target) + (setq channels (cons rcirc-target channels)) + (setq query-buffers (cons buf query-buffers)))))) + (delete-process process) + (rcirc-connect server port nick + rcirc-default-user-name + rcirc-default-full-name + channels + (plist-get (cdr rcirc-server-alist) :password) + (plist-get (cdr rcirc-server-alist) :encryption)))) + + ;; Thanks to: http://www.emacswiki.org/emacs/rcircAll + (defun-rcirc-command all (input) + "Run the arguments as a command for all connections. + Example use: /all away food or /all quit zzzz." + (interactive "s") + (let ((buffers (mapcar 'process-buffer (rcirc-process-list)))) + (dolist (buf buffers) + (with-current-buffer buf + (goto-char (point-max)) + (insert "/" input) + (rcirc-send-input))))) + + ;; Turn on rcirc tracking to be displayed in mode-line + (rcirc-track-minor-mode) + + ;; Connect to servers auto-matically if in daemon-mode + (if (and (daemonp) (nm-is-connected)) + (rcirc nil)))) +#+end_src + +** Email - Mu4e + +#+begin_src emacs-lisp + ;; Setup email using mu4e (mbsync in the background) and smtpmail + (use-package mu4e + ; TODO: bug found when switching to guix powered emacs + :init (setq mu4e~main-buffer-name "*mu4e*") + :config (progn + (setq mail-user-agent 'mu4e-user-agent + mu4e-maildir "~/.mail" + mu4e-get-mail-command "mbsync -a" + mu4e-update-interval 300 + message-send-mail-function 'smtpmail-send-it + message-kill-buffer-on-exit t + mu4e-use-fancy-chars t + mu4e-confirm-quit nil + mu4e-headers-date-format "%d/%b/%Y %H:%M" + message-signature-insert-empty-line t + mu4e-view-show-images t + mu4e-view-image-max-width 800 + + mml-secure-openpgp-sign-with-sender t + message-cite-style message-cite-style-gmail + + ;; Change the filename when moving mail; this is required to avoid duplicate uids with mbsync + mu4e-change-filenames-when-moving t + ;; Move emails to sent folder upon being successfully sent + mu4e-sent-messages-behavior 'sent + ;; Configure Gmail style citation + message-citation-line-format "On %d %b %Y at %R, %f wrote:\n" + message-citation-line-function 'message-insert-formatted-citation-line + + mu4e-view-actions '(("capture message" . mu4e-action-capture-message) + ("pdf view" . mu4e-action-view-as-pdf) + ("browser view" . mu4e-action-view-in-browser) + ("show this thread" . mu4e-action-show-thread)) + + mu4e-contexts + `( ,(make-mu4e-context + :name "Personal" + :enter-func (lambda () (mu4e-message "Entering Personal context")) + :leave-func (lambda () (mu4e-message "Leaving Personal context")) + ;; we match based on the contact-fields of the message + :match-func (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg :to "collin@rekahsoft.ca"))) + :vars `((user-mail-address . "collin@rekahsoft.ca") + (user-full-name . "Collin J. Doering") + (mu4e-sent-folder . "/collin@rekahsoft.ca/Sent") + (mu4e-drafts-folder . "/collin@rekahsoft.ca/Drafts") + (mu4e-trash-folder . "/collin@rekahsoft.ca/Trash") + (mu4e-refile-folder . "/collin@rekahsoft.ca/Archive") + (mu4e-maildir-shortcuts . (("/collin@rekahsoft.ca/Inbox" . ?i) + ("/collin@rekahsoft.ca/Archive" . ?a) + ("/collin@rekahsoft.ca/Sent" . ?s) + ("/collin@rekahsoft.ca/Drafts" . ?d) + ("/collin@rekahsoft.ca/Trash" . ?t) + ("/collin@rekahsoft.ca/Junk" . ?J) + ("/collin@rekahsoft.ca/Mailing Lists" . ?m) + ("/collin@rekahsoft.ca/Mailing Lists/Gnu/Guix" . ?g))) + (mu4e-bookmarks . (,(make-mu4e-bookmark + :name "Unread messages" + :query "flag:unread AND NOT flag:trashed AND maildir:/collin@rekahsoft.ca/*" + :key ?u) + ,(make-mu4e-bookmark + :name "Today's messages" + :query "date:today..now AND maildir:/collin@rekahsoft.ca/*" + :key ?t) + ,(make-mu4e-bookmark + :name "Last 7 days" + :query "date:7d..now AND maildir:/collin@rekahsoft.ca/*" + :key ?w) + ,(make-mu4e-bookmark + :name "Messages with images" + :query "mime:image/* AND maildir:/collin@rekahsoft.ca/*" + :key ?p))) + (mu4e-compose-signature . + (concat + "Collin J. Doering\n\n" + "http://rekahsoft.ca\n" + "http://blog.rekahsoft.ca\n" + "http://git.rekahsoft.ca\n")))) + ,(make-mu4e-context + :name "GMail" + :enter-func (lambda () (mu4e-message "Entering GMail context")) + :leave-func (lambda () (mu4e-message "Leaving GMail context")) + ;; we match based on the contact-fields of the message + :match-func (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg :to "collin.doering@gmail.com"))) + :vars `((user-mail-address . "collin.doering@gmail.com") + (user-full-name . "Collin J. Doering") + (mu4e-sent-folder . "/collin.doering@gmail.com/[Gmail]/.Sent Mail") + (mu4e-drafts-folder . "/collin.doering@gmail.com/[Gmail]/.Drafts") + (mu4e-trash-folder . "/collin.doering@gmail.com/[Gmail]/.Trash") + (mu4e-refile-folder . "/collin.doering@gmail.com/[Gmail]/.All Mail") + (mu4e-maildir-shortcuts . (("/collin.doering@gmail.com/Inbox" . ?i) + ("/collin.doering@gmail.com/[Gmail]/.All Mail" . ?a) + ("/collin.doering@gmail.com/[Gmail]/.Sent Mail" . ?s) + ("/collin.doering@gmail.com/[Gmail]/.Drafts" . ?d) + ("/collin.doering@gmail.com/[Gmail]/.Starred" . ?f) + ("/collin.doering@gmail.com/[Gmail]/.Trash" . ?t) + ("/collin.doering@gmail.com/[Gmail]/.Spam" . ?J))) + (mu4e-bookmarks . (,(make-mu4e-bookmark + :name "Unread messages" + :query "flag:unread AND NOT flag:trashed AND maildir:/collin.doering@gmail.com/*" + :key ?u) + ,(make-mu4e-bookmark + :name "Today's messages" + :query "date:today..now AND maildir:/collin.doering@gmail.com/*" + :key ?t) + ,(make-mu4e-bookmark + :name "Last 7 days" + :query "date:7d..now AND maildir:/collin.doering@gmail.com/*" + :key ?w) + ,(make-mu4e-bookmark + :name "Messages with images" + :query "mime:image/* AND maildir:/collin.doering@gmail.com/*" + :key ?p))) + ;; GMail automatically adds messages to the users sent folder, so successfully sent messages should be deleted to avoid duplicates + (mu4e-sent-messages-behavior . delete) + (mu4e-compose-signature . + (concat + "Collin J. Doering\n\n" + "http://rekahsoft.ca\n" + "http://blog.rekahsoft.ca\n" + "http://git.rekahsoft.ca\n")))) + ,(make-mu4e-context + :name "Rekahsoft-GMail" + :enter-func (lambda () (mu4e-message "Entering Rekahsoft-GMail context")) + :leave-func (lambda () (mu4e-message "Leaving Rekahsoft-GMail context")) + ;; we match based on the contact-fields of the message + :match-func (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg :to "rekahsoft@gmail.com"))) + :vars `((user-mail-address . "rekahsoft@gmail.com") + (user-full-name . "Collin J. Doering") + (mu4e-sent-folder . "/rekahsoft@gmail.com/[Gmail]/.Sent Mail") + (mu4e-drafts-folder . "/rekahsoft@gmail.com/[Gmail]/.Drafts") + (mu4e-trash-folder . "/rekahsoft@gmail.com/[Gmail]/.Trash") + (mu4e-refile-folder . "/rekahsoft@gmail.com/[Gmail]/.All Mail") + (mu4e-maildir-shortcuts . (("/rekahsoft@gmail.com/Inbox" . ?i) + ("/rekahsoft@gmail.com/[Gmail]/.All Mail" . ?a) + ("/rekahsoft@gmail.com/[Gmail]/.Sent Mail" . ?s) + ("/rekahsoft@gmail.com/[Gmail]/.Drafts" . ?d) + ("/rekahsoft@gmail.com/[Gmail]/.Starred" . ?f) + ("/rekahsoft@gmail.com/[Gmail]/.Trash" . ?t) + ("/rekahsoft@gmail.com/[Gmail]/.Spam" . ?J))) + (mu4e-bookmarks . (,(make-mu4e-bookmark + :name "Unread messages" + :query "flag:unread AND NOT flag:trashed AND maildir:/rekahsoft@gmail.com/*" + :key ?u) + ,(make-mu4e-bookmark + :name "Today's messages" + :query "date:today..now AND maildir:/rekahsoft@gmail.com/*" + :key ?t) + ,(make-mu4e-bookmark + :name "Last 7 days" + :query "date:7d..now AND maildir:/rekahsoft@gmail.com/*" + :key ?w) + ,(make-mu4e-bookmark + :name "Messages with images" + :query "mime:image/* AND maildir:/rekahsoft@gmail.com/*" + :key ?p))) + ;; GMail automatically adds messages to the users sent folder, so successfully sent messages should be deleted to avoid duplicates + (mu4e-sent-messages-behavior . delete) + (mu4e-compose-signature . + (concat + "Collin J. Doering\n\n" + "http://rekahsoft.ca\n" + "http://blog.rekahsoft.ca\n" + "http://git.rekahsoft.ca\n")))) + ,(make-mu4e-context + :name "eSentire" + :enter-func (lambda () (mu4e-message "Entering eSentire context")) + :leave-func (lambda () (mu4e-message "Leaving eSentire context")) + ;; we match based on the contact-fields of the message + :match-func (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg :to "collin.doering@esentire.com"))) + :vars `((user-mail-address . "collin.doering@esentire.com") + (user-full-name . "Collin J. Doering") + (mu4e-sent-folder . "/collin.doering@esentire.com/Sent Items") + (mu4e-drafts-folder . "/collin.doering@esentire.com/Drafts") + (mu4e-trash-folder . "/collin.doering@esentire.com/Deleted Items") + (mu4e-refile-folder . "/collin.doering@esentire.com/Archive") + (mu4e-maildir-shortcuts . (("/collin.doering@esentire.com/Inbox" . ?i) + ("/collin.doering@esentire.com/Archive" . ?a) + ("/collin.doering@esentire.com/Sent Items" . ?s) + ("/collin.doering@esentire.com/Drafts" . ?d) + ("/collin.doering@esentire.com/Important" . ?f) + ("/collin.doering@esentire.com/Deleted Items" . ?t) + ("/collin.doering@esentire.com/Junk Email" . ?J))) + (mu4e-bookmarks . (,(make-mu4e-bookmark + :name "Unread messages" + :query "flag:unread AND NOT flag:trashed AND maildir:/collin.doering@esentire.com/*" + :key ?u) + ,(make-mu4e-bookmark + :name "Today's messages" + :query "date:today..now AND maildir:/collin.doering@esentire.com/*" + :key ?t) + ,(make-mu4e-bookmark + :name "Last 7 days" + :query "date:7d..now AND maildir:/collin.doering@esentire.com/*" + :key ?w) + ,(make-mu4e-bookmark + :name "Messages with images" + :query "mime:image/* AND maildir:/collin.doering@esentire.com/*" + :key ?p))) + (mu4e-compose-signature . "Collin J. Doering | Senior Engineering Manager + eSentire Inc, - The industry's only pure-play MDR provider + M: 519.500.0931 + "))) + ,(make-mu4e-context + :name "Lacure" + :enter-func (lambda () (mu4e-message "Entering Lacure context")) + :leave-func (lambda () (mu4e-message "Leaving Lacure context")) + ;; we match based on the contact-fields of the message + :match-func (lambda (msg) + (when msg + (mu4e-message-contact-field-matches msg :to "collin@lacure.com"))) + :vars `((user-mail-address . "collin@lacure.com") + (user-full-name . "Collin J. Doering") + (mu4e-sent-folder . "/collin@lacure.com/Sent Items") + (mu4e-drafts-folder . "/collin@lacure.com/Drafts") + (mu4e-trash-folder . "/collin@lacure.com/Deleted Items") + (mu4e-refile-folder . "/collin@lacure.com/Archive") + (mu4e-maildir-shortcuts . (("/collin@lacure.com/Inbox" . ?i) + ("/collin@lacure.com/Archive" . ?a) + ("/collin@lacure.com/Sent Items" . ?s) + ("/collin@lacure.com/Drafts" . ?d) + ("/collin@lacure.com/Important" . ?f) + ("/collin@lacure.com/Deleted Items" . ?t) + ("/collin@lacure.com/Junk Email" . ?J))) + (mu4e-bookmarks . (,(make-mu4e-bookmark + :name "Unread messages" + :query "flag:unread AND NOT flag:trashed AND maildir:/collin@lacure.com/*" + :key ?u) + ,(make-mu4e-bookmark + :name "Today's messages" + :query "date:today..now AND maildir:/collin@lacure.com/*" + :key ?t) + ,(make-mu4e-bookmark + :name "Last 7 days" + :query "date:7d..now AND maildir:/collin@lacure.com/*" + :key ?w) + ,(make-mu4e-bookmark + :name "Messages with images" + :query "mime:image/* AND maildir:/collin@lacure.com/*" + :key ?p))) + (mu4e-compose-signature . "Collin J. Doering - Lacure\n"))))) + + ;; Use imagemagick to display images (if available) + (when (fboundp 'imagemagick-register-types) + (imagemagick-register-types))) + :hook ((mu4e-compose-mode . (lambda () (auto-save-mode -1))) + (mu4e-compose-mode . turn-off-auto-fill) + (mu4e-compose-mode . visual-line-mode)) + :bind (("C-x M" . mu4e))) + + ;; TODO: this functionality has moved upstream. See: https://github.com/djcb/mu/pull/1586. + ;; Also, this appears to be broken when using guix powered emacs + (use-package mu4e-maildirs-extension + :after mu4e + :config (progn + (mu4e-maildirs-extension) + + ;; Override mu4e-maildirs-extension-get-relevant-maildirs to allow filtering of + ;; displayed maildirs depending on the current mu4e context + (defun mu4e-maildirs-extension-get-relevant-maildirs () + (seq-filter (lambda (maildir) + (string-match-p + (alist-get 'user-mail-address (mu4e-context-vars (mu4e-context-current))) + maildir)) + (mu4e-get-maildirs))) + + (defun mu4e-maildirs-after-enter-context () + (interactive) + (let ((current-prefix-arg '(16))) + (mu4e-maildirs-extension-with-buffer + (call-interactively 'mu4e-maildirs-extension-force-update)))) + + (defadvice mu4e-context-switch + (after mu4e-context-after-enter-func activate) + (mu4e-maildirs-after-enter-context)) + + (ad-activate 'mu4e-context-switch))) + + (use-package mu4e-alert + :after mu4e + :commands mu4e-alert-set-default-style + :config (progn + (setq mu4e-alert-interesting-mail-query "flag:unread AND (maildir:/collin@rekahsoft.ca/Inbox OR maildir:/collin.doering@gmail.com/Inbox)") + (mu4e-alert-set-default-style 'libnotify)) + :hook ((after-init . mu4e-alert-enable-notifications) + (after-init . mu4e-alert-enable-mode-line-display))) + + (use-package smtpmail + :config (progn + ;; Setup smtp defaults + (setq user-full-name "Collin J. Doering" + smtpmail-smtp-server "smtp.migadu.com" + smtpmail-smtp-service 587 + smtpmail-stream-type 'starttls + smtpmail-debug-info t) + + (setq smtp-accounts + '(("collin@rekahsoft.ca" "Collin J. Doering" "smtp.migadu.com") + ("collin.doering@gmail.com" "Collin J. Doering" "smtp.gmail.com") + ("rekahsoft@gmail.com" "rekahsoft" "smtp.gmail.com") + ("collin.doering@esentire.com" "Collin J. Doering" "smtp.office365.com") + ("collin@lacure.com" "Collin J. Doering" "smtp.office365.com"))) + + (defun my-change-smtp () + (save-excursion + (loop with from = (save-restriction + (message-narrow-to-headers) + (message-fetch-field "from")) + for (addr fname server) in smtp-accounts + when (string-match addr from) + do (setq user-mail-address addr + user-full-name fname + smtpmail-smtp-server server + smtpmail-smtp-user addr)))) + + (defadvice smtpmail-via-smtp + (before change-smtp-by-message-from-field (recipient buffer &optional ask) activate) + (with-current-buffer buffer (my-change-smtp))) + + (ad-activate 'smtpmail-via-smtp))) + + ;; Attach files using dired using 'C-c RET C-a' + ;; Thanks to: http://www.djcbsoftware.nl/code/mu/mu4e/Attaching-files-with-dired.html#Attaching-files-with-dired + (use-package gnus-dired + :config (progn + ;; make the `gnus-dired-mail-buffers' function also work on + ;; message-mode derived modes, such as mu4e-compose-mode + (defun gnus-dired-mail-buffers () + "Return a list of active message buffers." + (let (buffers) + (save-current-buffer + (dolist (buffer (buffer-list t)) + (set-buffer buffer) + (when (and (derived-mode-p 'message-mode) + (null message-sent-message-via)) + (push (buffer-name buffer) buffers)))) + (nreverse buffers))) + + (setq gnus-dired-mail-mode 'mu4e-user-agent) + (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode))) +#+end_src + +** PDF Viewer + +Emacs comes with a built in pdf reader that leverages imagemagic to convert the pdf to images +which are then read off disk. This is not optimal from the perspective of performance +however, but luckily the [[https://github.com/politza/pdf-tools][pdf-tools]] package resolves this, as well as adds a variety of nice +features (eg search, text annotation, highlighting, and more..) on top of providing a much +nicer user experience. + +#+begin_src emacs-lisp + (use-package pdf-tools + :config (pdf-tools-install)) +#+end_src + +* TODO Editing :needs_review: + +This section should be reviewed as this has grown over time. Also, some if not many of these +settings can likely be replaced by the [[https://github.com/hrs/sensible-defaults.el][sensible-defaults]] package. + +#+begin_src emacs-lisp + ;; Turn off indentation (use spaces instead) + (setq-default indent-tabs-mode nil) + + ;; Turn on global pretty-ification of symbols + (global-prettify-symbols-mode 1) + + (use-package pretty-mode + :config (global-pretty-mode 1)) + + (setq + ;; Make cursor the width of the character it is under + x-stretch-cursor t + ;; Single spaces denote end sentences for use with sentence commands + sentence-end-double-space nil) + + ;; Show column number in mode-line + (column-number-mode) + + ;; Show size of file in mode-line + (size-indication-mode) + + ;; Set the fill-column for text filling + (setq-default fill-column 93) + + ;; TODO: guix - this currently does not load in daemon mode + ;; Turn hl-line-mode on globally + ;;(global-hl-line-mode) + + ;; Activate linum-mode in all buffers used for programming + (activate-mode-with-hooks (lambda () (display-line-numbers-mode 1)) code-modes) + + ;; Add little indicators to fringe indicating the location of point in the given window + ;; See: https://www.gnu.org/software/emacs/manual/html_node/emacs/Displaying-Boundaries.html + ;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Useless-Whitespace.html + (setq-default indicate-buffer-boundaries 'left + indicate-empty-lines t) + + ;; Don't scroll the buffer to center when using follow-mode + (add-hook 'follow-mode-hook (lambda () + (make-local-variable 'scroll-conservatively) + (set 'scroll-conservatively 101))) + + ;; Indicate empty space at the end of a line + ;;(setq-default show-trailing-whitespace nil) + + ;; Do not display error when killing from a read-only buffer; instead just show a warning + ;; Note: in both cases the killed text is copied to the kill-ring + ;; See: https://www.gnu.org/software/emacs/manual/html_node/emacs/Kill-Options.html#Kill-Options + (setq kill-read-only-ok t) + + ;; Enable the disabled narrowing commands + (put 'narrow-to-defun 'disabled nil) + (put 'narrow-to-page 'disabled nil) + (put 'narrow-to-region 'disabled nil) + + ;; Setup cursor-blink-mode + (setq blink-cursor-blinks 3) + (blink-cursor-mode) + + ;; Setup electric-pair mode globally + (electric-pair-mode) + + ;; Use view-mode aggressively for read-only files + ;; See: http://www.emacswiki.org/emacs/ViewMode + (setq view-read-only t) + + ;; Stop renaming of saved files to filename~ which ends up breaking hardlinks + (setq backup-by-copying-when-linked t) + + ;; fixes color output issues; see: http://wiki.archlinux.org/index.php/Emacs#Colored_output_issues + (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on) + + ;; Automatically open some config files with an associated major mode + ;; Note: regexp's used to match buffer filenames are intentionally left + ;; unbounded (without '$') to catch cases where the filename may + ;; take the format: filename~ + (add-to-list 'auto-mode-alist '("\\.conkerorrc" . js-mode)) + (add-to-list 'auto-mode-alist '("\\.xmobarrc" . haskell-mode)) + (add-to-list 'auto-mode-alist '("\\.screenrc" . conf-mode)) + (add-to-list 'auto-mode-alist '("\\.stumpwmrc" . lisp-mode)) + (add-to-list 'auto-mode-alist '("\w*\\.service" . conf-mode)) + (add-to-list 'auto-mode-alist '("\w*\\.socket" . conf-mode)) + (add-to-list 'auto-mode-alist '("\\.mpdconf" . conf-mode)) + (add-to-list 'auto-mode-alist '("dunstrc" . conf-mode)) + + ;; Thanks to: http://ergoemacs.org/emacs/emacs_byte_compile.html + (defun byte-compile-if-elisp () + "`byte-compile' current buffer if it's emacs-lisp-mode and compiled file exists." + (interactive) + (when (and (eq major-mode 'emacs-lisp-mode) + (file-exists-p (byte-compile-dest-file buffer-file-name))) + (byte-compile-file buffer-file-name))) + + (add-hook 'after-save-hook 'byte-compile-if-elisp) + + (use-package string-inflection) + + (use-package fill-column-indicator + :config (turn-on-fci-mode)) + + ;; Highlight indentation + (use-package highlight-indent-guides + :init (progn + (setq highlight-indent-guides-method 'character + highlight-indent-guides-character ?\| + highlight-indent-guides-auto-odd-face-perc 15 + highlight-indent-guides-auto-even-face-perc 15 + highlight-indent-guides-auto-character-face-perc 20)) + :config (add-hook 'prog-mode-hook 'highlight-indent-guides-mode)) +#+end_src + +Enable some commands that are by default disabled. + +#+begin_src elisp + (put 'set-goal-column 'disabled nil) + (put 'upcase-region 'disabled nil) +#+end_src + +** Ace Jump Mode + +#+begin_src emacs-lisp + (use-package ace-jump-mode + :bind ("C-c SPC" . ace-jump-mode)) +#+end_src + +** Link Navigation + +[[https://github.com/abo-abo/avy][avy]] is a package that assist with jumping to visible text using a char-based decision tree. +The [[https://github.com/abo-abo/ace-link][ace-link]] package leverages avy to provide quick navigation of links in various contexts. + +#+begin_src emacs-lisp + (use-package ace-link + :config (ace-link-setup-default)) +#+end_src + +** Expand Region + +#+begin_src emacs-lisp + (use-package expand-region + :bind ("C-=" . er/expand-region)) +#+end_src + +** Multiple Cursors + +#+begin_src emacs-lisp + (use-package multiple-cursors + :bind (("C-S-c C-S-c" . mc/edit-lines) + ("C->" . mc/mark-next-like-this) + ("C-<" . mc/mark-previous-like-this) + ("C-c C-<" . mc/mark-all-like-this))) + + (use-package ace-mc + :after multiple-cursors ace-jump-mode + :bind (("C-c m m" . ace-mc-add-multiple-cursors) + ("C-c m s" . ace-mc-add-single-cursor))) +#+end_src + +** Auto Complete + +Setup fancy auto-complete + +#+begin_src emacs-lisp + (use-package auto-complete) + (use-package auto-complete-config + :after auto-complete + :config (progn + (ac-config-default) + ;; Set trigger keys so yasnippet and auto-complete play nicely. If tab is pressed + ;; and the word at point exists in yasnippet, then yassippet will be used; + ;; otherwise auto-complete will be used. + (ac-set-trigger-key "TAB") + (ac-set-trigger-key ""))) + ;;(add-to-list 'ac-dictionary-directories "/usr/share/emacs/site-lisp/auto-complete/ac-dict") +#+end_src + +** Yaml + +#+begin_src emacs-lisp + (use-package yaml-mode + :config (add-hook 'yaml-mode-hook + (lambda () + (make-variable-buffer-local 'yas-indent-line) + (setq yas-indent-line nil)))) +#+end_src + +** Yasnippet + +#+begin_src emacs-lisp + ;; Courtesy of https://github.com/makp/emacs-configs/blob/master/mk_yasnippet-setup.el + (defun shk-yas/helm-prompt (prompt choices &optional display-fn) + "Use helm to select snippet choices." + (interactive) + (setq display-fn (or display-fn 'identity)) + (if (require 'helm-config) + (let (tmpsource cands result rmap) + (setq cands (mapcar (lambda (x) (funcall display-fn x)) choices)) + (setq rmap (mapcar (lambda (x) (cons (funcall display-fn x) x)) choices)) + (setq tmpsource + (list + (cons 'name prompt) + (cons 'candidates cands) + '(action . (("Expand" . (lambda (selection) selection)))) + )) + (setq result (helm-other-buffer '(tmpsource) "*helm-select-yasnippet")) + (if (null result) + (signal 'quit "user quit!") + (cdr (assoc result rmap)))) + nil)) + + (use-package yasnippet + :defer t + :config (progn + (if is-guix-system-p + (yas-load-directory "~/.guix-profile/share/emacs/site-lisp/yasnippet-snippets-1.0/snippets") + (yas-load-directory "~/.emacs.d/elpa/yasnippet-snippets-20200802.1658")) + (yas-load-directory (no-littering-expand-etc-file-name "snippets")) + (setq-default + ac-sources (push 'ac-source-yasnippet ac-sources) + yas-prompt-functions '(shk-yas/helm-prompt yas-dropdown-prompt)) + (yas-global-mode 1))) + + (use-package helm-c-yasnippet + :bind (("C-" . helm-yas-complete)) + :config (setq helm-yas-space-match-any-greedy t)) + + (use-package auto-yasnippet + :bind (("C-c w" . aya-create) + ("C-c e" . aya-expand))) +#+end_src + +** Rebox2 + +#+begin_src emacs-lisp + ;; TODO: this is breaks multiple cursors (rebox replaces yank and other commands) + ;; url: http://www.emacswiki.org/emacs/rebox2 + (use-package rebox2 + :init (setq rebox-style-loop '(10 11 12 13 15 16 17 20 21 22 23 26 27)) + :config (define-globalized-minor-mode global-rebox-mode rebox-mode rebox-mode)) +#+end_src + +** God Mode + +#+begin_src emacs-lisp + (use-package god-mode + :config (progn + ;;(require 'god-mode-isearch) + ;;(define-key isearch-mode-map (kbd "") 'god-mode-isearch-activate) + ;;(define-key god-mode-isearch-map (kbd "") 'god-mode-isearch-disable) + + (define-key god-local-mode-map (kbd ".") 'repeat) + (define-key god-local-mode-map (kbd "i") 'god-local-mode) + + (setq god-exempt-major-modes + (append god-exempt-major-modes + '(eshell-mode term-mode rcirc-mode mu4e-main-mode + mu4e-view-mode mu4e-headers-mode mu4e-compose-mode))) + ;; (setq god-exempt-predicates nil) + + (defun c/god-mode-update-cursor () + (cond (god-local-mode (progn + (set-face-background 'mode-line "grey20") + (set-face-foreground 'mode-line "#1ddeaa") + (set-face-background 'mode-line-inactive "grey3") + (set-face-foreground 'mode-line-inactive "grey80"))) + (t (progn + (set-face-background 'mode-line "grey20") + (set-face-foreground 'mode-line "#00afff") + (set-face-background 'mode-line-inactive "grey5") + (set-face-foreground 'mode-line-inactive "grey80"))))) + + (add-hook 'god-mode-enabled-hook 'c/god-mode-update-cursor) + (add-hook 'god-mode-disabled-hook 'c/god-mode-update-cursor)) + ;; This kills the ESC prefix keymap, so I may replace it with a different binding + :bind ("" . god-mode-all)) +#+end_src + +** Dired + +#+begin_src emacs-lisp + ;; Enable dired-find-alternative-file + (put 'dired-find-alternate-file 'disabled nil) + + ;; Use human readable file sizes + (setq dired-listing-switches "-alh") + + ;; Setup omit-mode in dired + (require 'dired-x) + (setq-default dired-omit-files-p t) ; Buffer-local variable + (setq dired-omit-files (concat dired-omit-files "\\|^\\..+$")) + + ;; Use dired-subtree from dired-hacks + (use-package dired-subtree + :config (bind-keys :map dired-mode-map + ("i" . dired-subtree-insert) + (";" . dired-subtree-remove))) + + ;; Use dired-narrow from dired-hacks to narrow dired to match filter + (use-package dired-narrow + :bind (:map dired-mode-map + ("/" . dired-narrow))) +#+end_src + +** Undo Tree + +#+begin_src emacs-lisp + ;; Setup undo-tree + (use-package undo-tree + :config (progn + (global-undo-tree-mode))) +#+end_src + +** Code Folding + +#+begin_src emacs-lisp + (use-package vimish-fold + :config (vimish-fold-global-mode 1) + :bind (("C-x n f" . vimish-fold) + ("C-x n F" . vimish-fold-refold-all) + ("C-x n k" . vimish-fold-delete) + ("C-x n u" . vimish-fold-unfold-all))) +#+end_src + +** TODO Debugging + +Currently this is broken and results in a non-blocking error upon emacs startup. + +#+begin_src emacs-lisp + (use-package realgud + :disabled) +#+end_src + +** Swiper + +#+begin_src emacs-lisp + (use-package swiper + :bind (("C-c s" . swiper))) +#+end_src + +* Modes +** Winner + +#+begin_src emacs-lisp + (use-package winner + :init (winner-mode +1) + :bind (("" . winner-undo) + ("" . winner-redo))) +#+end_src + +** Magit + +#+begin_src emacs-lisp + (defun magit-status-with-prefix () + "Call magit-status with the prefix key" + (interactive) + (let ((current-prefix-arg '(4))) + (call-interactively 'magit-status))) + + (use-package magit + :init (setq magit-commit-signoff t + magit-status-buffer-switch-function 'switch-to-buffer + magit-last-seen-setup-instructions "1.4.0" + vc-follow-symlinks t) + :bind (("C-x g" . magit-status) + ("C-x G" . magit-status-with-prefix))) +#+end_src + +Use [[https://github.com/magit/forge][magit-forge]] to interact with git forges. + +#+begin_src emacs-lisp + (use-package forge + :after magit + :config (setq forge-alist + (append forge-alist + '(("git.eng.esentire.com" "git.eng.esentire.com/api/v3" + "git.eng.esentire.com" forge-github-repository) + ("git.rekahsoft.ca:2222" "git.rekahsoft.ca/api/v1" + "git.rekahsoft.ca" forge-gitea-repository))))) +#+end_src + +Use [[https://github.com/magit/orgit][orgit]] to allow links to magit from org-mode files. + +#+begin_src emacs-lisp + (use-package orgit + :after org) +#+end_src + +** TODO Calendar + +#+begin_src emacs-lisp + (setq calendar-latitude 43.1 + calendar-longitude 80.7 + calendar-location-name "Woodstock, ON") +#+end_src + +This appears to be unnecessary (the default functions as needed). + +#+begin_src emacs-lisp :tangle no + (setq calendar-daylight-savings-starts '(calendar-nth-named-day 1 0 3 year) + calendar-daylight-savings-ends '(calendar-nth-named-day 1 0 11 year)) +#+end_src + +*Note:* currently the ~calendar-time-zone~ value is purposely set incorrectly. This needs to +be investigated. + +#+begin_src emacs-lisp :tangle no + (setq calendar-time-zone 344 ; This SHOULD be -300, however no sunrise is displayed in this case. This value seems to give the correct sunrise/sunset + calendar-standard-time-zone-name "EST" + calendar-daylight-time-zone-name "EDT") +#+end_src + +** Org Mode + +Use [[http://gnuplot.sourceforge.net/][gnuplot]] alongside org-mode to generate plots. + +#+begin_src emacs-lisp + (use-package gnuplot + :defer t) +#+end_src + +#+begin_src emacs-lisp + (use-package org + :defer t + :custom org-modules (append '(org-habit) org-modules) + :config (progn + (setq org-directory "~/.org" + org-attach-directory (concat (file-name-as-directory org-directory) "data") + org-todo-keywords '((sequence "TODO(t)" "NEXT(n!/!)" "DOING(s!/!)" "|" "DONE(d!/@)") + (sequence "WAIT(w@/!)" "PAUSE(p@/!)" "|" "CANCELED(c@/@)" "PHONE(P!)") + (sequence "REPLY(r!)" "|" "SENT(S!)")) + org-todo-keyword-faces '(("TODO" . org-warning) + ("DOING" . "cyan") + ("DONE" . org-done) + ("WAIT" . "orange red") + ("PAUSE" . "yellow") + ("CANCELED" . (:foreground "orange" :weight bold)) + ("PHONE" . org-done) + ("REPLY" . org-warning) + ("SENT" . org-done)) + org-agenda-sorting-strategy '((agenda time-up priority-down category-keep) + (todo priority-down category-keep) + (tags priority-down category-keep) + (search category-keep)) + org-agenda-window-setup 'current-window + org-agenda-clockreport-parameter-plist '(:link t :maxlevel 3 :hidefiles t :properties ("CATEGORY")) + + ;; Use org-indent-mode globally + org-startup-indented t + + ;; Ensure that org-add-note puts notes after drawers + ;; See: https://emacs.stackexchange.com/questions/17282/org-mode-logbook-note-entry-without-logbook-drawer + org-log-state-notes-insert-after-drawers t + + ;; Set org-jump default interface. The org-jump outline can still be + ;; accessed using a universal prefix + ;; See: https://emacs.stackexchange.com/questions/32617/how-to-jump-directly-to-an-org-headline + org-goto-interface 'outline-path-completion + + org-return-follows-link t + org-log-done 'time + org-src-fontify-natively t + org-enforce-todo-dependencies t + org-refile-use-outline-path t + org-global-properties '(("Effort_ALL" . "0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00")) + org-columns-default-format "%65ITEM(Task) %TODO %3PRIORITY %8Effort(Effort){:} %CLOCKSUM %SCHEDULED %DEADLINE %TAGS") + + ;; Setup org-crypt + (setq org-crypt-key "E05BFEC8" + org-crypt-disable-auto-save 'encrypt) + (org-crypt-use-before-save-magic) + + ;; Enable markdown export + (require 'ox-md) + + (setq org-agenda-files + (let ((agenda-dir "~/.org/roam/agenda") + (agenda-files '("~/.emacs.d/config.org"))) + (if (file-directory-p agenda-dir) + (append agenda-files + (directory-files-recursively + agenda-dir + "\.org\\(\.gpg\\)?$" t t)))) + org-refile-targets `((nil :maxlevel . 5) + (,org-agenda-files :maxlevel . 3))) + + ;; This provides a much more usable experience with org-refile from helm + (setq org-outline-path-complete-in-steps nil + org-refile-use-outline-path t) + + ;; Set org-timer options + (setq org-timer-default-timer "0:25:00" + org-clock-sound (no-littering-expand-etc-file-name "assets/beep.wav") + org-show-notification-timeout 5) + + ;; Persist org-mode clocks between emacs sessions + (setq org-clock-persist 'history) + (org-clock-persistence-insinuate) + + ;; Enable org-mode capture + (setq org-default-notes-file "~/.org/roam/agenda/capture.org") + + (setq org-capture-templates + '(("t" "Templates for tasks") + ("tt" "Task" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* TODO %?\n %i\n") + ("tT" "Immediate task" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* DOING %?\n%T\n%i\n" :clock-in t :clock-resume t) + ("te" "Task regarding a particular email" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* TODO Follow up on %a from '%:fromname' %?\n%U\n") + ("tE" "Immediately start task regarding a particular email" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* Doing Follow up on %a from %:fromname %?\n%U\n" :clock-in t :clock-resume t) + ("tf" "Task with regards to a particular file" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* TODO %?\nFile: [[%F]]\n") + ("tF" "Task with regards to a particular file" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* TODO %?\nFile: [[%F]]\n" :clock-in t :clock-keep t) + + ("a" "Templates for appointments") + ("aa" "Appointment" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* %?\n%i%^T") + ("aA" "Immediate appointment" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* %?\n %i\n%i%T" :clock-in t :clock-resume t) + + ("r" "Templates for replies") + ("re" "Reply to a particular email" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* REPLY to '%:fromname' regarding %a%?\n%U\n") + ("rE" "Immediately reply to a particular email" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* SENT to %:fromname regarding %a%?\n%U\n" :clock-in t :clock-resume t) + + ("p" "Phone call" entry + (file+olp "~/.org/roam/agenda/capture.org" "Triage") + "* PHONE %?\n %U\n" :clock-in t :clock-resume t) + + ;; ;; TODO: these should likely be moved into org-roam-dailies capture templates + ;; ("l" "Templates for logging") + ;; ("ll" "Log" entry + ;; (file+datetree "~/.org/logbook.org") + ;; "* %?\n Entered on %U\n %i\n") + ;; ("lf" "Log with file link" entry + ;; (file+datetree "~/.org/logbook.org") + ;; "* %?\n Entered on %U\n %i\n %a") + )) + + ;; Use minted (requires python package pygments) for exported source code listings when using + ;; pdflatex + ;; See: https://emacs.stackexchange.com/questions/27154/exporting-highlighted-source-code-to-pdf-in-org-mode + (add-to-list 'org-latex-packages-alist '("" "minted")) + (setq org-latex-listings 'minted + org-latex-pdf-process + '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" + "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" + "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f")) + + ;; Add additional languages for org-babel (now part of org-mode) + (org-babel-do-load-languages + 'org-babel-load-languages + '((haskell . t) + (gnuplot . t) + (emacs-lisp . t) + (C . t) + (python . t) + (awk . t) + (clojure . t) + (ditaa . t) + (dot . t) + (groovy . t) + (java . t) + (python . t) + (lisp . t) + (ledger . t) + (scheme . t) + (plantuml . t) + (octave . t) + (rec . t) + (sql . t) + (sqlite . t) + (shell . t))) + + (setq org-plantuml-exec-mode 'plantuml)) + :bind (("C-c c" . org-capture) + ("C-c l" . org-store-link) + ("C-c a" . org-agenda) + ("C-c b" . org-switchb) + ("C-c L" . org-insert-link-global) + ("C-c o" . org-open-at-point-global) + ("C-c C-/" . org-decrypt-entries))) + + ;; Enable easy templates + (use-package org-tempo + :after org) + + ;; GUIX TODO: This package is not available + ;; (use-package org-magit + ;; :after org) + + (use-package org-ac + :after org + :config (org-ac/config-default)) + + (use-package org-mu4e + :after org mu4e) + + (use-package ob-async + :after org + :config (setq ob-async-no-async-languages-alist '("shell"))) +#+end_src + +*** Setup [[https://github.com/abo-abo/org-download][org-download]] + +#+begin_src emacs-lisp + (use-package org-download + :after org + :config (setq org-download-screenshot-method "scrot -s %s") + :bind (:map org-mode-map + ("C-c d y" . org-download-yank) + ("C-c d s" . org-download-screenshot) + ("C-c d e" . org-download-edit))) +#+end_src + +*** Setup [[https://www.orgroam.com][org-roam]] + +#+begin_src emacs-lisp + (use-package org-roam + :init + (setq org-roam-v2-ack t) + :custom + ;; TODO: these settings need to be reviewed after the upgrade to v2 + (org-roam-directory (expand-file-name "~/.org/roam")) + (org-roam-graph-viewer nil) + (org-roam-db-update-method 'immediate) + (org-roam-index-file "Index") ; Default + ;; TODO: the template system was changed in v2, and these need to be updated + ;; (org-roam-capture-templates + ;; '(("d" "default" plain #'org-roam-capture--get-point "%?" :file-name "%<%Y%m%d%H%M%S>-${slug}" :head "#+title: ${title} + ;; " :unnarrowed t) + ;; ("p" "person" plain #'org-roam-capture--get-point "%?" :file-name "%<%Y%m%d%H%M%S>-${slug}" :head "#+title: ${title} + ;; #+roam_tags: person + ;; " :unnarrowed t) + ;; ("b" "book" plain #'org-roam-capture--get-point "%?" :file-name "%<%Y%m%d%H%M%S>-${slug}" :head "#+title: ${title} + ;; #+roam_key: ${url} + ;; #+roam_tags: book + ;; " :unnarrowed t) + ;; ("w" "web" plain #'org-roam-capture--get-point "%?" :file-name "%<%Y%m%d%H%M%S>-${slug}" :head "#+title: ${title} + ;; #+roam_key: ${url} + ;; #+roam_tags: ${tags} + ;; " :unnarrowed t))) + + ;; TODO + ;; (org-roam-dailies-capture-templates '(("d" "daily" plain #'org-roam-capture--get-point "" :immediate-finish t :file-name "%<%Y-%m-%d>" :head "#+title: %<%Y-%m-%d>"))) + :bind (("C-c n l" . org-roam-buffer-toggle) + ("C-c n f" . org-roam-node-find) + ("C-c n g" . org-roam-graph) + ("C-c n D" . org-roam-doctor) + ("C-c n i" . org-roam-node-insert) + ("C-c n I" . org-roam-node-insert-section) + + ;; TODO: investigate capture + ; ("C-c n c" . org-roam-capture) + + ("C-c n y" . org-roam-dailies-goto-yesterday) + ("C-c n t" . org-roam-dailies-goto-today) + ("C-c n T" . org-roam-dailies-goto-tomorrow) + ("C-c n d" . org-roam-dailies-goto-date)) + :config + (org-roam-db-autosync-enable)) + + (use-package org-roam-protocol + :after org-roam) +#+end_src + +**** TODO [#C] org-roam files pollute ~.emacs.d~ :open_source: + :PROPERTIES: + :Effort: 0:10 + :END: + +This can be adjusted via the customize variable ~org-roam-db-location~. However, this should +also be pushed upstream to the ~no-littering~ package. The default value is +~~/.emacs.d/org-roam.db~. + +**** TODO Turn on org-roam encryption + +Encryption via gpg can be enabled transparently for org-roam org files. This can be enabled +via the customize variable ~org-roam-encrypt-files~. + +**** Setup [[https://github.com/org-roam/org-roam-ui][org-roam-ui]] + +#+begin_src emacs-lisp + (use-package websocket + :after org-roam) + + (use-package org-roam-ui + :after org-roam + :config + (progn + (setq org-roam-ui-sync-theme t + org-roam-ui-follow t + org-roam-ui-update-on-save t + org-roam-ui-open-on-start nil) + (when (daemonp) + (org-roam-ui-mode)))) +#+end_src + +*** Setup [[https://github.com/alphapapa/org-ql][org-ql]] + +#+begin_src emacs-lisp + (use-package org-ql + :custom (org-ql-search-directories-files-recursive t)) + + (use-package helm-org-ql + :after (helm org-ql)) +#+end_src + +*** Setup [[https://github.com/weirdNox/org-noter][org-noter]] + +#+begin_src emacs-lisp + (use-package org-noter) +#+end_src + +*** Setup [[https://github.com/alphapapa/org-super-agenda][org-super-agenda]] + +#+begin_src emacs-lisp + (use-package org-super-agenda + :config + (progn + (setq org-super-agenda-groups + '((:name "Today" + :time-grid t) + (:name "Important" + :priority "A") + (:name "In Progress" + :todo "DOING") + (:name "Next Up" + :todo "NEXT") + (:name "Paused" + :todo "PAUSE") + (:name "Waiting" + :todo "WAIT") + (:auto-category t))) + (org-super-agenda-mode))) +#+end_src + +*** TODO Setup [[https://github.com/diadochos/org-babel-eval-in-repl][org-babel-eval-in-repl]] + +#+begin_src emacs-lisp + (use-package eval-in-repl) + (use-package eval-in-repl-shell + :after eval-in-repl + :config + (setq eir-shell-type 'vterm + eir-shell-term-program (executable-find "zsh") + eir-shell-buffer-name "*vterm*")) + + (use-package org-babel-eval-in-repl + :after eval-in-repl org + :config + ;; TODO: this doesn't seem to work correctly + ;; Taken from: https://github.com/diadochos/org-babel-eval-in-repl/wiki#example-2-one-magic-key + (defun org-meta-return-around (org-fun &rest args) + "Run `ober-eval-in-repl' if in source code block, + `ober-eval-block-in-repl' if at header, + and `org-meta-return' otherwise." + (if (org-in-block-p '("src")) + (let* ((point (point)) + (element (org-element-at-point)) + (area (org-src--contents-area element)) + (beg (copy-marker (nth 0 area)))) + (if (< point beg) + (ober-eval-block-in-repl) + (ober-eval-in-repl))) + (apply org-fun args))) + (advice-add 'org-meta-return :around #'org-meta-return-around)) +#+end_src + +** treemacs + +#+begin_src emacs-lisp + (use-package treemacs + :defer t + :init + (with-eval-after-load 'winum + (define-key winum-keymap (kbd "M-0") #'treemacs-select-window)) + :config + (progn + (setq treemacs-collapse-dirs (if treemacs-python-executable 3 0) + treemacs-deferred-git-apply-delay 0.5 + treemacs-directory-name-transformer #'identity + treemacs-display-in-side-window t + treemacs-eldoc-display t + treemacs-file-event-delay 5000 + treemacs-file-extension-regex treemacs-last-period-regex-value + treemacs-file-follow-delay 0.2 + treemacs-file-name-transformer #'identity + treemacs-follow-after-init t + treemacs-git-command-pipe "" + treemacs-goto-tag-strategy 'refetch-index + treemacs-indentation 2 + treemacs-indentation-string " " + treemacs-is-never-other-window nil + treemacs-max-git-entries 5000 + treemacs-missing-project-action 'ask + treemacs-move-forward-on-expand nil + treemacs-no-png-images nil + treemacs-no-delete-other-windows t + treemacs-project-follow-cleanup nil + treemacs-position 'left + treemacs-recenter-distance 0.1 + treemacs-recenter-after-file-follow nil + treemacs-recenter-after-tag-follow nil + treemacs-recenter-after-project-jump 'always + treemacs-recenter-after-project-expand 'on-distance + treemacs-show-cursor nil + treemacs-show-hidden-files t + treemacs-silent-filewatch nil + treemacs-silent-refresh nil + treemacs-sorting 'alphabetic-asc + treemacs-space-between-root-nodes t + treemacs-tag-follow-cleanup t + treemacs-tag-follow-delay 1.5 + treemacs-user-mode-line-format nil + treemacs-user-header-line-format nil + treemacs-width 35 + treemacs-workspace-switch-cleanup nil) + + ;; TODO: temporary workaround as in these fonts are missing + (add-to-list 'all-the-icons-data/file-icon-alist '("dart" . "\xEB29")) + (add-to-list 'all-the-icons-data/file-icon-alist '("fsharp" . "\xEB29")) + + ;; The default width and height of the icons is 22 pixels. If you are + ;; using a Hi-DPI display, uncomment this to double the icon size. + ;;(treemacs-resize-icons 44) + + (treemacs-follow-mode t) + (treemacs-filewatch-mode t) + (treemacs-fringe-indicator-mode t) + (pcase (cons (not (null (executable-find "git"))) + (not (null treemacs-python-executable))) + (`(t . t) + (treemacs-git-mode 'deferred)) + (`(t . _) + (treemacs-git-mode 'simple)))) + :bind + (:map global-map + ("M-0" . treemacs-select-window) + ("C-x t 1" . treemacs-delete-other-windows) + ("C-x t t" . treemacs) + ("C-x t B" . treemacs-bookmark) + ("C-x t C-t" . treemacs-find-file) + ("C-x t M-t" . treemacs-find-tag))) + + (use-package treemacs-projectile + :after treemacs projectile) + + (use-package treemacs-all-the-icons + :after treemacs all-the-icons) + + (use-package treemacs-magit + :after treemacs magit) + + ;; (use-package treemacs-persp ;;treemacs-persective if you use perspective.el vs. persp-mode + ;; :after treemacs persp-mode ;;or perspective vs. persp-mode + ;; :config (treemacs-set-scope-type 'Perspectives)) +#+end_src + +** Ledger + +#+begin_src emacs-lisp + (use-package ledger-mode + :config (setq ledger-binary-path "ledger")) + + (use-package flycheck-ledger + :after flycheck) +#+end_src + +** Dashboard + +Use [[https://github.com/emacs-dashboard/emacs-dashboard][emacs-dashboard]]. + +#+begin_src emacs-lisp + (use-package dashboard + :custom (dashboard-startup-banner 'logo) + :init (setq dashboard-set-heading-icons t + dashboard-set-file-icons t + dashboard-set-navigator t + dashboard-items '((recents . 5) + (bookmarks . 5) + (projects . 5) + (agenda . 5) + (registers . 5))) + :config + (progn + (dashboard-setup-startup-hook) + + (defun dashboard () + (interactive) + (let ((buffer "*dashboard*")) + (when (not (get-buffer buffer)) + (dashboard-insert-startupify-lists)) + (switch-to-buffer buffer)))) + :bind (("C-c d" . dashboard))) +#+end_src +** Rust + +#+begin_src emacs-lisp + (use-package rust-mode) +#+end_src + +** Lispy + +#+begin_src emacs-lisp + ;; Set default lisp program + (setq inferior-lisp-program "/usr/bin/sbcl") + + ;; Since there is no support for the kawa implementation of scheme + (defun run-kawa () + "Run Kawa Scheme in an Emacs buffer." + (interactive) + (require 'cmuscheme) ;; Built-in + (let ((scheme-program-name "/usr/bin/kawa")) + (run-scheme scheme-program-name))) + + ;; Function to start and/or connect to slime + (defun start-slime () + (interactive) + (unless (slime-connected-p) + (save-excursion (slime)))) + + ;; Setup slime mode + (require 'slime-autoloads) ;; package + (slime-setup '(slime-fancy)) + + ;; Set usable lisp implementations + (setq slime-lisp-implementations + '((sbcl ("/usr/bin/sbcl" "")) + (clisp ("/usr/bin/clisp" "-K base")))) + + ;; Setup enhanced scheme/racket mode consisting of geiser, quack and paredit + ;; Setup geiser + (use-package geiser + ;; GUIX TODO: ac-geiser is not packaged upstream and causes this to break + ; :config (use-package ac-geiser) + ) + + ;; GUIX TODO: This breaks geiser on guix + ;; ;; Setup auto-completion for geiser (ELPA) + ;; (add-hook 'geiser-mode-hook 'ac-geiser-setup) + ;; (add-hook 'geiser-repl-mode-hook 'ac-geiser-setup) + ;; (eval-after-load "auto-complete" + ;; '(add-to-list 'ac-modes 'geiser-repl-mode)) + + ;; Make struct stand out in scheme-mode for racket + (defun racket-faces () + (font-lock-add-keywords nil + '(("(struct \\(\\sw+\\)" 1 font-lock-function-name-face) + ("(\\(struct\\)" 1 font-lock-keyword-face) + ("(\\(λ\\)" 1 font-lock-function-name-face)))) + + (add-hook 'scheme-mode-hook 'racket-faces) + (add-hook 'geiser-repl-mode-hook 'racket-faces) + + ;; Setup scribble mode + (use-package scribble-mode) + + ;; Setup quack + (use-package quack) + + (defvar lispy-langs-hooks '(lisp-mode-hook lisp-interaction-mode-hook emacs-lisp-mode-hook scheme-mode-hook c-mode-hook c++-mode-hook python-mode-hook geiser-repl-mode-hook)) + + ;; Setup paredit + (use-package paredit + :config (activate-mode-with-hooks (lambda () (paredit-mode 1)) lispy-langs-hooks)) + + ;; Highlight sexp's in lispy languages + (use-package highlight-sexp + :config (activate-mode-with-hooks (lambda () (highlight-sexp-mode)) lispy-langs-hooks)) + + ;; Paredit binds to C-j globally and thus disables the binding to + ;; eval-print-last-sexp in emacs-lisp-mode (e.g *scratch*, etc..) + (add-hook 'emacs-lisp-mode-hook + '(lambda () + (define-key emacs-lisp-mode-map "\C-xj" 'eval-print-last-sexp))) + + ;; Match paren's in given modes [to apply globally do (show-paren-mode 1)] + (activate-mode-with-hooks (lambda () (show-paren-mode)) lispy-langs-hooks) + + ;; Highlight paren's near point + (use-package highlight-parentheses + :config (activate-mode-with-hooks (lambda () (highlight-parentheses-mode)) lispy-langs-hooks)) + + ;; Setup rainbow-delimiters + (use-package rainbow-delimiters + :config (activate-mode-with-hooks 'rainbow-delimiters-mode-enable lispy-langs-hooks)) + ;;(global-rainbow-delimiters-mode) ;; TODO: breaks font coloring in erc for some reason? + + (use-package rainbow-mode + :defer t + :hook ((css-mode . rainbow-mode))) + + ;; upcomming functionallity: toggle paredit-mode due to annoying things like wrapping parens when a mistake is made + ;; known issue..if paredit-mode is turned on when there are unbalanced parens an error is reported + (defun toggle-paredit-mode () + (let ((active-minor-modes (list))) + (mapatoms (lambda (sym) + (when (and (symbolp sym) (assq sym minor-mode-alist) (symbol-value sym)) + (push sym active-minor-modes)))) + (if (member 'paredit-mode active-minor-modes) (paredit-mode -1) (paredit-mode 1)))) + + (setq geiser-repl-use-other-window nil + geiser-active-implementations '(racket guile)) +#+end_src + +** Haskell + +#+begin_src emacs-lisp + ;; Thanks to: https://github.com/haskell/haskell-mode/wiki/Haskell-Interactive-Mode-Setup + ;; https://github.com/haskell/haskell-mode/blob/master/examples/init.el + + (custom-set-variables + ;; Use notify.el (if you have it installed) at the end of running + ;; Cabal commands or generally things worth notifying. + '(haskell-notify-p t) + + ;; To enable tags generation on save. + '(haskell-tags-on-save t) + + ;; To enable stylish on save. + '(haskell-stylish-on-save t) + + '(haskell-process-suggest-remove-import-lines t) + '(haskell-process-auto-import-loaded-modules t) + '(haskell-process-log t)) + + (add-hook 'haskell-mode-hook 'haskell-hook) + (add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode) + (add-hook 'haskell-mode-hook 'interactive-haskell-mode) + (add-hook 'haskell-cabal-mode-hook 'haskell-cabal-hook) + + ;; Haskell main editing mode key bindings. + (defun haskell-hook () + ;; Use indentation. + ;;(haskell-indent-mode) + + ;; Use electric-quote-mode + (electric-quote-local-mode) + + ;; Load the current file (and make a session if not already made). + (define-key haskell-mode-map [?\C-c ?\C-l] 'haskell-process-load-file) + (define-key haskell-mode-map [f5] 'haskell-process-load-file) + + ;; Switch to the REPL. + (define-key haskell-mode-map [?\C-c ?\C-z] 'haskell-interactive-switch) + + ;; “Bring” the REPL, hiding all other windows apart from the source + ;; and the REPL. + (define-key haskell-mode-map (kbd "C-`") 'haskell-interactive-bring) + + ;; Build the Cabal project. + (define-key haskell-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build) + + ;; Interactively choose the Cabal command to run. + (define-key haskell-mode-map (kbd "C-c c") 'haskell-process-cabal) + + ;; Get the type and info of the symbol at point, print it in the + ;; message buffer. + (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type) + (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info) + + ;; Contextually do clever things on the space key, in particular: + ;; 1. Complete imports, letting you choose the module name. + ;; 2. Show the type of the symbol after the space. + ;; NOTE: the haskell-mode-contextual-space function has been depreciated + ;;(define-key haskell-mode-map (kbd "SPC") 'haskell-mode-contextual-space) + + ;; Jump to the imports. Keep tapping to jump between import + ;; groups. C-u f8 to jump back again. + (define-key haskell-mode-map [f8] 'haskell-navigate-imports) + + ;; Jump to the definition of the current symbol. + (define-key haskell-mode-map (kbd "M-.") 'haskell-mode-tag-find) + + ;; Indent the below lines on columns after the current column. + (define-key haskell-mode-map (kbd "C-") + (lambda () + (interactive) + (haskell-move-nested 1))) + + ;; Same as above but backwards. + (define-key haskell-mode-map (kbd "C-") + (lambda () + (interactive) + (haskell-move-nested -1))) + + ;; Interactive keybindings + (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-or-reload) + (define-key haskell-mode-map (kbd "C-`") 'haskell-interactive-bring) + (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type) + (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info) + (define-key haskell-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build) + (define-key haskell-mode-map (kbd "C-c C-k") 'haskell-interactive-mode-clear) + (define-key haskell-mode-map (kbd "C-c c") 'haskell-process-cabal) + + ;; Interactive keybindings that are useful in cabal-mode + (define-key haskell-cabal-mode-map (kbd "C-`") 'haskell-interactive-bring) + (define-key haskell-cabal-mode-map (kbd "C-c C-k") 'haskell-interactive-mode-clear) + (define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build) + (define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal)) + + ;; Useful to have these keybindings for .cabal files, too. + (defun haskell-cabal-hook () + (define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-process-cabal-build) + (define-key haskell-cabal-mode-map (kbd "C-c c") 'haskell-process-cabal) + (define-key haskell-cabal-mode-map (kbd "C-`") 'haskell-interactive-bring) + (define-key haskell-cabal-mode-map [?\C-c ?\C-z] 'haskell-interactive-switch)) + + ;; Set inferior haskell default executable + (setq haskell-program-name "/usr/bin/ghci") + + ;; TODO: this is rarely if ever used + (use-package hamlet-mode) +#+end_src + +** PlantUML + +#+begin_src emacs-lisp + (use-package plantuml-mode + :config (setq plantuml-default-exec-mode 'executable + plantuml-output-type "png")) +#+end_src + +** Graphviz Dot + +#+begin_src emacs-lisp + (use-package graphviz-dot-mode) +#+end_src + +** TODO Hex :deprecate: + +This is rarely if ever used. Consider removal. + +#+begin_src emacs-lisp + (use-package "intel-hex-mode") +#+end_src + +** TODO Web :needs_review: + +#+begin_src emacs-lisp + ;; Setup web browsing + (setq browse-url-browser-function 'browse-url-generic + browse-url-generic-program "firefox-developer-edition") + + (defun browse-url-before-point () + "Find the first url before point and open it in a browser using browse-url" + (interactive) + (save-excursion + (search-backward-regexp "\(file\|ftp\\|http\\|https\)://.*\.") + (browse-url-at-point))) + + (global-set-key (kbd "C-c g") 'browse-url-at-point) + (global-set-key (kbd "C-c G") 'browse-url-before-point) + + (use-package php-mode + :defer t + :mode "/*.\.php[345]?$") + + ;; Setup zencoding-mode (now emmet-mode) + (use-package emmet-mode + :defer t + :bind (:map emmet-mode-keymap + ;; Disable C-j keybinding set by zencoding-mode and replace it with 'C-c j' + ("C-j" . nil) + ("C-c j" . emmet-expand-line)) + :hook ((sgml-mode . emmet-mode) ;; Auto-start on any markup modes + (css-mode . emmet-mode) ;; Enable Emmet's css abbreviation. + (emmet-mode . (lambda () (setq emmet-indentation 2))) ;; Indent 2 spaces. + )) + + (use-package graphql-mode + :defer t + :mode "\\.gql\\'" + :hook ((graphql-mode))) + + ;; Setup mmm-mode for multiple mode regions in the same buffer + (use-package mmm-mode + :defer t) + ;;(setq mmm-global-mode 'maybe) + + (use-package restclient + :defer t) + + (use-package elpher + :defer t) +#+end_src + +** TODO Python :needs_review: + +Both of these packages are not yet available on guix. Further more, the use of ein needs to +be further investigated. + +#+begin_src emacs-lisp + (use-package ipython + :defer t) + + (use-package ein + :defer t) +#+end_src + +** TODO Recutils + +#+begin_src emacs-lisp + (use-package rec-mode) +#+end_src + +** Latex + +#+begin_src emacs-lisp + (setq-default TeX-master nil) + + ;; Use auto-complete in latex buffers + (eval-after-load "auto-complete" + '(add-to-list 'ac-modes 'latex-mode)) + + (use-package auctex + :defer t + :functions TeX-global-PDF-mode + :hook ((LaTeX-mode . visual-line-mode) + (LaTeX-mode . LaTeX-math-mode) + (LaTeX-mode . turn-on-reftex)) + :config (progn + (setq TeX-auto-save t + TeX-parse-self t + reftex-plug-into-AUCTeX t) + (TeX-global-PDF-mode t))) +#+end_src + +** Tramp + +#+begin_src emacs-lisp + ;; Set default tramp method to ssh (for security purposes) + (setq tramp-default-method "ssh") + + ;; Set tramp terminal type to tramp instead of the default dumb + ;; This avoids forcing a simple PS1 on remote systems that are using zsh + ;; via a dumb term. However this requires all remotes to disable fancy PS1's + ;; by checking if the terminal type is "tramp" + (setq tramp-terminal-type "tramp") + + ;; Set the prompt pattern tramp searches for in order to send commands to the remote shell + (setq tramp-shell-prompt-pattern "^[^$>\n]*[#$%>] *\\(\[[0-9;]*[a-zA-Z] *\\)*") +#+end_src + +*** TODO Extensions :needs_review: + +All packages below are unavailable for guix, excluding ~emacs-docker-tramp~. Further these +packages appeared defered and likely will never get loaded. + +#+begin_src emacs-lisp + (use-package vagrant-tramp + :defer t) + + (use-package docker-tramp) + + (use-package kubernetes-tramp + :defer t) + + (use-package magit-tramp + :defer t) +#+end_src + +** Guix + +#+begin_src emacs-lisp + (use-package guix + :bind ("C-c x g" . guix)) +#+end_src + +** TODO Archlinux - Mode for ~PKGBUILD~ files :needs_review: + +This is not yet packaged for guix. + +#+begin_src emacs-lisp + (use-package pkgbuild-mode + :defer t) +#+end_src + +** TODO Docker :needs_review: + +#+begin_src emacs-lisp + ;; TODO: What is this? + (use-package docker + :bind ("C-c D" . docker)) + + (use-package docker-compose-mode + :disabled ;; TODO: auto-completion does not seem to work using this package + :defer t) +#+end_src + +** eshell + +#+begin_src emacs-lisp + ;; TODO: make a function to toggle the eshell; given a the universal argument the following can occur: + ;; - if numerical then opens the nth scratch buffer "*eshell*" + ;; - if no args then open a new eshell + ;; + ;; (defun toggle-eshell (arg) + ;; (interactive "P") + ;; (cond (((equal arg '(4)) )))) + + (defun eshell/catbuf (buffer-name) + "Given a buffer-name returns the contents of said buffer" + (interactive "bBuffer: ") + (save-excursion + (let ((code-buf (get-buffer buffer-name))) + (if (null code-buf) (concat "The buffer given \"" buffer-name "\" does not exist") + (set-buffer code-buf) + (buffer-string))))) + + (defun eshell/find-file-ext (fp) + "Finds a single file or a list of files matching a regxp and returns a list of their respective buffers" + (interactive) + (if (listp fp) (mapcar #'find-file fp) + (list (find-file fp)))) + + (defun eshell/ff (fp &rest other-fps) + "A FP is either a file path (relative or absolute) or a regexp which eshell converts to a + list of stings (file paths) which match the regexp (likely using file-expand-widcards). + eshell/ff takes one or more file paths and opens them in the current buffer returning a list + consisting of lists of buffers opened by each respective FP argument." + (interactive) + (mapcar #'eshell/find-file-ext (cons fp other-fps))) + + (defun eshell/clear () + "04Dec2001 - sailor, to clear the eshell buffer." + (interactive) + (let ((inhibit-read-only t)) + (erase-buffer))) + + (use-package eshell + :bind (:map ctl-x-4-map + ("e" . eshell)) + :config (setq + eshell-scroll-to-bottom-on-input t + eshell-visual-commands '("vi" "screen" "top" "less" ;; Commands to run without dumb-term + "more" "lynx" "ncftp" "vim" + "ncmpcpp" "irssi" "mc" "alsamixer" + "/usr/bin/sudo"))) + + ;; TODO: this doesn't belong in this file and should be relocated + ;; Force ediff sessions to run in the same frame + (setq ediff-window-setup-function 'ediff-setup-windows-plain) +#+end_src + +* Known Issues +** Archive :ARCHIVE: +*** CANCELED Package [[https://github.com/tjim/lockstep][lockstep]] (emacs package) for [[file:../20210104204237-gnu_guix.org][guix]] :guix: + CLOSED: [2021-09-05 Sun 03:37] + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:37 + :END: + - State "CANCELED" from "TODO" [2021-09-05 Sun 03:37] \\ + Not going to spend time on this +*** DONE Fix org-roam (dailies and capture) + CLOSED: [2021-09-04 Sat 12:55] DEADLINE: <2021-09-10 Fri 22:00> + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: + + - State "DONE" from "TODO" [2021-09-04 Sat 12:55] + Noticed today that org-roam-dailies is broken (and possibly other stuff too). The reason + being is that some functionality of org-roam was refactored into an extension directory that + does not get picked up by the guix emacs-build-system. +*** DONE Add support for plantuml + CLOSED: [2021-05-17 Mon 00:30] DEADLINE: <2021-05-14 Fri 22:00> + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: + + - State "DONE" from "TODO" [2021-05-17 Mon 00:30] + - [X] [[https://github.com/skuro/plantuml-mode][plantuml-mode]] support + - [X] org-babel support confirmed +*** DONE Setup rec-mode for recutils files + CLOSED: [2021-07-27 Tue 09:23] DEADLINE: <2021-07-24 Sat 22:00> + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: + - State "DONE" from "DOING" [2021-07-27 Tue 09:23] + - State "DOING" from "TODO" [2021-04-26 Mon 11:32] +*** DONE [[https://github.com/Silex/docker.el][docker.el]] is broken :bug: + CLOSED: [2021-05-03 Mon 06:33] DEADLINE: <2021-05-14 Fri 21:00> + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: + - State "DONE" from "TODO" [2021-05-03 Mon 06:33] + - Note taken on [2021-05-03 Mon 06:33] \\ + The package ~emacs-docker~ was not in my manifest. +*** DONE Assign [[help:dashboard][dashboard]] function to a keybinding + CLOSED: [2021-04-25 Sun 06:23] DEADLINE: <2021-04-23 Fri 21:00> + :PROPERTIES: + :Effort: 0:10 + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: + - State "DONE" from "TODO" [2021-04-25 Sun 06:23] +*** DONE Use ibuffer more effectively (via ibuffer-projectile) + CLOSED: [2021-04-25 Sun 06:25] DEADLINE: <2021-04-30 Fri 22:00> + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: +*** DONE Leverage [[https://github.com/alphapapa/org-super-agenda][org-super-agenda]] :org: + CLOSED: [2021-04-17 Sat 11:05] DEADLINE: <2021-04-16 Fri 21:00> + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: + - State "DONE" from "DOING" [2021-04-17 Sat 11:05] + - State "DOING" from "TODO" [2021-04-15 Thu 08:23] + +*** DONE Package [[https://github.com/Fuco1/org-timeline][org-timeline]] for guix and determine if it should be used :org:guix: + CLOSED: [2021-04-25 Sun 08:54] DEADLINE: <2021-04-30 Fri 21:00> + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: + + - Note taken on [2021-04-25 Sun 08:54] \\ + Completed packaging for guix (not upstream), however the package is not ready for my daily + use. + - State "DONE" from "TODO" [2021-04-25 Sun 08:54] +**** Setup [[https://github.com/Fuco1/org-timeline][org-timeline]] + + This is a little premature yet. Specifically, it cannot be easily placed in the agenda, + has some UI glitches and doesn't seem to function the way I would expect. There seems to + be some big improvements coming in [[https://github.com/Fuco1/org-timeline/issues/20][issue#20]]. + + #+begin_src emacs-lisp :tangle no + (use-package org-timeline + :config (add-hook 'org-agenda-finalize-hook 'org-timeline-insert-timeline :append)) + #+end_src + +*** DONE Use [[https://www.gnu.org/software/emacs/manual/html_mono/auth.html#The-Unix-password-store][pass auth-source]] (built into emacs) instead of ~auth-info.gpg~ + CLOSED: [2021-04-10 Sat 19:50] + :PROPERTIES: + :ARCHIVE_TIME: 2021-09-05 Sun 03:38 + :END: + - State "DONE" from "DOING" [2021-04-10 Sat 19:50] + - State "DOING" from "TODO" [2021-04-02 Fri 16:04] +** DOING Startup of emacs on non-guix systems has the following ~use-package~ errors + +#+begin_src text + Error (use-package): Cannot load rcirc-notify + Error (use-package): realgud/:catch: Symbol’s value as variable is void: Info-mode-map +#+end_src + +These errors likely occur as I have temporarily disabled the [[https://marmalade-repo.org/][marmalade repository]] thinking I +had no packages installed from there. This looks to not be the case. + +** TODO ~use-package~ deferred packages may not show errors until they are attempted to be used + +On guix, this will result in undesired runtime behavior. Emacs packages that are loaded via +~use-package~ but deferred need to be investigated; missing packages can then be added to the +guix manifest. + +** TODO Bytecode compilation of emacs configuration results in issues with doom-modeline + +As a result of this, currently in [[file:init.el][init.el]] bytecode compilation has been disabled (by not +passing ~t~ to ~org-babel-load-file~). + +** CANCELED Investigate further enhancements to emacs +CLOSED: [2021-11-30 Tue 16:28] + +- State "CANCELED" from "TODO" [2021-11-30 Tue 16:28] \\ + This is too general and not actionable. Closing. + See: + - https://github.com/emacs-tw/awesome-emacs + +** TODO Use ~emacs-emms~ in place of ncmpcpp/mpd + +See: https://www.gnu.org/software/emms/manual + +** TODO Turn off ligatures in all modes except haskell and org-mode + +The reason for this change is that ligatures impact code formatting which results in files +that are miss formatted when not using ligatures. Perhaps there is a way to handle this +better, however another reason to remove ligatures in some modes (for example scheme and lisp +modes), is that the ligatures actually add an additional layer of abstraction that is not +beneficial as in these languages ligatures are out of place. + +** DOING Package ~rcirc-notify~ for guix :guix:open_source: +- State "DOING" from "TODO" [2021-11-26 Fri 22:21] +** TODO Investigate loading error of realgud + +Upon emacs startup, the following error message appears while loading ~realgud~. + +#+begin_src text + Loading /home/collin/.guix-profile/share/emacs/site-lisp/realgud/common/custom... + Loading /home/collin/.guix-profile/share/emacs/site-lisp/realgud/common/custom...done + Loading /home/collin/.guix-profile/share/emacs/site-lisp/realgud/lang/java... + Error (use-package): realgud/:catch: Symbol’s value as variable is void: Info-mode-map +#+end_src + +** TODO Evaluate the usefulness of [[https://github.com/rougier/mu4e-dashboard][mu4e-dashboard]] :spike: + +** TODO Look into value of elfeed and associated packages :spike: + +- [[https://github.com/skeeto/elfeed][elfeed]] :: available on guix +- [[https://github.com/remyhonig/elfeed-org][elfeed-org]] :: available on guix +- [[https://github.com/fasheng/elfeed-protocol][elfeed-protocol]] :: **not** available on guix +- [[https://github.com/algernon/elfeed-goodies][elfeed-goodies]] :: **not** available on guix +- [[https://github.com/Manoj321/elfeed-dashboard][elfeed-dashboard]] :: **not** available on guix + +Also keep in mind reading from a mobile client, and perhaps using nextcloud news. + +** DONE Package [[https://github.com/fniessen/org-html-themes][fniessen/org-html-themes]] (the theme used for this document) for guix :guix:open_source: +CLOSED: [2021-09-05 Sun 03:39] +:LOGBOOK: +CLOCK: [2021-09-05 Sun 02:35]--[2021-09-05 Sun 03:23] => 0:48 +CLOCK: [2021-09-04 Sat 10:30]--[2021-09-04 Sat 10:50] => 0:20 +:END: + +- State "DONE" from "DOING" [2021-09-05 Sun 03:39] +- State "DOING" from "TODO" [2021-09-05 Sun 00:03] +This removes the dependency on the internet when generating html from this document. + +** TODO Look to setup [[https://code.orgmode.org/bzg/org-mode/raw/master/contrib/lisp/org-notify.el][org-notify]] + +** TODO Look to setup/use [[https://github.com/ahungry/org-jira][org-jira]] + +** TODO Resolve issue with [[https://github.com/org-roam/org-roam/issues/597][org-roam-ump-to-index]] not working correctly (upstream bug) + +** TODO [#A] Setup scratchpad functionality in emacs exwm :exwm: + +- Note taken on [2021-12-01 Wed 08:43] \\ + Looks like the [[https://github.com/kyagi/shell-pop-el][shell-pop-el]] package will do exactly what I need here. That is, I can use it to open vterm 'scratchpads'. + - https://www.reddit.com/r/emacs/comments/eeyl3s/quakestyle_console_for_exwm/ + - https://github.com/paulbdavis/emacs/blob/94e69b3cf0b364c4e82a91040879276e080b4c3e/init.el#L786 + - https://github.com/paulbdavis/emacs/blob/94e69b3cf0b364c4e82a91040879276e080b4c3e/init.el#L964 + +** TODO [#A] Investigate workflow using emacs instead of shell for data manipulation :spike: + +- https://ambrevar.xyz/lisp-repl-shell/index.html +- https://fosdem.org/2021/schedule/event/lisprepl/ +- http://www.howardism.org/Technical/Emacs/piper-presentation.html +- https://gitlab.com/howardabrams/emacs-piper +- http://howardism.org/Technical/Emacs/piper-part-deux.html + +** TODO [#C] Update guix package [[https://github.com/emacs-helm/helm-mu][emacs-helm-mu]] :open_source: + +- Note taken on [2021-04-02 Fri 16:04] \\ + This definitely will work, as for the time being I have just installed it adhoc with guix: + +#+begin_src shell + guix install --with-branch=emacs-helm-mu=master emacs-helm-mu +#+end_src +** TODO Implement [[https://org-roam.discourse.group/t/add-link-tags-feature/171][org-roam link-tags]] feature when its available + +** TODO [#C] Use [[https://github.com/zevlg/telega.el][telegra]] emacs telegram client :telegram: +:PROPERTIES: +:ID: 8fe37d5b-9ea3-4235-bed9-e4a8243465d9 +:END: + +** TODO Setup Language Server Protocol support ([[https://emacs-lsp.github.io/lsp-mode/][lsp-mode]]) +:PROPERTIES: +:ID: e6ce98a1-110f-4279-a37e-7f1b58657809 +:END: + +*** TODO Look into [[https://github.com/emacs-lsp/lsp-treemacs][lsp-treemacs]] +:PROPERTIES: +:ID: df301bd4-efb1-4d4d-ad63-6640302b7a76 +:END: +** TODO Use [[https://github.com/skeeto/elfeed][elfeed]] as an rss feed reader :rss: +:PROPERTIES: +:ID: 0c85615c-f72f-4361-bd8d-13e95d4b9675 +:Effort: 1:00 +:END: + +See: https://gerlacdt.github.io/posts/emacs-elfeed/ + +** TODO Determine how to run emacs as a daemon with [[*EXWM][EXWM]] (this is known, however how it interacts with shepherd/systemd is not clear) +** TODO Determine how to optionally turn on gathering of use-package statistics + +See: https://github.com/jwiegley/use-package#gathering-statistics + +#+begin_src emacs-lisp + ;; (setq use-package-compute-statistics t) +#+end_src +** TODO [[*Automatically Fetch Packages][Automatically Fetch Packages]] technically does not work unless the user already has use-package installed + +See: [[https://github.com/nilcons/emacs-use-package-fast#the-ensure-mechanism-to-recreate-your-package-user-dir-from-emacs]] +** TODO Improve or remove the need for [[*Activate modes with a set of hooks][Activate modes with a set of hooks]] +** TODO Define useful [[*Hydra][Hydra's]] + +See: https://github.com/abo-abo/hydra/wiki/Hydras-by-Topic + +** TODO Setup org-alert to display notifications for scheduled and deadline todos +** TODO Package [[https://github.com/spegoraro/org-alert][org-alert]] for guix :guix:open_source: +** TODO Investigate [[https://github.com/kiwanami/emacs-calfw][emacs-calfw]] :spike: +:PROPERTIES: +:Effort: 0:30 +:END: + +It provides a way to import csv calendars, as well as view org-mode agendas as a calendar +view, all within emacs. +** TODO Define a [[*Link Navigation][reasonable keybinding for ace-link]] +:PROPERTIES: +:Effort: 0:10 +:END: + +** TODO Investigate using [[https://github.com/jcaw/theme-magic][theme-magic]] to set gtk theme based on emacs one +** TODO Setup mu4e text flowing + +See: +- https://www.reddit.com/r/emacs/comments/aakmz4/line_breaks_in_emails_mu4e/ +- https://emacs.stackexchange.com/questions/3061/how-to-stop-mu4e-from-inserting-line-breaks +- https://www.djcbsoftware.nl/code/mu/mu4e/Writing-messages.html (section ~C.4.18~) +- https://mathiasbynens.be/notes/gmail-plain-text + +** TODO Package [[https://github.com/djcb/sauron][sauron]] (emacs package by mu4e author) for guix and determine if its useful for events and notifications +** TODO Setup [[help:org-tag-alist][org-tag-alist]] (see [[info:org#Setting Tags][info:org#Setting Tags]]) :org_mode: +DEADLINE: <2022-02-01 Tue> +** TODO Evaluate use of slack from emacs (via [[https://github.com/yuya373/emacs-slack][emacs-slack]]) + +*** TODO Evaluate [[https://github.com/jackellenberger/emojme][emojme]] for showing emojis when using emacs-slack +** TODO Make org-mode buffers prettier + +See: +- http://www.howardism.org/Technical/Emacs/orgmode-wordprocessor.html +- https://zzamboni.org/post/beautifying-org-mode-in-emacs/ + +*** TODO Evaluate [[https://github.com/sabof/org-bullets][org-bullets]] + +*** TODO Evaluate [[https://github.com/iqbalansari/emacs-emojify][emacs-emojify]] +** DONE Package and evaluate/use [[https://github.com/seagle0128/all-the-icons-ibuffer][all-the-icons-ibuffer]] :guix:open_source: + CLOSED: [2021-09-05 Sun 04:05] DEADLINE: <2021-07-31 Sat 22:00> + :LOGBOOK: + CLOCK: [2021-09-05 Sun 03:43]--[2021-09-05 Sun 04:05] => 0:22 + :END: + - State "DONE" from "TODO" [2021-09-05 Sun 04:05] +** TODO Setup [[https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-gnuplot.html][gnuplot org-babel support]] +** TODO Store common org-agenda searches ([[https://orgmode.org/manual/Storing-searches.html#Storing-searches][see]]) +** TODO Better define org-mode stuck projects (see [[help:org-stuck-projects]], [[https://github.com/alphapapa/org-ql/blob/master/examples.org#stuck-projects-block-agenda][org-ql example]]) +** DONE Setup [[https://github.com/ppareit/graphviz-dot-mode][Graphviz dot mode]] +CLOSED: [2022-01-04 Tue 11:10] DEADLINE: <2021-07-24 Sat 22:00> +- State "DONE" from "DOING" [2022-01-04 Tue 11:10] +- State "DOING" from "TODO" [2021-05-29 Sat 22:30] +** TODO Setup [[https://github.com/magit/orgit-forge][orgit-forge]] +DEADLINE: <2022-02-01 Tue> +** TODO Investigate use of [[https://github.com/sinic/ednc][ednc (Emacs Desktop Notification Center)]] as a replacement for dunst +** TODO Replace slime with [[https://github.com/joaotavora/sly][sly]] +DEADLINE: <2022-06-01 Wed> +** TODO Investigate [[https://github.com/lordpretzel/mu4e-views][mu4e-views]] :email: +** TODO Setup [[https://github.com/abo-abo/org-download][org-download]] +DEADLINE: <2022-01-08 Sat> +** TODO Many Emoji's do not work in emacs +DEADLINE: <2022-01-10 Mon> +** TODO When using [[help:org-agenda-filter-by-tag][org-agenda-filter-by-tag]], '|' or queries do not work :org: +DEADLINE: <2022-02-25 Fri> +** TODO Investigate how to evaluate org-mode code blocks in vterm :emacs: + +See: +- https://github.com/diadochos/org-babel-eval-in-repl +- https://github.com/kaz-yos/eval-in-repl +** TODO Package and setup emacs [[https://github.com/lewang/command-log-mode][command-log-mode]] :guix:upstream: +** TODO Setup Sieve script management abilities from within emacs + +See: https://www.gnu.org/software/emacs/manual/html_node/sieve/Managing-Sieve.html diff --git a/user-config/emacs/.emacs.d/etc/assets/beep.wav b/user-config/emacs/.emacs.d/etc/assets/beep.wav new file mode 100644 index 0000000000000000000000000000000000000000..545c26045c6b7d607bdf81b603cd8ab8fbb88592 GIT binary patch literal 23206 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 literal 0 HcmV?d00001 diff --git a/user-config/emacs/.emacs.d/etc/custom.el b/user-config/emacs/.emacs.d/etc/custom.el new file mode 100644 index 0000000..e69de29 diff --git a/user-config/emacs/.emacs.d/etc/eshell/aliases b/user-config/emacs/.emacs.d/etc/eshell/aliases new file mode 100644 index 0000000..3698e78 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/eshell/aliases @@ -0,0 +1,6 @@ +alias modspeed sudo tc qdisc $2 dev $1 root netem delay 300ms +alias ms magit-status $1 +alias mss magit-status . +alias ssudo /usr/bin/sudo +alias d dired $1 +alias ffo find-file-other-window $1 diff --git a/user-config/emacs/.emacs.d/etc/eshell/profile b/user-config/emacs/.emacs.d/etc/eshell/profile new file mode 100644 index 0000000..72bfbc3 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/eshell/profile @@ -0,0 +1,7 @@ +# File: ~/.eshell/profile +# Author: Collin J. Doering +# Date: Nov 12, 2011 +# Description: + +# Set commands that use a Term buffer instead of the eshell dumbterm +setq eshell-visual-commands (list "vi" "screen" "top" "less" "more" "lynx" "ncftp" "pine" "tin" "trn" "elm" "vim" "ncmpcpp" "irssi" "mc" "vim" "ncmpcpp" "irssi" "mc" "vim" "ncmpcpp" "irssi" "mc" "/usr/bin/sudo") >> /dev/null diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-compiled-snippets.el b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-compiled-snippets.el new file mode 100644 index 0000000..a25720d --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-compiled-snippets.el @@ -0,0 +1,8 @@ +;;; Compiled snippets and support files for `latex-mode' +;;; Snippet definitions: +;;; +(yas-define-snippets 'latex-mode + '(("begin" "\\begin{$1}\n\n $0\n\n\\end{$1}\n" "begin" nil nil nil nil nil nil))) + + +;;; Do not edit! File generated at Mon Jun 2 06:32:05 2014 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-ignore-filenames-as-triggers b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-ignore-filenames-as-triggers new file mode 100644 index 0000000..e69de29 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-make-groups b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-make-groups new file mode 100644 index 0000000..e69de29 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-parents b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-parents new file mode 100644 index 0000000..eed5b44 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/.yas-parents @@ -0,0 +1 @@ +text-mode diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/abstract.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/abstract.yasnippet new file mode 100644 index 0000000..bf05994 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/abstract.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : abs +# group: sections +# name : \abstract +# -- +\begin{abstract} +$0 +\end{abstract} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/align.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/align.yasnippet new file mode 100644 index 0000000..4fd7beb --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/align.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Rasmus Borgsmidt +# key : align +# group: environments +# name : \begin{align} ... \end{align} +# -- +\begin{align} + $0 +\end{align} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/alignstar.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/alignstar.yasnippet new file mode 100644 index 0000000..538a2dd --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/alignstar.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Rasmus Borgsmidt +# key : align* +# group: environments +# name : \begin{align*} ... \end{align*} +# -- +\begin{align*} + $0 +\end{align*} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/array.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/array.yasnippet new file mode 100644 index 0000000..aa67ae9 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/array.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Peter Urbak +# key : arr +# group: environments +# name : \begin{array} ... \end{array} +# -- +\begin{array}{$1} + $0 +\end{array} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/article.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/article.yasnippet new file mode 100644 index 0000000..a9e5203 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/article.yasnippet @@ -0,0 +1,28 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# contributor : Song Qiang +# key: article +# group: skeleton +# name: \documentclass{article} ... +# -- +\documentclass[11pt]{article} + +\usepackage{graphicx,amsmath,amssymb,subfigure,url,xspace} +\newcommand{\eg}{e.g.,\xspace} +\newcommand{\bigeg}{E.g.,\xspace} +\newcommand{\etal}{\textit{et~al.\xspace}} +\newcommand{\etc}{etc.\@\xspace} +\newcommand{\ie}{i.e.,\xspace} +\newcommand{\bigie}{I.e.,\xspace} + +\title{${1:title}} +\author{${2:Author Name}} + +\begin{document} +\maketitle + + +\bibliographystyle{${3:plain}} +\bibliography{${4:literature.bib}} + +\end{document} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/beamer.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/beamer.yasnippet new file mode 100644 index 0000000..4c4c7c3 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/beamer.yasnippet @@ -0,0 +1,37 @@ +# -*- mode: snippet -*- +# contributor: Claudio Marforio +# key: beamer +# group: skeleton +# name: \documentclass{beamer} ... +# -- +\documentclass[xcolor=dvipsnames]{beamer} + +\usepackage{graphicx,subfigure,url} + +% example themes +\usetheme{Frankfurt} +\usecolortheme{seahorse} +\usecolortheme{rose} + +% put page numbers +% \setbeamertemplate{footline}[frame number]{} +% remove navigation symbols +% \setbeamertemplate{navigation symbols}{} + +\title{${1:Presentation Title}} +\author{${2:Author Name}} + +\begin{document} + +\frame[plain]{\titlepage} + +\begin{frame}[plain]{Outline} + \tableofcontents +\end{frame} + +\section{${3:Example Section}} +\begin{frame}{${4:Frame Title}} + +\end{frame} + +\end{document} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/begin b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/begin new file mode 100644 index 0000000..55dc1bd --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/begin @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# name: begin +# key: begin +# -- +\begin{$1} + + $0 + +\end{$1} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/begin.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/begin.yasnippet new file mode 100644 index 0000000..e18b643 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/begin.yasnippet @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# contributor : Bjorn Reese +# key: begin +# group: environments +# name: \begin{environment} ... \end{environment} +# -- +\begin{${1:$$(yas/choose-value (mapcar 'car (LaTeX-environment-list)))}} +$0 +\end{$1} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bib.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bib.yasnippet new file mode 100644 index 0000000..9dc6ad7 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bib.yasnippet @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: bib +# group: misc +# name: \bibliography +# -- +\bibliographystyle{plain} +\bibliography{$1}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/big.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/big.yasnippet new file mode 100644 index 0000000..ff59479 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/big.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Song Qiang +# key: big +# group: math +# name: \bigl( ... \bigr) +# -- +\\${1:$$(yas/choose-value '("big" "Big" "bigg" "Bigg"))}l( $0 \\$1r) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bigop.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bigop.yasnippet new file mode 100644 index 0000000..7aa214f --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bigop.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: François Garillot +# key: bigop +# group: math +# name: \bigop_{n}^{} +# -- +\\big${1:$$(yas/choose-value '("oplus" "otimes" "odot" "cup" "cap" "uplus" "sqcup" "vee" "wedge"))}_{$2}^{$3}$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/binom.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/binom.yasnippet new file mode 100644 index 0000000..98d663d --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/binom.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Song Qiang +# key: binom +# group: math +# name: \binom{n}{k} +# -- +\binom{${1:n}}{${2:k}} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/block.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/block.yasnippet new file mode 100644 index 0000000..39f3cd0 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/block.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor: Claudio Marforio +# key: block +# group: environments +# name : \begin{*block} ... \end{*block} +# -- +\begin{${1:$$(yas/choose-value '("block" "exampleblock" "alertblock"))}}{${2:Block Title}} + +\end{$1} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bold.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bold.yasnippet new file mode 100644 index 0000000..c717a7b --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/bold.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Mrcio M. Ribeiro +# key: bf +# group: font +# name: {\bf ... } +# -- +{\bf $1}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/case.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/case.yasnippet new file mode 100644 index 0000000..70a67d0 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/case.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: case +# group: math +# name: \begin{cases} ... \end{cases} +# -- +\begin{cases} +$0 \\\\ +\end{cases} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/cha.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/cha.yasnippet new file mode 100644 index 0000000..898e21d --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/cha.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : cha +# group: sections +# name : \chapter +# -- +\chapter{${1:name}} +\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/chastar.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/chastar.yasnippet new file mode 100644 index 0000000..d9a8bb9 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/chastar.yasnippet @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : cha* +# group: sections +# name : \chapter* +# -- +\chapter*{${1:name}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/cite.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/cite.yasnippet new file mode 100644 index 0000000..e709854 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/cite.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor : Marcio M. Ribeiro +# key: cite +# group: references +# name : \cite +# -- +\cite{${1:label$(unless yas/modified-p (car (reftex-citation 't)))}}$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/coprod.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/coprod.yasnippet new file mode 100644 index 0000000..770bbaa --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/coprod.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: François Garillot +# key: coprod +# group: math +# name: \coprod_{n}^{} +# -- +\coprod_{$1}^{$2}$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/desc.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/desc.yasnippet new file mode 100644 index 0000000..4b77ad2 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/desc.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : desc +# group: environments +# name : \begin{description} ... \end{description} +# -- +\begin{description} +\item[${1:label}] $0 +\end{description} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/doc.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/doc.yasnippet new file mode 100644 index 0000000..6203573 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/doc.yasnippet @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: doc +# name: \documentclass +# -- +\documentclass[$2]{${1:$$(yas/choose-value '("article" "report" "book" "letter"))}} + +\begin{document} +$0 +\end{document} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/em.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/em.yasnippet new file mode 100644 index 0000000..84fe8f0 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/em.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Mrcio M. Ribeiro +# key: em +# group: font +# name: {\em ...} +# -- +{\em $1}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/enum.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/enum.yasnippet new file mode 100644 index 0000000..9d7e398 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/enum.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key: enum +# group: environments +# name : \begin{enumerate} ... \end{enumerate} +# -- +\begin{enumerate} +\item $0 +\end{enumerate} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/eq.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/eq.yasnippet new file mode 100644 index 0000000..64be33f --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/eq.yasnippet @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: eq +# group: math +# name: \begin{equation} ... \end{equation} +# -- +\begin{equation} +\label{${1:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +$0 +\end{equation} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/eqs.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/eqs.yasnippet new file mode 100644 index 0000000..1eee28c --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/eqs.yasnippet @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: eqs +# group: math +# name: \begin{align} ... \end{align} +# -- +\begin{${1:$$(yas/choose-value '("align" "align*" "multline" "gather" "subequations"))}} +\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +$0 +\end{$1} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/fig.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/fig.yasnippet new file mode 100644 index 0000000..2152c36 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/fig.yasnippet @@ -0,0 +1,12 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : fig +# group: environments +# name : \begin{figure} ... \end{figure} +# -- +\begin{figure}[htbp] + \centering + $0 + \caption{${1:caption}} + \label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +\end{figure} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/frac.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/frac.yasnippet new file mode 100644 index 0000000..12fa023 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/frac.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Song Qiang +# key: frac +# group: math +# name: \frac{numerator}{denominator} +# -- +\frac{${1:numerator}}{${2:denominator}}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/frame.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/frame.yasnippet new file mode 100644 index 0000000..62158d8 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/frame.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor: Claudio Marforio +# key: frame +# group: environments +# name : \begin{frame} ... \end{frame} +# -- +\begin{frame}{${1:Frame Title}} + +\end{frame} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/gls.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/gls.yasnippet new file mode 100644 index 0000000..b944042 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/gls.yasnippet @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# contributor : Peter Urbak +# key : newgls +# group: misc +# name : \newglossaryentry{...}{...} +# -- +\newglossaryentry{$1}{name={$1}, + description={$2.}} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/graphics.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/graphics.yasnippet new file mode 100644 index 0000000..c3add51 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/graphics.yasnippet @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : graphics +# name : \includegraphics +# -- +\includegraphics[width=${1:\linewidth}]{${2:file}} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/href.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/href.yasnippet new file mode 100644 index 0000000..78ce877 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/href.yasnippet @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# key: href +# group: environments +# name: \href{url}{text} +# -- +\href{${1:url}}{${2:text}}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/int.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/int.yasnippet new file mode 100644 index 0000000..ead32d7 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/int.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Song Qiang +# key: int +# group: math +# name: \int_{n}^{} +# -- +\\${1:$$(yas/choose-value '("int" "oint" "iint" "iiint" "iiiint" "idotsint"))}{$2}^{$3}$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/it.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/it.yasnippet new file mode 100644 index 0000000..d9052bf --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/it.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: it +# group: environments +# name: \item +# -- +\item $0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/itd.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/itd.yasnippet new file mode 100644 index 0000000..94d9358 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/itd.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Rasmus Borgsmidt +# key: itd +# group: environments +# name: \item[] (description) +# -- +\item[${1:label}] $0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/item.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/item.yasnippet new file mode 100644 index 0000000..14fb2d0 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/item.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : item +# group: environments +# name : \begin{itemize} ... \end{itemize} +# -- +\begin{itemize} +\item $0 +\end{itemize} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/label.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/label.yasnippet new file mode 100644 index 0000000..9bcc82b --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/label.yasnippet @@ -0,0 +1,7 @@ + -*- mode: snippet -*- +# contributor : Mrcio M. Ribeiro +# key: lab +# group: references +# name : \label +# -- +\label{${1:label$(unless yas/modified-p (reftex-label nil 'dont-insert))}}$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/letter.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/letter.yasnippet new file mode 100644 index 0000000..258cf3d --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/letter.yasnippet @@ -0,0 +1,27 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# contributor : Song Qiang +# key: letter +# group: skeleton +# name: \documentclass{letter} ... +# -- +\documentclass{letter} +\signature{${1:Foo Bar}} +\address{${2:Address line 1 \\\\ +Address line 2 \\\\ +Address line 3}} +\begin{document} + +\begin{letter} +{${3:Recipient's address}} + +\opening{Dear ${4:Sir}:} + +$0 + +\closing{Yours Sincerely,} + +\end{letter} + +\end{document} + diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/lim.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/lim.yasnippet new file mode 100644 index 0000000..04f1417 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/lim.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: François Garillot +# key: lim +# group: math +# name: \lim_{n} +# -- +\lim_{$1}$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/math.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/math.yasnippet new file mode 100644 index 0000000..cfbdd04 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/math.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor: Song Qiang +# key: math +# group: math +# name: displaymath \[ ... \] +# -- +\[ +$1 +\] diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/matrix.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/matrix.yasnippet new file mode 100644 index 0000000..58d643c --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/matrix.yasnippet @@ -0,0 +1,11 @@ +# -*- mode: snippet -*- +# contributor: Song Qiang +# key: matrix +# group: math +# name: \begin{matrix} ... \end{} +# -- +\begin{${1:$$(yas/choose-value '("pmatrix" "bmatrix" "Bmatrix" "vmatrix" "Vmatrix" "smallmatrix"))}} +\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +$0 +\end{$1} + diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/minipage.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/minipage.yasnippet new file mode 100644 index 0000000..447b31e --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/minipage.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: minipage +# group: environments +# name: \begin{minipage}[position][width] ... \end{minipage} +# -- +\begin{minipage}[${1:htbp}]{${2:1.0}${3:\linewidth}} + $0 +\end{minipage} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/par.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/par.yasnippet new file mode 100644 index 0000000..ffe3e14 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/par.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key: par +# group: sections +# name : \paragraph +# -- +\paragraph{${1:name}} +\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/prod.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/prod.yasnippet new file mode 100644 index 0000000..7174475 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/prod.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: François Garillot +# key: prod +# group: math +# name: \prod_{n}^{} +# -- +\prod_{$1}^{$2}$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ref.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ref.yasnippet new file mode 100644 index 0000000..c3a4116 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ref.yasnippet @@ -0,0 +1,7 @@ + -*- mode: snippet -*- +# contributor : Mrcio M. Ribeiro +# key: ref +# group: references +# name : \ref +# -- +\ref{${1:label$(unless yas/modified-p (reftex-reference nil 'dont-insert))}}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sc.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sc.yasnippet new file mode 100644 index 0000000..5194a85 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sc.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Rasmus Borgsmidt +# key: sc +# group: font +# name: {\sc ...} +# -- +{\scshape $1}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sec.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sec.yasnippet new file mode 100644 index 0000000..993e5aa --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sec.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : sec +# group: sections +# name : \section +# -- +\section{${1:name}} +\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/secstar.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/secstar.yasnippet new file mode 100644 index 0000000..1d6ff55 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/secstar.yasnippet @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key : sec* +# group: sections +# name : \section* +# -- +\section*{${1:name}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ssub.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ssub.yasnippet new file mode 100644 index 0000000..c78dae6 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ssub.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key: ssub +# group: sections +# name : \subsubsection +# -- +\subsubsection{${1:name}} +\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ssubstar.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ssubstar.yasnippet new file mode 100644 index 0000000..5399487 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/ssubstar.yasnippet @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key: ssub* +# group: sections +# name : \subsubsection* +# -- +\subsubsection*{${1:name}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sub.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sub.yasnippet new file mode 100644 index 0000000..f71ebb2 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sub.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key: sub +# group: sections +# name : \subsection +# -- +\subsection{${1:name}} +\label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/subfig.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/subfig.yasnippet new file mode 100644 index 0000000..7388475 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/subfig.yasnippet @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key: subfig +# group: environments +# name : \subfigure +# -- +\subfigure[${1:caption}]{ + \label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} + $0 +} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/substar.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/substar.yasnippet new file mode 100644 index 0000000..3af6aae --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/substar.yasnippet @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key: sub* +# group: sections +# name : \subsection* +# -- +\subsection*{${1:name}} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sum.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sum.yasnippet new file mode 100644 index 0000000..2dd1ff5 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/sum.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Song Qiang +# key: sum +# group: math +# name: \sum_{n}^{} +# -- +\sum_{$1}^{$2}$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/table.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/table.yasnippet new file mode 100644 index 0000000..ebcc444 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/table.yasnippet @@ -0,0 +1,14 @@ +# -*- mode: snippet -*- +# contributor : Mads D. Kristensen +# key: table +# group: environments +# name : \begin{table} ... \end{table} +# -- +\begin{table}[htbp] + \centering + \begin{tabular}{${3:format}} + $0 + \end{tabular} + \caption{${1:caption}} + \label{${2:"waiting for reftex-label call..."$(unless yas/modified-p (reftex-label nil 'dont-insert))}} +\end{table} diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/tt.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/tt.yasnippet new file mode 100644 index 0000000..24461f2 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/tt.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Rasmus Borgsmidt +# key: tt +# group: font +# name: {\tt ...} +# -- +{\tt $1}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/url.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/url.yasnippet new file mode 100644 index 0000000..eb56f6b --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/url.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: url +# group: environments +# name: \url +# -- +\url{${1:$$(yas/choose-value '("http" "ftp"))}://${2:address}}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/use.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/use.yasnippet new file mode 100644 index 0000000..8b99050 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/use.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# key: use +# group: misc +# name: \usepackage +# -- +\usepackage[$2]{$1}$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/latex-mode/verb.yasnippet b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/verb.yasnippet new file mode 100644 index 0000000..c63f997 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/latex-mode/verb.yasnippet @@ -0,0 +1,11 @@ +# -*- mode: snippet -*- +# contributor: Mads D. Kristensen +# contributor : Bjorn Reese +# contributor : Song Qiang +# key: verb +# group: environments +# name: \begin{verbatim} ... \end{verbatim} +# -- +\begin{verbatim} +$0 +\end{verbatim} diff --git a/user-config/emacs/.emacs.d/etc/snippets/markdown-mode/.yas-compiled-snippets.el b/user-config/emacs/.emacs.d/etc/snippets/markdown-mode/.yas-compiled-snippets.el new file mode 100644 index 0000000..a3cf21b --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/markdown-mode/.yas-compiled-snippets.el @@ -0,0 +1,8 @@ +;;; Compiled snippets and support files for `markdown-mode' +;;; Snippet definitions: +;;; +(yas-define-snippets 'markdown-mode + '(("blog" "---\ntitle: ${1:title}\nauthor: `(insert-author)`\ndate: `(insert-date)`\ndescription: ${2:description}\nupdated: ${3:updated}\ntags: ${4:general}\n---\n\n$0" "blog" nil nil nil nil nil nil))) + + +;;; Do not edit! File generated at Mon Jun 2 06:32:05 2014 diff --git a/user-config/emacs/.emacs.d/etc/snippets/markdown-mode/blog b/user-config/emacs/.emacs.d/etc/snippets/markdown-mode/blog new file mode 100644 index 0000000..4b0655a --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/markdown-mode/blog @@ -0,0 +1,13 @@ +# -*- mode: snippet -*- +# name: blog +# key: blog +# -- +--- +title: ${1:title} +author: `(insert-author)` +date: `(insert-date)` +description: ${2:description} +tags: ${3:general} +--- + +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/and b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/and new file mode 100644 index 0000000..63e9df9 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/and @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: and +# key: and +# key: a +# -- +(and $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/append b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/append new file mode 100644 index 0000000..2256218 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/append @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: append +# key: append +# -- +(append $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/apply b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/apply new file mode 100644 index 0000000..c066886 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/apply @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: apply +# key: apply +# -- +(apply $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/car b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/car new file mode 100644 index 0000000..3e68c3a --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/car @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: car +# key: car +# -- +(car $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cdr b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cdr new file mode 100644 index 0000000..9f65f4f --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cdr @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: cdr +# key: cdr +# -- +(cdr $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/class b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/class new file mode 100644 index 0000000..0c24a3e --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/class @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: class +# key: cls +# -- +(class ${1:object%} + (super-new$2) + (init$3) + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cond b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cond new file mode 100644 index 0000000..a23dd86 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cond @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: cond +# key: cond +# -- +(cond [${1:expr} ${2:body}] + [$0]) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cons b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cons new file mode 100644 index 0000000..216490a --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/cons @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: cons +# key: cons +# -- +(cons $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define new file mode 100644 index 0000000..43ac9bf --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: function: (define (head args) body ...+) +# key: def +# -- +(define (${1:fun} ${2:args}) + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-match b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-match new file mode 100644 index 0000000..aafa133 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-match @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: define/match +# key: defm +# -- +(define/match (${1:fun} ${2:args}) + [(${3:pat})${4: #:when ${5:expr}} ${6:body}]$0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-public b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-public new file mode 100644 index 0000000..743c247 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-public @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: define/public +# key: defp +# -- +(define/public (${1:fun} ${2:args}) + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax new file mode 100644 index 0000000..b8276b8 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (define-syntax id expr) +# key: defs +# -- +(define-syntax ${1:id} + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax-rule b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax-rule new file mode 100644 index 0000000..7101634 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax-rule @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: define-syntax-rule +# key: defsr +# -- +(define-syntax-rule (${1:id} ${2:pat}) + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax.1 b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax.1 new file mode 100644 index 0000000..c89ee61 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define-syntax.1 @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (define-syntax (head args) body ...+) +# key: defs +# -- +(define-syntax (${1:id} ${2:stx}) + $0) diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define.1 b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define.1 new file mode 100644 index 0000000..cfd76d5 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/define.1 @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: variable: (define id expr) +# key: def +# -- +(define ${1:var} $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda new file mode 100644 index 0000000..5ebb939 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (lambda (args ...) body ...+) +# key: lambda +# -- +(lambda (${1:args}) $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda.1 b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda.1 new file mode 100644 index 0000000..c7da781 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda.1 @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (lambda rest-id body ...+) +# key: lambda +# -- +(lambda ${1:rest-id} $0) diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda.2 b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda.2 new file mode 100644 index 0000000..65e1a49 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/lambda.2 @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (lambda (args ...+ . rest-id) body ...+) +# key: lambda +# -- +(lambda (${1:args} . ${2:rst}) $0) diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/length b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/length new file mode 100644 index 0000000..da00ace --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/length @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: length +# key: length +# -- +(length $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let new file mode 100644 index 0000000..51bfb1e --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (let ([id val-expr] ...) body ...+) +# key: let +# -- +(let ([$1]$2) + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let* b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let* new file mode 100644 index 0000000..5596f15 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let* @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (let* ([id val-expr] ...) body ...+) +# key: let* +# -- +(let* ([$1]$2) + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let.1 b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let.1 new file mode 100644 index 0000000..d9d8e24 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/let.1 @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (let proc-id ([id init-expr] ...) body ...+) +# key: let +# -- +(let ${1:proc-id} ([$2]$3) + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/letrec b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/letrec new file mode 100644 index 0000000..e71f3b1 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/letrec @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: (letrec ([id val-expr] ...) body ...+) +# key: letr +# -- +(letrec ([$1]$2) + $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/list b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/list new file mode 100644 index 0000000..11be961 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/list @@ -0,0 +1,5 @@ +#contributor: Xah Lee (XahLee.org) +#name: list +#key: list +# -- +(list $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/match b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/match new file mode 100644 index 0000000..916d440 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/match @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: match +# key: mat +# -- +(match ${1:val} + [${2:pat}${3: #:when ${4:expr}} ${5:body}]$0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/match* b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/match* new file mode 100644 index 0000000..ae31960 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/match* @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Collin J. Doering +# name: match* +# key: mat* +# -- +(match* (${1:vals}) + [${2:pat}${3: #:when ${4:expr}} ${5:body}]$0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/or b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/or new file mode 100644 index 0000000..506fcc9 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/or @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: or +# key: or +# key: o +# -- +(or $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/quote b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/quote new file mode 100644 index 0000000..afa3b31 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/quote @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: quote +# key: quo +# -- +(quote $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/repeat b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/repeat new file mode 100644 index 0000000..8b71195 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/scheme-mode/repeat @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# contributor: Xah Lee (XahLee.org) +# name: repeat +# key: repeat +# -- +(repeat $0) \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/base64-field b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/base64-field new file mode 100644 index 0000000..c6a4e32 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/base64-field @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: base64-field +# key: b64f +# group: kubernetes +# -- +${1:key}: ${2:$$(when (and yas-modified-p yas-moving-away-p) (base64-encode-string yas-text))} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/configmap b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/configmap new file mode 100644 index 0000000..61d4402 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/configmap @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# name: base64-field +# key: cm +# group: kubernetes +# -- +apiVersion: v1 +kind: ConfigMap +data: + $0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/container b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/container new file mode 100644 index 0000000..480b4fe --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/container @@ -0,0 +1,8 @@ +# -*- mode: snippet -*- +# name: container +# key: cont +# group: kubernetes +# -- +- name: ${1:name} + image: ${2:image} + volumeMounts: \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/deployment b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/deployment new file mode 100644 index 0000000..ed57dc7 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/deployment @@ -0,0 +1,21 @@ +# -*- mode: snippet -*- +# name: deployment +# key: deploy +# group: kubernetes +# -- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ${1:name} +spec: + selector: + matchLabels: + app: ${2:app} + replicas: ${3:replicas} + template: + metadata: + labels: + app: nginx + spec: + containers: + \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/endpoint b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/endpoint new file mode 100644 index 0000000..7c5d357 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/endpoint @@ -0,0 +1,15 @@ +# -*- mode: snippet -*- +# name: endpoint +# key: ep +# group: kubernetes +# -- +apiVersion: v1 +kind: Endpoints +metadata: + name: ${1:name} +subsets: + - addresses: + - ${2:$$(yas-choose-value '("ip" "hostname" "nodeName" "targetRef"))}: $3 + ports: + - port: ${4:port} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/ingress b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/ingress new file mode 100644 index 0000000..af6f4d2 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/ingress @@ -0,0 +1,15 @@ +# -*- mode: snippet -*- +# name: base64-field +# key: ig +# group: kubernetes +# -- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + annotations: + $0 + name: ${1:name} + namespace: ${2:namespace} +spec: + rules: + \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/ingress-rule b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/ingress-rule new file mode 100644 index 0000000..96f9158 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/ingress-rule @@ -0,0 +1,12 @@ +# -*- mode: snippet -*- +# name: ingress-rule +# key: igrule +# group: kubernetes +# -- +- host: ${1:host} + http: + paths: + - path: ${2:path} + backend: + serviceName: ${3:service-name} + servicePort: ${4:service-port} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/manifest b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/manifest new file mode 100644 index 0000000..3dc04a4 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/manifest @@ -0,0 +1,11 @@ +# -*- mode: snippet -*- +# name: manifest +# key: mfs +# group: kubernetes +# -- +apiVersion: ${1:$$(yas-choose-value '("v1" "storage.k8s.io/v1"))} +kind: ${2:$$(yas-choose-value '("Pod" "Service" "Deployment" "PersistentVolume" "StorageClass" "ConfigMap" "Secret" "Endpoints" "Ingress" "Namespace" "ServiceAccount" ))} +metadata: +labels: +spec: +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/namespace b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/namespace new file mode 100644 index 0000000..82435ca --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/namespace @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# name: namespace +# key: ns +# group: kubernetes +# -- +apiVersion: v1 +kind: Namespace +metadata: + name: ${1:name} +$0 diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/pod b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/pod new file mode 100644 index 0000000..047f8d5 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/pod @@ -0,0 +1,12 @@ +# -*- mode: snippet -*- +# name: base64-field +# key: po +# group: kubernetes +# -- +apiVersion: v1 +kind: Pod +metadata: + name: ${1:name} +spec: + containers: + $0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/secret b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/secret new file mode 100644 index 0000000..4dbeb01 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/secret @@ -0,0 +1,12 @@ +# -*- mode: snippet -*- +# name: secret +# key: scrt +# group: kubernetes +# -- +apiVersion: v1 +kind: Secret +metadata: + name: ${1:name} +type: Opaque +data: + $0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/service-account b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/service-account new file mode 100644 index 0000000..0d904f6 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/service-account @@ -0,0 +1,11 @@ +# -*- mode: snippet -*- +# name: serviceaccount +# key: sa +# group: kubernetes +# -- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: ${1:name} +automountServiceAccountToken: ${2:true} +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/storage-class b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/storage-class new file mode 100644 index 0000000..4946a4c --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/storage-class @@ -0,0 +1,14 @@ +# -*- mode: snippet -*- +# name: storage-class +# key: sc +# group: kubernetes +# -- +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: ${1:name} +provisioner: ${2:$$(yas-choose-value '("kubernetes.io/aws-ebs" "kubernetes.io/gce-pd" "kubernetes.io/glusterfs" "kubernetes.io/cinder" "kubernetes.io/vsphere-volume" "kubernetes.io/rbd" "kubernetes.io/quobyte" "kubernetes.io/azure-disk" "kubernetes.io/azure-file" "kubernetes.io/portworx-volume" "kubernetes.io/scaleio" "kubernetes.io/storageos" "kubernetes.io/no-provisioner"))} +parameters: +reclaimPolicy: ${3:$$(yas-choose-value '("Delete" "Retain"))} +mountOptions: +volumeBindingMode: ${4:$$(yas-choose-value '("Immediate" "WaitForFirstConsumer"))} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/volume-mount b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/volume-mount new file mode 100644 index 0000000..90271eb --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/snippets/yaml-mode/volume-mount @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: volume-mount +# key: vm +# group: kubernetes +# -- +- mountPath: ${1:mountPath} + name: ${2:name} \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/etc/templates/c-template.c b/user-config/emacs/.emacs.d/etc/templates/c-template.c new file mode 100644 index 0000000..c4eb9a3 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/c-template.c @@ -0,0 +1,23 @@ +/** + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * File: @!@FILE@!@ + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + */ + diff --git a/user-config/emacs/.emacs.d/etc/templates/clojure-template.clj b/user-config/emacs/.emacs.d/etc/templates/clojure-template.clj new file mode 100644 index 0000000..91d07e2 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/clojure-template.clj @@ -0,0 +1,19 @@ +;; (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: @!@FILE@!@ +;; Author: @!@AUTHOR@!@ <@!@EMAIL@!@ +;; Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/cpp-template.cc b/user-config/emacs/.emacs.d/etc/templates/cpp-template.cc new file mode 100644 index 0000000..c4eb9a3 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/cpp-template.cc @@ -0,0 +1,23 @@ +/** + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * File: @!@FILE@!@ + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + */ + diff --git a/user-config/emacs/.emacs.d/etc/templates/css-template.css b/user-config/emacs/.emacs.d/etc/templates/css-template.css new file mode 100644 index 0000000..0cc3d3a --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/css-template.css @@ -0,0 +1,23 @@ +/** + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * File: @!@FILE@!@ + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@ + * Date: @!@DATE@!@ + */ + diff --git a/user-config/emacs/.emacs.d/etc/templates/emacs-lisp-template.el b/user-config/emacs/.emacs.d/etc/templates/emacs-lisp-template.el new file mode 100644 index 0000000..e1e1976 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/emacs-lisp-template.el @@ -0,0 +1,19 @@ +;; (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: @!@FILE@!@ +;; Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +;; Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/erlang-template.erl b/user-config/emacs/.emacs.d/etc/templates/erlang-template.erl new file mode 100644 index 0000000..bf749f4 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/erlang-template.erl @@ -0,0 +1,19 @@ +% (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +% +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . + +% File: @!@FILE@!@ +% Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +% Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/haml-template.haml b/user-config/emacs/.emacs.d/etc/templates/haml-template.haml new file mode 100644 index 0000000..d78559c --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/haml-template.haml @@ -0,0 +1,19 @@ +// (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// File: @!@FILE@!@ +// Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +// Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/haskell-template.hs b/user-config/emacs/.emacs.d/etc/templates/haskell-template.hs new file mode 100644 index 0000000..59ad04e --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/haskell-template.hs @@ -0,0 +1,19 @@ +-- (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +-- File: @!@FILE@!@ +-- Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +-- Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/html-template.html b/user-config/emacs/.emacs.d/etc/templates/html-template.html new file mode 100644 index 0000000..3f68731 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/html-template.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/user-config/emacs/.emacs.d/etc/templates/java-script-template.js b/user-config/emacs/.emacs.d/etc/templates/java-script-template.js new file mode 100644 index 0000000..c4eb9a3 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/java-script-template.js @@ -0,0 +1,23 @@ +/** + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * File: @!@FILE@!@ + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + */ + diff --git a/user-config/emacs/.emacs.d/etc/templates/java-template.java b/user-config/emacs/.emacs.d/etc/templates/java-template.java new file mode 100644 index 0000000..fd87abf --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/java-template.java @@ -0,0 +1,22 @@ +/** + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * File: @!@FILE@!@ + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + */ diff --git a/user-config/emacs/.emacs.d/etc/templates/lisp-template.lisp b/user-config/emacs/.emacs.d/etc/templates/lisp-template.lisp new file mode 100644 index 0000000..e1e1976 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/lisp-template.lisp @@ -0,0 +1,19 @@ +;; (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: @!@FILE@!@ +;; Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +;; Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/lua-template.lua b/user-config/emacs/.emacs.d/etc/templates/lua-template.lua new file mode 100644 index 0000000..03b35d6 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/lua-template.lua @@ -0,0 +1,19 @@ +-- (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +-- File: @!@FILE@!@ +-- Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +-- Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/ocaml-template.ml b/user-config/emacs/.emacs.d/etc/templates/ocaml-template.ml new file mode 100644 index 0000000..8c9b0ec --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/ocaml-template.ml @@ -0,0 +1,23 @@ +(* + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) + +(* + * File: @!@FILE@!@ + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + *) + diff --git a/user-config/emacs/.emacs.d/etc/templates/php-template.php b/user-config/emacs/.emacs.d/etc/templates/php-template.php new file mode 100644 index 0000000..a9b89f4 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/php-template.php @@ -0,0 +1,28 @@ +. +*/ + +/** + * File: @!@FILE@!@ + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + */ + + + +?> diff --git a/user-config/emacs/.emacs.d/etc/templates/python-scratch.py b/user-config/emacs/.emacs.d/etc/templates/python-scratch.py new file mode 100644 index 0000000..99644b5 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/python-scratch.py @@ -0,0 +1,3 @@ +# This buffer is for notes you don't want to save, and for Lisp evaluation. +# If you want to create a file, visit that file with C-x C-f, +# then enter the text in that file's own buffer. diff --git a/user-config/emacs/.emacs.d/etc/templates/python-template.py b/user-config/emacs/.emacs.d/etc/templates/python-template.py new file mode 100644 index 0000000..cfd7b97 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/python-template.py @@ -0,0 +1,19 @@ +# (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# File: @!@FILE@!@ +# Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +# Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/racket-template.rkt b/user-config/emacs/.emacs.d/etc/templates/racket-template.rkt new file mode 100644 index 0000000..43dd5c0 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/racket-template.rkt @@ -0,0 +1,21 @@ +#lang racket + +;; (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: @!@FILE@!@ +;; Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +;; Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/ruby-template.rb b/user-config/emacs/.emacs.d/etc/templates/ruby-template.rb new file mode 100644 index 0000000..cfd7b97 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/ruby-template.rb @@ -0,0 +1,19 @@ +# (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# File: @!@FILE@!@ +# Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +# Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/sass-template.sass b/user-config/emacs/.emacs.d/etc/templates/sass-template.sass new file mode 100644 index 0000000..d78559c --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/sass-template.sass @@ -0,0 +1,19 @@ +// (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// File: @!@FILE@!@ +// Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +// Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/scala-template.scala b/user-config/emacs/.emacs.d/etc/templates/scala-template.scala new file mode 100644 index 0000000..c4eb9a3 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/scala-template.scala @@ -0,0 +1,23 @@ +/** + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * File: @!@FILE@!@ + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + */ + diff --git a/user-config/emacs/.emacs.d/etc/templates/scheme-template.scm b/user-config/emacs/.emacs.d/etc/templates/scheme-template.scm new file mode 100644 index 0000000..e1e1976 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/scheme-template.scm @@ -0,0 +1,19 @@ +;; (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: @!@FILE@!@ +;; Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +;; Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/scss-template.scss b/user-config/emacs/.emacs.d/etc/templates/scss-template.scss new file mode 100644 index 0000000..d78559c --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/scss-template.scss @@ -0,0 +1,19 @@ +// (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// File: @!@FILE@!@ +// Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +// Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/shell-template.sh b/user-config/emacs/.emacs.d/etc/templates/shell-template.sh new file mode 100644 index 0000000..356eef2 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/shell-template.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# File: @!@FILE@!@ +# Author: @!@AUTHOR@!@ <@!@EMAIL@!@> +# Date: @!@DATE@!@ + diff --git a/user-config/emacs/.emacs.d/etc/templates/sml-template.ml b/user-config/emacs/.emacs.d/etc/templates/sml-template.ml new file mode 100644 index 0000000..b902b63 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/sml-template.ml @@ -0,0 +1,23 @@ +(* + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) + +(* + * File: sml-template.ml + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + *) + diff --git a/user-config/emacs/.emacs.d/etc/templates/sml-template.sml b/user-config/emacs/.emacs.d/etc/templates/sml-template.sml new file mode 100644 index 0000000..b902b63 --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/templates/sml-template.sml @@ -0,0 +1,23 @@ +(* + * (C) Copyright @!@AUTHOR@!@ @!@YEAR@!@ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) + +(* + * File: sml-template.ml + * Author: @!@AUTHOR@!@ <@!@EMAIL@!@> + * Date: @!@DATE@!@ + *) + diff --git a/user-config/emacs/.emacs.d/etc/yasnippet/snippets/markdown-mode/blog b/user-config/emacs/.emacs.d/etc/yasnippet/snippets/markdown-mode/blog new file mode 100644 index 0000000..4b0655a --- /dev/null +++ b/user-config/emacs/.emacs.d/etc/yasnippet/snippets/markdown-mode/blog @@ -0,0 +1,13 @@ +# -*- mode: snippet -*- +# name: blog +# key: blog +# -- +--- +title: ${1:title} +author: `(insert-author)` +date: `(insert-date)` +description: ${2:description} +tags: ${3:general} +--- + +$0 \ No newline at end of file diff --git a/user-config/emacs/.emacs.d/init.el b/user-config/emacs/.emacs.d/init.el new file mode 100644 index 0000000..e1f45f8 --- /dev/null +++ b/user-config/emacs/.emacs.d/init.el @@ -0,0 +1,32 @@ +;; (C) Copyright Collin J. Doering 2020 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; Even though this is not used, it needs to be here so that package.el +;; doesn't re-add it uncommented +;; (package-initialize) + +;;; Code: + +(require 'org) +(require 'ob-tangle) + +(let* ((filename (concat (file-name-directory load-file-name) "config")) + (config (concat filename ".org")) + (el (concat filename ".el"))) + (when (file-exists-p config) + ;; Note: org-babel-load-file is explicitly not used as it doesn't + ;; hand symlinks but overwrites them + (org-babel-tangle-file config) + (load-file el))) diff --git a/user-config/emacs/.local/share/applications/org-protocol-override.desktop b/user-config/emacs/.local/share/applications/org-protocol-override.desktop new file mode 100644 index 0000000..ed85337 --- /dev/null +++ b/user-config/emacs/.local/share/applications/org-protocol-override.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Org-Protocol +Comment=Protocol which allows interaction between org-roam-server in emacs and a web browser +Exec=org-protocol-open.sh +Icon=emacs-icon +Type=Application +Terminal=false +MimeType=x-scheme-handler/org-protocol diff --git a/user-config/git/.config/git/attributes b/user-config/git/.config/git/attributes new file mode 100644 index 0000000..bfa69cf --- /dev/null +++ b/user-config/git/.config/git/attributes @@ -0,0 +1 @@ +*.gpg filter=gpg diff=gpg diff --git a/user-config/git/.gitconfig b/user-config/git/.gitconfig new file mode 100644 index 0000000..b37c863 --- /dev/null +++ b/user-config/git/.gitconfig @@ -0,0 +1,15 @@ +[user] + email = collin@rekahsoft.ca + name = Collin J. Doering + signingkey = E05BFEC8 +[color] + branch = auto + diff = auto + status = auto + ui = true +[push] + default = simple +#[commit] +# gpgsign = true +[diff "gpg"] + textconv = gpg --no-tty --decrypt diff --git a/user-config/gpg/.gnupg/gpg-agent.conf b/user-config/gpg/.gnupg/gpg-agent.conf new file mode 100644 index 0000000..5947b5a --- /dev/null +++ b/user-config/gpg/.gnupg/gpg-agent.conf @@ -0,0 +1,23 @@ +# File: ~/.gnupg/gpg-agent.conf +# Author: Collin J. Doering +# Date: Dec 15, 2010 +# Description: + +# Use gpg-agent for ssh keys +enable-ssh-support + +# Cache settings +default-cache-ttl 10800 +default-cache-ttl-ssh 10800 +max-cache-ttl-ssh 10800 + +# Environment file +#write-env-file /home/collin/.gnupg/gpg-agent.info + +# Keyboard control +#no-grab + +# PIN entry program +#pinentry-program /usr/bin/pinentry-curses +#pinentry-program /usr/bin/pinentry-qt4 +pinentry-program /usr/bin/pinentry-gtk-2 diff --git a/user-config/gpg/.pam_environment b/user-config/gpg/.pam_environment new file mode 100644 index 0000000..b55fba7 --- /dev/null +++ b/user-config/gpg/.pam_environment @@ -0,0 +1,2 @@ +SSH_AGENT_PID DEFAULT= +SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh" diff --git a/user-config/guile/.guile b/user-config/guile/.guile new file mode 100644 index 0000000..46e4cc2 --- /dev/null +++ b/user-config/guile/.guile @@ -0,0 +1,7 @@ +;; Use readline +(use-modules (ice-9 readline)) +(activate-readline) + +;; Use guile-colorized +(use-modules (ice-9 colorized)) +(activate-colorized) diff --git a/user-config/guix/.config/guix/channels.scm b/user-config/guix/.config/guix/channels.scm new file mode 100644 index 0000000..59beac2 --- /dev/null +++ b/user-config/guix/.config/guix/channels.scm @@ -0,0 +1,18 @@ +(cons* + + ;; (channel + ;; (name 'guix) + ;; (url "https://git.rekahsoft.ca/rekahsoft/guix.git") + ;; (branch "rekahsoft")) + + (channel + (name 'rekahsoft-guix) + (url "https://git.rekahsoft.ca/rekahsoft/rekahsoft-guix.git") + (branch "master") + (introduction + (make-channel-introduction + "7d16b31094446f10d539fcfab8336bdfd38386c8" + (openpgp-fingerprint + "F8D5 46F3 AF37 EF53 D1B6 48BE 7B4D EB93 212B 3022")))) + + %default-channels) diff --git a/user-config/guix/.config/guix/home.scm b/user-config/guix/.config/guix/home.scm new file mode 100644 index 0000000..40d21c8 --- /dev/null +++ b/user-config/guix/.config/guix/home.scm @@ -0,0 +1,4 @@ +(use-modules (home)) + +(home + (data-directory "/data/collin")) diff --git a/user-config/haskell/.cabal/config b/user-config/haskell/.cabal/config new file mode 100644 index 0000000..55b699a --- /dev/null +++ b/user-config/haskell/.cabal/config @@ -0,0 +1,211 @@ +-- This is the configuration file for the 'cabal' command line tool. +-- +-- The available configuration options are listed below. +-- Some of them have default values listed. +-- +-- Lines (like this one) beginning with '--' are comments. +-- Be careful with spaces and indentation because they are +-- used to indicate layout for nested sections. +-- +-- This config file was generated using the following versions +-- of Cabal and cabal-install: +-- Cabal library version: 2.0.0.2 +-- cabal-install version: 2.0.0.0 + + +repository hackage.haskell.org + url: http://hackage.haskell.org/ + -- secure: True + -- root-keys: + -- key-threshold: 3 + +-- default-user-config: +-- require-sandbox: False +-- ignore-sandbox: False +-- ignore-expiry: False +-- http-transport: +-- nix: False +remote-repo-cache: /home/collin/.cabal/packages +-- local-repo: +-- logs-dir: /home/collin/.cabal/logs +world-file: /home/collin/.cabal/world +-- verbose: 1 +-- compiler: ghc +-- cabal-file: +-- with-compiler: +-- with-hc-pkg: +-- program-prefix: +-- program-suffix: +-- library-vanilla: True +-- library-profiling: +-- shared: +-- executable-dynamic: False +-- profiling: +-- executable-profiling: +-- profiling-detail: +-- library-profiling-detail: +-- optimization: True +-- debug-info: False +-- library-for-ghci: +-- split-objs: False +-- executable-stripping: True +-- library-stripping: True +-- configure-option: +-- user-install: True +-- package-db: +-- flags: +-- extra-include-dirs: +-- deterministic: +-- cid: +-- extra-lib-dirs: +-- extra-framework-dirs: +extra-prog-path: /home/collin/.cabal/bin +-- instantiate-with: +-- tests: False +-- coverage: False +-- library-coverage: +-- allow-older: False +-- allow-newer: False +-- exact-configuration: False +-- benchmarks: False +-- relocatable: False +-- cabal-lib-version: +-- constraint: +-- preference: +-- solver: modular +-- documentation: False +-- doc-index-file: $datadir/doc/$arch-$os-$compiler/index.html +-- max-backjumps: 2000 +-- reorder-goals: False +-- count-conflicts: True +-- shadow-installed-packages: False +-- strong-flags: False +-- allow-boot-library-installs: False +-- reinstall: False +-- avoid-reinstalls: False +-- force-reinstalls: False +-- upgrade-dependencies: False +-- index-state: +-- root-cmd: +-- symlink-bindir: +build-summary: /home/collin/.cabal/logs/build.log +-- build-log: +remote-build-reporting: anonymous +-- report-planning-failure: False +-- per-component: True +-- one-shot: False +-- run-tests: +jobs: $ncpus +-- keep-going: False +-- offline: False +-- project-file: +-- username: +-- password: +-- password-command: +-- builddir: + +haddock + -- keep-temp-files: False + -- hoogle: False + -- html: False + -- html-location: + -- executables: False + -- tests: False + -- benchmarks: False + -- foreign-libraries: False + -- all: + -- internal: False + -- css: + -- hyperlink-source: False + -- hscolour-css: + -- contents-location: + +install-dirs user + -- prefix: /home/collin/.cabal + -- bindir: $prefix/bin + -- libdir: $prefix/lib + -- libsubdir: $abi/$libname + -- dynlibdir: $libdir/$abi + -- libexecdir: $prefix/libexec + -- libexecsubdir: $abi/$pkgid + -- datadir: $prefix/share + -- datasubdir: $abi/$pkgid + -- docdir: $datadir/doc/$abi/$pkgid + -- htmldir: $docdir/html + -- haddockdir: $htmldir + -- sysconfdir: $prefix/etc + +install-dirs global + -- prefix: /usr/local + -- bindir: $prefix/bin + -- libdir: $prefix/lib + -- libsubdir: $abi/$libname + -- dynlibdir: $libdir/$abi + -- libexecdir: $prefix/libexec + -- libexecsubdir: $abi/$pkgid + -- datadir: $prefix/share + -- datasubdir: $abi/$pkgid + -- docdir: $datadir/doc/$abi/$pkgid + -- htmldir: $docdir/html + -- haddockdir: $htmldir + -- sysconfdir: $prefix/etc + +program-locations + -- alex-location: + -- ar-location: + -- c2hs-location: + -- cpphs-location: + -- doctest-location: + -- gcc-location: + -- ghc-location: + -- ghc-pkg-location: + -- ghcjs-location: + -- ghcjs-pkg-location: + -- greencard-location: + -- haddock-location: + -- happy-location: + -- haskell-suite-location: + -- haskell-suite-pkg-location: + -- hmake-location: + -- hpc-location: + -- hsc2hs-location: + -- hscolour-location: + -- jhc-location: + -- ld-location: + -- lhc-location: + -- lhc-pkg-location: + -- pkg-config-location: + -- runghc-location: + -- strip-location: + -- tar-location: + -- uhc-location: + +program-default-options + -- alex-options: + -- ar-options: + -- c2hs-options: + -- cpphs-options: + -- doctest-options: + -- gcc-options: + -- ghc-options: + -- ghc-pkg-options: + -- ghcjs-options: + -- ghcjs-pkg-options: + -- greencard-options: + -- haddock-options: + -- happy-options: + -- haskell-suite-options: + -- haskell-suite-pkg-options: + -- hmake-options: + -- hpc-options: + -- hsc2hs-options: + -- hscolour-options: + -- jhc-options: + -- ld-options: + -- lhc-options: + -- lhc-pkg-options: + -- pkg-config-options: + -- runghc-options: + -- strip-options: + -- tar-options: + -- uhc-options: diff --git a/user-config/haskell/.ghci b/user-config/haskell/.ghci new file mode 100644 index 0000000..1153763 --- /dev/null +++ b/user-config/haskell/.ghci @@ -0,0 +1,11 @@ +-- Setup prompt +:set prompt "ghci> " + +-- Setup use of hoogle through ghci +:def hoogle \str -> return $ ":! hoogle --count=15 \"" ++ str ++ "\"" + +-- Enable almost all warnings by default +:set -Wall + +-- Enable multi-line mode; shortform for -{ ... }- +:set +m diff --git a/user-config/kitty/.config/kitty/kitty.conf b/user-config/kitty/.config/kitty/kitty.conf new file mode 100644 index 0000000..413848e --- /dev/null +++ b/user-config/kitty/.config/kitty/kitty.conf @@ -0,0 +1,788 @@ +# vim:fileencoding=utf-8:ft=conf:foldmethod=marker + +#: Fonts {{{ + +#: kitty has very powerful font management. You can configure +#: individual font faces and even specify special fonts for particular +#: characters. + +font_family FreeMono +bold_font auto +italic_font auto +bold_italic_font auto + +#: You can specify different fonts for the bold/italic/bold-italic +#: variants. By default they are derived automatically, by the OSes +#: font system. Setting them manually is useful for font families that +#: have many weight variants like Book, Medium, Thick, etc. For +#: example:: + +#: font_family Operator Mono Book +#: bold_font Operator Mono Medium +#: italic_font Operator Mono Book Italic +#: bold_italic_font Operator Mono Medium Italic + +font_size 11.0 + +#: Font size (in pts) + +adjust_line_height 0 +adjust_column_width 0 + +#: Change the size of each character cell kitty renders. You can use +#: either numbers, which are interpreted as pixels or percentages +#: (number followed by %), which are interpreted as percentages of the +#: unmodified values. You can use negative pixels or percentages less +#: than 100% to reduce sizes (but this might cause rendering +#: artifacts). + +# symbol_map U+E0A0-U+E0A2,U+E0B0-U+E0B3 PowerlineSymbols + +#: Map the specified unicode codepoints to a particular font. Useful +#: if you need special rendering for some symbols, such as for +#: Powerline. Avoids the need for patched fonts. Each unicode code +#: point is specified in the form U+. You +#: can specify multiple code points, separated by commas and ranges +#: separated by hyphens. symbol_map itself can be specified multiple +#: times. Syntax is:: + +#: symbol_map codepoints Font Family Name + +box_drawing_scale 0.001, 1, 1.5, 2 + +#: Change the sizes of the lines used for the box drawing unicode +#: characters These values are in pts. They will be scaled by the +#: monitor DPI to arrive at a pixel value. There must be four values +#: corresponding to thin, normal, thick, and very thick lines. + +#: }}} + +#: Cursor customization {{{ + +cursor #cccccc + +#: Default cursor color + +cursor_shape block + +#: The cursor shape can be one of (block, beam, underline) + +cursor_blink_interval 0.5 +cursor_stop_blinking_after 15.0 + +#: The interval (in seconds) at which to blink the cursor. Set to zero +#: to disable blinking. Note that numbers smaller than repaint_delay +#: will be limited to repaint_delay. Stop blinking cursor after the +#: specified number of seconds of keyboard inactivity. Set to zero to +#: never stop blinking. + +#: }}} + +#: Scrollback {{{ + +scrollback_lines 2000 + +#: Number of lines of history to keep in memory for scrolling back. +#: Memory is allocated on demand. + +scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER + +#: Program with which to view scrollback in a new window. The +#: scrollback buffer is passed as STDIN to this program. If you change +#: it, make sure the program you use can handle ANSI escape sequences +#: for colors and text formatting. INPUT_LINE_NUMBER in the command +#: line above will be replaced by an integer representing which line +#: should be at the top of the screen. + +wheel_scroll_multiplier 5.0 + +#: Modify the amount scrolled by the mouse wheel or touchpad. Use +#: negative numbers to change scroll direction. + +#: }}} + +#: Mouse {{{ + +url_color #0087BD +url_style curly + +#: The color and style for highlighting URLs on mouse-over. url_style +#: can be one of: none, single, double, curly + +open_url_modifiers kitty_mod + +#: The modifier keys to press when clicking with the mouse on URLs to +#: open the URL + +open_url_with default + +#: The program with which to open URLs that are clicked on. The +#: special value default means to use the operating system's default +#: URL handler. + +copy_on_select no + +#: Copy to clipboard on select. With this enabled, simply selecting +#: text with the mouse will cause the text to be copied to clipboard. +#: Useful on platforms such as macOS/Wayland that do not have the +#: concept of primary selections. Note that this is a security risk, +#: as all programs, including websites open in your browser can read +#: the contents of the clipboard. + +rectangle_select_modifiers ctrl+alt + +#: The modifiers to use rectangular selection (i.e. to select text in +#: a rectangular block with the mouse) + +select_by_word_characters :@-./_~?&=%+# + +#: Characters considered part of a word when double clicking. In +#: addition to these characters any character that is marked as an +#: alpha-numeric character in the unicode database will be matched. + +click_interval 0.5 + +#: The interval between successive clicks to detect double/triple +#: clicks (in seconds) + +mouse_hide_wait 3.0 + +#: Hide mouse cursor after the specified number of seconds of the +#: mouse not being used. Set to zero to disable mouse cursor hiding. + +focus_follows_mouse no + +#: Set the active window to the window under the mouse when moving the +#: mouse around + +#: }}} + +#: Performance tuning {{{ + +repaint_delay 10 + +#: Delay (in milliseconds) between screen updates. Decreasing it, +#: increases frames-per-second (FPS) at the cost of more CPU usage. +#: The default value yields ~100 FPS which is more than sufficient for +#: most uses. Note that to actually achieve 100 FPS you have to either +#: set sync_to_monitor to no or use a monitor with a high refresh +#: rate. + +input_delay 3 + +#: Delay (in milliseconds) before input from the program running in +#: the terminal is processed. Note that decreasing it will increase +#: responsiveness, but also increase CPU usage and might cause flicker +#: in full screen programs that redraw the entire screen on each loop, +#: because kitty is so fast that partial screen updates will be drawn. + +sync_to_monitor yes + +#: Sync screen updates to the refresh rate of the monitor. This +#: prevents tearing (https://en.wikipedia.org/wiki/Screen_tearing) +#: when scrolling. However, it limits the rendering speed to the +#: refresh rate of your monitor. With a very high speed mouse/high +#: keyboard repeat rate, you may notice some slight input latency. If +#: so, set this to no. + +#: }}} + +#: Terminal bell {{{ + +enable_audio_bell yes + +#: Enable/disable the audio bell. Useful in environments that require +#: silence. + +visual_bell_duration 0.0 + +#: Visual bell duration. Flash the screen when a bell occurs for the +#: specified number of seconds. Set to zero to disable. + +window_alert_on_bell yes + +#: Request window attention on bell. Makes the dock icon bounce on +#: macOS or the taskbar flash on linux. + +bell_on_tab yes + +#: Show a bell symbol on the tab if a bell occurs in one of the +#: windows in the tab and the window is not the currently focused +#: window + +#: }}} + +#: Window layout {{{ + +remember_window_size yes +initial_window_width 640 +initial_window_height 400 + +#: If enabled, the window size will be remembered so that new +#: instances of kitty will have the same size as the previous +#: instance. If disabled, the window will initially have size +#: configured by initial_window_width/height, in pixels. You can use a +#: suffix of "c" on the width/height values to have them interpreted +#: as number of cells instead of pixels. + +enabled_layouts * + +#: The enabled window layouts. A comma separated list of layout names. +#: The special value * means all layouts. The first listed layout will +#: be used as the startup layout. For a list of available layouts, see +#: the layouts. + +window_resize_step_cells 2 +window_resize_step_lines 2 + +#: The step size (in units of cell width/cell height) to use when +#: resizing windows. The cells value is used for horizontal resizing +#: and the lines value for vertical resizing. + +window_border_width 1.0 + +#: The width (in pts) of window borders. Will be rounded to the +#: nearest number of pixels based on screen resolution. Note that +#: borders are displayed only when more than one window is visible. +#: They are meant to separate multiple windows. + +draw_minimal_borders yes + +#: Draw only the minimum borders needed. This means that only the +#: minimum needed borders for inactive windows are drawn. That is only +#: the borders that separate the inactive window from a neighbor. Note +#: that setting a non-zero window margin overrides this and causes all +#: borders to be drawn. + +window_margin_width 0.0 + +#: The window margin (in pts) (blank area outside the border) + +single_window_margin_width -1000.0 + +#: The window margin (in pts) to use when only a single window is +#: visible. Negative values will cause the value of +#: window_margin_width to be used instead. + +window_padding_width 0.0 + +#: The window padding (in pts) (blank area between the text and the +#: window border) + +active_border_color #00ff00 + +#: The color for the border of the active window + +inactive_border_color #cccccc + +#: The color for the border of inactive windows + +bell_border_color #ff5a00 + +#: The color for the border of inactive windows in which a bell has +#: occurred + +inactive_text_alpha 1.0 + +#: Fade the text in inactive windows by the specified amount (a number +#: between zero and one, with zero being fully faded). + +#: }}} + +#: Tab bar {{{ + +tab_bar_edge top + +#: Which edge to show the tab bar on, top or bottom + +tab_bar_margin_width 0.0 + +#: The margin to the left and right of the tab bar (in pts) + +tab_bar_style separator + +#: The tab bar style, can be one of: fade or separator. In the fade +#: style, each tab's edges fade into the background color, in the +#: separator style, tabs are separated by a configurable separator. + +tab_fade 0.25 0.5 0.75 1 + +#: Control how each tab fades into the background when using fade for +#: the tab_bar_style. Each number is an alpha (between zero and one) +#: that controls how much the corresponding cell fades into the +#: background, with zero being no fade and one being full fade. You +#: can change the number of cells used by adding/removing entries to +#: this list. + +tab_separator " ┇" + +#: The separator between tabs in the tab bar when using separator as +#: the tab_bar_style. + +active_tab_foreground #000 +active_tab_background #BE5345 +active_tab_font_style bold-italic +inactive_tab_foreground #C1A236 +inactive_tab_background #000 +inactive_tab_font_style normal + +#: Tab bar colors and styles + +#: }}} + +#: Color scheme {{{ + +foreground #dddddd +background #000000 + +#: The foreground and background colors + +background_opacity 0.85 +dynamic_background_opacity no + +#: The opacity of the background. A number between 0 and 1, where 1 is +#: opaque and 0 is fully transparent. This will only work if +#: supported by the OS (for instance, when using a compositor under +#: X11). Note that it only sets the default background color's +#: opacity. This is so that things like the status bar in vim, +#: powerline prompts, etc. still look good. But it means that if you +#: use a color theme with a background color in your editor, it will +#: not be rendered as transparent. Instead you should change the +#: default background color in your kitty config and not use a +#: background color in the editor color scheme. Or use the escape +#: codes to set the terminals default colors in a shell script to +#: launch your editor. Be aware that using a value less than 1.0 is a +#: (possibly significant) performance hit. If you want to dynamically +#: change transparency of windows set dynamic_background_opacity to +#: yes (this is off by default as it has a performance cost) + +dim_opacity 0.75 + +#: How much to dim text that has the DIM/FAINT attribute set. One +#: means no dimming and zero means fully dimmed (i.e. invisible). + +selection_foreground #000000 +selection_background #FFFACD + +#: The foreground and background for text selected with the mouse + + +#: The 16 terminal colors. There are 8 basic colors, each color has a +#: dull and bright version. You can also set the remaining colors from +#: the 256 color table as color16 to color255. + +color0 #000000 +color8 #767676 + +#: black + +color1 #cc0403 +color9 #f2201f + +#: red + +color2 #19cb00 +color10 #23fd00 + +#: green + +color3 #cecb00 +color11 #fffd00 + +#: yellow + +color4 #0d73cc +color12 #1a8fff + +#: blue + +color5 #cb1ed1 +color13 #fd28ff + +#: magenta + +color6 #0dcdcd +color14 #14ffff + +#: cyan + +color7 #dddddd +color15 #ffffff + +#: white + +#: }}} + +#: Advanced {{{ + +shell . + +#: The shell program to execute. The default value of . means to use +#: whatever shell is set as the default shell for the current user. +#: Note that on macOS if you change this, you might need to add +#: --login to ensure that the shell starts in interactive mode and +#: reads its startup rc files. + +editor . + +#: The console editor to use when editing the kitty config file or +#: similar tasks. A value of . means to use the environment variable +#: EDITOR. Note that this environment variable has to be set not just +#: in your shell startup scripts but system-wide, otherwise kitty will +#: not see it. + +close_on_child_death no + +#: Close the window when the child process (shell) exits. If no (the +#: default), the terminal will remain open when the child exits as +#: long as there are still processes outputting to the terminal (for +#: example disowned or backgrounded processes). If yes, the window +#: will close as soon as the child process exits. Note that setting it +#: to yes means that any background processes still using the terminal +#: can fail silently because their stdout/stderr/stdin no longer work. + +allow_remote_control yes + +#: Allow other programs to control kitty. If you turn this on other +#: programs can control all aspects of kitty, including sending text +#: to kitty windows, opening new windows, closing windows, reading the +#: content of windows, etc. Note that this even works over ssh +#: connections. + +startup_session none + +#: Path to a session file to use for all kitty instances. Can be +#: overridden by using the kitty --session command line option for +#: individual instances. See sessions in the kitty documentation for +#: details. Note that relative paths are interpreted with respect to +#: the kitty config directory. Environment variables in the path are +#: expanded. + +clipboard_control write-clipboard write-primary + +#: Allow programs running in kitty to read and write from the +#: clipboard. You can control exactly which actions are allowed. The +#: set of possible actions is: write-clipboard read-clipboard write- +#: primary read-primary The default is to allow writing to the +#: clipboard and primary selection. Note that enabling the read +#: functionality is a security risk as it means that any program, even +#: one running on a remote server via SSH can read your clipboard. + +term xterm-kitty + +#: The value of the TERM environment variable to set. Changing this +#: can break many terminal programs, only change it if you know what +#: you are doing, not because you read some advice on Stack Overflow +#: to change it. + +#: }}} + +#: OS specific tweaks {{{ + +macos_titlebar_color system + +#: Change the color of the kitty window's titlebar on macOS. A value +#: of system means to use the default system color, a value of +#: background means to use the background color of the currently +#: active window and finally you can use an arbitrary color, such as +#: #12af59 or red. WARNING: This option works by using a hack, as +#: there is no proper Cocoa API for it. It sets the background color +#: of the entire window and makes the titlebar transparent. As such it +#: is incompatible with background_opacity. If you want to use both, +#: you are probably better off just hiding the titlebar with +#: macos_hide_titlebar. + +macos_hide_titlebar no + +#: Hide the kitty window's title bar on macOS. + +x11_hide_window_decorations no + +#: Hide the window decorations (title bar and window borders) on X11 +#: and Wayland. Whether this works and exactly what effect it has +#: depends on the window manager, as it is the job of the window +#: manager/compositor to draw window decorations. + +macos_option_as_alt yes + +#: Use the option key as an alt key. With this set to no, kitty will +#: use the macOS native Option+Key = unicode character behavior. This +#: will break any Alt+key keyboard shortcuts in your terminal +#: programs, but you can use the macOS unicode input technique. + +macos_hide_from_tasks no + +#: Hide the kitty window from running tasks (Option+Tab) on macOS. + +macos_quit_when_last_window_closed no + +#: Have kitty quit when all the top-level windows are closed. By +#: default, kitty will stay running, even with no open windows, as is +#: the expected behavior on macOS. + +macos_window_resizable yes + +#: Disable this if you want kitty top-level (OS) windows to not be +#: resizable on macOS. + +#: }}} + +#: Keyboard shortcuts {{{ + +#: For a list of key names, see: GLFW keys +#: . The name to use +#: is the part after the GLFW_KEY_ prefix. For a list of modifier +#: names, see: GLFW mods +#: + +#: On Linux you can also use XKB key names to bind keys that are not +#: supported by GLFW. See XKB keys +#: for a list of key names. The name to use is the part +#: after the XKB_KEY_ prefix. Note that you should only use an XKB key +#: name for keys that are not present in the list of GLFW keys. + +#: You can use the special action no_op to unmap a keyboard shortcut +#: that is assigned in the default configuration. + +#: You can combine multiple actions to be triggered by a single +#: shortcut, using the syntax below:: + +#: map key combine action1 action2 action3 ... + +#: For example:: + +#: map kitty_mod+e combine : new_window : next_layout + +#: this will create a new window and switch to the next available +#: layout + +#: You can use multi-key shortcuts using the syntax shown below:: + +#: map key1>key2>key3 action + +#: For example:: + +#: map ctrl+f>2 set_font_size 20 + +kitty_mod ctrl+shift + +#: The value of kitty_mod is used as the modifier for all default +#: shortcuts, you can change it in your kitty.conf to change the +#: modifiers for all the default shortcuts. + +clear_all_shortcuts yes + +#: You can have kitty remove all shortcut definition seen up to this +#: point. Useful, for instance, to remove the default shortcuts. + +#: Clipboard {{{ + +map kitty_mod+c copy_to_clipboard +map kitty_mod+v paste_from_clipboard +map kitty_mod+s paste_from_selection +map shift+insert paste_from_selection +map kitty_mod+o pass_selection_to_program + +#: You can also pass the contents of the current selection to any +#: program using pass_selection_to_program. By default, the system's +#: open program is used, but you can specify your own, for example:: + +#: map kitty_mod+o pass_selection_to_program firefox + +#: You can pass the current selection to a terminal program running in +#: a new kitty window, by using the @selection placeholder:: + +#: map kitty_mod+y new_window less @selection + +#: }}} + +#: Scrolling {{{ + +map kitty_mod+up scroll_line_up +map kitty_mod+k scroll_line_up +map kitty_mod+down scroll_line_down +map kitty_mod+j scroll_line_down +map kitty_mod+page_up scroll_page_up +map kitty_mod+page_down scroll_page_down +map kitty_mod+home scroll_home +map kitty_mod+end scroll_end +map kitty_mod+h show_scrollback + +#: You can send the contents of the current screen + history buffer as +#: stdin to an arbitrary program using the placeholders @text (which +#: is the plain text) and @ansi (which includes text styling escape +#: codes). For only the current screen, use @screen or @ansi_screen. +#: For example, the following command opens the scrollback buffer in +#: less in a new window:: + +#: map kitty_mod+y new_window @ansi less +G -R + +#: }}} + +#: Window management {{{ + +map kitty_mod+enter new_window + +#: You can open a new window running an arbitrary program, for +#: example:: + +#: map kitty_mod+y new_window mutt + +#: You can open a new window with the current working directory set to +#: the working directory of the current window using:: + +#: map ctrl+alt+enter new_window_with_cwd + +map kitty_mod+n new_os_window +map kitty_mod+w close_window +map kitty_mod+] next_window +map kitty_mod+[ previous_window +map kitty_mod+f move_window_forward +map kitty_mod+b move_window_backward +map kitty_mod+` move_window_to_top +map kitty_mod+r start_resizing_window +map kitty_mod+1 first_window +map kitty_mod+2 second_window +map kitty_mod+3 third_window +map kitty_mod+4 fourth_window +map kitty_mod+5 fifth_window +map kitty_mod+6 sixth_window +map kitty_mod+7 seventh_window +map kitty_mod+8 eighth_window +map kitty_mod+9 ninth_window +map kitty_mod+0 tenth_window +#: }}} + +#: Tab management {{{ + +map kitty_mod+right next_tab +map kitty_mod+left previous_tab +map kitty_mod+t new_tab +map kitty_mod+q close_tab +map kitty_mod+. move_tab_forward +map kitty_mod+, move_tab_backward +map kitty_mod+alt+t set_tab_title + +#: You can also create shortcuts to go to specific tabs, with 1 being +#: the first tab:: + +#: map ctrl+alt+1 goto_tab 1 +#: map ctrl+alt+2 goto_tab 2 + +#: Just as with new_window above, you can also pass the name of +#: arbitrary commands to run when using new_tab and use +#: new_tab_with_cwd. +#: }}} + +#: Layout management {{{ + +map kitty_mod+l next_layout + +#: You can also create shortcuts to switch to specific layouts:: + +#: map ctrl+alt+t goto_layout tall +#: map ctrl+alt+s goto_layout stack +#: }}} + +#: Font sizes {{{ + +#: You can change the font size for all top-level kitty windows at a +#: time or only the current one. + +# TODO: temporaryily disabled zoom/font-size changes as they conflict with emacs +#map kitty_mod+equal change_font_size all +2.0 +#map kitty_mod+minus change_font_size all -2.0 +map kitty_mod+backspace change_font_size all 0 + +#: To setup shortcuts for specific font sizes:: + +#: map kitty_mod+f6 change_font_size all 10.0 + +#: To setup shortcuts to change only the current window's font size:: + +#: map kitty_mod+f6 change_font_size current 10.0 +#: }}} + +#: Select and act on visible text {{{ + +#: Use the hints kitten to select text and either pass it to an +#: external program or insert it into the terminal or copy it to the +#: clipboard. + +map kitty_mod+e kitten hints + +#: Open a currently visible URL using the keyboard. The program used +#: to open the URL is specified in open_url_with. + +map kitty_mod+p>f kitten hints --type path --program - + +#: Select a path/filename and insert it into the terminal. Useful, for +#: instance to run git commands on a filename output from a previous +#: git command. + +map kitty_mod+p>shift+f kitten hints --type path + +#: Select a path/filename and open it with the default open program. + +map kitty_mod+p>l kitten hints --type line --program - + +#: Select a line of text and insert it into the terminal. Use for the +#: output of things like: ls -1 + +map kitty_mod+p>w kitten hints --type word --program - + +#: Select words and insert into terminal. + +map kitty_mod+p>h kitten hints --type hash --program - + +#: Select something that looks like a hash and insert it into the +#: terminal. Useful with git, which uses sha1 hashes to identify +#: commits + + +#: The hints kitten has many more modes of operation that you can map +#: to different shortcuts. For a full description see kittens/hints. +#: }}} + +#: Miscellaneous {{{ + +map kitty_mod+f11 toggle_fullscreen +map kitty_mod+u input_unicode_character +map kitty_mod+f2 edit_config_file +map kitty_mod+escape kitty_shell window + +#: Open the kitty shell in a new window/tab/overlay/os_window to +#: control kitty using commands. + +map kitty_mod+a>m set_background_opacity +0.1 +map kitty_mod+a>l set_background_opacity -0.1 +map kitty_mod+a>1 set_background_opacity 1 +map kitty_mod+a>d set_background_opacity default + +#: You can tell kitty to send arbitrary (UTF-8) encoded text to the +#: client program when pressing specified shortcut keys. For example:: + +#: map ctrl+alt+a send_text all Special text + +#: This will send "Special text" when you press the ctrl+alt+a key +#: combination. The text to be sent is a python string literal so you +#: can use escapes like \x1b to send control codes or \u21fb to send +#: unicode characters (or you can just input the unicode characters +#: directly as UTF-8 text). The first argument to send_text is the +#: keyboard modes in which to activate the shortcut. The possible +#: values are normal or application or kitty or a comma separated +#: combination of them. The special keyword all means all modes. The +#: modes normal and application refer to the DECCKM cursor key mode +#: for terminals, and kitty refers to the special kitty extended +#: keyboard protocol. + +#: Another example, that outputs a word and then moves the cursor to +#: the start of the line (same as pressing the Home key):: + +#: map ctrl+alt+a send_text normal Word\x1b[H +#: map ctrl+alt+a send_text application Word\x1bOH + +#: }}} + +# }}} diff --git a/user-config/kitty/.config/kitty/session.conf b/user-config/kitty/.config/kitty/session.conf new file mode 100644 index 0000000..83d8ed9 --- /dev/null +++ b/user-config/kitty/.config/kitty/session.conf @@ -0,0 +1,5 @@ +# Run zsh +launch zsh + +title emacs +launch emacsclient -nw diff --git a/user-config/mbsync/.mbsyncrc b/user-config/mbsync/.mbsyncrc new file mode 100644 index 0000000..c2b47a7 --- /dev/null +++ b/user-config/mbsync/.mbsyncrc @@ -0,0 +1,193 @@ +# +# mbsync configuration +# + +# +# Account Template + +# # +# # example-account@domain.tld + +# IMAPAccount example-account@domain.tld +# Host +# User +# PassCmd "pass ..." +# SSLType IMAPS +# SSLVersions TLSv1.2 +# CertificateFile /etc/ssl/certs/ca-certificates.crt + +# IMAPStore example-account@domain.tld-remote +# Account example-account@domain.tld + +# MaildirStore example-account@domain.tld-local +# SubFolders Legacy +# # The trailing "/" is important +# Path ~/.mail/example-account@domain.tld/ +# Inbox ~/.mail/example-account@domain.tld/Inbox + + +# +# collin.doering@rekahsoft.ca + +IMAPAccount collin@rekahsoft.ca +Host imap.migadu.com +User collin@rekahsoft.ca +PassCmd "pass personal/migadu.com/mail-boxes/collin@rekahsoft.ca" +SSLType IMAPS +SSLVersions TLSv1.2 +CertificateFile /etc/ssl/certs/ca-certificates.crt + +IMAPStore collin@rekahsoft.ca-remote +Account collin@rekahsoft.ca + +MaildirStore collin@rekahsoft.ca-local +SubFolders Verbatim +# The trailing "/" is important +Path ~/.mail/collin@rekahsoft.ca/ +Inbox ~/.mail/collin@rekahsoft.ca/Inbox + +# +# collin.doering@gmail.com + +IMAPAccount collin.doering@gmail.com +Host imap.gmail.com +User collin.doering@gmail.com +PassCmd "pass personal/Google/collin.doering@gmail.com/app/mu4e" +SSLType IMAPS +SSLVersions TLSv1.2 +CertificateFile /etc/ssl/certs/ca-certificates.crt + +IMAPStore collin.doering@gmail.com-remote +Account collin.doering@gmail.com + +MaildirStore collin.doering@gmail.com-local +SubFolders Legacy +# The trailing "/" is important +Path ~/.mail/collin.doering@gmail.com/ +Inbox ~/.mail/collin.doering@gmail.com/Inbox + +# +# rekahsoft@gmail.com + +IMAPAccount rekahsoft@gmail.com +Host imap.gmail.com +User rekahsoft@gmail.com +PassCmd "pass personal/Google/rekahsoft@gmail.com/app/mu4e" +SSLType IMAPS +SSLVersions TLSv1.2 +CertificateFile /etc/ssl/certs/ca-certificates.crt + +IMAPStore rekahsoft@gmail.com-remote +Account rekahsoft@gmail.com + +MaildirStore rekahsoft@gmail.com-local +SubFolders Legacy +# The trailing "/" is important +Path ~/.mail/rekahsoft@gmail.com/ +Inbox ~/.mail/rekahsoft@gmail.com/Inbox + +# +# collin.doering@esentire.com + +IMAPAccount collin.doering@esentire.com +Host outlook.office365.com +User collin.doering@esentire.com +PassCmd "pass professional/esentire/esentire.com/app/EmacsMU4E" +SSLType IMAPS +SSLVersions TLSv1.2 +CertificateFile /etc/ssl/certs/ca-certificates.crt + +IMAPStore collin.doering@esentire.com-remote +Account collin.doering@esentire.com + +MaildirStore collin.doering@esentire.com-local +SubFolders Legacy +# The trailing "/" is important +Path ~/.mail/collin.doering@esentire.com/ +Inbox ~/.mail/collin.doering@esentire.com/Inbox + +# +# collin@lacure.com + +IMAPAccount collin@lacure.com +Host outlook.office365.com +User collin@lacure.com +PassCmd "pass professional/lacure/office365/app/EmacsMU4E" +SSLType IMAPS +SSLVersions TLSv1.2 +CertificateFile /etc/ssl/certs/ca-certificates.crt + +IMAPStore collin@lacure.com-remote +Account collin@lacure.com + +MaildirStore collin@lacure.com-local +SubFolders Legacy +# The trailing "/" is important +Path ~/.mail/collin@lacure.com/ +Inbox ~/.mail/collin@lacure.com/Inbox + + +# +# Channels +# + +Channel personal +Far :collin@rekahsoft.ca-remote: +Near :collin@rekahsoft.ca-local: +# Exclude everything under the internal [Gmail] folder, except the interesting folders +Patterns * ![Gmail]* "[Gmail]/Sent Mail" "[Gmail]/Starred" "[Gmail]/All Mail" "[Gmail]/Drafts" "[Gmail]/Trash" "[Gmail]/Spam" +# Or include everything +#Patterns * +# Automatically create missing mailboxes, both locally and on the server +Create Both +Expunge Both +# Save the synchronization state files in the relevant directory +SyncState * + +Channel personal-gmail +Far :collin.doering@gmail.com-remote: +Near :collin.doering@gmail.com-local: +# Exclude everything under the internal [Gmail] folder, except the interesting folders +Patterns * ![Gmail]* "[Gmail]/Sent Mail" "[Gmail]/Starred" "[Gmail]/All Mail" "[Gmail]/Drafts" "[Gmail]/Trash" "[Gmail]/Spam" +# Or include everything +#Patterns * +# Automatically create missing mailboxes, both locally and on the server +Create Both +Expunge Both +# Save the synchronization state files in the relevant directory +SyncState * + +Channel rekahsoft-gmail +Far :rekahsoft@gmail.com-remote: +Near :rekahsoft@gmail.com-local: +# Exclude everything under the internal [Gmail] folder, except the interesting folders +Patterns * ![Gmail]* "[Gmail]/Sent Mail" "[Gmail]/Starred" "[Gmail]/All Mail" "[Gmail]/Drafts" "[Gmail]/Trash" "[Gmail]/Spam" +# Or include everything +#Patterns * +# Automatically create missing mailboxes, both locally and on the server +Create Both +Expunge Both +# Save the synchronization state files in the relevant directory +SyncState * + +Channel work-esentire +Far :collin.doering@esentire.com-remote: +Near :collin.doering@esentire.com-local: +# Include everything +Patterns * +# Automatically create missing mailboxes, both locally and on the server +Create Both +Expunge Both +# Save the synchronization state files in the relevant directory +SyncState * + +Channel work-lacure +Far :collin@lacure.com-remote: +Near :collin@lacure.com-local: +# Include everything +Patterns * +# Automatically create missing mailboxes, both locally and on the server +Create Both +Expunge Both +# Save the synchronization state files in the relevant directory +SyncState * diff --git a/user-config/mpd/.mpdconf b/user-config/mpd/.mpdconf new file mode 100644 index 0000000..22c1e2d --- /dev/null +++ b/user-config/mpd/.mpdconf @@ -0,0 +1,463 @@ +# An example configuration file for MPD +# See the mpd.conf man page for a more detailed description of each parameter. + + +# Files and directories ####################################################### +# +# This setting controls the top directory which MPD will search to discover the +# available audio files and add them to the daemon's online database. This +# setting defaults to the XDG directory, otherwise the music directory will be +# be disabled and audio files will only be accepted over ipc socket (using +# file:// protocol) or streaming files over an accepted protocol. +# +music_directory "/home/collin/Music" +# +# This setting sets the MPD internal playlist directory. The purpose of this +# directory is storage for playlists created by MPD. The server will use +# playlist files not created by the server but only if they are in the MPD +# format. This setting defaults to playlist saving being disabled. +# +playlist_directory "~/.mpd/playlists" +# +# This setting sets the location of the MPD database. This file is used to +# load the database at server start up and store the database while the +# server is not up. This setting defaults to disabled which will allow +# MPD to accept files over ipc socket (using file:// protocol) or streaming +# files over an accepted protocol. +# +db_file "~/.mpd/database" +# +# These settings are the locations for the daemon log files for the daemon. +# These logs are great for troubleshooting, depending on your log_level +# settings. +# +# The special value "syslog" makes MPD use the local syslog daemon. This +# setting defaults to logging to syslog, otherwise logging is disabled. +# +log_file "~/.mpd/log" +# +# This setting sets the location of the file which stores the process ID +# for use of mpd --kill and some init scripts. This setting is disabled by +# default and the pid file will not be stored. +# +pid_file "~/.mpd/pid" +# +# This setting sets the location of the file which contains information about +# most variables to get MPD back into the same general shape it was in before +# it was brought down. This setting is disabled by default and the server +# state will be reset on server start up. +# +state_file "~/.mpd/state" +# +# The location of the sticker database. This is a database which +# manages dynamic information attached to songs. +# +#sticker_file "~/.mpd/sticker.sql" +# +############################################################################### + + +# General music daemon options ################################################ +# +# This setting specifies the user that MPD will run as. MPD should never run as +# root and you may use this setting to make MPD change its user ID after +# initialization. This setting is disabled by default and MPD is run as the +# current user. +# +#user "nobody" +# +# This setting specifies the group that MPD will run as. If not specified +# primary group of user specified with "user" setting will be used (if set). +# This is useful if MPD needs to be a member of group such as "audio" to +# have permission to use sound card. +# +#group "nogroup" +# +# This setting sets the address for the daemon to listen on. Careful attention +# should be paid if this is assigned to anything other then the default, any. +# This setting can deny access to control of the daemon. +# +# For network +#bind_to_address "127.0.0.1" +#bind_to_address "192.168.1.100" +bind_to_address "any" + +# +# And for Unix Socket +#bind_to_address "~/.mpd/socket" +# +# This setting is the TCP port that is desired for the daemon to get assigned +# to. +# +port "6600" +# +# This setting controls the type of information which is logged. Available +# setting arguments are "default", "secure" or "verbose". The "verbose" setting +# argument is recommended for troubleshooting, though can quickly stretch +# available resources on limited hardware storage. +# +#log_level "default" +# +# If you have a problem with your MP3s ending abruptly it is recommended that +# you set this argument to "no" to attempt to fix the problem. If this solves +# the problem, it is highly recommended to fix the MP3 files with vbrfix +# (available from ), at which +# point gapless MP3 playback can be enabled. +# +#gapless_mp3_playback "yes" +# +# Setting "restore_paused" to "yes" puts MPD into pause mode instead +# of starting playback after startup. +# +#restore_paused "no" +# +# This setting enables MPD to create playlists in a format usable by other +# music players. +# +#save_absolute_paths_in_playlists "no" +# +# This setting defines a list of tag types that will be extracted during the +# audio file discovery process. The complete list of possible values can be +# found in the mpd.conf man page. +#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" +# +# This setting enables automatic update of MPD's database when files in +# music_directory are changed. +# +auto_update "yes" +# +# Limit the depth of the directories being watched, 0 means only watch +# the music directory itself. There is no limit by default. +# +#auto_update_depth "3" +# +############################################################################### + + +# Symbolic link behavior ###################################################### +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links outside of the configured music_directory. +# +#follow_outside_symlinks "yes" +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links inside of the configured music_directory. +# +#follow_inside_symlinks "yes" +# +############################################################################### + + +# Zeroconf / Avahi Service Discovery ########################################## +# +# If this setting is set to "yes", service information will be published with +# Zeroconf / Avahi. +# +#zeroconf_enabled "yes" +# +# The argument to this setting will be the Zeroconf / Avahi unique name for +# this MPD server on the network. +# +#zeroconf_name "Music Player" +# +############################################################################### + + +# Permissions ################################################################# +# +# If this setting is set, MPD will require password authorization. The password +# can setting can be specified multiple times for different password profiles. +# +password "patchMeIn@read,add,control,admin" +# +# This setting specifies the permissions a user has who has not yet logged in. +# +default_permissions "read,add" +# +############################################################################### + + +# Input ####################################################################### +# + +input { + plugin "curl" +# proxy "proxy.isp.com:8080" +# proxy_user "user" +# proxy_password "password" +} + +# +############################################################################### + +# Audio Output ################################################################ +# +# MPD supports various audio output types, as well as playing through multiple +# audio outputs at the same time, through multiple audio_output settings +# blocks. Setting this block is optional, though the server will only attempt +# autodetection for one sound card. +# +# See for examples of +# other audio outputs. +# +# An example of an ALSA output: +# +#audio_output { +# type "alsa" +# name "My ALSA Device" +## device "hw:0,0" # optional +## format "44100:16:2" # optional +## mixer_type "hardware" # optional +## mixer_device "default" # optional +## mixer_control "PCM" # optional +## mixer_index "0" # optional +#} +# +# An example of an OSS output: +# +#audio_output { +# type "oss" +# name "My OSS Device" +## device "/dev/dsp" # optional +## format "44100:16:2" # optional +## mixer_type "hardware" # optional +## mixer_device "/dev/mixer" # optional +## mixer_control "PCM" # optional +#} + +# +# An example of a shout output (for streaming to Icecast): +# +# audio_output { +# type "shout" +# # encoding "ogg" # optional +# name "RekahSoft Shout Stream" +# host "localhost" +# port "8000" +# mount "/mpd.ogg" +# password "" +# quality "5.0" +# # bitrate "128" +# format "44100:16:1" +# # protocol "icecast2" # optional +# # user "source" # optional +# # description "My Stream Description" # optional +# # url "http://example.com" # optional +# # genre "jazz" # optional +# # public "no" # optional +# # timeout "2" # optional +# # mixer_type "software" # optional +# } + +# +# An example of a recorder output: +# +#audio_output { +# type "recorder" +# name "My recorder" +# encoder "vorbis" # optional, vorbis or lame +# path "/var/lib/mpd/recorder/mpd.ogg" +## quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +#} + +# +# An example of a httpd output (built-in HTTP streaming server): +# +audio_output { + type "httpd" + name "RekahSoft HTTP Stream" + encoder "vorbis" # optional, vorbis or lame + port "8000" + bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 +# quality "5.0" # do not define if bitrate is defined + bitrate "128" # do not define if quality is defined + format "44100:16:1" + max_clients "5" # optional 0=no limit +} + +# +# An example of a pulseaudio output (streaming to a remote pulseaudio server) +# +#audio_output { +# type "pulse" +# name "My Pulse Output" +## server "remote_server" # optional +## sink "remote_server_sink" # optional +#} +# + +audio_output { + type "pulse" + name "My Pulse Output" +# server "remote_server" # optional +# sink "remote_server_sink" # optional +} + +audio_output { + type "fifo" + name "RekahSoft_FIFO" + path "~/.mpd/mpd.fifo" + format "44100:16:2" +} + +## Example "pipe" output: +# +#audio_output { +# type "pipe" +# name "my pipe" +# command "aplay -f cd 2>/dev/null" +## Or if you're want to use AudioCompress +# command "AudioCompress -m | aplay -f cd 2>/dev/null" +## Or to send raw PCM stream through PCM: +# command "nc example.org 8765" +# format "44100:16:2" +#} +# +## An example of a null output (for no audio output): +# +#audio_output { +# type "null" +# name "My Null Output" +# mixer_type "none" # optional +#} +# +# This setting will change all decoded audio to be converted to the specified +# format before being passed to the audio outputs. By default, this setting is +# disabled. +# +#audio_output_format "44100:16:2" +# +# If MPD has been compiled with libsamplerate support, this setting specifies +# the sample rate converter to use. Possible values can be found in the +# mpd.conf man page or the libsamplerate documentation. By default, this is +# setting is disabled. +# +#samplerate_converter "Fastest Sinc Interpolator" +# +############################################################################### + + +# Normalization automatic volume adjustments ################################## +# +# This setting specifies the type of ReplayGain to use. This setting can have +# the argument "off", "album" or "track". See +# for more details. This setting is off by default. +# +#replaygain "album" +# +# This setting sets the pre-amp used for files that have ReplayGain tags. By +# default this setting is disabled. +# +#replaygain_preamp "0" +# +# This setting enables on-the-fly normalization volume adjustment. This will +# result in the volume of all playing audio to be adjusted so the output has +# equal "loudness". This setting is disabled by default. +# +volume_normalization "yes" +# +############################################################################### + + +# MPD Internal Buffering ###################################################### +# +# This setting adjusts the size of internal decoded audio buffering. Changing +# this may have undesired effects. Don't change this if you don't know what you +# are doing. +# +#audio_buffer_size "2048" +# +# This setting controls the percentage of the buffer which is filled before +# beginning to play. Increasing this reduces the chance of audio file skipping, +# at the cost of increased time prior to audio playback. +# +#buffer_before_play "10%" +# +############################################################################### + + +# Resource Limitations ######################################################## +# +# These settings are various limitations to prevent MPD from using too many +# resources. Generally, these settings should be minimized to prevent security +# risks, depending on the operating resources. +# +#connection_timeout "60" +#max_connections "10" +#max_playlist_length "16384" +#max_command_list_size "2048" +#max_output_buffer_size "8192" +# +############################################################################### + +# Client TCP keep alive ####################################################### +# +# For clients connected by TCP on supported platforms. +# Allows detection of dangling connections due to clients disappearing from +# the network without closing their connections. +# +# This is not usually necessary but can be useful in cases such as wifi connectected +# clients that go in and out of network range or turn off wifi without closing their +# connections. Combined with low max_connections this can soon cause clients to not +# be able to connect. +# +# +# Enable tcp keepalive on new client connections (default is "no") +# +#tcp_keep_alive "no" +# +# Time in seconds since the last communication on the connection and before +# the keepalive probing is started. (default is 7200 seconds) +#tcp_keep_alive_idle "7200" +# +# Interval in seconds between keepalive probes, once a probe started. +# (default is 75 seconds) +#tcp_keep_alive_interval "75" +# +# Number of failed probes before the connection is pronounced dead and +# the connection is closed. (default is 9 times) +#tcp_keep_alive_count "9" +# +############################################################################### + +# Character Encoding ########################################################## +# +# If file or directory names do not display correctly for your locale then you +# may need to modify this setting. +# +#filesystem_charset "UTF-8" +# +# This setting controls the encoding that ID3v1 tags should be converted from. +# +#id3v1_encoding "ISO-8859-1" +# +############################################################################### + + +# SIDPlay decoder ############################################################# +# +# songlength_database: +# Location of your songlengths file, as distributed with the HVSC. +# The sidplay plugin checks this for matching MD5 fingerprints. +# See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq +# +# default_songlength: +# This is the default playing time in seconds for songs not in the +# songlength database, or in case you're not using a database. +# A value of 0 means play indefinitely. +# +# filter: +# Turns the SID filter emulation on or off. +# +#decoder { +# plugin "sidplay" +# songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt" +# default_songlength "120" +# filter "true" +#} +# +############################################################################### + diff --git a/user-config/nyxt/.config/nyxt/auto-config.lisp b/user-config/nyxt/.config/nyxt/auto-config.lisp new file mode 100644 index 0000000..e69de29 diff --git a/user-config/nyxt/.config/nyxt/init.lisp b/user-config/nyxt/.config/nyxt/init.lisp new file mode 100644 index 0000000..b86b736 --- /dev/null +++ b/user-config/nyxt/.config/nyxt/init.lisp @@ -0,0 +1,11 @@ +(define-configuration (buffer web-buffer prompt-buffer) + ((default-modes (append '(nyxt::emacs-mode) %slot-default%)))) + +(define-configuration web-buffer + ((default-modes (append + '(nyxt::auto-mode + nyxt::emacs-mode +; nyxt::noscript-mode +; nyxt::blocker-mode + nyxt::reduce-tracking-mode) + %slot-default%)))) diff --git a/user-config/racket/.racketrc b/user-config/racket/.racketrc new file mode 100644 index 0000000..955afee --- /dev/null +++ b/user-config/racket/.racketrc @@ -0,0 +1,2 @@ +;; The following line loads `xrepl' support +(require xrepl) diff --git a/user-config/redshift/.config/redshift/redshift.conf b/user-config/redshift/.config/redshift/redshift.conf new file mode 100644 index 0000000..342404b --- /dev/null +++ b/user-config/redshift/.config/redshift/redshift.conf @@ -0,0 +1,70 @@ +; Global settings for redshift +[redshift] +; Set the day and night screen temperatures +temp-day=5700 +temp-night=3500 + +; Disable the smooth fade between temperatures when Redshift starts and stops. +; 0 will cause an immediate change between screen temperatures. +; 1 will gradually apply the new screen temperature over a couple of seconds. +fade=1 + +; Solar elevation thresholds. +; By default, Redshift will use the current elevation of the sun to determine +; whether it is daytime, night or in transition (dawn/dusk). When the sun is +; above the degrees specified with elevation-high it is considered daytime and +; below elevation-low it is considered night. +;elevation-high=3 +;elevation-low=-6 + +; Custom dawn/dusk intervals. +; Instead of using the solar elevation, the time intervals of dawn and dusk +; can be specified manually. The times must be specified as HH:MM in 24-hour +; format. +;dawn-time=6:00-7:45 +;dusk-time=18:35-20:15 + +; Set the screen brightness. Default is 1.0. +;brightness=0.9 +; It is also possible to use different settings for day and night +; since version 1.8. +;brightness-day=0.7 +;brightness-night=0.4 +; Set the screen gamma (for all colors, or each color channel +; individually) +gamma=0.8 +;gamma=0.8:0.7:0.8 +; This can also be set individually for day and night since +; version 1.10. +;gamma-day=0.8:0.7:0.8 +;gamma-night=0.6 + +; Set the location-provider: 'geoclue2', 'manual' +; type 'redshift -l list' to see possible values. +; The location provider settings are in a different section. +location-provider=geoclue2 + +; Set the adjustment-method: 'randr', 'vidmode' +; type 'redshift -m list' to see all possible values. +; 'randr' is the preferred method, 'vidmode' is an older API. +; but works in some cases when 'randr' does not. +; The adjustment method settings are in a different section. +adjustment-method=randr + +; Configuration of the location-provider: +; type 'redshift -l PROVIDER:help' to see the settings. +; ex: 'redshift -l manual:help' +; Keep in mind that longitudes west of Greenwich (e.g. the Americas) +; are negative numbers. +[manual] +lat=43.4503 +lon=-80.4832 + +; Configuration of the adjustment-method +; type 'redshift -m METHOD:help' to see the settings. +; ex: 'redshift -m randr:help' +; In this example, randr is configured to adjust only screen 0. +; Note that the numbering starts from 0, so this is actually the first screen. +; If this option is not specified, Redshift will try to adjust _all_ screens. +;[randr] +;screen=0 diff --git a/user-config/rofi-pass/.config/rofi-pass/config b/user-config/rofi-pass/.config/rofi-pass/config new file mode 100644 index 0000000..a5bbbe4 --- /dev/null +++ b/user-config/rofi-pass/.config/rofi-pass/config @@ -0,0 +1,84 @@ +# permanently set alternative root dir. Use ":" to separate multiple roots +# which can be switched at runtime with shift+left/right +# root=/path/to/root + +# rofi command. Make sure to have "$@" as last argument +_rofi () { + rofi -i -no-auto-select "$@" +} + +# image viewer to display qrcode of selected entry +# qrencode is needed to generate the image and a viewer +# that can read from pipes. Known viewers to work are feh and display +_image_viewer () { + feh - +# display +} + +# xdotool needs the keyboard layout to be set using setxkbmap +# You can do this in your autostart scripts (e.g. xinitrc) + +# If for some reason, you cannot do this, you can set the command here. +# and set fix_layout to true +fix_layout=false + +layout_cmd () { + setxkbmap us +} + +# fields to be used +URL_field='url' +USERNAME_field='user' +AUTOTYPE_field='autotype' + +# delay to be used for :delay keyword +delay=2 + +# rofi-pass needs to close itself before it can type passwords. Set delay here. +wait=0.2 + +## Programs to be used +# Editor +EDITOR='emacsclient -c' + +# Browser +BROWSER='xdg-open' + +## Misc settings + +default_do='typePass' # menu, autotype, copyPass, typeUser, typePass, copyUser, copyUrl, viewEntry, typeMenu, actionMenu, copyMenu, openUrl +auto_enter='false' +notify='false' +default_autotype='user :tab pass' + +# color of the help messages +# leave empty for autodetection +help_color="#4872FF" + +# Clipboard settings +# Possible options: primary, clipboard, both +clip=both + +# Options for generating new password entries +# default_user is also used for password files that have no user field. +#default_user="${ROFI_PASS_DEFAULT_USER-$(whoami)}" +#default_user2=mary_ann +#password_length=12 + +# Custom Keybindings +autotype="Alt+1" +type_user="Alt+2" +type_pass="Alt+3" +open_url="Alt+4" +copy_name="Alt+u" +copy_url="Alt+l" +copy_pass="Alt+p" +show="Alt+o" +copy_entry="Alt+2" +type_entry="Alt+1" +copy_menu="Alt+c" +action_menu="Alt+a" +type_menu="Alt+t" +help="Alt+h" +switch="Alt+x" +insert_pass="Alt+n" diff --git a/user-config/rofi/.config/rofi/config.rasi b/user-config/rofi/.config/rofi/config.rasi new file mode 100644 index 0000000..582c76e --- /dev/null +++ b/user-config/rofi/.config/rofi/config.rasi @@ -0,0 +1,148 @@ +configuration { + modi: "combi,drun,window,run,ssh,keys"; + font: "FreeMono 12"; +/* location: 0;*/ +/* yoffset: 0;*/ +/* xoffset: 0;*/ +/* fixed-num-lines: true;*/ +/* show-icons: false;*/ + terminal: "kitty"; +/* ssh-client: "ssh";*/ +/* ssh-command: "{terminal} -e {ssh-client} {host} [-p {port}]";*/ +/* run-command: "{cmd}";*/ +/* run-list-command: "";*/ +/* run-shell-command: "{terminal} -e {cmd}";*/ +/* window-command: "wmctrl -i -R {window}";*/ +/* window-match-fields: "all";*/ +/* icon-theme: ;*/ +/* drun-match-fields: "name,generic,exec,categories,keywords";*/ +/* drun-categories: ;*/ +/* drun-show-actions: false;*/ +/* drun-display-format: "{name} [({generic})]";*/ +/* drun-url-launcher: "xdg-open";*/ +/* disable-history: false;*/ +/* ignored-prefixes: "";*/ +/* sort: false;*/ +/* sorting-method: "normal";*/ +/* case-sensitive: false;*/ +/* cycle: true;*/ +/* sidebar-mode: false;*/ +/* hover-select: false;*/ +/* eh: 1;*/ +/* auto-select: false;*/ +/* parse-hosts: false;*/ +/* parse-known-hosts: true;*/ + combi-modi: "window,drun"; +/* matching: "normal";*/ +/* tokenize: true;*/ +/* m: "-5";*/ +/* filter: ;*/ +/* dpi: -1;*/ +/* threads: 0;*/ +/* scroll-method: 0;*/ +/* window-format: "{w} {c} {t}";*/ +/* click-to-exit: true;*/ +/* max-history-size: 25;*/ +/* combi-hide-mode-prefix: false;*/ +/* matching-negate-char: '-' /* unsupported */;*/ +/* cache-dir: ;*/ +/* window-thumbnail: false;*/ +/* drun-use-desktop-cache: false;*/ +/* drun-reload-desktop-cache: false;*/ +/* normalize-match: false;*/ +/* steal-focus: false;*/ +/* application-fallback-icon: ;*/ +/* pid: "/run/user/1000/rofi.pid";*/ +/* display-window: ;*/ +/* display-windowcd: ;*/ +/* display-run: ;*/ +/* display-ssh: ;*/ +/* display-drun: ;*/ +/* display-combi: ;*/ +/* display-keys: ;*/ +/* display-filebrowser: ;*/ +/* kb-primary-paste: "Control+V,Shift+Insert";*/ +/* kb-secondary-paste: "Control+v,Insert";*/ +/* kb-clear-line: "Control+w";*/ +/* kb-move-front: "Control+a";*/ +/* kb-move-end: "Control+e";*/ +/* kb-move-word-back: "Alt+b,Control+Left";*/ +/* kb-move-word-forward: "Alt+f,Control+Right";*/ +/* kb-move-char-back: "Left,Control+b";*/ +/* kb-move-char-forward: "Right,Control+f";*/ +/* kb-remove-word-back: "Control+Alt+h,Control+BackSpace";*/ +/* kb-remove-word-forward: "Control+Alt+d";*/ +/* kb-remove-char-forward: "Delete,Control+d";*/ +/* kb-remove-char-back: "BackSpace,Shift+BackSpace,Control+h";*/ +/* kb-remove-to-eol: "Control+k";*/ +/* kb-remove-to-sol: "Control+u";*/ +/* kb-accept-entry: "Control+j,Control+m,Return,KP_Enter";*/ +/* kb-accept-custom: "Control+Return";*/ +/* kb-accept-custom-alt: "Control+Shift+Return";*/ +/* kb-accept-alt: "Shift+Return";*/ +/* kb-delete-entry: "Shift+Delete";*/ +/* kb-mode-next: "Shift+Right,Control+Tab";*/ +/* kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab";*/ +/* kb-mode-complete: "Control+l";*/ +/* kb-row-left: "Control+Page_Up";*/ +/* kb-row-right: "Control+Page_Down";*/ +/* kb-row-up: "Up,Control+p,ISO_Left_Tab";*/ +/* kb-row-down: "Down,Control+n";*/ +/* kb-row-tab: "Tab";*/ +/* kb-page-prev: "Page_Up";*/ +/* kb-page-next: "Page_Down";*/ +/* kb-row-first: "Home,KP_Home";*/ +/* kb-row-last: "End,KP_End";*/ +/* kb-row-select: "Control+space";*/ +/* kb-screenshot: "Alt+S";*/ +/* kb-ellipsize: "Alt+period";*/ +/* kb-toggle-case-sensitivity: "grave,dead_grave";*/ +/* kb-toggle-sort: "Alt+grave";*/ +/* kb-cancel: "Escape,Control+g,Control+bracketleft";*/ +/* kb-custom-1: "Alt+1";*/ +/* kb-custom-2: "Alt+2";*/ +/* kb-custom-3: "Alt+3";*/ +/* kb-custom-4: "Alt+4";*/ +/* kb-custom-5: "Alt+5";*/ +/* kb-custom-6: "Alt+6";*/ +/* kb-custom-7: "Alt+7";*/ +/* kb-custom-8: "Alt+8";*/ +/* kb-custom-9: "Alt+9";*/ +/* kb-custom-10: "Alt+0";*/ +/* kb-custom-11: "Alt+exclam";*/ +/* kb-custom-12: "Alt+at";*/ +/* kb-custom-13: "Alt+numbersign";*/ +/* kb-custom-14: "Alt+dollar";*/ +/* kb-custom-15: "Alt+percent";*/ +/* kb-custom-16: "Alt+dead_circumflex";*/ +/* kb-custom-17: "Alt+ampersand";*/ +/* kb-custom-18: "Alt+asterisk";*/ +/* kb-custom-19: "Alt+parenleft";*/ +/* kb-select-1: "Super+1";*/ +/* kb-select-2: "Super+2";*/ +/* kb-select-3: "Super+3";*/ +/* kb-select-4: "Super+4";*/ +/* kb-select-5: "Super+5";*/ +/* kb-select-6: "Super+6";*/ +/* kb-select-7: "Super+7";*/ +/* kb-select-8: "Super+8";*/ +/* kb-select-9: "Super+9";*/ +/* kb-select-10: "Super+0";*/ +/* ml-row-left: "ScrollLeft";*/ +/* ml-row-right: "ScrollRight";*/ +/* ml-row-up: "ScrollUp";*/ +/* ml-row-down: "ScrollDown";*/ +/* me-select-entry: "MousePrimary";*/ +/* me-accept-entry: "MouseDPrimary";*/ +/* me-accept-custom: "Control+MouseDPrimary";*/ + timeout { + action: "kb-cancel"; + delay: 0; + } + filebrowser { + directories-first: true; + sorting-method: "name"; + } +} + +@theme "/home/collin/.guix-profile/share/rofi/themes/Arc-Dark.rasi" diff --git a/user-config/shepherd/.config/shepherd/init.d/fccache.scm b/user-config/shepherd/.config/shepherd/init.d/fccache.scm new file mode 100644 index 0000000..c4e7112 --- /dev/null +++ b/user-config/shepherd/.config/shepherd/init.d/fccache.scm @@ -0,0 +1,31 @@ +;; (C) Copyright Collin J. Doering 2020 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: fccache.scm +;; Author: Collin J. Doering +;; Date: Jul 26, 2020 + +(define fccache + (make + #:provides '(fccache) + #:docstring "Run 'fc-cache -frv'" + #:start (make-forkexec-constructor + '("guix" "environment" "--ad-hoc" "fontconfig" "--" + "fc-cache" "-frv") + #:log-file (string-append (getenv "HOME") + "/log/fccache.log")) + #:one-shot? #t)) + +(register-services fccache) diff --git a/user-config/shepherd/.config/shepherd/init.d/mpd.scm b/user-config/shepherd/.config/shepherd/init.d/mpd.scm new file mode 100644 index 0000000..ddf70e6 --- /dev/null +++ b/user-config/shepherd/.config/shepherd/init.d/mpd.scm @@ -0,0 +1,32 @@ +;; (C) Copyright Collin J. Doering 2020 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: mpd.scm +;; Author: Collin J. Doering +;; Date: Aug 2, 2020 + +(define mpd + (make + #:provides '(mpd) + #:requires '(pulseaudio) + #:docstring "Run mpd, the music player daemon" + #:start (make-forkexec-constructor + '("mpd" "--no-daemon --stdout %h/.mpdconf") + #:log-file (string-append (getenv "HOME") + "/log/mpd.log")) + #:stop (make-kill-destructor) + #:respawn? #t)) + +(register-services mpd) diff --git a/user-config/shepherd/.config/shepherd/init.d/pulseaudio.scm b/user-config/shepherd/.config/shepherd/init.d/pulseaudio.scm new file mode 100644 index 0000000..3cdb618 --- /dev/null +++ b/user-config/shepherd/.config/shepherd/init.d/pulseaudio.scm @@ -0,0 +1,31 @@ +;; (C) Copyright Collin J. Doering 2020 +;; +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;; File: pulseaudio.scm +;; Author: Collin J. Doering +;; Date: Aug 2, 2020 + +(define pulseaudio + (make + #:provides '(pulseaudio) + #:docstring "Run pulseaudio" + #:start (make-forkexec-constructor + '("pulseaudio" "--start") + #:log-file (string-append (getenv "HOME") + "/log/pulseaudio.log")) + #:stop (make-kill-destructor) + #:respawn? #t)) + +(register-services pulseaudio) diff --git a/user-config/shepherd/.config/shepherd/init.scm b/user-config/shepherd/.config/shepherd/init.scm new file mode 100644 index 0000000..126684b --- /dev/null +++ b/user-config/shepherd/.config/shepherd/init.scm @@ -0,0 +1,13 @@ +(use-modules (shepherd service) + ((ice-9 ftw) #:select (scandir))) + +;; Load all the files in the directory 'init.d' with a suffix '.scm'. +(for-each + (lambda (file) + (load (string-append "init.d/" file))) + (scandir (string-append (dirname (current-filename)) "/init.d") + (lambda (file) + (string-suffix? ".scm" file)))) + +;; Send shepherd into the background +(action 'shepherd 'daemonize) diff --git a/user-config/sway/.bin/start-sway.sh b/user-config/sway/.bin/start-sway.sh new file mode 100755 index 0000000..43382b7 --- /dev/null +++ b/user-config/sway/.bin/start-sway.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +exec dbus-run-session sway diff --git a/user-config/sway/.config/sway/config b/user-config/sway/.config/sway/config new file mode 100644 index 0000000..71fd927 --- /dev/null +++ b/user-config/sway/.config/sway/config @@ -0,0 +1,220 @@ +# Default config for sway +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Home row direction keys, like vim +set $left h +set $down j +set $up k +set $right l +# Your preferred terminal emulator (alacritty) +set $term kitty + +# Your preferred application launcher +# Note: pass the final command to swaymsg so that the resulting window can be opened +# on the original workspace that the command was run on. +set $menu wofi --show run,drun +#set $menu dmenu_path | dmenu | xargs swaymsg exec -- + +### Output configuration + +# You can get the names of your outputs by running: swaymsg -t get_outputs +output * res 1920x1080 bg /home/collin/.guix-profile/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill + +# Set inner window gaps +gaps inner 4 + +### Idle configuration +# This will lock your screen after 300 seconds of inactivity, then turn off +# your displays after another 300 seconds, and turn your screens back on when +# resumed. It will also lock your screen before your computer goes to sleep. + +exec swayidle -w \ + timeout 300 'swaylock -f -c 000000' \ + timeout 600 'swaymsg "output * dpms off"' \ + resume 'swaymsg "output * dpms on"' \ + before-sleep 'swaylock -f -c 000000' + +# Disable window border decorations +default_border pixel + +### Input configuration +# +# Example configuration: +# +# input "2:14:SynPS/2_Synaptics_TouchPad" { +# dwt enabled +# tap enabled +# natural_scroll enabled +# middle_emulation enabled +# } +# +# You can get the names of your inputs by running: swaymsg -t get_inputs +# Read `man 5 sway-input` for more information about this section. + +### Key bindings +# +# Basics: +# + # Start a terminal + bindsym $mod+Return exec $term + + # Kill focused window + bindsym $mod+Shift+c kill + + # Start your launcher + bindsym $mod+p exec $menu + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+q reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+q exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit' + +# +# Moving around: +# + # Move your focus around + bindsym $mod+$left focus left + bindsym $mod+$down focus down + bindsym $mod+$up focus up + bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + bindsym $mod+Shift+$left move left + bindsym $mod+Shift+$down move down + bindsym $mod+Shift+$up move up + bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + bindsym $mod+Shift+Left move left + bindsym $mod+Shift+Down move down + bindsym $mod+Shift+Up move up + bindsym $mod+Shift+Right move right + +# +# Workspaces: +# + # Switch to workspace + bindsym $mod+1 workspace 1 + bindsym $mod+2 workspace 2 + bindsym $mod+3 workspace 3 + bindsym $mod+4 workspace 4 + bindsym $mod+5 workspace 5 + bindsym $mod+6 workspace 6 + bindsym $mod+7 workspace 7 + bindsym $mod+8 workspace 8 + bindsym $mod+9 workspace 9 + bindsym $mod+0 workspace 10 + # Move focused container to workspace + bindsym $mod+Shift+1 move container to workspace 1 + bindsym $mod+Shift+2 move container to workspace 2 + bindsym $mod+Shift+3 move container to workspace 3 + bindsym $mod+Shift+4 move container to workspace 4 + bindsym $mod+Shift+5 move container to workspace 5 + bindsym $mod+Shift+6 move container to workspace 6 + bindsym $mod+Shift+7 move container to workspace 7 + bindsym $mod+Shift+8 move container to workspace 8 + bindsym $mod+Shift+9 move container to workspace 9 + bindsym $mod+Shift+0 move container to workspace 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + bindsym $mod+b splith + bindsym $mod+v splitv + + # Switch the current container between different layout styles + bindsym $mod+s layout stacking + bindsym $mod+w layout tabbed + bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + bindsym $mod+a focus parent +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + bindsym $mod+minus scratchpad show + +# +# Resizing containers: +# +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + bindsym $left resize shrink width 10px + bindsym $down resize grow height 10px + bindsym $up resize shrink height 10px + bindsym $right resize grow width 10px + + # Ditto, with arrow keys + bindsym Left resize shrink width 10px + bindsym Down resize grow height 10px + bindsym Up resize shrink height 10px + bindsym Right resize grow width 10px + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym $mod+r mode "resize" + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. +bar { + position top + + # When the status_command prints a new line to stdout, swaybar updates. + # The default just shows the current date and time. + status_command while date +'%Y-%m-%d %l:%M:%S %p'; do sleep 1; done + + colors { + statusline #ffffff + background #323232 + inactive_workspace #32323200 #32323200 #5c5c5c + } +} + +include /gnu/store/c8pamd4jsgd2ls579a7cs5jjk2cv5f3z-sway-1.4/etc/sway/config.d/* diff --git a/user-config/tmux/.tmux.conf b/user-config/tmux/.tmux.conf new file mode 100644 index 0000000..b6d0963 --- /dev/null +++ b/user-config/tmux/.tmux.conf @@ -0,0 +1,30 @@ +# File: .tmux.conf +# Author: Collin J. Doering +# Date: Jan 18, 2014 + +# Set prefix key to C-t instead of default C-b +unbind C-b +set -g prefix C-t + +# Mimic 256 colors +set -g default-terminal "screen-256color" + +# Toggle last window like screen +bind-key C-t last-window + +# Rebind clock-mode to "prefix T" +unbind t +bind-key T clock-mode + +# Send prefix to underlying application using "prefix t" +bind-key t send-prefix + +# Setup pane movement +bind-key j command-prompt -p "join pane from:" "join-pane -s '%%'" +bind-key s command-prompt -p "send pane to:" "join-pane -t '%%'" + +# session initialization +#new -s default -n zsh zsh +#neww -n weechat weechat-curses +#neww -n emacs emacsclient +#selectw -t 1 diff --git a/user-config/wofi/.config/wofi/style.css b/user-config/wofi/.config/wofi/style.css new file mode 100644 index 0000000..0dcf5e9 --- /dev/null +++ b/user-config/wofi/.config/wofi/style.css @@ -0,0 +1,37 @@ +window { +margin: 0px; +border: 1px solid #bd93f9; +background-color: #282a36; +} + +#input { +margin: 5px; +border: none; +background-color: #44475a; +} + +#inner-box { +margin: 5px; +border: none; +background-color: #282a36; +} + +#outer-box { +margin: 5px; +border: none; +background-color: #282a36; +} + +#scroll { +margin: 0px; +border: none; +} + +#text { +margin: 5px; +border: none; +} + +#entry:selected { +background-color: #44475a; +} diff --git a/user-config/xorg/.Xresources b/user-config/xorg/.Xresources new file mode 100644 index 0000000..996cf1a --- /dev/null +++ b/user-config/xorg/.Xresources @@ -0,0 +1,63 @@ +! File: .Xresources +! Author: Collin J. Doering +! Date: Jan 18, 2014 + +! Xterm Options +XTerm*reverseVideo: on +xterm*bellIsUrgent: true +xterm*faceName: FreeMono-11:antialias=true +xterm*font: 7x13 + +! Smyck color scheme (http://color.smyck.org/) +! Black +*.color0: #000000 +! Red +*.color1: #C75646 +! Green +*.color2: #8EB33B +! Yellow +*.color3: #D0B03C +! Blue +*.color4: #72B3CC +! Purple +*.color5: #C8A0D1 +! Cyan +*.color6: #218693 +! White +*.color7: #B0B0B0 +! Grey +*.color8: #5D5D5D +! Light Red +*.color9: #E09690 +! Light Green +*.color10: #CDEE69 +! Light Yellow +*.color11: #FFE377 +! Light Blue +*.color12: #9CD9F0 +! Light Purple +*.color13: #FBB1F9 +! Light Cyan +*.color14: #77DFD8 +! Light white +*.color15: #F8F8F8 + +! Force vncviewer to show a password dialog +vncviewer.passwordDialog: true + +! Set default emacs font +Emacs*font: FreeMono-12 +Emacs.toolBar: off +Emacs.menuBar: off +Emacs.scrollBar: off +Emacs*foreground: WhiteSmoke +Emacs*background: black + +! HiDPI settings +!Xft.dpi: 180 +!Xft.autohint: 0 +!Xft.lcdfilter: lcddefault +!Xft.hintstyle: hintfull +!Xft.hinting: 1 +!Xft.antialias: 1 +!Xft.rgba: rgb diff --git a/user-config/xorg/.bin/keyboard.sh b/user-config/xorg/.bin/keyboard.sh new file mode 100755 index 0000000..92d50fd --- /dev/null +++ b/user-config/xorg/.bin/keyboard.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +# (C) Copyright Collin J. Doering 2017 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# File: keyboard.sh +# Author: Collin J. Doering +# Date: Feb 27, 2017 + +KEYWORD='AT Translated Set 2' +CFG_FILE="$HOME/.keyboard" + +case "$1" in + on) + # Turn keyboard on + if [ -f "$CFG_FILE" ]; then + INP=($(cat $CFG_FILE)) + else + echo "Error! No config file '${CFG_FILE}'" + exit 1 + fi + + ID=${INP[0]} + MASTER=${INP[1]} + + xinput reattach "$ID" "$MASTER" + ;; + off) + # Turn keyboard off + IFS=$'\n' + IDS=($(xinput --list --id-only)) + NAMES=($(xinput --list --name-only)) + unset IFS + + ID='' + for i in "${!IDS[@]}"; do + if [[ "${NAMES[$i]}" =~ "$KEYWORD" ]]; then + ID="${IDS[$i]}" + break + fi + done + + MASTER=$(xinput --list | grep "$KEYWORD" | head -n1 | tail -c4 | head -c1) + echo "$ID $MASTER" > "$CFG_FILE" + + xinput float "$ID" + ;; + *) + echo "Error! Invalid use of keyboard.sh" + exit 1 + ;; +esac + +# Exit gracefully +exit 0 diff --git a/user-config/xorg/.bin/startx.sh b/user-config/xorg/.bin/startx.sh new file mode 100755 index 0000000..0623408 --- /dev/null +++ b/user-config/xorg/.bin/startx.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +GUIX_PROFILE=~/.guix-profile + +if [ ! -z "$GUIX_ENVIRONMENT" ]; then + # When in a guix environment, extend particular environment variables + # TODO: there are likely more environment variables that should be extended + export XDG_CONFIG_DIRS="${XDG_CONFIG_DIRS}:$GUIX_ENVIRONMENT/etc/xdg" +fi + +export XKB_BINDIR=${GUIX_PROFILE}/bin + +exec ${GUIX_PROFILE}/bin/xinit ${HOME}/.xinitrc $@ -- \ + ${GUIX_PROFILE}/bin/Xorg :$XDG_VTNR vt$XDG_VTNR \ + -keeptty \ + -xkbdir ${GUIX_PROFILE}/share/X11/xkb \ + -configdir ${GUIX_PROFILE}/share/X11/xorg.conf.d \ + -modulepath ${GUIX_PROFILE}/lib/xorg/modules diff --git a/user-config/xorg/.screenlayout/just-laptop.sh b/user-config/xorg/.screenlayout/just-laptop.sh new file mode 100755 index 0000000..ab18015 --- /dev/null +++ b/user-config/xorg/.screenlayout/just-laptop.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +xrandr --output VIRTUAL1 --off \ + --output HDMI2 --off \ + --output HDMI1 --off \ + --output DP1 --off \ + --output DP2 --off \ + --output eDP1 --auto + +# Set random wallpaper +feh --randomize --bg-fill ~/.wallback/* diff --git a/user-config/xorg/.screenlayout/personal.sh b/user-config/xorg/.screenlayout/personal.sh new file mode 100755 index 0000000..f5d0d3c --- /dev/null +++ b/user-config/xorg/.screenlayout/personal.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +# Monitor Setup. HDMI1 and DP2 must be scaled by a factor of 2x2 so that resolutions look good +# with a 4k laptop screen. +# +# - +------------+-----------+ +# | |............| | +# {x} |............| | +# | |............| | +# | |............| | +# - +------------+ | +# | | DP2 | +# | | | +# | HDMI1 | | +# | | | +# | | | +# +-----+------+-----+-----+ +# |.....| |.....| +# |.....| |.....| +# |.....| eDP1 |.....| +# |.....| |.....| +# |.....| |.....| +# +-----+------------+-----+ +# +# |-{y}-| +# +# Where: +# x = 1920(2) - 1080(2) +# = 2(1920 - 1080) +# = 1680 +# y = (1/2)(2(1920 + 1080) - 3840) +# = 1920 + 1080 - 1920 +# = 1080 + +xrandr \ + --output VIRTUAL1 --off \ + --output DP1 --off \ + --output HDMI2 --off \ + --output HDMI1 --mode 1920x1080 --scale 2x2 --pos 0x1680 --rotate normal \ + --output DP2 --mode 1920x1080 --scale 2x2 --pos 3840x0 --rotate left \ + --output eDP1 --primary --mode 3840x2160 --pos 1080x3840 --rotate normal + +# Set random wallpaper on all monitors +feh --randomize --bg-fill ~/.wallback/* diff --git a/user-config/xorg/.screenlayout/work-home.sh b/user-config/xorg/.screenlayout/work-home.sh new file mode 100755 index 0000000..edc18ef --- /dev/null +++ b/user-config/xorg/.screenlayout/work-home.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +xrandr --output eDP1 --auto \ + --output HDMI2 --auto --above eDP1 \ + --output DP1 --auto --above eDP1 --right-of HDMI2 --rotate left + +# Set random wallpaper on all monitors +feh --randomize --bg-fill ~/.wallback/* diff --git a/user-config/xorg/.screenlayout/work.sh b/user-config/xorg/.screenlayout/work.sh new file mode 100755 index 0000000..285592b --- /dev/null +++ b/user-config/xorg/.screenlayout/work.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +xrandr --output eDP1 --auto \ + --output HDMI2 --auto --above eDP1 --rotate left \ + --output DP1 --auto --above eDP1 --right-of HDMI2 + +# Set random wallpaper on all monitors +feh --randomize --bg-fill ~/.wallback/* diff --git a/user-config/xorg/.xinitrc b/user-config/xorg/.xinitrc new file mode 100755 index 0000000..cbc83e4 --- /dev/null +++ b/user-config/xorg/.xinitrc @@ -0,0 +1,178 @@ +#!/usr/bin/env bash + +# Usage: .xinitrc [window-manager] [session-type] +# where: window-manager is one of '(xmonad openbox stumpwm awesome exwm) +# session-type is "full", "min", or "new"; if any other string is given, defaults to "full" + +# TODO: this is only useful on non-guix systems, however a similar +# thing could be done for ~/.guix-profile/etc/X11/xinit/xinitrc.d, +# however on guix this path is empty (not provided by xinit package) +# +# # Runs system-wide xinitrc scripts +# if [ -d /etc/X11/xinit/xinitrc.d ]; then +# for f in /etc/X11/xinit/xinitrc.d/*; do +# [ -x "$f" ] && . "$f" +# done +# unset f +# fi + +# Initialize a full desktop session (run generic helper applications) +init_full_session() { + # TODO: (should this be moved .zshenv?) Fix java applications + export _JAVA_AWT_WM_NONREPARENTING=1 + + # TODO: guix (wallpaper dir doesn't exist) + # Set random wallpaper + # [ -d ~/.wallback ] && feh --randomize --bg-scale ~/.wallback/* + + # TODO: guix + # # Start geoclue for use by redshift + # #/usr/lib/geoclue-2.0/demos/agent & + + # TODO: guix + # # Star redshift + # redshift -l geoclue2 & + # #redshift -l 43.4503:-80.4832 & + + # TODO: guix + # # Unclutter the desktop and remove mouse pointer when inactive + # unclutter & + + # TODO: Compositors cause screen locking to be ineffective. Disabled until resolved. + #compton -b + + # TODO: guix + # # Run xbindkeys + # xbindkeys & + + # TODO: guix + # # Use xautolock for screen locking + # xautolock -time 5 -notify 30 -notifier "notify-send -u critical -t 10000 -- 'LOCKING screen in 30 seconds'" -locker '/sbin/i3lock-fancy-rapid 10 7 -f' & + + # TODO: guix + # # Start urxvt daemon + # urxvtd & + + # Allow clipboard to be shared via spice + spice-vdagent & + + # Determine how to start (or not start) emacs + if [ "$SESSION_WM" = "exwm" ]; then + case "$SESSION_TYPE" in + min|new) + ;; # Do not start emacs as it will be started in regular mode as a window manager + full|*) + # Emacs CANNOT be put in the background here, as later + # emacsclient will have to connect, which will require the + # emacs daemon be started and ready. + emacs --daemon -f start-as-window-manager + ;; + esac + else + emacs --daemon & + fi + + # TODO: guix + # # Connect planc midi keyboard + # local PLANCK_STRING='Planck Keyboard' + # if [ ! -z "$(xinput | grep "$PLANK_STRING")" ]; then + # local timity=$(aconnect -o | grep 'TiMidity' | head -n1 | cut -d: -f1 | cut -d' ' -f2) + # local planck=$(aconnect -i | grep "$PLANCK_STRING" | head -n1 | cut -d: -f1 | cut -d' ' -f2) + + # # TODO: timidity seems to interfere with pulseaudio + # aconnect "$planck" "$timity" + # fi + + # TODO: guix + # # Test for HiDPI monitors (seems to break emacs scale) + # #export GDK_SCALE=2 + # #export GDK_DPI_SCALE=0.5 + + # Set the default wm to xmonad for full sessions + DEFAULT_WM=xmonad +} + +# Initialize a min desktop session (run generic helper applications) +init_min_session() { + # Set the default wm to exwm for minimal sessions + DEFAULT_WM=exwm +} + +# Initialize a session +# +# Environment Variables: +# - SESSION_TYPE :: The session type to initialize (one of 'full', 'min' or 'new') +# - SESSION_WM :: The session window manager to use +init_session() { + # TODO: is this needed? is it used? + # Set keymap to allow switching between US qwerty and dvorak layouts + setxkbmap -layout us,us -variant ,dvorak -option grp:sclk_toggle + + # Set the default curson used by all WM's + xsetroot -cursor_name left_ptr + + # Load Xresources + xrdb -merge ~/.Xresources + + case "$SESSION_TYPE" in + # Min or new session + min|new) + init_min_session + ;; + # Full session + full) + init_full_session + ;; + # Invalid session or unspecified + *) + if [ ! -z "$SESSION_TYPE" ]; then + echo "Error! Unknown session type '${SESSION_TYPE}'. Session type must be either 'full', 'min' or 'new'." + exit 1 + fi + init_full_session + ;; + esac +} + +# Start a session +# +# Environment Variables: +# - SESSION_TYPE :: The session type to initialize (one of 'full' or 'min) +# - SESSION_WM :: The session window manager to use +run_session() { + case "$SESSION_WM" in + xmonad|stumpwm) + exec dbus-launch --exit-with-session "$SESSION_WM" + ;; + exwm) + if [ "$SESSION_TYPE" = "min" ]; then + exec dbus-launch --exit-with-session emacs -f start-as-window-manager + else + exec emacsclient -c + fi + ;; + *) + if [ "$SESSION_TYPE" = "new" ]; then + exec dbus-launch --exit-with-session "$SESSION_WM" + else + exec dbus-launch --exit-with-session "$DEFAULT_WM" + fi + ;; + esac +} + +# +# Start of execution +# + +export SESSION_WM="$1" +export SESSION_TYPE="$2" + +init_session + +# TODO (machine specific): Set default monitor/s and resolutions/positions +xrandr --output Virtual-1 --mode 1920x1080 + +# This is the end of execution, as run_session will exec the +# appropriate wm +run_session diff --git a/user-config/zathura/.config/zathura/zathurarc b/user-config/zathura/.config/zathura/zathurarc new file mode 100644 index 0000000..0a5707e --- /dev/null +++ b/user-config/zathura/.config/zathura/zathurarc @@ -0,0 +1,7 @@ +map [normal] ! set "pages-per-row 1" +map [normal] @ set "pages-per-row 2" +map [normal] # set "pages-per-row 3" + +set recolor-darkcolor "#EBEBEB" +set recolor-lightcolor "#080808" +set recolor true diff --git a/user-config/zsh/.zprofile b/user-config/zsh/.zprofile new file mode 100644 index 0000000..19c7ae0 --- /dev/null +++ b/user-config/zsh/.zprofile @@ -0,0 +1,11 @@ +# Honor system-wide environment variables +source /etc/profile + +# Setup guix profile locales +export GUIX_LOCPATH=${HOME}/.guix-profile/lib/locale + +# Add local binaries to PATH +export PATH="${PATH}:$HOME/.bin" + +# Start user shepherd if not already running +#[[ ! -S /run/user/${UID}/shepherd/socket ]] && shepherd diff --git a/user-config/zsh/.zsh_resources/completions/_aws-vault b/user-config/zsh/.zsh_resources/completions/_aws-vault new file mode 100644 index 0000000..a9ef96f --- /dev/null +++ b/user-config/zsh/.zsh_resources/completions/_aws-vault @@ -0,0 +1,24 @@ +#compdef aws-vault + +_aws-vault() { + local i + for (( i=2; i < CURRENT; i++ )); do + if [[ ${words[i]} == -- ]]; then + shift $i words + (( CURRENT -= i )) + _normal + return + fi + done + + local matches=($(${words[1]} --completion-bash "${(@)words[1,$CURRENT]}")) + compadd -a matches + + if [[ $compstate[nmatches] -eq 0 && $words[$CURRENT] != -* ]]; then + _files + fi +} + +if [[ "$(basename -- ${(%):-%x})" != "_aws-vault" ]]; then + compdef _aws-vault aws-vault +fi diff --git a/user-config/zsh/.zsh_resources/completions/_beet b/user-config/zsh/.zsh_resources/completions/_beet new file mode 100644 index 0000000..56c86d0 --- /dev/null +++ b/user-config/zsh/.zsh_resources/completions/_beet @@ -0,0 +1,237 @@ +#compdef beet + +# zsh completion for beets music library manager and MusicBrainz tagger: http://beets.radbox.org/ + +# Default values for BEETS_LIBRARY & BEETS_CONFIG needed for the cache checking function. +# They will be updated under the assumption that the config file is in the same directory as the library. +local BEETS_LIBRARY=~/.config/beets/library.db +local BEETS_CONFIG=~/.config/beets/config.yaml +# Use separate caches for file locations, command completions, and query completions. +# This allows the use of different rules for when to update each one. +zstyle ":completion:${curcontext}:" cache-policy _beet_check_cache +_beet_check_cache () { + local cachefile="$(basename ${1})" + if [[ ! -a "${1}" ]] || [[ "${1}" -ot =beet ]]; then + # always update the cache if it doesnt exist, or if the beet executable changes + return 0 + fi + case cachefile; in + (beetslibrary) + if [[ ! -a "${~BEETS_LIBRARY}" ]] || [[ "${1}" -ot "${~BEETS_CONFIG}" ]]; then + return 0 + fi + ;; + (beetscmds) + _retrieve_cache beetslibrary + if [[ "${1}" -ot "${~BEETS_CONFIG}" ]]; then + return 0 + fi + ;; + esac + return 1 +} + +# useful: argument to _regex_arguments for matching any word +local matchany=/$'[^\0]##\0'/ +# arguments to _regex_arguments for completing files and directories +local -a files dirs +files=("$matchany" ':file:file:_files') +dirs=("$matchany" ':dir:directory:_dirs') + +# Retrieve or update caches +if ! _retrieve_cache beetslibrary || _cache_invalid beetslibrary; then + local BEETS_LIBRARY="${$(beet config|grep library|cut -f 2 -d ' '):-${BEETS_LIBRARY}}" + local BEETS_CONFIG="${$(beet config -p):-${BEETS_CONFIG}}" + _store_cache beetslibrary BEETS_LIBRARY BEETS_CONFIG +fi + +if ! _retrieve_cache beetscmds || _cache_invalid beetscmds; then + local -a subcommands fields beets_regex_words_subcmds beets_regex_words_help query modify + local subcmd cmddesc matchquery matchmodify field fieldargs queryelem modifyelem + # Useful function for joining grouped lines of output into single lines (taken from _completion_helpers) + _join_lines() { + awk -v SEP="$1" -v ARG2="$2" -v START="$3" -v END2="$4" 'BEGIN {if(START==""){f=1}{f=0}; + if(ARG2 ~ "^[0-9]+"){LINE1 = "^[[:space:]]{,"ARG2"}[^[:space:]]"}else{LINE1 = ARG2}} + ($0 ~ END2 && f>0 && END2!="") {exit} + ($0 ~ START && f<1) {f=1; if(length(START)!=0){next}} + ($0 ~ LINE1 && f>0) {if(f<2){f=2; printf("%s",$0)}else{printf("\n%s",$0)}; next} + (f>1) {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$0); printf("%s%s",SEP, $0); next} + END {print ""}' + } + # Variables used for completing subcommands and queries + subcommands=(${${(f)"$(beet help | _join_lines ' ' 3 'Commands:')"}[@]}) + fields=($(beet fields | grep -G '^ ' | sort -u | colrm 1 2)) + for field in "${fields[@]}" + do + fieldargs="$fieldargs '$field:::{_beet_field_values $field}'" + done + queryelem="_values -S : 'query field (add an extra : to match by regexp)' '::' $fieldargs" + modifyelem="_values -S = 'modify field (replace = with ! to remove field)' $(echo "'${^fields[@]}:: '")" + # regexps for matching query and modify terms on the command line + matchquery=/"(${(j/|/)fields[@]})"$':[^\0]##\0'/ + matchmodify=/"(${(j/|/)fields[@]})"$'(=[^\0]##|!)\0'/ + # create completion function for queries + _regex_arguments _beet_query "$matchany" \# \( "$matchquery" ":query:query string:$queryelem" \) \# + local "beets_query"="$(which _beet_query)" + # arguments for _regex_arguments for completing lists of queries and modifications + beets_query_args=( \( "$matchquery" ":query:query string:{_beet_query}" \) \# ) + beets_modify_args=( \( "$matchmodify" ":modify:modify string:$modifyelem" \) \# ) + # now build arguments for _beet and _beet_help completion functions + beets_regex_words_subcmds=('(') + for i in ${subcommands[@]}; do + subcmd="${i[(w)1]}" + # remove first word and parenthesised alias, replace : with -, [ with (, ] with ), and remove single quotes + cmddesc="${${${${${i[(w)2,-1]##\(*\) #}//:/-}//\[/(}//\]/)}//\'/}" + # update arguments needed for creating _beet + beets_regex_words_subcmds+=(/"${subcmd}"$'\0'/ ":subcmds:subcommands:((${subcmd}:${cmddesc// /\ }))") + beets_regex_words_subcmds+=(\( "${matchany}" ":option:option:{_beet_subcmd ${subcmd}}" \) \# \|) + # update arguments needed for creating _beet_help + beets_regex_words_help+=("${subcmd}:${cmddesc}") + done + beets_regex_words_subcmds[-1]=')' + _store_cache beetscmds beets_regex_words_subcmds beets_regex_words_help beets_query_args beets_modify_args beets_query +else + # Evaluate the variable containing the query completer function + eval "${beets_query}" +fi + +# Function for getting unique values for field from database (you may need to change the path to the database). +_beet_field_values() { + local -a output fieldvals + local sqlcmd="select distinct $1 from items;" + _retrieve_cache beetslibrary + case ${1} + in + lyrics) + fieldvals= + ;; + *) + if [[ "$(sqlite3 ${~BEETS_LIBRARY} ${sqlcmd} 2>&1)" =~ "no such column" ]]; then + sqlcmd="select distinct value from item_attributes where key=='$1' and value!='';" + fi + output="$(sqlite3 ${~BEETS_LIBRARY} ${sqlcmd} 2>/dev/null | sed -rn '/^-+$/,${{/^[- ]+$/n};p}')" + fieldvals=("${(f)output[@]}") + ;; + esac + compadd -P \" -S \" -M 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' -Q -a fieldvals +} + +# This function takes a beet subcommand as its first argument, and then uses _regex_words to set ${reply[@]} +# to an array containing arguments for the _regex_arguments function. +_beet_subcmd_options() { + local shortopt optarg optdesc + local matchany=/$'[^\0]##\0'/ + local -a regex_words + regex_words=() + for i in ${${(f)"$(beet help $1 | awk '/^ +-/{if(x)print x;x=$0;next}/^ *$/{if(x) exit}{if(x) x=x$0}END{print x}')"}[@]} + do + opt="${i[(w)1]/,/}" + optarg="${${${i## #[-a-zA-Z]# }##[- ]##*}%%[, ]*}" + optdesc="${${${${${i[(w)2,-1]/[A-Z, ]#--[-a-z]##[=A-Z]# #/}//:/-}//\[/(}//\]/)}//\'/}" + case $optarg; in + ("") + if [[ "$1" == "import" && "$opt" == "-L" ]]; then + regex_words+=("$opt:$optdesc:\${beets_query_args[@]}") + else + regex_words+=("$opt:$optdesc") + fi + ;; + (LOG) + local -a files + files=("$matchany" ':file:file:_files') + regex_words+=("$opt:$optdesc:\$files") + ;; + (CONFIG) + local -a configfile + configfile=("$matchany" ':file:config file:{_files -g *.yaml}') + regex_words+=("$opt:$optdesc:\$configfile") + ;; + (LIB|LIBRARY) + local -a libfile + libfile=("$matchany" ':file:database file:{_files -g *.db}') + regex_words+=("$opt:$optdesc:\$libfile") + ;; + (DIR|DIRECTORY) + local -a dirs + dirs=("$matchany" ':dir:directory:_dirs') + regex_words+=("$opt:$optdesc:\$dirs") + ;; + (SOURCE) + if [[ "${1}" -eq lastgenre ]]; then + local -a lastgenresource + lastgenresource=(/$'(artist|album|track)\0'/ ':source:genre source:(artist album track)') + regex_words+=("$opt:$optdesc:\$lastgenresource") + else + regex_words+=("$opt:$optdesc:\$matchany") + fi + ;; + (*) + regex_words+=("$opt:$optdesc:\$matchany") + ;; + esac + done + _regex_words options "$1 options" "${regex_words[@]}" +} + +## Function for completing subcommands. It calls another completion function which is first created if it doesn't already exist. +_beet_subcmd() { + local -a options + local subcmd="${1}" + if [[ ! $(type _beet_${subcmd} | grep function) =~ function ]]; then + if ! _retrieve_cache "beets${subcmd}" || _cache_invalid "beets${subcmd}"; then + local matchany=/$'[^\0]##\0'/ + local -a files + files=("$matchany" ':file:file:_files') + # get arguments for completing subcommand options + _beet_subcmd_options "$subcmd" + options=("${reply[@]}" \#) + _retrieve_cache beetscmds + case ${subcmd}; in + (import) + _regex_arguments _beet_import "${matchany}" /"${subcmd}"$'\0'/ "${options[@]}" "${files[@]}" \# + ;; + (modify) + _regex_arguments _beet_modify "${matchany}" /"${subcmd}"$'\0'/ "${options[@]}" \ + "${beets_query_args[@]}" "${beets_modify_args[@]}" + ;; + (fields|migrate|version|config) + _regex_arguments _beet_${subcmd} "${matchany}" /"${subcmd}"$'\0'/ "${options[@]}" + ;; + (help) + _regex_words subcmds "subcommands" "${beets_regex_words_help[@]}" + _regex_arguments _beet_help "${matchany}" /$'help\0'/ "${options[@]}" "${reply[@]}" + ;; + (*) # Other commands have options followed by a query + _regex_arguments _beet_${subcmd} "${matchany}" /"${subcmd}"$'\0'/ "${options[@]}" "${beets_query_args[@]}" + ;; + esac + # Store completion function in a cache file + local "beets_${subcmd}"="$(which _beet_${subcmd})" + _store_cache "beets${subcmd}" "beets_${subcmd}" + else + # Evaluate the function which is stored in $beets_${subcmd} + local var="beets_${subcmd}" + eval "${(P)var}" + fi + fi + _beet_${subcmd} +} + +# Global options +local -a globalopts +_regex_words options "global options" '-c:path to configuration file:$files' '-v:print debugging information' \ + '-l:library database file to use:$files' '-h:show this help message and exit' '-d:destination music directory:$dirs' +globalopts=("${reply[@]}") + +# Create main completion function +_regex_arguments _beet "$matchany" \( "${globalopts[@]}" \# \) "${beets_regex_words_subcmds[@]}" + +# Set tag-order so that options are completed separately from arguments +zstyle ":completion:${curcontext}:" tag-order '! options' + +# Execute the completion function +_beet "$@" + +# Local Variables: +# mode:shell-script +# End: diff --git a/user-config/zsh/.zsh_resources/completions/_docker-compose b/user-config/zsh/.zsh_resources/completions/_docker-compose new file mode 100644 index 0000000..f53f963 --- /dev/null +++ b/user-config/zsh/.zsh_resources/completions/_docker-compose @@ -0,0 +1,474 @@ +#compdef docker-compose + +# Description +# ----------- +# zsh completion for docker-compose +# ------------------------------------------------------------------------- +# Authors +# ------- +# * Steve Durrheimer +# ------------------------------------------------------------------------- +# Inspiration +# ----------- +# * @albers docker-compose bash completion script +# * @felixr docker zsh completion script : https://github.com/felixr/docker-zsh-completion +# ------------------------------------------------------------------------- + +__docker-compose_q() { + docker-compose 2>/dev/null $compose_options "$@" +} + +# All services defined in docker-compose.yml +__docker-compose_all_services_in_compose_file() { + local already_selected + local -a services + already_selected=$(echo $words | tr " " "|") + __docker-compose_q config --services \ + | grep -Ev "^(${already_selected})$" +} + +# All services, even those without an existing container +__docker-compose_services_all() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + services=$(__docker-compose_all_services_in_compose_file) + _alternative "args:services:($services)" && ret=0 + + return ret +} + +# All services that have an entry with the given key in their docker-compose.yml section +__docker-compose_services_with_key() { + local already_selected + local -a buildable + already_selected=$(echo $words | tr " " "|") + # flatten sections to one line, then filter lines containing the key and return section name. + __docker-compose_q config \ + | sed -n -e '/^services:/,/^[^ ]/p' \ + | sed -n 's/^ //p' \ + | awk '/^[a-zA-Z0-9]/{printf "\n"};{printf $0;next;}' \ + | grep " \+$1:" \ + | cut -d: -f1 \ + | grep -Ev "^(${already_selected})$" +} + +# All services that are defined by a Dockerfile reference +__docker-compose_services_from_build() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + buildable=$(__docker-compose_services_with_key build) + _alternative "args:buildable services:($buildable)" && ret=0 + + return ret +} + +# All services that are defined by an image +__docker-compose_services_from_image() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + pullable=$(__docker-compose_services_with_key image) + _alternative "args:pullable services:($pullable)" && ret=0 + + return ret +} + +__docker-compose_get_services() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local kind + declare -a running paused stopped lines args services + + docker_status=$(docker ps > /dev/null 2>&1) + if [ $? -ne 0 ]; then + _message "Error! Docker is not running." + return 1 + fi + + kind=$1 + shift + [[ $kind =~ (stopped|all) ]] && args=($args -a) + + lines=(${(f)"$(_call_program commands docker $docker_options ps $args)"}) + services=(${(f)"$(_call_program commands docker-compose 2>/dev/null $compose_options ps -q)"}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + lines=(${lines[2,-1]}) + + # Container ID + local line s name + local -a names + for line in $lines; do + if [[ ${services[@]} == *"${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}"* ]]; then + names=(${(ps:,:)${${line[${begin[NAMES]},-1]}%% *}}) + for name in $names; do + s="${${name%_*}#*_}:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" + s="$s, ${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}" + s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then + stopped=($stopped $s) + else + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = *\(Paused\)* ]]; then + paused=($paused $s) + fi + running=($running $s) + fi + done + fi + done + + [[ $kind =~ (running|all) ]] && _describe -t services-running "running services" running "$@" && ret=0 + [[ $kind =~ (paused|all) ]] && _describe -t services-paused "paused services" paused "$@" && ret=0 + [[ $kind =~ (stopped|all) ]] && _describe -t services-stopped "stopped services" stopped "$@" && ret=0 + + return ret +} + +__docker-compose_pausedservices() { + [[ $PREFIX = -* ]] && return 1 + __docker-compose_get_services paused "$@" +} + +__docker-compose_stoppedservices() { + [[ $PREFIX = -* ]] && return 1 + __docker-compose_get_services stopped "$@" +} + +__docker-compose_runningservices() { + [[ $PREFIX = -* ]] && return 1 + __docker-compose_get_services running "$@" +} + +__docker-compose_services() { + [[ $PREFIX = -* ]] && return 1 + __docker-compose_get_services all "$@" +} + +__docker-compose_caching_policy() { + oldp=( "$1"(Nmh+1) ) # 1 hour + (( $#oldp )) +} + +__docker-compose_commands() { + local cache_policy + + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy + if [[ -z "$cache_policy" ]]; then + zstyle ":completion:${curcontext}:" cache-policy __docker-compose_caching_policy + fi + + if ( [[ ${+_docker_compose_subcommands} -eq 0 ]] || _cache_invalid docker_compose_subcommands) \ + && ! _retrieve_cache docker_compose_subcommands; + then + local -a lines + lines=(${(f)"$(_call_program commands docker-compose 2>&1)"}) + _docker_compose_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/ ##/:}) + (( $#_docker_compose_subcommands > 0 )) && _store_cache docker_compose_subcommands _docker_compose_subcommands + fi + _describe -t docker-compose-commands "docker-compose command" _docker_compose_subcommands +} + +__docker-compose_subcommand() { + local opts_help opts_force_recreate opts_no_recreate opts_no_build opts_remove_orphans opts_timeout opts_no_color opts_no_deps + + opts_help='(: -)--help[Print usage]' + opts_force_recreate="(--no-recreate)--force-recreate[Recreate containers even if their configuration and image haven't changed. Incompatible with --no-recreate.]" + opts_no_recreate="(--force-recreate)--no-recreate[If containers already exist, don't recreate them. Incompatible with --force-recreate.]" + opts_no_build="(--build)--no-build[Don't build an image, even if it's missing.]" + opts_remove_orphans="--remove-orphans[Remove containers for services not defined in the Compose file]" + opts_timeout=('(-t --timeout)'{-t,--timeout}"[Specify a shutdown timeout in seconds. (default: 10)]:seconds: ") + opts_no_color='--no-color[Produce monochrome output.]' + opts_no_deps="--no-deps[Don't start linked services.]" + + integer ret=1 + + case "$words[1]" in + (build) + _arguments \ + $opts_help \ + "*--build-arg=[Set build-time variables for one service.]:=: " \ + '--force-rm[Always remove intermediate containers.]' \ + '--no-cache[Do not use cache when building the image.]' \ + '--pull[Always attempt to pull a newer version of the image.]' \ + '*:services:__docker-compose_services_from_build' && ret=0 + ;; + (bundle) + _arguments \ + $opts_help \ + '--push-images[Automatically push images for any services which have a `build` option specified.]' \ + '(--output -o)'{--output,-o}'[Path to write the bundle file to. Defaults to ".dab".]:file:_files' && ret=0 + ;; + (config) + _arguments \ + $opts_help \ + '(--quiet -q)'{--quiet,-q}"[Only validate the configuration, don't print anything.]" \ + '--resolve-image-digests[Pin image tags to digests.]' \ + '--services[Print the service names, one per line.]' \ + '--volumes[Print the volume names, one per line.]' && ret=0 + ;; + (create) + _arguments \ + $opts_help \ + $opts_force_recreate \ + $opts_no_recreate \ + $opts_no_build \ + "(--no-build)--build[Build images before creating containers.]" \ + '*:services:__docker-compose_services_all' && ret=0 + ;; + (down) + _arguments \ + $opts_help \ + "--rmi[Remove images. Type must be one of: 'all': Remove all images used by any service. 'local': Remove only images that don't have a custom tag set by the \`image\` field.]:type:(all local)" \ + '(-v --volumes)'{-v,--volumes}"[Remove named volumes declared in the \`volumes\` section of the Compose file and anonymous volumes attached to containers.]" \ + $opts_remove_orphans && ret=0 + ;; + (events) + _arguments \ + $opts_help \ + '--json[Output events as a stream of json objects]' \ + '*:services:__docker-compose_services_all' && ret=0 + ;; + (exec) + _arguments \ + $opts_help \ + '-d[Detached mode: Run command in the background.]' \ + '--privileged[Give extended privileges to the process.]' \ + '(-u --user)'{-u,--user=}'[Run the command as this user.]:username:_users' \ + '-T[Disable pseudo-tty allocation. By default `docker-compose exec` allocates a TTY.]' \ + '--index=[Index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \ + '(-):running services:__docker-compose_runningservices' \ + '(-):command: _command_names -e' \ + '*::arguments: _normal' && ret=0 + ;; + (help) + _arguments ':subcommand:__docker-compose_commands' && ret=0 + ;; + (images) + _arguments \ + $opts_help \ + '-q[Only display IDs]' \ + '*:services:__docker-compose_services_all' && ret=0 + ;; + (kill) + _arguments \ + $opts_help \ + '-s[SIGNAL to send to the container. Default signal is SIGKILL.]:signal:_signals' \ + '*:running services:__docker-compose_runningservices' && ret=0 + ;; + (logs) + _arguments \ + $opts_help \ + '(-f --follow)'{-f,--follow}'[Follow log output]' \ + $opts_no_color \ + '--tail=[Number of lines to show from the end of the logs for each container.]:number of lines: ' \ + '(-t --timestamps)'{-t,--timestamps}'[Show timestamps]' \ + '*:services:__docker-compose_services_all' && ret=0 + ;; + (pause) + _arguments \ + $opts_help \ + '*:running services:__docker-compose_runningservices' && ret=0 + ;; + (port) + _arguments \ + $opts_help \ + '--protocol=[tcp or udp \[default: tcp\]]:protocol:(tcp udp)' \ + '--index=[index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \ + '1:running services:__docker-compose_runningservices' \ + '2:port:_ports' && ret=0 + ;; + (ps) + _arguments \ + $opts_help \ + '-q[Only display IDs]' \ + '*:services:__docker-compose_services_all' && ret=0 + ;; + (pull) + _arguments \ + $opts_help \ + '--ignore-pull-failures[Pull what it can and ignores images with pull failures.]' \ + '*:services:__docker-compose_services_from_image' && ret=0 + ;; + (push) + _arguments \ + $opts_help \ + '--ignore-push-failures[Push what it can and ignores images with push failures.]' \ + '*:services:__docker-compose_services' && ret=0 + ;; + (rm) + _arguments \ + $opts_help \ + '(-f --force)'{-f,--force}"[Don't ask to confirm removal]" \ + '-v[Remove any anonymous volumes attached to containers]' \ + '*:stopped services:__docker-compose_stoppedservices' && ret=0 + ;; + (run) + _arguments \ + $opts_help \ + $opts_no_deps \ + '-d[Detached mode: Run container in the background, print new container name.]' \ + '*-e[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \ + '--entrypoint[Overwrite the entrypoint of the image.]:entry point: ' \ + '--name=[Assign a name to the container]:name: ' \ + '(-p --publish)'{-p,--publish=}"[Publish a container's port(s) to the host]" \ + '--rm[Remove container after run. Ignored in detached mode.]' \ + "--service-ports[Run command with the service's ports enabled and mapped to the host.]" \ + '-T[Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.]' \ + '(-u --user)'{-u,--user=}'[Run as specified username or uid]:username or uid:_users' \ + '(-v --volume)*'{-v,--volume=}'[Bind mount a volume]:volume: ' \ + '(-w --workdir)'{-w,--workdir=}'[Working directory inside the container]:workdir: ' \ + '(-):services:__docker-compose_services' \ + '(-):command: _command_names -e' \ + '*::arguments: _normal' && ret=0 + ;; + (scale) + _arguments \ + $opts_help \ + $opts_timeout \ + '*:running services:__docker-compose_runningservices' && ret=0 + ;; + (start) + _arguments \ + $opts_help \ + '*:stopped services:__docker-compose_stoppedservices' && ret=0 + ;; + (stop|restart) + _arguments \ + $opts_help \ + $opts_timeout \ + '*:running services:__docker-compose_runningservices' && ret=0 + ;; + (top) + _arguments \ + $opts_help \ + '*:running services:__docker-compose_runningservices' && ret=0 + ;; + (unpause) + _arguments \ + $opts_help \ + '*:paused services:__docker-compose_pausedservices' && ret=0 + ;; + (up) + _arguments \ + $opts_help \ + '(--abort-on-container-exit)-d[Detached mode: Run containers in the background, print new container names. Incompatible with --abort-on-container-exit.]' \ + $opts_no_color \ + $opts_no_deps \ + $opts_force_recreate \ + $opts_no_recreate \ + $opts_no_build \ + "(--no-build)--build[Build images before starting containers.]" \ + "(-d)--abort-on-container-exit[Stops all containers if any container was stopped. Incompatible with -d.]" \ + '(-t --timeout)'{-t,--timeout}"[Use this timeout in seconds for container shutdown when attached or when containers are already running. (default: 10)]:seconds: " \ + $opts_remove_orphans \ + '*:services:__docker-compose_services_all' && ret=0 + ;; + (version) + _arguments \ + $opts_help \ + "--short[Shows only Compose's version number.]" && ret=0 + ;; + (*) + _message 'Unknown sub command' && ret=1 + ;; + esac + + return ret +} + +_docker-compose() { + # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. + # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. + if [[ $service != docker-compose ]]; then + _call_function - _$service + return + fi + + local curcontext="$curcontext" state line + integer ret=1 + typeset -A opt_args + + local file_description + + if [[ -n ${words[(r)-f]} || -n ${words[(r)--file]} ]] ; then + file_description="Specify an override docker-compose file (default: docker-compose.override.yml)" + else + file_description="Specify an alternate docker-compose file (default: docker-compose.yml)" + fi + + _arguments -C \ + '(- :)'{-h,--help}'[Get help]' \ + '*'{-f,--file}"[${file_description}]:file:_files -g '*.yml'" \ + '(-p --project-name)'{-p,--project-name}'[Specify an alternate project name (default: directory name)]:project name:' \ + '--verbose[Show more output]' \ + '(- :)'{-v,--version}'[Print version and exit]' \ + '(-H --host)'{-H,--host}'[Daemon socket to connect to]:host:' \ + '--tls[Use TLS; implied by --tlsverify]' \ + '--tlscacert=[Trust certs signed only by this CA]:ca path:' \ + '--tlscert=[Path to TLS certificate file]:client cert path:' \ + '--tlskey=[Path to TLS key file]:tls key path:' \ + '--tlsverify[Use TLS and verify the remote]' \ + "--skip-hostname-check[Don't check the daemon's hostname against the name specified in the client certificate (for example if your docker host is an IP address)]" \ + '(-): :->command' \ + '(-)*:: :->option-or-argument' && ret=0 + + local -a relevant_compose_flags relevant_docker_flags compose_options docker_options + + relevant_compose_flags=( + "--file" "-f" + "--host" "-H" + "--project-name" "-p" + "--tls" + "--tlscacert" + "--tlscert" + "--tlskey" + "--tlsverify" + "--skip-hostname-check" + ) + + relevant_docker_flags=( + "--host" "-H" + "--tls" + "--tlscacert" + "--tlscert" + "--tlskey" + "--tlsverify" + ) + + for k in "${(@k)opt_args}"; do + if [[ -n "${relevant_docker_flags[(r)$k]}" ]]; then + docker_options+=$k + if [[ -n "$opt_args[$k]" ]]; then + docker_options+=$opt_args[$k] + fi + fi + if [[ -n "${relevant_compose_flags[(r)$k]}" ]]; then + compose_options+=$k + if [[ -n "$opt_args[$k]" ]]; then + compose_options+=$opt_args[$k] + fi + fi + done + + case $state in + (command) + __docker-compose_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-compose-$words[1]: + __docker-compose_subcommand && ret=0 + ;; + esac + + return ret +} + +_docker-compose "$@" diff --git a/user-config/zsh/.zsh_resources/completions/_exa b/user-config/zsh/.zsh_resources/completions/_exa new file mode 100644 index 0000000..0f5f04d --- /dev/null +++ b/user-config/zsh/.zsh_resources/completions/_exa @@ -0,0 +1,40 @@ +#compdef exa + +__exa() { + _arguments \ + "(- 1 *)"{-v,--version}"[Show version of exa]" \ + "(- 1 *)"{-\?,--help}"[Show list of command-line options]" \ + {-1,--oneline}"[Display one entry per line]" \ + {-l,--long}"[Display extended file metadata as a table]" \ + {-G,--grid}"[Display entries as a grid]" \ + {-x,--across}"[Sort the grid across, rather than downwards]" \ + {-R,--recurse}"[Recurse into directories]" \ + {-T,--tree}"[Recurse into directories as a tree]" \ + {-F,--classify}"[Display type indicator by file names]" \ + {--color,--colour}"[When to use terminal colours]" \ + {--color,--colour}-scale"[Highlight levels of file sizes distinctly]" \ + --group-directories-first"[Sort directories before other files]" \ + {-a,--all}"[Show hidden and 'dot' files]" \ + {-d,--list-dirs}"[List directories like regular files]" \ + {-L,--level}"+[Limit the depth of recursion]" \ + {-r,--reverse}"[Reverse the sort order]" \ + {-s,--sort}"[Which field to sort by]:(sort field):(accessed created extension Extension filename Filename inode modified name Name none size type)" \ + {-I,--ignore-glob}"[Ignore files that match these glob patterns]" \ + {-b,--binary}"[List file sizes with binary prefixes]" \ + {-B,--bytes}"[List file sizes in bytes, without any prefixes]" \ + {-g,--group}"[List each file's group]" \ + {-h,--header}"[Add a header row to each column]" \ + {-H,--links}"[List each file's number of hard links]" \ + {-i,--inode}"[List each file's inode number]" \ + {-m,--modified}"[Use the modified timestamp field]" \ + {-S,--blocks}"[List each file's number of filesystem blocks]" \ + {-t,--time}"[Which time field to show]:(time field):(accessed created modified)" \ + --time-style"[How to format timestamps]:(time style):(default iso long-iso full-iso)" \ + {-u,--accessed}"[Use the accessed timestamp field]" \ + {-U,--created}"[Use the created timestamp field]" \ + --git"[List each file's Git status, if tracked]" \ + {-@,--extended}"[List each file's extended attributes and sizes]" \ + '*:filename:_files' +} + +__exa diff --git a/user-config/zsh/.zshenv b/user-config/zsh/.zshenv new file mode 100644 index 0000000..28c8c79 --- /dev/null +++ b/user-config/zsh/.zshenv @@ -0,0 +1,10 @@ +# All commands in this file MUST not produce output + +# Default editor +export EDITOR="emacsclient -t" # $EDITOR should open in terminal +export VISUAL="emacsclient -a emacs" # $VISUAL opens in GUI with non-daemon as alternate + +export GUILE_LOAD_PATH="${GUILE_LOAD_PATH}:$HOME/.guix-profile/share/guile/site/3.0" +export GUILE_LOAD_COMPILED_PATH="${GUILE_LOAD_COMPILED_PATH}:$HOME/.guix-profile/lib/guile/3.0/site-ccache" + +export LEDGER_FILE=~/.org/accounting/accounting.ledger diff --git a/user-config/zsh/.zshrc b/user-config/zsh/.zshrc new file mode 100644 index 0000000..1076ebb --- /dev/null +++ b/user-config/zsh/.zshrc @@ -0,0 +1,346 @@ +# File: ~/.zshrc +# Description: zsh configuration file + +# TODO: uncomment +# # Add ~/.zsh_resources/completions to $fpath (needs to come before 'compinit') +# fpath=( ~/.zsh_resources/completions "${fpath[@]}" ) + +source ~/.guix-profile/bin/z.sh +precmd () { + z --add "$(pwd -P)" +} + +# Use zsh-autosuggestions (requires pacman package) +source ~/.guix-profile/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh + +# TODO: temporary +fpath=( ~/.guix-profile/share/zsh/site-functions "${fpath[@]}" ) + +# The following lines were added by compinstall +zstyle ':completion:*' completer _list _expand _complete _ignored _match _correct _approximate _prefix +zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} +zstyle ':completion:*' matcher-list '' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|[._-/,+]=** r:|=**' 'l:|=* r:|=*' +zstyle ':completion:*' max-errors 5 +zstyle ':completion:*' preserve-prefix '//[^/]##/' +zstyle :compinstall filename '/home/collin/.zshrc' + +autoload -Uz compinit +compinit + +SPACESHIP_PROMPT_ORDER=( + time # Time stamps section + user # Username section + dir # Current directory section + host # Hostname section + git # Git section (git_branch + git_status) +# hg # Mercurial section (hg_branch + hg_status) + package # Package version + node # Node.js section + ruby # Ruby section + elixir # Elixir section +# xcode # Xcode section + swift # Swift section + golang # Go section + php # PHP section + rust # Rust section + haskell # Haskell Stack section + julia # Julia section + docker # Docker section + aws # Amazon Web Services section + venv # virtualenv section +# conda # conda virtualenv section + pyenv # Pyenv section + dotnet # .NET section +# ember # Ember.js section + kubecontext # Kubectl context section + terraform # Terraform workspace section + exec_time # Execution time + line_sep # Line break + battery # Battery level and status +# vi_mode # Vi-mode indicator + jobs # Background jobs indicator + exit_code # Exit code section + char # Prompt character +) + +SPACESHIP_DIR_TRUNC=0 +SPACESHIP_PROMPT_ADD_NEWLINE=false +SPACESHIP_PROMPT_SEPARATE_LINE=true +SPACESHIP_KUBECONTEXT_SYMBOL="☸️ " # Two spaces are used instead of one in prompt; this forces use of only one + +autoload -U promptinit; promptinit +prompt spaceship +# End of lines added by compinstall + +# Lines for zsh setup + +HISTFILE="$HOME/.zsh_history" +HISTSIZE=10000000 +SAVEHIST=10000000 +setopt AUTO_CD # Change directories without cd +setopt BANG_HIST # Treat the '!' character specially during expansion. +setopt EXTENDED_HISTORY # Write the history file in the ":start:elapsed;command" format. +setopt INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits. +setopt SHARE_HISTORY # Share history between all sessions. +setopt HIST_EXPIRE_DUPS_FIRST # Expire duplicate entries first when trimming history. +setopt HIST_IGNORE_DUPS # Don't record an entry that was just recorded again. +setopt HIST_IGNORE_ALL_DUPS # Delete old recorded entry if new entry is a duplicate. +setopt HIST_FIND_NO_DUPS # Do not display a line previously found. +setopt HIST_IGNORE_SPACE # Don't record an entry starting with a space. +setopt HIST_SAVE_NO_DUPS # Don't write duplicate entries in the history file. +setopt HIST_REDUCE_BLANKS # Remove superfluous blanks before recording entry. +setopt HIST_VERIFY # Don't execute immediately upon history expansion. +setopt HIST_BEEP # Beep when accessing nonexistent history. + +setopt COMPLETE_ALIASES # Complete command line switches for aliases +# End of zsh history setup + +# Use emacs keybindings +bindkey -e + +# Lines to add fzf fuzzy completion widgets supplied by fzf package +source ~/.guix-profile/share/fzf/key-bindings.zsh +source ~/.guix-profile/share/fzf/completion.zsh + +# Rebind C-t for fzf-file-widget to ESC-t +bindkey -r '^T' +bindkey '\et' fzf-file-widget +# Rebind C-r for ffz-history-widget to ESC-r +bindkey -r '^R' +bindkey '\er' fzf-history-widget + +export FZF_DEFAULT_OPTS='--no-height --no-reverse' +export FZF_ALT_C_COMMAND="find -L . -mindepth 1 \\( -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune -o -type d -print 2> /dev/null | cut -b3-" +#export FZF_CTRL_T_COMMAND="find -L . -mindepth 1 \\( -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune -o -type f -print -o -type d -print -o -type l -print 2> /dev/null | cut -b3-" +export FZF_CTRL_T_COMMAND="ag --hidden --ignore .git -g '' 2> /dev/null" +export FZF_CTRL_T_OPTS="--preview '(highlight -O ansi -l {} 2> /dev/null || cat {} || tree -C {}) 2> /dev/null'" +export FZF_CTRL_R_OPTS="--preview 'echo {}' --preview-window down:3:hidden --bind '?:toggle-preview'" +# End of zsh fzf widget setup + +# Check for a tramp session and set a compatible PS1 +# See: https://www.emacswiki.org/emacs/TrampMode +[[ $TERM == "tramp" ]] && unsetopt zle && PS1='$ ' && return + +# Check for an interactive session +[ -z "$PS1" ] && return + +# Alias' to make command output prettier (use color with some commands by default) +alias ls='ls --color=auto' +alias ll='ls -l' +alias la='ls -a' +alias lla='ls -al' +alias grep='grep --color=auto' +alias fgrep='fgrep --color=auto' +alias egrep='egrep --color=auto' + +alias f='find' +compdef f='find' + +alias b='bat' +# #compdef b='bat' # No completions for bat installed/available + +alias x='exa' +alias xs='exa' +alias xl='exa -l' +alias xla='exa -la' +alias xx='x -alT --git' +compdef x='exa' +compdef xs='exa' +compdef xl='exa' +compdef xla='exa' +compdef xx='exa' + +alias av='aws-vault' +alias avl='aws-vault login ${AWS_PROFILE:-default}' +alias ave='aws-vault exec ${AWS_PROFILE:-default} --' +alias aven='aws-vault exec --no-session ${AWS_PROFILE:-default} --' +compdef av='aws-vault' +compdef avl='aws-vault' +compdef ave='aws-vault' +compdef aven='aws-vault' + +AWS_ALIAS='aws-vault exec --no-session ${AWS_PROFILE:-default} -- aws' +AWS_SHELL_ALIAS='aws-vault exec --no-session ${AWS_PROFILE:-default} -- aws-shell' +alias aws="$AWS_ALIAS" +alias aws-shell="$AWS_SHELL_ALIAS" +alias unaws='unset AWS_{PROFILE,SECRET_ACCESS_KEY,ACCESS_KEY_ID,SDK_LOAD_CONFIG}' +alias alias-aws="alias aws='${AWS_ALIAS}'; alias aws-shell='${AWS_SHELL_ALIAS}'" +alias unalias-aws='unalias aws; unalias aws-shell' + +alias ff='firefox-developer-edition' +alias ffp='firefox-developer-edition --private-window' + +alias e='emacsclient -t' +alias kssh='kitty +kitten ssh' +# alias mplayer-ascii='mplayer -vo aa:driver=curses -monitorpixelaspect 0.5 -really-quiet' +# alias qemu='qemu-system-x86_64 -enable-kvm' +# alias lock='cmatrix; clear; vlock' +# alias vv="virt-viewer --connect qemu:///session" +# alias xc="xclip -selection clipboard" + +alias s='sudo' +alias si='sudo -i' +compdef s='sudo' +compdef si='sudo' + +# Use colordiff in place of diff +#alias diff='colordiff' + + +# +# TODO: uncomment +# + +# # Shortcuts for ssh +# function ssht() { +# if [ "$#" -lt 1 ]; then +# echo Invalid use of ssht +# return 1 +# else +# hostname="$1" +# shift +# other_options="$*" +# ssh -t $other_options $hostname -- /bin/sh -c 'tmux attach || (echo tmux not found, trying screen. && screen -R || echo No terminal multiplexer found. Have a shell. && $SHELL)' +# fi +# } + +# # Set colors to use with grep +# export GREP_COLOR="1;33" + +# # Use source-highlight to make code in less syntax highlighted +# export LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s" +# export LESS=' -R ' + +# # Set text/background colors for ls +# export LS_COLORS="di=01;37" + +# Turn off noscroll +stty stop undef + +# Setup direnv hook +eval "$(direnv hook zsh)" + +# # Update startup tty so gpg-agent find correct display for the pinentry program +# echo "UPDATESTARTUPTTY" | gpg-connect-agent > /dev/null 2>&1 + +# # Use zsh-source-highlight +# source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh +# source /usr/share/nvm/init-nvm.sh + +# # Use hub completion +# eval "$(hub alias -s zsh)" + +# # Use aws-cli completion +# source /usr/bin/aws_zsh_completer.sh + +# TODO: not packaged on guix +# # Use doctl completion +# source <(doctl completion zsh) + +# TODO: not packaged on guix +# # Use kubectl completion +# source <(kubectl completion zsh) + +# TODO: not packaged on guix +# # Use helm completion +# source <(helm completion zsh) + +# # Set GOPATH and add $GOPATH/bin to PATH +# export GOPATH=~/.go +# export PATH="${PATH}:${GOPATH}/bin" + +# # Use gcloud completion +# source /opt/google-cloud-sdk/completion.zsh.inc + +# # Setup libvirt default session uri +# export LIBVIRT_DEFAULT_URI=qemu:///system + +# # Set default vagrant provider to libvirt +# export VAGRANT_DEFAULT_PROVIDER=libvirt + +# # Setup ESP-32 sdk +# export IDF_PATH=/opt/esp-idf-sdk +# . ${IDF_PATH}/add_path.sh > /dev/null 2>&1 + +# Access pem ssh keys from password store +pass-ssh() { + psw="$1" + shift + + key_file="$(mktemp)" + + pass "$psw" > "$key_file" + ssh -i "$key_file" $@ + + rm "$key_file" +} + +# Set aws-vault default backend +export AWS_VAULT_BACKEND=pass +export AWS_VAULT_PASS_PREFIX=aws-vault + +# Required for emacs vterm +# See: https://github.com/akermu/emacs-libvterm +vterm_printf(){ + if [ -n "$TMUX" ]; then + # Tell tmux to pass the escape sequences through + # (Source: http://permalink.gmane.org/gmane.comp.terminal-emulators.tmux.user/1324) + printf "\ePtmux;\e\e]%s\007\e\\" "$1" + elif [ "${TERM%%-*}" = "screen" ]; then + # GNU screen (screen, screen-256color, screen-256color-bce) + printf "\eP\e]%s\007\e\\" "$1" + else + printf "\e]%s\e\\" "$1" + fi +} + +# Ease message passing to vterm +vterm_cmd() { + local vterm_elisp + vterm_elisp="" + while [ $# -gt 0 ]; do + vterm_elisp="$vterm_elisp""$(printf '"%s" ' "$(printf "%s" "$1" | sed -e 's|\\|\\\\|g' -e 's|"|\\"|g')")" + shift + done + vterm_printf "51;E$vterm_elisp" +} + +# Override man to run emacs man +man() { + vterm_cmd man "$@" +} + +# Override info to run emacs info +info() { + vterm_cmd info "$@" +} + +find-file() { + vterm_cmd find-file "$@" +} + +message() { + vterm_cmd message "$@" +} + +vterm-clear-scrollback() { + vterm_cmd vterm-clear-scrollback "$@" +} + +# Alias shell scripts in ~/.bin directory +for i in ~/.bin/*.sh; do + alias $(basename $i | sed -E 's/^(.*)\.sh$/\1/')=$i +done + +# Startx when on tty1 +if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then + exec ~/.bin/startx.sh +fi + +# For emacs vterm directory and prompt tracking +# https://github.com/akermu/emacs-libvterm#directory-tracking-and-prompt-tracking +vterm_prompt_end() { + vterm_printf "51;A$(whoami)@$(hostname):$(pwd)"; +} +setopt PROMPT_SUBST +PROMPT=$PROMPT'%{$(vterm_prompt_end)%}'