« get me outta code hell

dotfiles - Miscellaneous configuration files of my personal use
about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.tmux.conf3
-rw-r--r--.zshrc34
-rw-r--r--apps/Sublime Text 4/Packages/User/Default (OSX).sublime-keymap11
-rw-r--r--apps/Sublime Text 4/Packages/User/HSMusic Editing.py62
-rw-r--r--apps/Sublime Text 4/Packages/User/Markdown.sublime-settings7
-rw-r--r--apps/Sublime Text 4/Packages/User/Preferences.sublime-settings20
-rw-r--r--apps/krita/krita-shortcuts.shortcuts26
-rwxr-xr-xdevice/miniminimini_pre3
-rw-r--r--userstuff/hsmusic/Switch HSMusic websites.user.js71
9 files changed, 223 insertions, 14 deletions
diff --git a/.tmux.conf b/.tmux.conf
index 04760e3..89a5d4b 100644
--- a/.tmux.conf
+++ b/.tmux.conf
@@ -8,6 +8,9 @@ set -sg escape-time 0
 set -g status-style bg=colour235,fg=colour249
 set-window-option -g window-status-current-style fg=colour251,bright
 
+set -g set-titles on
+set -g set-titles-string "#S: #W"
+
 bind '"' split-window -c "#{pane_current_path}"
 bind % split-window -h -c "#{pane_current_path}"
 bind c new-window -c "#{pane_current_path}"
diff --git a/.zshrc b/.zshrc
index 3c92d3b..bfb087f 100644
--- a/.zshrc
+++ b/.zshrc
@@ -115,8 +115,35 @@ export PATH
 
 # //// aliases & non-script functions //////////////////////// <alias-fns> // #
 
+# -- cli shenanigans --
+
+alias tm='tmux attach \; choose-tree -s && exit'
+alias grc='git rebase --continue'
+
+# -- file management utilities --
+
+relink() {
+  inode1=$(ls -i $1 | cut -d " " -f 1) &&
+  inode2=$(ls -i $2 | cut -d " " -f 1) &&
+  if [[ $inode1 == $inode2 ]]; then
+    echo files are already same inode >&2
+  else
+    sha1=$(sha256sum $1 | cut -d " " -f 1) &&
+    sha2=$(sha256sum $2 | cut -d " " -f 1) &&
+    if [[ $sha1 != $sha2 ]]; then
+      echo files have different checksums >&2
+    else
+      rm $2 && ln $1 $2
+    fi
+  fi
+}
+
 # -- hooks into third-party stuff --
 
+if [[ -v DEVICE_HAS_SUBLIME_TEXT ]]; then
+  alias subl='open -a "$DEVICE_SUBLIME_TEXT_INSTALLATION"'
+fi
+
 if [[ -v DEVICE_HAS_VIM ]]; then
   vimhelp() {
     vim -c ":h $1 | only"
@@ -128,3 +155,10 @@ fi
 
 device_postconfig
 
+
+# //// really actually end of file stuff ////////////////////// <eof-step> // #
+
+if [[ -v DEVICE_HAS_SDKMAN ]]; then
+  export SDKMAN_DIR="$DEVICE_SDKMAN_INSTALLATION"
+  source "$DEVICE_SDKMAN_INSTALLATION/bin/sdkman-init.sh"
+fi
diff --git a/apps/Sublime Text 4/Packages/User/Default (OSX).sublime-keymap b/apps/Sublime Text 4/Packages/User/Default (OSX).sublime-keymap
index 7426757..3c842f5 100644
--- a/apps/Sublime Text 4/Packages/User/Default (OSX).sublime-keymap
+++ b/apps/Sublime Text 4/Packages/User/Default (OSX).sublime-keymap
@@ -11,6 +11,10 @@
 		],
 	},
 
+	{ "keys": ["ctrl+super+k"], "command": "next_bookmark" },
+	{ "keys": ["ctrl+shift+super+k"], "command": "prev_bookmark" },
+	{ "keys": ["super+k"], "command": "toggle_bookmark", "args": {"toggle_line": true } },
+
 	// HSMusic wiki tag editing
 	// (bind caps lock to f16 in Karabiner-Elements)
 
