From b0c5176f1e8d064ef69d0a5637410e489abaa859 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 4 Feb 2024 21:25:21 +0100 Subject: [PATCH 1/4] git: Add git-bug quick access aliases --- git/.config/sh/alias.d/git.sh | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/git/.config/sh/alias.d/git.sh b/git/.config/sh/alias.d/git.sh index 94df149..8062e3d 100644 --- a/git/.config/sh/alias.d/git.sh +++ b/git/.config/sh/alias.d/git.sh @@ -13,8 +13,6 @@ alias g='git' alias ga='git add' alias gaa='git add --all' alias gai='git add -i' -alias gb='git branch' -alias gbd='git branch -d' alias gc='git commit -v' alias gc!='git commit -v --amend' @@ -96,4 +94,22 @@ else alias gsta='git stash save' fi +if exist git-bug; then + gb() { + if [ "$#" -eq 1 ]; then + git bug show "$1" + else + git bug ls "$@" + fi + } + alias gbt='git bug termui' + + alias gba='git bug add' + alias gbm='git bug comment add' + alias gbc='git bug status close' + + alias gbp='git bug push' + alias gbl='git bug pull' +fi + unset -v git_version From a91f553f58d486e1480434ff6fba24995c87d846 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Sun, 4 Feb 2024 21:26:13 +0100 Subject: [PATCH 2/4] task: Add git-sync script hook Synchronizes a git repository for the taskwarrior data directory, automatically committing any changes after each command; and pushing and pulling on syncing taskwarrior. --- .../.local/share/task/hooks/on-exit.git-sync | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 office/.local/share/task/hooks/on-exit.git-sync diff --git a/office/.local/share/task/hooks/on-exit.git-sync b/office/.local/share/task/hooks/on-exit.git-sync new file mode 100755 index 0000000..9de25c4 --- /dev/null +++ b/office/.local/share/task/hooks/on-exit.git-sync @@ -0,0 +1,39 @@ +#!/bin/sh +# Automatically git commits, pushes and pulls if doable in the taskwarrior data directory +# +# Much of this taken from: https://github.com/mrschyte/taskwarrior-hooks/ +# with much gratitude + +if [ "${DISABLE_HOOKS}" = "true" ] || ! command -v git >/dev/null 2>&1; then + exit 0; +fi + +if [ "$1" != "api:2" ]; then + printf "Taskwarrior uses different data API version than git plugin. Aborting!" 1>&2 + exit 1 +fi + +data_dir="$(echo "$5" | cut -f2 -d:)" +command_run="$(echo "$3" | cut -f2 -d:)" + +# after any command, if there's changes add and commit +if ! git -C "$data_dir" diff --exit-code >/dev/null 2>&1; then + # need to run to fully update tasks that just got done + DISABLE_HOOKS=true env task next >/dev/null 2>&1 + + header="auto: ${2##* }" + msg="full command: $2" + git -C "$data_dir" commit -a -m "$header" -m "$msg" --no-gpg-sign >/dev/null 2>&1 +fi + +if [ "$command_run" = "synchronize" ]; then + DISABLE_HOOKS=true env task sync + + git -C "$data_dir" pull >/dev/null 2>&1 + pull_ret="$?" + git -C "$data_dir" push >/dev/null 2>&1 + push_ret="$?" + if [ "$pull_ret" -eq 0 ] && [ "$push_ret" -eq 0 ]; then + echo Git upstream synchronized. + fi +fi From 20b9d432ac5cd077702358c8a49fd424fbca7841 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Mon, 5 Feb 2024 12:09:23 +0100 Subject: [PATCH 3/4] qutebrowser: Use farside for dynamic redirects The redirector can now be fed with either a list of targets to pick from (as before) or a "farside" entry which points to a farside service redirect or multiple. The dict entry then looks like: ```python "quora": { "source": ["quora.com"], "farside": ["quetre"], } ``` It has the source service url as usual, but then instead of a "target" entry contains a "farside" entry. A redirect dict entry can take both "target" and "farside" entries, but will then always give precedence to farside choices. This should go a long way in helping keep OSS frontends up to date. It now mostly depends on farside entries in turn being updated. One potential concern is the new centralization in relying on farside as the redirect authority. --- qutebrowser/config/redirects.py | 216 ++++++++++++-------------------- 1 file changed, 83 insertions(+), 133 deletions(-) diff --git a/qutebrowser/config/redirects.py b/qutebrowser/config/redirects.py index c4f6868..218db30 100644 --- a/qutebrowser/config/redirects.py +++ b/qutebrowser/config/redirects.py @@ -1,6 +1,8 @@ import random -from urllib import parse import re +from typing import Any, Callable +from urllib import parse + from qutebrowser.api import interceptor from qutebrowser.extensions.interceptors import QUrl, RedirectException from qutebrowser.utils import message @@ -30,157 +32,81 @@ def fixScribePath(url: QUrl): redirects = { "youtube": { "source": ["youtube.com"], - "target": [ - "invidious.no-logs.com", - "inv.citw.lgbt", - "invidious.privacydev.net", - "inv.tux.pizza", - "invidious.einfachzocken.eu", - "invidious.perennialte.ch", - "invidious.fdn.fr", - "invidious.nerdvpn.de", - "inv.zzls.xyz", - "invidious.private.coffee", - "invidious.projectsegfau.lt", - "invidious.lunar.icu", - "yewtu.be", - "iv.melmac.space", - "iv.datura.network", - "piped.kavin.rocks", - ], + "farside": ["invidious"], + }, + "stackoverflow": { + "source": ["stackoverflow.com"], + "farside": ["anonymousoverflow"], }, "lbry": { "source": ["odysee.com"], - "target": [ - "lbry.bcow.xyz", - "odysee.076.ne.jp", - "librarian.pussthecat.org", - "lbry.mutahar.rocks", - "lbry.vern.cc", - ], + "farside": ["librarian"], }, "reddit": { "source": ["reddit.com"], - "target": [ - "teddit.ggc-project.de", - "teddit.kavin.rocks", - "teddit.zaggy.nl", - "teddit.namazso.eu", - "teddit.nautolan.racing", - "teddit.tinfoil-hat.net", - "teddit.domain.glass", - "libreddit.kavin.rocks", - "safereddit.com", - "reddit.invak.id", - "reddit.simo.sh", - "libreddit.strongthany.cc", - "libreddit.domain.glass", - "libreddit.pussthecat.org", - "libreddit.kylrth.com", - "libreddit.privacydev.net", - "l.opnxng.com", - "libreddit.oxymagnesium.com", - "reddit.utsav2.dev", - "libreddit.freedit.eu", - "lr.artemislena.eu", - "snoo.habedieeh.re", - ], + "farside": ["redlib"], + }, + "instagram": { + "source": ["instagram.com"], + "farside": ["proxigram"], }, "twitter": { "source": ["twitter.com"], - "target": [ - "nitter.net", - "nitter.42l.fr", - "nitter.fdn.fr", - "nitter.1d4.us", - "nitter.kavin.rocks", - "nitter.unixfox.eu", - "nitter.namazso.eu", - "nitter.moomoo.me", - "bird.trom.tf", - "nitter.it", - "twitter.censors.us", - "nitter.grimneko.de", - "twitter.076.ne.jp", - "n.l5.ca", - "unofficialbird.com", - "nitter.ungovernable.men", - ], + "farside": ["nitter"], }, "imdb": { "source": ["imdb.com"], - "target": [ - "libremdb.iket.me", - "libremdb.pussthecat.org", - "ld.vern.cc", - "binge.whatever.social", - "libremdb.lunar.icu", - ], + "farside": ["libremdb"], }, "translate": { "source": ["translate.google.com"], - "target": [ - "lingva.ml", - "translate.igna.wtf", - "translate.plausibility.cloud", - "translate.projectsegfau.lt", - "translate.dr460nf1r3.org", - "lingva.garudalinux.org", - "translate.jae.fi", - ], + "farside": ["lingva"], }, "tiktok": { "source": ["tiktok.com"], - "target": [ - "proxitok.pabloferreiro.es", - "proxitok.pussthecat.org", - "tok.habedieeh.re", - "proxitok.privacydev.net", - "proxitok.odyssey346.dev", - "tok.artemislena.eu", - "tok.adminforge.de", - "proxitok.manasiwibi.com", - "tik.hostux.net", - "tt.vern.cc", - "proxitok.mha.fi", - "proxitok.pufe.org", - "proxitok.marcopisco.com", - "cringe.whatever.social", - "proxitok.lunar.icu", - ], + "farside": ["proxitok"], }, "imgur": { "source": ["imgur.com"], - "target": [ - "imgur.artemislena.eu", - "ri.zzls.xyz", - "rimgo.bus-hit.me", - "rimgo.fascinated.cc", - "rimgo.hostux.net", - "rimgo.kling.gg", - "rimgo.lunar.icu", - "rimgo.marcopisco.com", - "rimgo.privacytools.io", - "rimgo.projectsegfau.lt", - "rimgo.pussthecat.org", - "rimgo.totaldarkness.net", - "rimgo.whateveritworks.org", - ], + "farside": ["rimgo"], }, "medium": { "source": ["medium.com"], - "target": [ - "scribe.rip", - "scribe.citizen4.eu", - "scribe.bus-hit.me", - "sc.vern.cc", - ], - "postprocess": fixScribePath, + "farside": ["scribe"], + # "postprocess": fixScribePath + }, + "fandom": { + "source": ["fandom.com"], + "farside": ["breezewiki"], + }, + "quora": { + "source": ["quora.com"], + "farside": ["quetre"], + # "postprocess": lambda url: message.info(f"CALLING QUORA WITH {url}") }, "google": { "source": ["google.com"], "target": [ + "search.albony.xyz", + "search.garudalinux.org", + "search.dr460nf1r3.org", + "s.tokhmi.xyz", + "search.sethforprivacy.com", "whoogle.dcs0.hu", + "gowogle.voring.me", + "whoogle.privacydev.net", + "wg.vern.cc", + "whoogle.hxvy0.gq", + "whoogle.hostux.net", + "whoogle.lunar.icu", + "wgl.frail.duckdns.org", + "whoogle.no-logs.com", + "whoogle.ftw.lol", + "whoogle-search--replitcomreside.repl.co", + "search.notrustverify.ch", + "whoogle.datura.network", + "whoogle.yepserver.xyz", + "search.nezumi.party", ], }, } @@ -199,18 +125,42 @@ def rewrite(request: interceptor.Request) -> None: url = request.request_url if service := _should_be_redirected(url.host()): - # TODO integrate pinging and always surf to fastest? - target = service["target"][random.randint(0, len(service["target"]) - 1)] - if target is not None and url.setHost(target) is not False: - if "postprocess" in service: - url = service["postprocess"](url) - try: - request.redirect(url) - except RedirectException as e: - message.error(str(e)) + if "farside" in service: + url = _farside_redirect(url, _pick_random(service["farside"])) + else: + srv = _pick_random(service["target"]) + url = _target_redirect(url, srv) + try: + request.redirect(url) + except RedirectException as e: + message.error(str(e)) + + if "postprocess" in service and isinstance(service["postprocess"], Callable): + url = service["postprocess"](url) -def _should_be_redirected(host: str, redirects: dict = redirects) -> dict | None: +def _farside_redirect(url: QUrl, service: str) -> QUrl: + try: + url.setHost("farside.link") + url.setPath(f"/{service}{url.path()}") + except RedirectException as e: + message.error(str(e)) + return url + + +def _target_redirect(url: QUrl, target: str) -> QUrl: + if target is not None and url.setHost(target) is not False: + return url + return url + + +def _pick_random(choices: list) -> Any: + return choices[random.randint(0, len(choices) - 1)] + + +def _should_be_redirected( + host: str, redirects: dict = redirects +) -> dict[str, list] | None: for service in redirects.values(): for source in service["source"]: if re.search(source, host): From 22b70a06390950c31c3f86f48a8f727ed8253f9a Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Mon, 5 Feb 2024 14:55:09 +0100 Subject: [PATCH 4/4] nvim: Enter notes dir when calling zettel index When switching the current buffer to the Zettelkasten index page (`ni`), we now also switch the working directory to the corresponding notes directory. --- nvim/.config/nvim/lua/plugins/prose.lua | 4 ++++ nvim/.config/sh/alias.d/neovim.sh | 9 +++++++++ sh/.config/sh/alias | 20 +++++++------------- 3 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 nvim/.config/sh/alias.d/neovim.sh diff --git a/nvim/.config/nvim/lua/plugins/prose.lua b/nvim/.config/nvim/lua/plugins/prose.lua index 4f3e4fb..4a0334d 100644 --- a/nvim/.config/nvim/lua/plugins/prose.lua +++ b/nvim/.config/nvim/lua/plugins/prose.lua @@ -103,6 +103,9 @@ local prose_plugs = { -- simple static markdown linking and link following using zettel IDs { "marty-oehme/zettelkasten.nvim", + dependencies = { + "mickael-menu/zk-nvim", -- for the CD when opening index + }, ft = writing_ft, keys = { { @@ -122,6 +125,7 @@ local prose_plugs = { { "ni", function() + require("zk.commands").get("ZkCd")() require("zettelkasten").index_open() end, desc = "index page", diff --git a/nvim/.config/sh/alias.d/neovim.sh b/nvim/.config/sh/alias.d/neovim.sh new file mode 100644 index 0000000..da610fd --- /dev/null +++ b/nvim/.config/sh/alias.d/neovim.sh @@ -0,0 +1,9 @@ +# v shorthand for neovim +if exist nvim; then + alias v="nvim" + alias vim="nvim" + + # open notes with my vim zettelkasten plugin + # TODO better implementation conditional on zk & zettelkasten existing + alias vn='nvim +"lua require \"zk.commands\".get(\"ZkCd\")()" +"lua require \"zettelkasten\".index_open()"' +fi diff --git a/sh/.config/sh/alias b/sh/.config/sh/alias index 5b628a5..4af2790 100644 --- a/sh/.config/sh/alias +++ b/sh/.config/sh/alias @@ -7,20 +7,14 @@ exist() { type "$1" >/dev/null 2>&1; } # Avoid aliases which I did not create -- unalias EVERYTHING unalias -a -# v shorthand for neovim -if exist nvim; then - alias v="nvim" - alias vim="nvim" - alias vs="nvim -c 'ScratchPad'" # open an empty 'scratchpad' which simply disappears after use - alias vw="nvim -c \"lua require 'zettelkasten'.index_open()\"" # open to personal wiki -elif exist vim; then - alias v="vim" -else - alias v="vi" - alias vim="vi" +if alias v >/dev/null 2>&1; then + if exist vim; then + alias v="vim" + else + alias v="vi" + alias vim="vi" + fi fi -# open notes with my vim zettelkasten plugin -alias vn='v +"lua require \"zettelkasten\".index_open()"' # exit shell mimicks vim alias :q="exit"