From e418e2508f901e174497228ae6170cadcbd376b3 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 25 Nov 2022 16:42:34 +0100 Subject: [PATCH 01/12] git: Add sendmail configuration Added configuration to use git for direct patch contributions through mail. Uses msmtp for mail agent. --- git/.config/git/config | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/git/.config/git/config b/git/.config/git/config index 361923b..a39d586 100644 --- a/git/.config/git/config +++ b/git/.config/git/config @@ -3,7 +3,10 @@ name = Marty Oehme signingkey = 73BA40D5AFAF49C9 [init] - defaultBranch = main + defaultBranch = main +[sendemail] + smtpserver = "/usr/bin/msmtp" + annotate = yes [alias] ignore = "!gitignore -f" pushmerge = "push -o merge_request.merge_when_pipeline_succeeds" # see https://docs.gitlab.com/ce/user/project/push_options.html # merge-when-pipeline-succeeds-alias From ff6dab2c8f1637ac4fd3ac40d958a1b45f205e6c Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 25 Nov 2022 16:45:28 +0100 Subject: [PATCH 02/12] qutebrowser: Add docker hub to search engines Added docker hub search by prefixing search with `docker `. --- qutebrowser/.config/qutebrowser/url.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qutebrowser/.config/qutebrowser/url.py b/qutebrowser/.config/qutebrowser/url.py index 01bc9df..f09f43f 100644 --- a/qutebrowser/.config/qutebrowser/url.py +++ b/qutebrowser/.config/qutebrowser/url.py @@ -8,6 +8,7 @@ c.url.searchengines = { "aur": "https://aur.archlinux.org/packages/?K={}", "d": "https://www.dict.cc/?s={}", "ddg": "https://duckduckgo.com/?q={}", + "docker": "https://hub.docker.com/search?q={}", "dt": "https://www.deepl.com/translator#en/de/{}", "g": "https://www.google.com/search?q={}", "gh": "https://github.com/search?q={}", From 2b9981482f55aa44c2b9d9c026ef7da2e2c00154 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 25 Nov 2022 16:49:40 +0100 Subject: [PATCH 03/12] nvim: Switch to zen-mode and twilight plugins Switched out the old distraction-free writing plugins for neovim variants zen-mode and twilight by folke - they are simple (one command to invoke zen-mode, mapped to `F11`, and that's it), they are written in lua and they work together beautifully (invoking zen-mode also invokes twilight paragraph highlighting). --- nvim/.config/nvim/lua/maps.lua | 3 +-- nvim/.config/nvim/lua/plugins.lua | 16 ++-------------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/nvim/.config/nvim/lua/maps.lua b/nvim/.config/nvim/lua/maps.lua index 8234d08..0869e73 100644 --- a/nvim/.config/nvim/lua/maps.lua +++ b/nvim/.config/nvim/lua/maps.lua @@ -183,8 +183,7 @@ map.x.nore.silent['q'] = 'gq' map.n.nore.silent['Q'] = 'vapJgqap' -- Enter distraction free prose mode with F11 -map.n.nore.silent[''] = ':TZAtaraxis' -map.n.nore.silent[''] = ':TZMinimalist' +map.n.nore.silent[''] = ':ZenMode' -- PLUGIN: fzf-bibtex -- map @@ to automatically insert citation reference at cursor diff --git a/nvim/.config/nvim/lua/plugins.lua b/nvim/.config/nvim/lua/plugins.lua index 3f11bdc..5bc3c37 100644 --- a/nvim/.config/nvim/lua/plugins.lua +++ b/nvim/.config/nvim/lua/plugins.lua @@ -102,20 +102,8 @@ require("packer").startup(function() ft = { "quarto" } } use 'micarmst/vim-spellsync' -- personal dict improvements for git sync - use { -- provide distraction free writing - 'Pocco81/TrueZen.nvim', - config = function() - require("true-zen").setup({ - integrations = { - gitsigns = true, - lualine = true, - tmux = { global = false }, - limelight = true - } - }) - end - } - use { 'junegunn/limelight.vim', event = 'BufRead' } -- provide even distraction free-er writing (lowlight paragraphs) + use { 'folke/zen-mode.nvim', config = require('zen-mode').setup() } -- provide distraction free writing + use 'folke/twilight.nvim' -- provide even distraction free-er writing (lowlight paragraphs) use 'alok/notational-fzf-vim' -- quickly search through the wiki -- languages From 8f6e1994dfa940371fb32a8058f617e298f73419 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 25 Nov 2022 16:53:40 +0100 Subject: [PATCH 04/12] nvim: File formatting --- nvim/.config/nvim/lua/maps.lua | 26 ++++++++++++++------------ nvim/.config/nvim/lua/plug/_format.lua | 13 ++++++------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/nvim/.config/nvim/lua/maps.lua b/nvim/.config/nvim/lua/maps.lua index 0869e73..9db21d3 100644 --- a/nvim/.config/nvim/lua/maps.lua +++ b/nvim/.config/nvim/lua/maps.lua @@ -38,10 +38,12 @@ local function wrap_up() if vim.v.count == 0 then return 'gk' end return 'k' end + local function wrap_down() if vim.v.count == 0 then return 'gj' end return 'j' end + map.n.nore.expr['k'] = wrap_up map.n.nore.expr['j'] = wrap_down @@ -54,7 +56,7 @@ map.i.nore[''] = 'guiw`]a' -- let me save stuff as sudo when I forget to call vim with it map.c.nore['w!!'] = - [[execute 'silent! write !sudo tee % >/dev/null' edit!]] +[[execute 'silent! write !sudo tee % >/dev/null' edit!]] -- yank current filename/filepath to f buffer map.n.nore['yp'] = ':let @p = expand("%")' @@ -123,16 +125,16 @@ map.n.nore['E'] = ':Vifm getcwd()' -- PLUGIN: Telescope GLOBAL FUZZY FINDING -- buffers and files in current workdir map.n.nore['s'] = - [[:lua require 'telescope.builtin'.buffers(require 'telescope.themes'.get_ivy())]] +[[:lua require 'telescope.builtin'.buffers(require 'telescope.themes'.get_ivy())]] -- most recently used / MRU, bound to S since it is essentially a larger -- go-back intention than just buffers map.n.nore['S'] = - [[:lua require 'telescope.builtin'.oldfiles(require 'telescope.themes'.get_ivy())]] +[[:lua require 'telescope.builtin'.oldfiles(require 'telescope.themes'.get_ivy())]] -- fuzzy find files in cwd map.n.nore['f'] = [[:lua require 'telescope.builtin'.find_files()]] -- fuzzy find hidden files in cwd map.n.nore[''] = - [[:lua require 'telescope.builtin'.find_files({hidden=true})]] +[[:lua require 'telescope.builtin'.find_files({hidden=true})]] -- general full-text search in cwd with rg map.n.nore['F'] = [[:lua require 'telescope.builtin'.live_grep()]] @@ -140,25 +142,25 @@ map.n.nore['F'] = [[:lua require 'telescope.builtin'.live_grep()]] map.n.nore['gs'] = [[:lua require 'telescope.builtin'.git_status()]] -- git buffercommits map.n.nore['gb'] = - [[:lua require 'telescope.builtin'.git_bcommits()]] +[[:lua require 'telescope.builtin'.git_bcommits()]] -- git commitlog map.n.nore['gl'] = - [[:lua require 'telescope.builtin'.git_commits()]] +[[:lua require 'telescope.builtin'.git_commits()]] -- helptags map.n.nore[''] = - [[:lua require 'telescope.builtin'.help_tags()]] +[[:lua require 'telescope.builtin'.help_tags()]] -- manpages map.n.nore[''] = - [[:lua require 'telescope.builtin'.man_pages()]] +[[:lua require 'telescope.builtin'.man_pages()]] -- colorschemes map.n.nore[''] = - [[:lua require 'telescope.builtin'.colorscheme(require 'telescope.themes'.get_ivy())]] +[[:lua require 'telescope.builtin'.colorscheme(require 'telescope.themes'.get_ivy())]] -- spell suggestions map.n.nore['z='] = - [[:lua require 'telescope.builtin'.spell_suggest(require 'telescope.themes'.get_ivy())]] +[[:lua require 'telescope.builtin'.spell_suggest(require 'telescope.themes'.get_ivy())]] -- PLUGIN: betterdigraphs -- allow normal digraph insertion on c-k, telescope search on c-k c-k @@ -225,9 +227,9 @@ map.n.nore.silent[''] = "lua require('Navigator').previous()" -- lsp keymaps are set in lsp settings, only for lsp buffers map.i.nore.expr.silent[''] = 'compe#complete()' map.i.expr[''] = - [[vsnip#jumpable(1) ? '(vsnip-jump-next)' : '']] +[[vsnip#jumpable(1) ? '(vsnip-jump-next)' : '']] map.i.expr[''] = - [[vsnip#jumpable(-1) ? '(vsnip-jump-next)' : '']] +[[vsnip#jumpable(-1) ? '(vsnip-jump-next)' : '']] -- PLUGIN: symbols-outline.nvim map.n.nore.silent['o'] = "SymbolsOutline" diff --git a/nvim/.config/nvim/lua/plug/_format.lua b/nvim/.config/nvim/lua/plug/_format.lua index 487b57e..e4cdeac 100644 --- a/nvim/.config/nvim/lua/plug/_format.lua +++ b/nvim/.config/nvim/lua/plug/_format.lua @@ -14,7 +14,7 @@ local prettierfmt = { end } local shfmt = { - function() return {exe = "shfmt", args = {"-i 4"}, stdin = true} end + function() return { exe = "shfmt", args = { "-i 4" }, stdin = true } end } local formatters = { @@ -29,20 +29,19 @@ local formatters = { } end }, - go = {function() return {exe = "goimports", stdin = true} end}, + go = { function() return { exe = "goimports", stdin = true } end }, html = prettierfmt, javascript = prettierfmt, json = prettierfmt, lua = { function() - return - {exe = "lua-format", args = {"--indent-width", 4}, stdin = true} + return { exe = "lua-format", args = { "--indent-width", 4 }, stdin = true } end }, - python = {function() return {exe = "black", args = {"-"}, stdin = true} end}, + python = { function() return { exe = "black", args = { "-" }, stdin = true } end }, rust = { function() - return {exe = "rustfmt", args = {"--emit=stdout"}, stdin = true} + return { exe = "rustfmt", args = { "--emit=stdout" }, stdin = true } end }, sh = shfmt, @@ -50,7 +49,7 @@ local formatters = { zsh = shfmt } -require('formatter').setup({logging = false, filetype = formatters}) +require('formatter').setup({ logging = false, filetype = formatters }) -- Format on save: -- gather filetypes to autocorrect for each activated formatter above From 078578b1737806a91ae15b7e683ffc5fa27aa105 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 25 Nov 2022 16:56:26 +0100 Subject: [PATCH 05/12] nvim: Update buffer navigation maps Updated buffer navigation to make use of the hjkl paradigm instead of the since it adheres closer to vanilla nvim and works better with the new navigation features of Navigator.nvim. --- nvim/.config/nvim/lua/maps.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nvim/.config/nvim/lua/maps.lua b/nvim/.config/nvim/lua/maps.lua index 9db21d3..cc8a371 100644 --- a/nvim/.config/nvim/lua/maps.lua +++ b/nvim/.config/nvim/lua/maps.lua @@ -217,11 +217,11 @@ map.x['ga'] = '(EasyAlign)' map.n['ga'] = '(EasyAlign)' -- PLUGIN: Navigator.nvim -map.n.nore.silent[''] = "lua require('Navigator').left()" -map.n.nore.silent[''] = "lua require('Navigator').up()" -map.n.nore.silent[''] = "lua require('Navigator').right()" -map.n.nore.silent[''] = "lua require('Navigator').down()" -map.n.nore.silent[''] = "lua require('Navigator').previous()" +map.n.nore.silent['h'] = "lua require('Navigator').left()" +map.n.nore.silent['k'] = "lua require('Navigator').up()" +map.n.nore.silent['l'] = "lua require('Navigator').right()" +map.n.nore.silent['j'] = "lua require('Navigator').down()" +map.n.nore.silent['p'] = "lua require('Navigator').previous()" -- PLUGIN: compe.nvim -- lsp keymaps are set in lsp settings, only for lsp buffers From fdc85e5569d11538b00f6f86a0bc51e8912fad29 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 15 Nov 2022 18:36:41 +0100 Subject: [PATCH 06/12] sh: Replace kitty invocations with wezterm --- README.md | 4 ++-- sh/.config/sh/env | 4 ++-- wayland/.config/waybar/config | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index a6bca26..83ce55f 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,8 @@ Enjoy! * [`waybar`](https://github.com/Alexays/Waybar) - Easily customizable statusbar for wayland * [`bemenu`](https://github.com/Cloudef/bemenu) - Extended dmenu replacement for wayland, X11 and ncurses * [`fontconfig`] - System-wide font replacements and styling settings -* [`kitty`](https://sw.kovidgoyal.net/kitty/) - Terminal emulator (GPU accelerated and configurable) -* [`tmux`](https://github.com/tmux/tmux/) - terminal multiplexer +* [`wezterm`](https://wezfurlong.org/wezterm/) - Terminal emulator (fast, understandable and lua configurable) +* [`tmux`](https://github.com/tmux/tmux/) - terminal multiplexer (slowly migrating away in favor of wezterm) * [`nvim`](https://neovim.io/) - Neovim configuration * [`vifm`](https://github.com/vifm/vifm) - vim-like file-manager * [`qutebrowser`](https://github.com/qutebrowser/qutebrowser) - vim-key enabled web browser diff --git a/sh/.config/sh/env b/sh/.config/sh/env index db99a4e..fceba1b 100644 --- a/sh/.config/sh/env +++ b/sh/.config/sh/env @@ -22,7 +22,7 @@ export BIBFILE="${BIBFILE:-$LIBRARYROOT/academia/academia.bib}" # these are my personal 'important' application settings export EDITOR="nvim" export BROWSER="qutebrowser" -export TERMINAL="kitty" +export TERMINAL="wezterm" export PAGER="less" export FILEREADER="zathura" @@ -42,5 +42,5 @@ export SHELL=${SHELL:-/bin/bash} export TERM=xterm-256color if exist fzf; then - export FZF_DEFAULT_OPTS="--bind 'tab:toggle+down,shift-tab:toggle+up,ctrl-g:top,ctrl-t:toggle-preview,ctrl-d:preview-half-page-down,ctrl-u:preview-half-page-up' --color=light -1 -m --delimiter :" + export FZF_DEFAULT_OPTS="--bind 'tab:toggle+down,shift-tab:toggle+up,ctrl-g:top,ctrl-t:toggle-preview,ctrl-d:preview-half-page-down,ctrl-u:preview-half-page-up' --color=light -1 -m --delimiter :" fi diff --git a/wayland/.config/waybar/config b/wayland/.config/waybar/config index 4bd87ed..6ead0b9 100644 --- a/wayland/.config/waybar/config +++ b/wayland/.config/waybar/config @@ -12,7 +12,7 @@ "return-type": "json", "exec": "~/.config/waybar/modules/archupdates 5 json", "interval": 3600, - "on-click": "kitty --class float topgrade" + "on-click": "$TERMINAL start --class float topgrade" }, "backlight": { "device": "intel_backlight", @@ -45,8 +45,8 @@ "warning": 50, "critical": 80 }, - "on-click": "kitty --class float top", - "on-click-right": "kitty --class float glances" + "on-click": "$TERMINAL start --class float top", + "on-click-right": "$TERMINAL start --class float glances" }, "custom/events": { "format": "{}", @@ -115,7 +115,7 @@ "tooltip-format-ethernet": "{ifname} ", "tooltip-format-disconnected": "Disconnected", "max-length": 50, - "on-click": "kitty --class float nmtui", + "on-click": "$TERMINAL start --class float nmtui", // "on-click-right": "sudo rfkill toggle wlan" }, "pulseaudio": { @@ -132,7 +132,7 @@ "default": ["", ""] }, "scroll-step": 1, - "on-click": "kitty --class float pulsemixer", + "on-click": "$TERMINAL start --class float pulsemixer", "on-scroll-up": "pactl set-sink-volume @DEFAULT_SINK@ +1%", "on-scroll-down": "pactl set-sink-volume @DEFAULT_SINK@ -1%" }, @@ -146,7 +146,7 @@ "critical-threshold": 80, // "format-critical": "{temperatureC}° ", "format": "{temperatureC}° ", - "on-click": "kitty --class float watch sensors" + "on-click": "$TERMINAL start --class float watch sensors" }, "tray": { "icon-size": 21, @@ -176,6 +176,6 @@ "exec": "wc -l ~/.local/share/vidl/vidl_queue | cut -d' ' -f1", "exec-if": "[ -f ~/.local/share/vidl/vidl_queue ]", "interval": 5, - "on-click": "kitty --class float nvim ~/.local/share/vidl/vidl_queue" + "on-click": "$TERMINAL start --class float nvim ~/.local/share/vidl/vidl_queue" }, } From cf7d89078733b9e6305ca655e3a2cc3e75952d0a Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 15 Nov 2022 18:39:25 +0100 Subject: [PATCH 07/12] sh: Add timg aliases Added shell aliases for 'image listings' which aims to mimic the `ls` command in a very simple way. Invoke it via `il` to display a grid of all images residing in current directory. Images are being detected not by their extension but by running a `file` operation on, so in very large directories this might take a little (though, your terminal will probably buckle under the weight of displaying thousands of images anyway, so use with care). `IL` provides the same functionality but recurses into an arbitrary amount of subdirectories. Very useful to get an overview of a certain directory and its children but, again, think for a second before using since this could easily spew thousands of pictures into your term. --- sh/.config/sh/alias.d/timg.sh | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 sh/.config/sh/alias.d/timg.sh diff --git a/sh/.config/sh/alias.d/timg.sh b/sh/.config/sh/alias.d/timg.sh new file mode 100644 index 0000000..fb0d7e0 --- /dev/null +++ b/sh/.config/sh/alias.d/timg.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env sh +# Add simple 'image ls' for a directory using timg +# +# Prints a thumbnail gallery right in the terminal. +# WILL stutter when you go crazy in a hundred/thousand +# picture folder. + +if exist timg; then + il() { + images=$(find . -maxdepth 1 -type f -exec file --mime-type {} \+ | awk -F: '{if ($2 ~/image\//) print $1}') + if [ -z "$images" ]; then { + echo no images found. + return + }; fi + echo "$images" | timg --grid=4x3 --upscale=i --center --title --frames=1 -f - + } + IL() { + images=$(find . -type f -exec file --mime-type {} \+ | awk -F: '{if ($2 ~/image\//) print $1}') + if [ -z "$images" ]; then { + echo no images found. + return + }; fi + echo "$images" | timg --grid=4x3 --upscale=i --center --title --frames=1 -f - + } + qr() { + # if we are in a pipe, read from stdin and set fct arguments to it + if [ ! -t 0 ]; then + set -- "$(cat /dev/stdin)" + fi + qrencode -s1 -m2 "$@" -o- | timg --upscale=i - + } +fi From e884c94a99ec55e970b48112a3fab49321116a30 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 16 Nov 2022 18:28:33 +0100 Subject: [PATCH 08/12] qutebrowser: Fix terminal calls for wezterm --- qutebrowser/.config/qutebrowser/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/.config/qutebrowser/config.py b/qutebrowser/.config/qutebrowser/config.py index 925e392..2c8974f 100644 --- a/qutebrowser/.config/qutebrowser/config.py +++ b/qutebrowser/.config/qutebrowser/config.py @@ -17,7 +17,7 @@ c.completion.web_history.max_items = 1000 c.hints.uppercase = True c.editor.command = [ term, - "-e", + "start", "nvim", "-f", "{file}", @@ -29,9 +29,9 @@ c.editor.command = [ c.fileselect.handler = "external" picker = [ term, + "start", "--class", "float", - "-e", "vifm", "--choose-files", "{}", From 848f105df8afcd17c19e760d27ebc974daf0de28 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 16 Nov 2022 18:29:02 +0100 Subject: [PATCH 09/12] wezterm: Add config --- wezterm/.config/wezterm/maps.lua | 78 ++++++++++++++++++++ wezterm/.config/wezterm/wezterm.lua | 107 ++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 wezterm/.config/wezterm/maps.lua create mode 100644 wezterm/.config/wezterm/wezterm.lua diff --git a/wezterm/.config/wezterm/maps.lua b/wezterm/.config/wezterm/maps.lua new file mode 100644 index 0000000..5ffe960 --- /dev/null +++ b/wezterm/.config/wezterm/maps.lua @@ -0,0 +1,78 @@ +local act = require('wezterm').action +local keys = { + { key = 'O', mods = 'CTRL', action = act.ShowDebugOverlay }, + + { -- vertical pane + key = '\\', + mods = 'LEADER', + action = act.SplitHorizontal { domain = 'CurrentPaneDomain' } + }, { -- horizontal pane + key = '-', + mods = 'LEADER', + action = act.SplitVertical { domain = 'CurrentPaneDomain' } + }, { key = 'h', mods = 'CTRL', action = act.ActivatePaneDirection 'Left' }, + { key = 'j', mods = 'CTRL', action = act.ActivatePaneDirection 'Down' }, + { key = 'k', mods = 'CTRL', action = act.ActivatePaneDirection 'Up' }, + { key = 'l', mods = 'CTRL', action = act.ActivatePaneDirection 'Right' }, + { key = 'z', mods = 'LEADER', action = act.TogglePaneZoomState }, + { key = ' ', mods = 'LEADER', action = act.RotatePanes 'Clockwise' }, + { key = 'q', mods = 'LEADER', action = act.PaneSelect { mode = 'Activate' } }, + { + key = 'Q', + mods = 'LEADER', + action = act.PaneSelect { mode = 'SwapWithActive' } + }, { key = 'c', mods = 'LEADER', action = act.SpawnTab 'CurrentPaneDomain' }, + + { key = 't', mods = 'LEADER', action = act.ShowTabNavigator }, + { key = '[', mods = 'LEADER', action = act.ActivateCopyMode }, { + key = 'r', + mods = 'LEADER', + action = act.ActivateKeyTable { + name = 'resize_pane', + one_shot = false, + timeout_milliseconds = 2000 + } + }, { key = 'F', mods = 'LEADER', action = act.QuickSelect }, { + key = '/', + mods = 'LEADER', + action = act.Search('CurrentSelectionOrEmptyString') + }, { + key = 'b', + mods = 'LEADER', + action = act.ActivateKeyTable { name = 'scroll_mode', one_shot = false } + } + +} +-- Leader + number to activate that tab +for i = 1, 8 do + table.insert(keys, { + key = tostring(i), + mods = 'LEADER', + action = act.ActivateTab(i - 1) + }) +end +-- key table sub modes +local key_tables = { + -- mode to change size of any panes + resize_pane = { + { key = 'h', action = act.AdjustPaneSize { 'Left', 1 } }, + { key = 'l', action = act.AdjustPaneSize { 'Right', 1 } }, + { key = 'k', action = act.AdjustPaneSize { 'Up', 1 } }, + { key = 'j', action = act.AdjustPaneSize { 'Down', 1 } }, + { key = 'Escape', action = 'PopKeyTable' } + }, + scroll_mode = { + { key = 'y', mods = 'CTRL', action = act.ScrollByLine(-1) }, + { key = 'e', mods = 'CTRL', action = act.ScrollByLine(1) }, + { key = 'f', mods = 'CTRL', action = act.ScrollByPage(1) }, + { key = 'b', mods = 'CTRL', action = act.ScrollByPage(-1) }, + { key = 'd', mods = 'CTRL', action = act.ScrollByPage(0.5) }, + { key = 'u', mods = 'CTRL', action = act.ScrollByPage(-0.5) }, + { key = 'g', mods = 'CTRL', action = act.ScrollToTop }, + { key = 'G', mods = 'CTRL', action = act.ScrollToBottom }, + { key = '[', mods = 'CTRL', action = act.ScrollToPrompt(-1) }, + { key = ']', mods = 'CTRL', action = act.ScrollToPrompt(1) }, + { key = 'Escape', action = 'PopKeyTable' } + } +} +return { keys = keys, key_tables = key_tables } diff --git a/wezterm/.config/wezterm/wezterm.lua b/wezterm/.config/wezterm/wezterm.lua new file mode 100644 index 0000000..efcafd4 --- /dev/null +++ b/wezterm/.config/wezterm/wezterm.lua @@ -0,0 +1,107 @@ +local wezterm = require 'wezterm' +local mux = wezterm.mux + +local maps = require 'maps' + +-- STATUSBAR +-- show currently active key table in lower right status bar +-- mimicking Vim modes +wezterm.on('update-right-status', function(window, _) + local keytable = window:active_key_table() + if keytable then + keytable = 'MODE: ' .. keytable + else + keytable = '' + end + local workspace = window:active_workspace() + if workspace and workspace ~= 'default' then + workspace = 'WORKSPACE: ' .. workspace + else + workspace = '' + end + + local status = keytable .. ' ' .. workspace + window:set_left_status(status or '') + + -- "Wed Mar 3 08:14" + local date = wezterm.strftime '%a %b %-d %H:%M ' + + local bat = '' + for _, b in ipairs(wezterm.battery_info()) do + bat = + '🔋 ' .. string.format('%.0f%%', b.state_of_charge * 100) .. ' ' .. + b.state + end + + window:set_right_status(wezterm.format {{Text = bat .. ' ' .. date}}) +end) + +wezterm.on("set-up-dotfile-workspace", function(window, pane) + -- Set a workspace for coding on a current project + -- Top pane is for the editor, bottom pane is for the build tool + local project_dir = wezterm.home_dir .. '/projects/test/quarto/quarto-test' + local tab, build_pane, window = mux.spawn_window { + workspace = 'coding', + cwd = project_dir, + args = args + } + local editor_pane = build_pane:split{ + direction = 'Top', + size = 0.6, + cwd = project_dir + } + build_pane:send_text 'quarto check' + mux.set_active_workspace 'coding' +end) +-- +-- wezterm.on('gui-startup', function(cmd) +-- -- allow `wezterm start -- something` to affect what we spawn +-- -- in our initial window +-- local args = {} +-- if cmd then args = cmd.args end +-- +-- -- Set a workspace for coding on a current project +-- -- Top pane is for the editor, bottom pane is for the build tool +-- local project_dir = wezterm.home_dir .. '/projects/test/quarto/quarto-test' +-- local tab, build_pane, window = mux.spawn_window { +-- workspace = 'coding', +-- cwd = project_dir, +-- args = args +-- } +-- local editor_pane = build_pane:split { +-- direction = 'Top', +-- size = 0.6, +-- cwd = project_dir +-- } +-- build_pane:send_text 'quarto check' +-- +-- -- A workspace for interacting with a local machine that +-- -- runs some docker containners for home automation +-- local tab, pane, window = mux.spawn_window { +-- workspace = 'toppy', +-- args = { 'top' } +-- } +-- +-- -- We want to startup in the coding workspace +-- mux.set_active_workspace 'coding' +-- end) + +return { + enable_wayland = true, + + hide_tab_bar_if_only_one_tab = true, + use_fancy_tab_bar = false, + tab_bar_at_bottom = true, + window_padding = {left = 0, right = 0, top = 0, bottom = 0}, + + color_scheme = "Nord (base16)", + -- default_prog = {"nu"}, + scrollback_lines = 10000, + + font = wezterm.font('Liga Iosevka'), + line_height = 1.0, + + leader = {key = 'a', mods = 'CTRL', timeout_milliseconds = 1500}, + keys = maps.keys, + key_tables = maps.key_tables +} From 5dc8e5afcebcdf2736539958b800a9813d273189 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 25 Nov 2022 16:21:20 +0100 Subject: [PATCH 10/12] wezterm: Add event handling --- wezterm/.config/wezterm/events.lua | 63 ++++++++++++++++++++++ wezterm/.config/wezterm/maps.lua | 61 +++++++++++++++++----- wezterm/.config/wezterm/statusbar.lua | 46 ++++++++++++++++ wezterm/.config/wezterm/wezterm.lua | 75 ++++++++------------------- 4 files changed, 180 insertions(+), 65 deletions(-) create mode 100644 wezterm/.config/wezterm/events.lua create mode 100644 wezterm/.config/wezterm/statusbar.lua diff --git a/wezterm/.config/wezterm/events.lua b/wezterm/.config/wezterm/events.lua new file mode 100644 index 0000000..fd6aab8 --- /dev/null +++ b/wezterm/.config/wezterm/events.lua @@ -0,0 +1,63 @@ +local wezterm = require 'wezterm' +local io = require 'io' +local os = require 'os' +local act = wezterm.action + +local function setup() + local function isViProcess(pane) + local proc = pane:get_foreground_process_name() + if (proc:find('vim') or proc:find('nvim')) then return true end + return false + end + + local function conditionalActivatePane(window, pane, pane_direction, + vim_direction) + if (isViProcess(pane)) then + window:perform_action(act.Multiple { + act.SendKey { key = 'w', mods = 'CTRL' }, + act.SendKey { key = vim_direction } + }, pane) + else + window:perform_action(act.ActivatePaneDirection(pane_direction), + pane) + end + end + + wezterm.on('ActivatePaneDirection-right', function(window, pane) + conditionalActivatePane(window, pane, 'Right', 'l') + end) + wezterm.on('ActivatePaneDirection-left', function(window, pane) + conditionalActivatePane(window, pane, 'Left', 'h') + end) + wezterm.on('ActivatePaneDirection-up', function(window, pane) + conditionalActivatePane(window, pane, 'Up', 'k') + end) + wezterm.on('ActivatePaneDirection-down', function(window, pane) + conditionalActivatePane(window, pane, 'Down', 'j') + end) + + -- Retrieve the current scrollback text and send to editor + wezterm.on('edit-scrollback', function(window, pane) + local viewport_text = pane:get_lines_as_text(10000) + + -- Create a temporary file to pass to vim + local name = os.tmpname() + + local f = io.open(name, 'w+') + if f == nil then return false end + f:write(viewport_text) + f:flush() + f:close() + + -- Open a new window running vim and tell it to open the file + window:perform_action(act.SpawnCommandInNewTab { + args = { (os.getenv('EDITOR') or 'vi'), name } + }, pane) + + -- Wait time for vim to read the file before we remove it. + wezterm.sleep_ms(1000) + os.remove(name) + end) +end + +return { setup = setup } diff --git a/wezterm/.config/wezterm/maps.lua b/wezterm/.config/wezterm/maps.lua index 5ffe960..01149b2 100644 --- a/wezterm/.config/wezterm/maps.lua +++ b/wezterm/.config/wezterm/maps.lua @@ -1,7 +1,11 @@ -local act = require('wezterm').action +local wezterm = require('wezterm') +local act = wezterm.action + local keys = { { key = 'O', mods = 'CTRL', action = act.ShowDebugOverlay }, + { key = '[', mods = 'CTRL', action = act.ScrollToPrompt(-1) }, + { key = ']', mods = 'CTRL', action = act.ScrollToPrompt(1) }, { -- vertical pane key = '\\', mods = 'LEADER', @@ -10,11 +14,26 @@ local keys = { key = '-', mods = 'LEADER', action = act.SplitVertical { domain = 'CurrentPaneDomain' } - }, { key = 'h', mods = 'CTRL', action = act.ActivatePaneDirection 'Left' }, - { key = 'j', mods = 'CTRL', action = act.ActivatePaneDirection 'Down' }, - { key = 'k', mods = 'CTRL', action = act.ActivatePaneDirection 'Up' }, - { key = 'l', mods = 'CTRL', action = act.ActivatePaneDirection 'Right' }, - { key = 'z', mods = 'LEADER', action = act.TogglePaneZoomState }, + }, -- pane movement keys + { + key = 'h', + mods = 'CTRL', + action = act.EmitEvent 'ActivatePaneDirection-left' + }, + { + key = 'j', + mods = 'CTRL', + action = act.EmitEvent 'ActivatePaneDirection-down' + }, + { + key = 'k', + mods = 'CTRL', + action = act.EmitEvent 'ActivatePaneDirection-up' + }, { + key = 'l', + mods = 'CTRL', + action = act.EmitEvent 'ActivatePaneDirection-right' + }, { key = 'z', mods = 'LEADER', action = act.TogglePaneZoomState }, { key = ' ', mods = 'LEADER', action = act.RotatePanes 'Clockwise' }, { key = 'q', mods = 'LEADER', action = act.PaneSelect { mode = 'Activate' } }, { @@ -22,24 +41,38 @@ local keys = { mods = 'LEADER', action = act.PaneSelect { mode = 'SwapWithActive' } }, { key = 'c', mods = 'LEADER', action = act.SpawnTab 'CurrentPaneDomain' }, - - { key = 't', mods = 'LEADER', action = act.ShowTabNavigator }, + { key = ',', mods = 'LEADER', action = act.MoveTabRelative(-1) }, + { key = '.', mods = 'LEADER', action = act.MoveTabRelative(1) }, -- workspace selection + { + key = 's', + mods = 'LEADER', + action = act.ShowLauncherArgs { flags = 'FUZZY|WORKSPACES' } + }, { key = 't', mods = 'LEADER', action = act.ShowTabNavigator }, { key = '[', mods = 'LEADER', action = act.ActivateCopyMode }, { key = 'r', mods = 'LEADER', action = act.ActivateKeyTable { name = 'resize_pane', one_shot = false, - timeout_milliseconds = 2000 + timeout_milliseconds = 2000, + replace_current = true } }, { key = 'F', mods = 'LEADER', action = act.QuickSelect }, { key = '/', mods = 'LEADER', action = act.Search('CurrentSelectionOrEmptyString') }, { - key = 'b', + key = 'f', mods = 'LEADER', - action = act.ActivateKeyTable { name = 'scroll_mode', one_shot = false } + action = act.ActivateKeyTable { + name = 'scroll_mode', + one_shot = false, + replace_current = true + } + }, { key = 'e', mods = 'LEADER', action = act.EmitEvent 'edit-scrollback' }, { + key = 'l', + mods = 'LEADER', + action = act.EmitEvent 'ActivatePaneDirection-Right' } } @@ -59,6 +92,10 @@ local key_tables = { { key = 'l', action = act.AdjustPaneSize { 'Right', 1 } }, { key = 'k', action = act.AdjustPaneSize { 'Up', 1 } }, { key = 'j', action = act.AdjustPaneSize { 'Down', 1 } }, + { key = 'H', action = act.AdjustPaneSize { 'Left', 10 } }, + { key = 'L', action = act.AdjustPaneSize { 'Right', 10 } }, + { key = 'K', action = act.AdjustPaneSize { 'Up', 10 } }, + { key = 'J', action = act.AdjustPaneSize { 'Down', 10 } }, { key = 'Escape', action = 'PopKeyTable' } }, scroll_mode = { @@ -70,8 +107,6 @@ local key_tables = { { key = 'u', mods = 'CTRL', action = act.ScrollByPage(-0.5) }, { key = 'g', mods = 'CTRL', action = act.ScrollToTop }, { key = 'G', mods = 'CTRL', action = act.ScrollToBottom }, - { key = '[', mods = 'CTRL', action = act.ScrollToPrompt(-1) }, - { key = ']', mods = 'CTRL', action = act.ScrollToPrompt(1) }, { key = 'Escape', action = 'PopKeyTable' } } } diff --git a/wezterm/.config/wezterm/statusbar.lua b/wezterm/.config/wezterm/statusbar.lua new file mode 100644 index 0000000..020d882 --- /dev/null +++ b/wezterm/.config/wezterm/statusbar.lua @@ -0,0 +1,46 @@ +local wezterm = require 'wezterm' + +local function basename(s) return string.gsub(s or '', '(.*[/\\])(.*)', '%2') end + +local SEPARATOR = ' | ' +local function setup() + -- STATUSBAR + -- show currently active key table in lower right status bar + -- mimicing Vim modes + wezterm.on('update-status', function(window, pane) + local displayed = { left = {}, right = {} } + local keytable = window:active_key_table() + if keytable then + displayed.left[#displayed.left + 1] = 'MODE: ' .. keytable + end + + local workspace = window:active_workspace() + if workspace and workspace ~= 'default' then + displayed.left[#displayed.left + 1] = 'WORKSPACE: ' .. workspace + end + + local bat = '' + for _, b in ipairs(wezterm.battery_info()) do + bat = '🔋 ' .. string.format('%.0f%%', b.state_of_charge * 100) .. + ' ' .. b.state + end + displayed.right[#displayed.right + 1] = bat + + local currentprogram = pane:get_foreground_process_name() + displayed.right[#displayed.right + 1] = basename(currentprogram) + + local statusleft = '' + for _, v in ipairs(displayed.left) do + statusleft = statusleft .. v .. SEPARATOR + end + local statusright = '' + for _, v in ipairs(displayed.right) do + statusright = statusright .. v .. SEPARATOR + end + + window:set_left_status(statusleft or '') + window:set_right_status(statusright or '') + end) +end + +return { setup = setup } diff --git a/wezterm/.config/wezterm/wezterm.lua b/wezterm/.config/wezterm/wezterm.lua index efcafd4..33a7923 100644 --- a/wezterm/.config/wezterm/wezterm.lua +++ b/wezterm/.config/wezterm/wezterm.lua @@ -3,56 +3,26 @@ local mux = wezterm.mux local maps = require 'maps' --- STATUSBAR --- show currently active key table in lower right status bar --- mimicking Vim modes -wezterm.on('update-right-status', function(window, _) - local keytable = window:active_key_table() - if keytable then - keytable = 'MODE: ' .. keytable - else - keytable = '' - end - local workspace = window:active_workspace() - if workspace and workspace ~= 'default' then - workspace = 'WORKSPACE: ' .. workspace - else - workspace = '' - end +require 'statusbar'.setup() +require 'events'.setup() - local status = keytable .. ' ' .. workspace - window:set_left_status(status or '') - - -- "Wed Mar 3 08:14" - local date = wezterm.strftime '%a %b %-d %H:%M ' - - local bat = '' - for _, b in ipairs(wezterm.battery_info()) do - bat = - '🔋 ' .. string.format('%.0f%%', b.state_of_charge * 100) .. ' ' .. - b.state - end - - window:set_right_status(wezterm.format {{Text = bat .. ' ' .. date}}) -end) - -wezterm.on("set-up-dotfile-workspace", function(window, pane) - -- Set a workspace for coding on a current project - -- Top pane is for the editor, bottom pane is for the build tool - local project_dir = wezterm.home_dir .. '/projects/test/quarto/quarto-test' - local tab, build_pane, window = mux.spawn_window { - workspace = 'coding', - cwd = project_dir, - args = args - } - local editor_pane = build_pane:split{ - direction = 'Top', - size = 0.6, - cwd = project_dir - } - build_pane:send_text 'quarto check' - mux.set_active_workspace 'coding' -end) +-- wezterm.on("set-up-dotfile-workspace", function(window, pane) +-- -- Set a workspace for coding on a current project +-- -- Top pane is for the editor, bottom pane is for the build tool +-- local project_dir = wezterm.home_dir .. '/projects/test/quarto/quarto-test' +-- local tab, build_pane, window = mux.spawn_window { +-- workspace = 'coding', +-- cwd = project_dir, +-- args = args +-- } +-- local editor_pane = build_pane:split{ +-- direction = 'Top', +-- size = 0.6, +-- cwd = project_dir +-- } +-- build_pane:send_text 'quarto check' +-- mux.set_active_workspace 'coding' +-- end) -- -- wezterm.on('gui-startup', function(cmd) -- -- allow `wezterm start -- something` to affect what we spawn @@ -92,16 +62,17 @@ return { hide_tab_bar_if_only_one_tab = true, use_fancy_tab_bar = false, tab_bar_at_bottom = true, - window_padding = {left = 0, right = 0, top = 0, bottom = 0}, + window_padding = { left = 0, right = 0, top = 0, bottom = 0 }, + + color_scheme = "Mexico Light (base16)", - color_scheme = "Nord (base16)", -- default_prog = {"nu"}, scrollback_lines = 10000, font = wezterm.font('Liga Iosevka'), line_height = 1.0, - leader = {key = 'a', mods = 'CTRL', timeout_milliseconds = 1500}, + leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 1500 }, keys = maps.keys, key_tables = maps.key_tables } From e92e7e5b1ca55269bdb3ca3031d30563a8d8abd4 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 25 Nov 2022 17:00:00 +0100 Subject: [PATCH 11/12] vifm: Change default image opener to timg Changed opening images by default to do so on the commandline itself, using timg. Other openers can still be invoked through the `:file` command like before. --- vifm/.config/vifm/vifmrc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vifm/.config/vifm/vifmrc b/vifm/.config/vifm/vifmrc index 5483da3..f1938f2 100644 --- a/vifm/.config/vifm/vifmrc +++ b/vifm/.config/vifm/vifmrc @@ -392,6 +392,8 @@ filextype *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.mpeg,*.vob, \*.as[fx] \ {View using unique mplayer instance} \ umpv %f &, + \ {View in timg} + \ timg --title --center --clear %f; read -k 1 -s -r, \ {View using ffplay} \ ffplay -fs -autoexit %f, \ {View using Dragon} @@ -425,6 +427,8 @@ fileviewer *.[1-8] man ./%c | col -b " Gif filextype *.gif + \ {View in timg} + \ timg --loops=2 --title --center --clear %f; read -k 1 -s -r, \ {Loop} \ mpv --loop=inf %f %i &, fileviewer *.gif @@ -434,6 +438,8 @@ fileviewer *.gif " Images filextype *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm + \ {View in timg} + \ timg --title --center --clear %f; read -k 1 -s -r, \ {View in nsxiv directory viewer} \ vifm-thumbnailer %c, \ {View in nsxiv} @@ -447,9 +453,7 @@ filextype *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm \ {View in gpicview} \ gpicview %c, fileviewer *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm - \ kitty +kitten icat --silent --transfer-mode=stream --place=%pwx%ph@%pxx%py %c %N - \ %pc - \ kitty +kitten icat --clear --silent %pd + \ timg -g%pwx%ph -pq %c " OpenRaster filextype *.ora From 4f8d495191fc5b69fbe28ec39b54f79dafbd43bf Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 25 Nov 2022 17:01:32 +0100 Subject: [PATCH 12/12] nvim: Switch Navigator plugin to use wezterm Using wezterm in current implementation of Navigator.nvim plugin - somewhat of a HACK until the final implementation exists in the plugin. --- nvim/.config/nvim/lua/plugins.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nvim/.config/nvim/lua/plugins.lua b/nvim/.config/nvim/lua/plugins.lua index 5bc3c37..60690b8 100644 --- a/nvim/.config/nvim/lua/plugins.lua +++ b/nvim/.config/nvim/lua/plugins.lua @@ -22,7 +22,7 @@ require("packer").startup(function() -- essential use { 'numToStr/Navigator.nvim', - config = function() require('Navigator').setup() end + config = function() require('Navigator').setup({ mux = "wezterm" }) end } -- allow seamless navigation between vim buffers and tmux splits use 'jeffkreeftmeijer/vim-numbertoggle' -- toggles numbers to absolute for all buffers but the current which is relative use 'RRethy/vim-illuminate' -- highlight other occurences of the word under cursor