@@ -18,6 +22,7 @@
 		"command": "enter_exit_wiki_tag",
 		"context": [
 			{ "key": "project_name", "operator": "regex_contains", "operand": "HSMusic" },
+			{ "key": "file_name", "operator": "regex_contains", "operand": "\\.yaml" },
 		],
 	},
 
@@ -25,6 +30,7 @@
 		"command": "enter_exit_wiki_tag",
 		"context": [
 			{ "key": "project_name", "operator": "regex_contains", "operand": "HSMusic" },
+			{ "key": "file_name", "operator": "regex_contains", "operand": "\\.yaml" },
 		],
 	},
 
@@ -32,6 +38,7 @@
 		"command": "space_in_wiki_tag",
 		"context": [
 			{ "key": "project_name", "operator": "regex_contains", "operand": "HSMusic" },
+			{ "key": "file_name", "operator": "regex_contains", "operand": "\\.yaml" },
 		],
 	},
 
@@ -39,6 +46,7 @@
 		"command": "space_in_wiki_tag",
 		"context": [
 			{ "key": "project_name", "operator": "regex_contains", "operand": "HSMusic" },
+			{ "key": "file_name", "operator": "regex_contains", "operand": "\\.yaml" },
 		],
 	},
 
@@ -46,6 +54,7 @@
 		"command": "exit_wiki_tag",
 		"context": [
 			{ "key": "project_name", "operator": "regex_contains", "operand": "HSMusic" },
+			{ "key": "file_name", "operator": "regex_contains", "operand": "\\.yaml" },
 			{ "key": "panel_has_focus", "operator": "not_equal" },
 			{ "key": "overlay_has_focus", "operator": "not_equal" },
 		],
@@ -55,6 +64,7 @@
 		"command": "bold_wiki_text",
 		"context": [
 			{ "key": "project_name", "operator": "regex_contains", "operand": "HSMusic" },
+			{ "key": "file_name", "operator": "regex_contains", "operand": "\\.yaml" },
 			{ "key": "panel_has_focus", "operator": "not_equal" },
 			{ "key": "overlay_has_focus", "operator": "not_equal" },
 		],
@@ -64,6 +74,7 @@
 		"command": "insert_line_break_in_wiki_text",
 		"context": [
 			{ "key": "project_name", "operator": "regex_contains", "operand": "HSMusic" },
+			{ "key": "file_name", "operator": "regex_contains", "operand": "\\.yaml" },
 			{ "key": "panel_has_focus", "operator": "not_equal" },
 			{ "key": "overlay_has_focus", "operator": "not_equal" },
 		],
diff --git a/apps/Sublime Text 4/Packages/User/HSMusic Editing.py b/apps/Sublime Text 4/Packages/User/HSMusic Editing.py
index 41c6408..9b8c369 100644
--- a/apps/Sublime Text 4/Packages/User/HSMusic Editing.py
+++ b/apps/Sublime Text 4/Packages/User/HSMusic Editing.py
@@ -22,6 +22,25 @@ class ProjectSpecificKeyBinding(sublime_plugin.EventListener):
     elif operator == sublime.QueryOperator.NOT_REGEX_CONTAINS:
       return not re.search(operand, current_project_name)
 
+class FileSpecificKeyBinding(sublime_plugin.EventListener):
+  def on_query_context(self, view, key, operator, operand, match_all):
+    current_file_name = view.file_name()
+
+    if not current_file_name:
+      return None
+
+    if key != "file_name" and os.path.isfile(current_file_name):
+      return None
+
+    if operator == sublime.OP_EQUAL:
+      return current_file_name == operand
+    elif operator == sublime.OP_NOT_EQUAL:
+      return current_file_name != operand
+    elif operator == sublime.QueryOperator.REGEX_CONTAINS:
+      return re.search(operand, current_file_name)
+    elif operator == sublime.QueryOperator.NOT_REGEX_CONTAINS:
+      return not re.search(operand, current_file_name)
+
 class _CursorAdaptiveCommand(sublime_plugin.TextCommand):
   handle_region_fallback = ('keep',)
 
