From 34bf50fec990417ee3ce15776b573721f5193575 Mon Sep 17 00:00:00 2001 From: Solomon Wagner Date: Mon, 17 Mar 2025 00:53:47 -0400 Subject: [PATCH] Initial commit --- .gitignore | 5 + .gitmodules | 11 ++ Makefile | 40 ++++++ alacritty/alacritty.toml | 9 ++ alacritty/alacritty_0_12.toml | 44 ++++++ alacritty/themes | 1 + bashrc | 42 ++++++ doom/config.el | 77 +++++++++++ doom/init.el | 194 ++++++++++++++++++++++++++ doom/packages.el | 49 +++++++ herbstluftwm/autostart | 250 ++++++++++++++++++++++++++++++++++ herbstluftwm/i3status.conf | 41 ++++++ herbstluftwm/panel.sh | 56 ++++++++ nnn/.gitignore | 3 + nvim | 1 + ranger/plugins/__init__.py | 0 ranger/plugins/zoxide | 1 + 17 files changed, 824 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Makefile create mode 100644 alacritty/alacritty.toml create mode 100644 alacritty/alacritty_0_12.toml create mode 160000 alacritty/themes create mode 100644 bashrc create mode 100644 doom/config.el create mode 100644 doom/init.el create mode 100644 doom/packages.el create mode 100755 herbstluftwm/autostart create mode 100644 herbstluftwm/i3status.conf create mode 100755 herbstluftwm/panel.sh create mode 100644 nnn/.gitignore create mode 160000 nvim create mode 100644 ranger/plugins/__init__.py create mode 160000 ranger/plugins/zoxide diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..866b221 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +logs +*.log +log + +__pycache__ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..8c050ab --- /dev/null +++ b/.gitmodules @@ -0,0 +1,11 @@ +[submodule "alacritty/themes"] + path = alacritty/themes + url = https://github.com/alacritty/alacritty-theme + +[submodule "nvim"] + path = nvim + url = git@github.com:PoetryInCode/nvim.git + +[submodule "ranger/plugins/zoxide"] + path = ranger/plugins/zoxide + url = git@github.com:jchook/ranger-zoxide.git diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b0fd8a1 --- /dev/null +++ b/Makefile @@ -0,0 +1,40 @@ +## +# dotfiles installer +# +# @file +# @version 0.1 + +all: $(CFG_DIR) + +LN=ln -sf +PWD=$(realpath .) + +CFG_DIR:=~/.config + +define link + ln -sf $(PWD)/$* $(CFG_DIR) +endef + +%-install: $(CFG_DIR) + $(link) + +$(CFG_DIR): + mkdir -p $@ + +nvim-install: $(PWD)/nvim/LICENSE + git submodule sync nvim + $(link) + +ranger-install: $(PWD)/ranger/plugins/zoxide/LICENSE.md + git submodule sync ./ranger/plugins/zoxide + $(link) + +update: + git pull + git submodule sync --recursive + +install-all: alacritty-install config-install doom-install herbstluftwm-install nnn-install nvim-install ranger-install + +.PHONY: %-install update all install-all + +# end diff --git a/alacritty/alacritty.toml b/alacritty/alacritty.toml new file mode 100644 index 0000000..8a55847 --- /dev/null +++ b/alacritty/alacritty.toml @@ -0,0 +1,9 @@ + +[font] +normal={ family="Maple Mono NF" } + +[general] +import = [ + #"~/.config/alacritty/themes/themes/alacritty_0_12.toml" + "~/.config/alacritty/alacritty_0_12.toml" +] diff --git a/alacritty/alacritty_0_12.toml b/alacritty/alacritty_0_12.toml new file mode 100644 index 0000000..434db48 --- /dev/null +++ b/alacritty/alacritty_0_12.toml @@ -0,0 +1,44 @@ +# Alacritty's default color scheme pre-0.13 (based on tomorrow_night) +# https://github.com/alacritty/alacritty/blob/v0.12.3/alacritty/src/config/color.rs + +[colors.primary] +foreground = "#c5c8c6" +background = "#1d1f21" + +[colors.normal] +black = "#1d1f21" +red = "#cc6666" +green = "#b5bd68" +yellow = "#f0c674" +blue = "#81a2be" +magenta = "#b294bb" +cyan = "#8abeb7" +white = "#c5c8c6" + +[colors.bright] +black = "#666666" +red = "#d54e53" +green = "#b9ca4a" +yellow = "#e7c547" +blue = "#7aa6da" +magenta = "#c397d8" +cyan = "#70c0b1" +white = "#eaeaea" + +[colors.dim] +black = "#131415" +red = "#864343" +green = "#777c44" +yellow = "#9e824c" +blue = "#556a7d" +magenta = "#75617b" +cyan = "#5b7d78" +white = "#828482" + +[colors.hints] +start = { foreground = "#1d1f21", background = "#e9ff5e" } +end = { foreground = "#e9ff5e", background = "#1d1f21" } + +[colors.search] +matches = { foreground = "#000000", background = "#ffffff" } +focused_match = { foreground = "#ffffff", background = "#000000" } diff --git a/alacritty/themes b/alacritty/themes new file mode 160000 index 0000000..687675f --- /dev/null +++ b/alacritty/themes @@ -0,0 +1 @@ +Subproject commit 687675f3f2245c80ff8bfe8180b0eb40dfc0bc86 diff --git a/bashrc b/bashrc new file mode 100644 index 0000000..f5fa610 --- /dev/null +++ b/bashrc @@ -0,0 +1,42 @@ +# .bashrc + +[[ $- != *i* ]] && return # If not running interactively, don't do anything + +##### Load Secrets ##### +secretfile="$HOME/.bashrc.setkeys" +[ ! -f "$secretfile" ] && ( + echo "$secretfile does not exist, creating it" + touch $secretfile + chmod 660 $secretfile +) +. $secretfile # Load the secret file + +## List of secrets ## +export VULTR_API_KEY +## End secrets list ## +##### End Secrets ##### + +PS1='\n[`date "+%a %b %Y"`] \w\n\[\033[32m\]\u@\h\[\033[37m\] \$ ' + +# Functions are more portable than alias +function ls() { exa $@; } +function la() { ls -la $@; } + +function proxy() { ssh -N -v -D 5555 saw@solow.xyz; } +function ec() { emacsclient -t $@; } + +function reload() { . ~/.bashrc; } + +eval "$(zoxide init bash)" + +. "$HOME/.cargo/env" + +### PATH entries ### +PATH="${PATH}:/usr/local/bin" +PATH="${PATH}:${HOME}/.config/emacs/bin/" +PATH="${PATH}:/usr/lib/jvm/default-jdk/bin/" +export PATH +### End PATH entries ### + +export EDITOR=nvim +export NNN_OPENER="${HOME}/.local/bin/opener.sh" diff --git a/doom/config.el b/doom/config.el new file mode 100644 index 0000000..d02ae30 --- /dev/null +++ b/doom/config.el @@ -0,0 +1,77 @@ +;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- + +;; Place your private configuration here! Remember, you do not need to run 'doom +;; sync' after modifying this file! + + +;; Some functionality uses this to identify you, e.g. GPG configuration, email +;; clients, file templates and snippets. It is optional. +;; (setq user-full-name "John Doe" +;; user-mail-address "john@doe.com") + +;; Doom exposes five (optional) variables for controlling fonts in Doom: +;; +;; - `doom-font' -- the primary font to use +;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) +;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for +;; presentations or streaming. +;; - `doom-symbol-font' -- for symbols +;; - `doom-serif-font' -- for the `fixed-pitch-serif' face +;; +;; See 'C-h v doom-font' for documentation and more examples of what they +;; accept. For example: +;; +;;(setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light) +;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13)) +(setq doom-font (font-spec :family "Maple Mono NF" :size 13 :weight 'Regular)) +;; +;; If you or Emacs can't find your font, use 'M-x describe-font' to look them +;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to +;; refresh your font settings. If Emacs still can't find your font, it likely +;; wasn't installed correctly. Font issues are rarely Doom issues! + +;; There are two ways to load a theme. Both assume the theme is installed and +;; available. You can either set `doom-theme' or manually load a theme with the +;; `load-theme' function. This is the default: +(setq doom-theme 'doom-one) + +;; This determines the style of line numbers in effect. If set to `nil', line +;; numbers are disabled. For relative line numbers, set this to `relative'. +(setq display-line-numbers-type t) + +;; If you use `org' and don't want your org files in the default location below, +;; change `org-directory'. It must be set before org loads! +(setq org-directory "~/org/") + + +;; Whenever you reconfigure a package, make sure to wrap your config in an +;; `after!' block, otherwise Doom's defaults may override your settings. E.g. +;; +;; (after! PACKAGE +;; (setq x y)) +;; +;; The exceptions to this rule: +;; +;; - Setting file/directory variables (like `org-directory') +;; - Setting variables which explicitly tell you to set them before their +;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). +;; - Setting doom variables (which start with 'doom-' or '+'). +;; +;; Here are some additional functions/macros that will help you configure Doom. +;; +;; - `load!' for loading external *.el files relative to this one +;; - `use-package!' for configuring packages +;; - `after!' for running code after a package has loaded +;; - `add-load-path!' for adding directories to the `load-path', relative to +;; this file. Emacs searches the `load-path' when you load packages with +;; `require' or `use-package'. +;; - `map!' for binding new keys +;; +;; To get information about any of these functions/macros, move the cursor over +;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). +;; This will open documentation for it, including demos of how they are used. +;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, +;; etc). +;; +;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how +;; they are implemented. diff --git a/doom/init.el b/doom/init.el new file mode 100644 index 0000000..54e25a3 --- /dev/null +++ b/doom/init.el @@ -0,0 +1,194 @@ +;;; init.el -*- lexical-binding: t; -*- + +;; This file controls what Doom modules are enabled and what order they load +;; in. Remember to run 'doom sync' after modifying it! + +;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's +;; documentation. There you'll find a link to Doom's Module Index where all +;; of our modules are listed, including what flags they support. + +;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or +;; 'C-c c k' for non-vim users) to view its documentation. This works on +;; flags as well (those symbols that start with a plus). +;; +;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its +;; directory (for easy access to its source code). + +(doom! :input + ;;bidi ; (tfel ot) thgir etirw uoy gnipleh + ;;chinese + ;;japanese + ;;layout ; auie,ctsrnm is the superior home row + + :completion + company ; the ultimate code completion backend + (corfu +orderless) ; complete with cap(f), cape and a flying feather! + ;;helm ; the *other* search engine for love and life + ;;ido ; the other *other* search engine... + ;;ivy ; a search engine for love and life + vertico ; the search engine of the future + + :ui + ;;deft ; notational velocity for Emacs + doom ; what makes DOOM look the way it does + doom-dashboard ; a nifty splash screen for Emacs + doom-quit ; DOOM quit-message prompts when you quit Emacs + (emoji +unicode) ; 🙂 + hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + indent-guides ; highlighted indent columns + ligatures ; ligatures and symbols to make your code pretty again + ;;minimap ; show a map of the code on the side + modeline ; snazzy, Atom-inspired modeline, plus API + nav-flash ; blink cursor line after big motions + ;;neotree ; a project drawer, like NERDTree for vim + ophints ; highlight the region an operation acts on + (popup +defaults) ; tame sudden yet inevitable temporary windows + ;;tabs ; a tab bar for Emacs + treemacs ; a project drawer, like neotree but cooler + unicode ; extended unicode support for various languages + (vc-gutter +pretty) ; vcs diff in the fringe + vi-tilde-fringe ; fringe tildes to mark beyond EOB + window-select ; visually switch windows + workspaces ; tab emulation, persistence & separate workspaces + ;;zen ; distraction-free coding or writing + + :editor + (evil +everywhere); come to the dark side, we have cookies + file-templates ; auto-snippets for empty files + fold ; (nigh) universal code folding + ;;(format +onsave) ; automated prettiness + ;;god ; run Emacs commands without modifier keys + ;;lispy ; vim for lisp, for people who don't like vim + ;;multiple-cursors ; editing in many places at once + ;;objed ; text object editing for the innocent + ;;parinfer ; turn lisp into python, sort of + ;;rotate-text ; cycle region at point between text candidates + snippets ; my elves. They type so I don't have to + ;;word-wrap ; soft wrapping with language-aware indent + + :emacs + dired ; making dired pretty [functional] + electric ; smarter, keyword-based electric-indent + eww ; the internet is gross + ibuffer ; interactive buffer management + undo ; persistent, smarter undo for your inevitable mistakes + vc ; version-control and Emacs, sitting in a tree + + :term + ;;eshell ; the elisp shell that works everywhere + ;;shell ; simple shell REPL for Emacs + ;;term ; basic terminal emulator for Emacs + ;;vterm ; the best terminal emulation in Emacs + + :checkers + syntax ; tasing you for every semicolon you forget + ;;(spell +flyspell) ; tasing you for misspelling mispelling + ;;grammar ; tasing grammar mistake every you make + + :tools + ;;ansible + ;;biblio ; Writes a PhD for you (citation needed) + ;;collab ; buffers with friends + ;;debugger ; FIXME stepping through code, to help you add bugs + ;;direnv + ;;docker + editorconfig ; let someone else argue about tabs vs spaces + ;;ein ; tame Jupyter notebooks with emacs + (eval +overlay) ; run code, run (also, repls) + lookup ; navigate your code and its documentation + lsp ; M-x vscode + magit ; a git porcelain for Emacs + make ; run make tasks from Emacs + pass ; password manager for nerds + ;;pdf ; pdf enhancements + ;;prodigy ; FIXME managing external services & code builders + ;;terraform ; infrastructure as code + ;;tmux ; an API for interacting with tmux + tree-sitter ; syntax and parsing, sitting in a tree... + upload ; map local to remote projects via ssh/ftp + + :os + (:if (featurep :system 'macos) macos) ; improve compatibility with macOS + tty ; improve the terminal Emacs experience + + :lang + ;;agda ; types of types of types of types... + ;;beancount ; mind the GAAP + (cc +lsp) ; C > C++ == 1 + ;;clojure ; java with a lisp + ;;common-lisp ; if you've seen one lisp, you've seen them all + ;;coq ; proofs-as-programs + ;;crystal ; ruby at the speed of c + ;;csharp ; unity, .NET, and mono shenanigans + data ; config/data formats + ;;(dart +flutter) ; paint ui and not much else + ;;dhall + ;;elixir ; erlang done right + ;;elm ; care for a cup of TEA? + emacs-lisp ; drown in parentheses + ;;erlang ; an elegant language for a more civilized age + ;;ess ; emacs speaks statistics + ;;factor + ;;faust ; dsp, but you get to keep your soul + ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) + ;;fsharp ; ML stands for Microsoft's Language + ;;fstar ; (dependent) types and (monadic) effects and Z3 + ;;gdscript ; the language you waited for + (go +lsp) ; the hipster dialect + ;;(graphql +lsp) ; Give queries a REST + ;;(haskell +lsp) ; a language that's lazier than I am + ;;hy ; readability of scheme w/ speed of python + ;;idris ; a language you can depend on + json ; At least it ain't XML + ;;(java +lsp) ; the poster child for carpal tunnel syndrome + ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) + ;;julia ; a better, faster MATLAB + ;;kotlin ; a better, slicker Java(Script) + ;;latex ; writing papers in Emacs has never been so fun + ;;lean ; for folks with too much to prove + ;;ledger ; be audit you can be + lua ; one-based indices? one-based indices + markdown ; writing docs for people to ignore + ;;nim ; python + lisp at the speed of c + ;;nix ; I hereby declare "nix geht mehr!" + ;;ocaml ; an objective camel + org ; organize your plain life in plain text + ;;php ; perl's insecure younger brother + ;;plantuml ; diagrams for confusing people more + ;;graphviz ; diagrams for confusing yourself even more + ;;purescript ; javascript, but functional + python ; beautiful is better than ugly + ;;qt ; the 'cutest' gui framework ever + ;;racket ; a DSL for DSLs + ;;raku ; the artist formerly known as perl6 + ;;rest ; Emacs as a REST client + ;;rst ; ReST in peace + ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} + (rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;;scala ; java, but good + ;;(scheme +guile) ; a fully conniving family of lisps + sh ; she sells {ba,z,fi}sh shells on the C xor + ;;sml + ;;solidity ; do you need a blockchain? No. + ;;swift ; who asked for emoji variables? + ;;terra ; Earth and Moon in alignment for performance. + web ; the tubes + yaml ; JSON, but readable + ;;zig ; C, but simpler + + :email + ;;(mu4e +org +gmail) + ;;notmuch + ;;(wanderlust +gmail) + wanderlust + + :app + ;;calendar + ;;emms + ;;everywhere ; *leave* Emacs!? You must be joking + ;;irc ; how neckbeards socialize + ;;(rss +org) ; emacs as an RSS reader + + :config + ;;literate + (default +bindings +smartparens)) diff --git a/doom/packages.el b/doom/packages.el new file mode 100644 index 0000000..b3322c7 --- /dev/null +++ b/doom/packages.el @@ -0,0 +1,49 @@ +;; -*- no-byte-compile: t; -*- +;;; $DOOMDIR/packages.el + +;; To install a package with Doom you must declare them here and run 'doom sync' +;; on the command line, then restart Emacs for the changes to take effect -- or + + +;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: +;; (package! some-package) + +;; To install a package directly from a remote git repo, you must specify a +;; `:recipe'. You'll find documentation on what `:recipe' accepts here: +;; https://github.com/radian-software/straight.el#the-recipe-format +;; (package! another-package +;; :recipe (:host github :repo "username/repo")) + +;; If the package you are trying to install does not contain a PACKAGENAME.el +;; file, or is located in a subdirectory of the repo, you'll need to specify +;; `:files' in the `:recipe': +;; (package! this-package +;; :recipe (:host github :repo "username/repo" +;; :files ("some-file.el" "src/lisp/*.el"))) + +;; If you'd like to disable a package included with Doom, you can do so here +;; with the `:disable' property: +;; (package! builtin-package :disable t) + +;; You can override the recipe of a built in package without having to specify +;; all the properties for `:recipe'. These will inherit the rest of its recipe +;; from Doom or MELPA/ELPA/Emacsmirror: +;; (package! builtin-package :recipe (:nonrecursive t)) +;; (package! builtin-package-2 :recipe (:repo "myfork/package")) + +;; Specify a `:branch' to install a package from a particular branch or tag. +;; This is required for some packages whose default branch isn't 'master' (which +;; our package manager can't deal with; see radian-software/straight.el#279) +;; (package! builtin-package :recipe (:branch "develop")) + +;; Use `:pin' to specify a particular commit to install. +;; (package! builtin-package :pin "1a2b3c4d5e") + + +;; Doom's packages are pinned to a specific commit and updated from release to +;; release. The `unpin!' macro allows you to unpin single packages... +;; (unpin! pinned-package) +;; ...or multiple packages +;; (unpin! pinned-package another-pinned-package) +;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) +;; (unpin! t) diff --git a/herbstluftwm/autostart b/herbstluftwm/autostart new file mode 100755 index 0000000..eec6366 --- /dev/null +++ b/herbstluftwm/autostart @@ -0,0 +1,250 @@ +#!/usr/bin/env bash + +# this is a simple config for herbstluftwm + +hc() { + herbstclient "$@" +} + +TERMINAL=alacritty + +hc emit_hook reload + +xsetroot -solid '#5A8E3A' + +# remove all existing keybindings +hc keyunbind --all + +# keybindings +# if you have a super key you will be much happier with Mod set to Mod4 +Mod=Mod1 # Use alt as the main modifier +#Mod=Mod4 # Use the super key as the main modifier + +hc keybind $Mod-Shift-q close +hc keybind $Mod-Shift-r reload +hc keybind $Mod-Shift-e quit +hc keybind $Mod-Return spawn "${TERMINAL:-xterm}" # use your $TERMINAL with xterm as fallback + +hc keybind $Mod-d spawn "dmenu_run" + +# basic movement in tiling and floating mode +# focusing clients +hc keybind $Mod-Left focus left +hc keybind $Mod-Down focus down +hc keybind $Mod-Up focus up +hc keybind $Mod-Right focus right +hc keybind $Mod-h focus left +hc keybind $Mod-j focus down +hc keybind $Mod-k focus up +hc keybind $Mod-l focus right + +# moving clients in tiling and floating mode +hc keybind $Mod-Shift-Left shift left +hc keybind $Mod-Shift-Down shift down +hc keybind $Mod-Shift-Up shift up +hc keybind $Mod-Shift-Right shift right +hc keybind $Mod-Shift-h shift left +hc keybind $Mod-Shift-j shift down +hc keybind $Mod-Shift-k shift up +hc keybind $Mod-Shift-l shift right + +# splitting frames +# create an empty frame at the specified direction +hc keybind $Mod-u split bottom 0.5 +hc keybind $Mod-o split right 0.5 +# let the current frame explode into subframes +hc keybind $Mod-Control-space split explode + +# resizing frames and floating clients +resizestep=0.02 +hc keybind $Mod-Control-h resize left +$resizestep +hc keybind $Mod-Control-j resize down +$resizestep +hc keybind $Mod-Control-k resize up +$resizestep +hc keybind $Mod-Control-l resize right +$resizestep +hc keybind $Mod-Control-Left resize left +$resizestep +hc keybind $Mod-Control-Down resize down +$resizestep +hc keybind $Mod-Control-Up resize up +$resizestep +hc keybind $Mod-Control-Right resize right +$resizestep + +# tags +tag_names=({1..9}) +tag_keys=({1..9} 0) + +hc rename default "${tag_names[0]}" || true +for i in "${!tag_names[@]}"; do + hc add "${tag_names[$i]}" + key="${tag_keys[$i]}" + if [ -n "$key" ]; then + hc keybind "$Mod-$key" use_index "$i" + hc keybind "$Mod-Shift-$key" move_index "$i" + fi +done + +# cycle through tags +hc keybind $Mod-period use_index +1 --skip-visible +hc keybind $Mod-comma use_index -1 --skip-visible + +# layouting +hc keybind $Mod-r remove +hc keybind $Mod-s floating toggle +hc keybind $Mod-f fullscreen toggle +hc keybind $Mod-Shift-f set_attr clients.focus.floating toggle +hc keybind $Mod-Shift-d set_attr clients.focus.decorated toggle +hc keybind $Mod-Shift-m set_attr clients.focus.minimized true +hc keybind $Mod-Control-m jumpto last-minimized +hc keybind $Mod-p pseudotile toggle +# The following cycles through the available layouts within a frame, but skips +# layouts, if the layout change wouldn't affect the actual window positions. +# I.e. if there are two windows within a frame, the grid layout is skipped. +hc keybind $Mod-space \ + or , and . compare tags.focus.curframe_wcount = 2 \ + . cycle_layout +1 vertical horizontal max vertical grid \ + , cycle_layout +1 + +# mouse +hc mouseunbind --all +hc mousebind $Mod-Button1 move +hc mousebind $Mod-Button2 zoom +hc mousebind $Mod-Button3 resize + +# focus +hc keybind $Mod-BackSpace cycle_monitor +hc keybind $Mod-Tab cycle_all +1 +hc keybind $Mod-Shift-Tab cycle_all -1 +hc keybind $Mod-c cycle +hc keybind $Mod-i jumpto urgent + +# theme +hc attr theme.tiling.reset 1 +hc attr theme.floating.reset 1 +hc set frame_border_active_color '#222222cc' +hc set frame_border_normal_color '#101010cc' +hc set frame_bg_normal_color '#565656aa' +hc set frame_bg_active_color '#345F0Caa' +hc set frame_border_width 1 +hc set show_frame_decorations 'focused_if_multiple' +hc set frame_bg_transparent on +hc set frame_transparent_width 5 +hc set frame_gap 4 + +hc attr theme.title_height 15 +hc attr theme.title_when always +hc attr theme.title_font 'Dejavu Sans:pixelsize=12' # example using Xft +# hc attr theme.title_font '-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*' +hc attr theme.title_depth 3 # space below the title's baseline +hc attr theme.active.color '#345F0Cef' +hc attr theme.title_color '#ffffff' +hc attr theme.normal.color '#323232dd' +hc attr theme.urgent.color '#7811A1dd' +hc attr theme.tab_color '#1F1F1Fdd' +hc attr theme.active.tab_color '#2B4F0Add' +hc attr theme.active.tab_outer_color '#6C8257dd' +hc attr theme.active.tab_title_color '#ababab' +hc attr theme.normal.title_color '#898989' +hc attr theme.inner_width 1 +hc attr theme.inner_color black +hc attr theme.border_width 3 +hc attr theme.floating.border_width 4 +hc attr theme.floating.outer_width 1 +hc attr theme.floating.outer_color black +hc attr theme.active.inner_color '#789161' +hc attr theme.urgent.inner_color '#9A65B0' +hc attr theme.normal.inner_color '#606060' +# copy inner color to outer_color +for state in active urgent normal; do + hc substitute C theme.${state}.inner_color \ + attr theme.${state}.outer_color C +done +hc attr theme.tiling.outer_width 1 +hc attr theme.background_color '#141414' + +hc set window_gap 0 +hc set frame_padding 0 +hc set smart_window_surroundings off +hc set smart_frame_surroundings on +hc set mouse_recenter_gap 0 + +# rules +hc unrule -F +#hc rule class=XTerm tag=3 # move all xterms to tag 3 +hc rule focus=on # normally focus new clients +hc rule floatplacement=smart +#hc rule focus=off # normally do not focus new clients +# give focus to most common terminals +#hc rule class~'(.*[Rr]xvt.*|.*[Tt]erm|Konsole)' focus=on +hc rule windowtype~'_NET_WM_WINDOW_TYPE_(DIALOG|UTILITY|SPLASH)' floating=on +hc rule windowtype='_NET_WM_WINDOW_TYPE_DIALOG' focus=on +hc rule windowtype~'_NET_WM_WINDOW_TYPE_(NOTIFICATION|DOCK|DESKTOP)' manage=off +hc rule fixedsize floating=on + +hc set tree_style '╾│ ├└╼─┐' + +# unlock, just to be sure +hc unlock + +# do multi monitor setup here, e.g.: +# hc set_monitors 1280x1024+0+0 1280x1024+1280+0 +# or simply: +# hc detect_monitors + +panel_logs="$HOME/.config/herbstluftwm/logs" +mkdir -p $panel_logs + +# find the panel +panel=~/.config/herbstluftwm/panel.sh +[ -x "$panel" ] || panel=/etc/xdg/herbstluftwm/panel.sh +for monitor in $(hc list_monitors | cut -d: -f1); do + # start it on each monitor + "$panel" "$monitor" &>"${panel_logs}/bar.${monitor}.log" & +done + +# ------------------------------ +# Set up environment here +# ------------------------------ + +xset r rate 200 30 + +nitrogen --restore + +# ------------------------------ +# Long-running processes +# ------------------------------ + +# Path to the PID files +SCREENSAVERPIDFILE="/tmp/screensaver.xautolock.pid" +LOCKSCREENPIDFILE="/tmp/lockscreen.xautolock.pid" + +PIPEWIREPIDFILE="/tmp/pipewire.pid" +PICOMPIDFILE="/tmp/picom.pid" +REDSHIFTPIDFILE="/tmp/redshift.pid" + +# Start xautolock if not already running +if [ ! -f $SCREENSAVERPIDFILE ] || ! kill -0 $(cat $SCREENSAVERPIDFILE) 2>/dev/null; then + xautolock -time 5 -corners +0+0 -locker "~/.local/bin/screensaver.sh" -detectsleep & + echo $! >$SCREENSAVERPIDFILE +fi + +# Start PipeWire if not already running +if [ ! -f $PIPEWIREPIDFILE ] || ! kill -0 $(cat $PIPEWIREPIDFILE) 2>/dev/null; then + pipewire & + echo $! >$PIPEWIREPIDFILE +fi + +# Start Picom if not already running +if [ ! -f $PICOMPIDFILE ] || ! kill -0 $(cat $PICOMPIDFILE) 2>/dev/null; then + picom & + echo $! >$PICOMPIPIDFILE +fi + +# Start Picom if not already running +if [ ! -f $REDSHIFTPIDFILE ] || ! kill -0 $(cat $REDSHIFTPIDFILE) 2>/dev/null; then + redshift -l "42:-84" & + echo $! >$REDSHIFTPIDFILE +fi + +pgrep gnome-keyring || gnome-keyring-daemon --start +pgrep nextcloud || nextcloud --background +emacs --daemon & +# ------------------------------ +# Autostart gui applications +# ------------------------------ diff --git a/herbstluftwm/i3status.conf b/herbstluftwm/i3status.conf new file mode 100644 index 0000000..15b26f5 --- /dev/null +++ b/herbstluftwm/i3status.conf @@ -0,0 +1,41 @@ +general { + output_format = "dzen2" + colors = true + interval = 5 +} + +order += "ipv6" +order += "wireless _first_" +order += "ethernet _first_" +order += "disk /" +order += "load" +order += "memory" +order += "tztime local" + +wireless _first_ { + format_up = "W: (%quality at %essid) %ip" + format_down = "W: down" +} + +ethernet _first_ { + format_up = "E: %ip (%speed)" + format_down = "E: down" +} + +disk "/" { + format = "%avail" +} + +load { + format = "%1min" +} + +memory { + format = "%used / %total" + threshold_degraded = "1G" + format_degraded = "MEMORY < %available" +} + +tztime local { + format = "%Y-%m-%d %H:%M:%S" +} diff --git a/herbstluftwm/panel.sh b/herbstluftwm/panel.sh new file mode 100755 index 0000000..abb7244 --- /dev/null +++ b/herbstluftwm/panel.sh @@ -0,0 +1,56 @@ +# This is a hack of i3-bar with herbstluftwm +# +# I don't remember what exactly is going on, but it works. +# Eventually I need to write my own bar that itegrates better +# with herbstluft because I don't have things like a tag list +# with clickable tag switchers + +# Load fonts in case they haven't been loaded in X (thanks dzen2) +FONT_DIRS=(/usr/share/fonts/TTF/ /usr/share/fonts/OTF/ /usr/share/fonts) +for dir in $FONT_DIRS; do xset +fp $dir; done && xset fp rehash + +CFGDIR="$HOME/.config/herbstluftwm/" + +# ------------------------------- +# Init stuff stolen from other bar script +# ------------------------------- + +quote() { + local q="$(printf '%q ' "$@")" + printf '%s' "${q% }" +} + +hc_quoted="$(quote "${herbstclient_command[@]:-herbstclient}")" +hc() { "${herbstclient_command[@]:-herbstclient}" "$@"; } +monitor=${1:-0} +geometry=($(hc monitor_rect "$monitor")) +if [ -z "$geometry" ]; then + echo "Invalid monitor $monitor" + exit 1 +fi + +# geometry has the format X Y W H +x=${geometry[0]} +y=${geometry[1]} +mon_width=${geometry[2]} +mon_height=${geometry[3]} + +panel_x=$x +panel_height=16 +panel_width=$mon_width +panel_y=$((mon_height - panel_height)) + +font="-*-fixed-medium-*-*-*-14-*-*-*-*-*-*-*" + +bgcolor=$(hc get frame_border_normal_color | sed 's,^\(\#[0-9a-f]\{6\}\)[0-9a-f]\{2\}$,\1,') +selbg=$(hc get window_border_active_color | sed 's,^\(\#[0-9a-f]\{6\}\)[0-9a-f]\{2\}$,\1,') +selfg='#101010' + +# ------------------------------- + +# Pad the bottom of the monitor for the bar to live +hc pad $monitor 0 0 $panel_height 0 + +i3status -c $CFGDIR/i3status.conf | dzen2 \ + -w $panel_width -x $panel_x -y $panel_y -h $panel_height -ta r \ + -fn "$font" -bg "$bgcolor" -fg '#efefef' diff --git a/nnn/.gitignore b/nnn/.gitignore new file mode 100644 index 0000000..6c7be65 --- /dev/null +++ b/nnn/.gitignore @@ -0,0 +1,3 @@ +bookmarks +sessions +mounts diff --git a/nvim b/nvim new file mode 160000 index 0000000..23d6adc --- /dev/null +++ b/nvim @@ -0,0 +1 @@ +Subproject commit 23d6adc568ca6015f6a76ce834c44517849130b0 diff --git a/ranger/plugins/__init__.py b/ranger/plugins/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ranger/plugins/zoxide b/ranger/plugins/zoxide new file mode 160000 index 0000000..281828d --- /dev/null +++ b/ranger/plugins/zoxide @@ -0,0 +1 @@ +Subproject commit 281828de060299f73fe0b02fcabf4f2f2bd78ab3