@@ -170,7 +189,7 @@ def _normalize_region(region):
 def _match_tag_in_progress(view, region):
   region = _normalize_region(region)
   to_start = sublime.Region(view.line(region).a, region.a)
-  match = re.search('(\[\[(?:(?!]]|\|).)*)$', view.substr(to_start))
+  match = re.search(r'(\[\[(?:(?!]]|\|).)*)$', view.substr(to_start))
   if match:
     return match.group(1)
 
@@ -180,13 +199,13 @@ def _match_regex_ahead_same_line(view, region, regex):
   return re.search(regex, view.substr(to_end))
 
 def _match_rest_of_tag_in_progress(view, region):
-  regex = '^((?:(?!\[\[).)*]])'
+  regex = r'^((?:(?!\[\[).)*]])'
   match = _match_regex_ahead_same_line(view, region, regex)
   if match:
     return match.group(1)
 
 def _match_through_closing_html_tag(view, region, tag):
-  regex = f'^(.*?</{tag}>)'
+  regex = rf'^(.*?</{tag}>)'
   match = _match_regex_ahead_same_line(view, region, regex)
   if match:
     return match.group(1)
@@ -199,7 +218,7 @@ def _consider_reference_cycle(view, region, cycle):
 
   rest_of_tag = _match_rest_of_tag_in_progress(view, region)
 
-  rest_of_ref = re.search('^((?:(?!\|).)*:)', rest_of_tag)
+  rest_of_ref = re.search(r'^((?:(?!\|).)*:)', rest_of_tag)
   if rest_of_ref:
     return ('move', len(rest_of_ref.group(1)))
 
@@ -225,6 +244,35 @@ def _consider_reference_cycle(view, region, cycle):
   else:
     return ('insert', 'right', next_ref + ':', 0)
 
+def _consider_transform_url(view, region):
+  region = _normalize_region(region)
+  selected_text = view.substr(region)
+
+  start_through_selection = sublime.Region(view.line(region).a, region.b)
+  match = re.search(r'https?://\S+$', view.substr(start_through_selection))
+
+  if not match:
+    return None
+
+  # We don't have a convenient way to just replace a selection in one move,
+  # so just move to the end of the selection and try again next time...
+  if selected_text:
+    return ('collapse_move', len(selected_text))
+
+  url = match.group(0)
+  link = None
+
+  hsm = r'(?:https://(?:preview\.|staging\.)?hsmusic\.wiki/|http://localhost:\d+/)'
+
+  match = re.search(hsm + r'(album|track|artist|group|tag|flash)/(.+?)/', url)
+  if match:
+    link = f'[[{match.group(1)}:{match.group(2)}]]'
+
+  if not link:
+    return None
+
+  return ('replace_left', len(url), link, 0, 'right')
+
 def _guess_directory(name):
   directory = name
   directory =                     "-".join(directory.split(" "))
@@ -257,11 +305,15 @@ class ExitWikiTagCommand(_CursorAdaptiveCommand):
     if rest_of_tag:
       return ('collapse_move', len(rest_of_tag))
 
+    transform_url_action = _consider_transform_url(self.view, region)
+    if transform_url_action:
+      return transform_url_action
+
     region = _normalize_region(region)
     to_start = sublime.Region(self.view.line(region).a, region.a)
     to_end = sublime.Region(region.a, self.view.line(region).b)
     if to_start.a != to_start.b and to_end.a != to_end.b:
-      match = re.search('.*?([).,:;!?][).,:;!?"\']*|\\s(?=[(\'"])|[\'"](?=\\s|$)|$)', self.view.substr(to_end))
+      match = re.search(r'.*?([).,:;!?][).,:;!?"\']*|\\s(?=[(\'"])|[\'"](?=\\s|$)|$)', self.view.substr(to_end))
       if match:
         return ('collapse_move', len(match.group(0)))
 
diff --git a/apps/Sublime Text 4/Packages/User/Markdown.sublime-settings b/apps/Sublime Text 4/Packages/User/Markdown.sublime-settings
index 282ef1a..50c3d10 100644
--- a/apps/Sublime Text 4/Packages/User/Markdown.sublime-settings
+++ b/apps/Sublime Text 4/Packages/User/Markdown.sublime-settings
@@ -1,5 +1,9 @@
 // These settings override both User and Default settings for the Markdown syntax
 {
+  "rulers": [80],
+  "ruler_style": "stippled",
+  "wrap_width": 78,
+
   "mini_diff": false,
   "match_brackets": false,
   "auto_match_enabled": false,
@@ -14,6 +18,5 @@
   "caret_extra_bottom": 2,
   "caret_extra_width": 0,
 
-  "light_color_scheme": "Bass D-O.sublime-color-scheme",
-  // "color_scheme": "MarkdownEditor.sublime-color-scheme",
+  "color_scheme": "Packages/Colorsublime - Themes/Humane.tmTheme",
 }
diff --git a/apps/Sublime Text 4/Packages/User/Preferences.sublime-settings b/apps/Sublime Text 4/Packages/User/Preferences.sublime-settings
index c520bcf..f943b86 100644
--- a/apps/Sublime Text 4/Packages/User/Preferences.sublime-settings
+++ b/apps/Sublime Text 4/Packages/User/Preferences.sublime-settings
@@ -9,6 +9,9 @@
 	"scroll_context_lines": 6,
 	"indent_guide_options": ["draw_active"],
 
+	"folder_exclude_patterns": [".git", ".Trash", ".Trash-*", ".tap", "node_modules"],
+	"binary_file_patterns": ["*.jpg", "*.jpeg", "*.png", "*.gif", "*.ttf", "*.tga", "*.dds", "*.ico", "*.eot", "*.pdf", "*.swf", "*.jar", "*.zip", "*.avif"],
+
 	"trim_trailing_white_space_on_save": "not_on_caret",
 	"ensure_newline_at_eof_on_save": true,
 
@@ -16,6 +19,12 @@
 	"wrap_width_style": "min",
 	"draw_white_space": ["selection", "trailing"],
 
+	"always_show_minimap_viewport": true,
+	"draw_minimap_border": true,
+	"minimap_horizontal_scrolling": false,
+
+	"caret_style": "smooth",
+
 	"tab_completion": false,
 	"mini_diff": "auto",
 	"auto_complete": true,
@@ -29,15 +38,12 @@
 
 	"ignored_packages":
 	[
+		"CursorRuler",
 		"Vintage",
 	],
 
 	"theme": "Adaptive.sublime-theme",
-	"color_scheme": "Packages/Colorsublime - Themes/Jellybeams.tmTheme",
-	"dark_color_scheme": "Packages/Theme - Afterglow/Afterglow-twilight.tmTheme",
-	"light_color_scheme": "Celeste.sublime-color-scheme",
-
-	// MarkdownEditing preferences
-	"mde.auto_fold_link.enabled": false,
-	"mde.list_indent_bullets": [],
+	"color_scheme": "auto",
+	"dark_color_scheme": "Packages/Colorsublime - Themes/Jellybeams.tmTheme",
+	"light_color_scheme": "Packages/Github Color Theme/GitHub.tmTheme",
 }
diff --git a/apps/krita/krita-shortcuts.shortcuts b/apps/krita/krita-shortcuts.shortcuts
new file mode 100644
index 0000000..3ca342f
--- /dev/null
+++ b/apps/krita/krita-shortcuts.shortcuts
@@ -0,0 +1,26 @@
+[Shortcuts]
+KisToolSelectElliptical=none
+KisToolSelectOutline=U
+KisToolTransform=S
+KritaFill/KisToolFill=F; B
+KritaSelected/KisToolColorSampler=O
+KritaShape/KisToolBrush=P
+KritaShape/KisToolEllipse=none
+KritaTransform/KisToolMove=M
+RenameCurrentLayer=F2; R
+convert-to-path=none
+create_quick_group=Meta+G
+decrease_brush_size=Shift+[
+edit_redo=Ctrl+Shift+Z; Shift+J
+edit_undo=Ctrl+Z; J
+eraser_preset_action=K
+fullscreen=Meta+Ctrl+F
+increase_brush_size=Shift+]
+increase_opacity=none
+make_brush_color_darker=none
+pathpoint-join=none
+rotate_canvas_left=[
+rotate_canvas_right=]
+show_color_history=none
+show_common_colors=none
+toggle_layer_visibility=N
diff --git a/device/miniminimini_pre b/device/miniminimini_pre
index ad40591..63dcd93 100755
--- a/device/miniminimini_pre
+++ b/device/miniminimini_pre
@@ -21,6 +21,9 @@ export DEVICE_NVM_INSTALLATION="$HOME/.nvm"
 export DEVICE_HAS_PYENV
 export DEVICE_PYENV_CONFIGURATION="$HOME/.pyenv"
 
+export DEVICE_HAS_SDKMAN
+export DEVICE_SDKMAN_INSTALLATION="$HOME/.sdkman"
+
 export DEVICE_HAS_SUBLIME_TEXT
 export DEVICE_SUBLIME_TEXT_INSTALLATION="$HOME/Applications/Development & Editors/Sublime Text.app"
 
diff --git a/userstuff/hsmusic/Switch HSMusic websites.user.js b/userstuff/hsmusic/Switch HSMusic websites.user.js
new file mode 100644
index 0000000..47c2d0b
--- /dev/null
+++ b/userstuff/hsmusic/Switch HSMusic websites.user.js
@@ -0,0 +1,71 @@
+// ==UserScript==
+// @name         Switch HSMusic websites
+// @description  Then try to take over the world!
+// @include      http://localhost:8002/*
+// @match        https://hsmusic.wiki/*
+// @match        https://preview.hsmusic.wiki/*
+// ==/UserScript==
+
+const header = document.getElementById('header');
+const page = header.parentElement;
+const headerContainer = document.createElement('div');
+const customNav = document.createElement('div');
+
+Object.assign(headerContainer.style, {
+    display: 'flex',
+    flexDirection: 'row',
+});
+Object.assign(header.style, {
+    flexGrow: '1',
+});
+Object.assign(customNav.style, {
+    minWidth: '140px',
+    textAlign: 'right',
+});
+
+page.replaceChild(headerContainer, header);
+headerContainer.appendChild(header);
+headerContainer.appendChild(customNav);
+
+const pathname = () => {
+    let p = location.pathname;
+    p = p.replace(/^\/preview-en/, '');
+    return p;
+};
+
+const customNavLink = (text, basenameOrFn) => {
+    const href = typeof basenameOrFn === 'function' ? basenameOrFn() : basenameOrFn + pathname();
+    const link = document.createElement('a');
+    link.appendChild(document.createTextNode(text));
+    link.setAttribute('href', href);
+    customNav.appendChild(link);
+    Object.assign(link.style, {
+        display: 'inline-block',
+        border: '1px dotted var(--primary-color)',
+        borderRadius: '2px',
+        padding: '2px 8px',
+        margin: '2px 2px',
+        background: '#000c',
+    });
+    if (location.href === href) {
+        Object.assign(link.style, {
+            fontWeight: '800',
+            borderStyle: 'solid',
+        });
+    }
+};
+
+customNavLink('L', 'http://localhost:8002');
+customNavLink('P', 'https://preview.hsmusic.wiki');
+customNavLink('R', 'https://hsmusic.wiki');
+
+let match = location.href.match(/album\/([^/]*)/);
+if (match) {
+    customNavLink('G', () => `https://github.com/hsmusic/hsmusic-data/tree/preview/album/${match[1]}.yaml`);
+}
+
+match = location.href.match(/track\/([^/]*)/);
+if (match) {
+    const directory = getComputedStyle(document.body).getPropertyValue('--album-directory');
+    customNavLink('G', () => `https://github.com/hsmusic/hsmusic-data/tree/preview/album/${directory}.yaml`);
+}