Compare commits

...

15 Commits

Author SHA1 Message Date
316eefe916 kitty:get_cwd: Use KITTY_LISTEN_ON for socket path
Also verify that the socket exists before using it.
2025-12-11 15:27:39 +01:00
3a821d832b kitty:get_cwd: Use the match flag for performance
Instead of requesting the full tree as a JSON and extracting the focused
window with `jq`, use `kitten-@-ls`'s `--match` flag. This further
improves the performance.

Also remove the commented code using recursive descent because it is not
up-to-date anymore.
2025-12-11 15:27:38 +01:00
b291163a80 kitty:get_cwd: Make faster by not using kitten
kitten-@-ls(1) is unfortunately a bit slow (100ms) which is noticeable
when launching new windows using `get_cwd`. Make `get_cwd` faster (down
to 25ms) by communicating directly with the socket instead of using
`kitten`.
2025-12-11 15:27:23 +01:00
2e2bad65a2 polybar: Change while read loop to an xargs pipe 2025-12-10 14:27:53 +01:00
c46b1c5ea1 i3: Add bindings to switch forward & backward
After unplugging an external monitor I sometimes still have old
workspaces that I can't access through their index.
2025-12-10 14:20:40 +01:00
5f40b97e9a i3: Workspace 0 should be 10 2025-12-10 14:19:48 +01:00
5599ce14d7 i3: Normal numeric workspaces on multi outputs
Use normal workspace numbers with the output name as workspace name, but
strip the name in polybar.

See https://github.com/polybar/polybar/pull/3230 for strip-wsnames.
2025-12-04 14:31:05 +01:00
4008bb543b vim:looks: Don't hardcode the colorscheme colors 2025-11-25 18:06:24 +01:00
d0abb14567 vim: Highlight trailing spaces in colorscheme red 2025-11-25 18:06:13 +01:00
9e18be760c vim:setts: Use the number column for the signcolumn 2025-11-25 17:27:48 +01:00
04d3d6e87f vim:plugs:nrrwrgn: Add padding to small windows 2025-11-25 17:19:34 +01:00
526a37301a vim:plugs:ctags: Don't index venv and __pycache__ 2025-11-25 17:11:14 +01:00
7dc9efc0e4 vim:gitcommit: Fold unstaged and untracked files 2025-11-25 17:09:24 +01:00
9bc8b4b93f vim:ftplug:man: Only trigger one timer
Stop an already running timer similar to how it is done already when
highlighting the selection.
2025-11-25 16:07:52 +01:00
ead724b75b vim:ftplug:man: Fix WinResized support check
The check if the WinResized event is supported was broken from the
beginning on since I used `has()` instead of `exists()`.

Fixes: 558bb0582e (man.vim: Check if WinResized is supported,
       2025-01-29)
2025-11-25 15:56:21 +01:00
10 changed files with 109 additions and 54 deletions

View File

@@ -102,12 +102,16 @@ bindsym $mod+6 exec ~/.config/i3/multi-monitor-workspaces.sh -s 6
bindsym $mod+7 exec ~/.config/i3/multi-monitor-workspaces.sh -s 7
bindsym $mod+8 exec ~/.config/i3/multi-monitor-workspaces.sh -s 8
bindsym $mod+9 exec ~/.config/i3/multi-monitor-workspaces.sh -s 9
bindsym $mod+0 exec ~/.config/i3/multi-monitor-workspaces.sh -s 0
bindsym $mod+0 exec ~/.config/i3/multi-monitor-workspaces.sh -s 10
# switch back to the previous workspace
workspace_auto_back_and_forth yes
bindsym $mod+Tab workspace back_and_forth
# switch workspaces forward and backward
bindsym $mod+Next workspace next
bindsym $mod+Prior workspace prev
# Switch visible workspaces (e.g. multi monitor setup)
bindsym $mod+Shift+Tab exec i3-msg workspace "$( \
i3-msg -t get_workspaces | \
@@ -124,7 +128,7 @@ bindsym $mod+Shift+6 exec ~/.config/i3/multi-monitor-workspaces.sh -m 6
bindsym $mod+Shift+7 exec ~/.config/i3/multi-monitor-workspaces.sh -m 7
bindsym $mod+Shift+8 exec ~/.config/i3/multi-monitor-workspaces.sh -m 8
bindsym $mod+Shift+9 exec ~/.config/i3/multi-monitor-workspaces.sh -m 9
bindsym $mod+Shift+0 exec ~/.config/i3/multi-monitor-workspaces.sh -m 0
bindsym $mod+Shift+0 exec ~/.config/i3/multi-monitor-workspaces.sh -m 10
# move focused container and switch to workspace
bindsym Mod1+Shift+1 exec ~/.config/i3/multi-monitor-workspaces.sh -ms 1
@@ -136,7 +140,7 @@ bindsym Mod1+Shift+6 exec ~/.config/i3/multi-monitor-workspaces.sh -ms 6
bindsym Mod1+Shift+7 exec ~/.config/i3/multi-monitor-workspaces.sh -ms 7
bindsym Mod1+Shift+8 exec ~/.config/i3/multi-monitor-workspaces.sh -ms 8
bindsym Mod1+Shift+9 exec ~/.config/i3/multi-monitor-workspaces.sh -ms 9
bindsym Mod1+Shift+0 exec ~/.config/i3/multi-monitor-workspaces.sh -ms 0
bindsym Mod1+Shift+0 exec ~/.config/i3/multi-monitor-workspaces.sh -ms 10
# reload the configuration file
bindsym $mod+Shift+c reload

View File

@@ -25,25 +25,12 @@ done
shift $((OPTIND - 1))
[ $# -gt 0 ] || usage
outputs="$(i3-msg -t get_outputs | jq -r '.[] | select(.active).name')"
num_outs="$(printf "%s\n" "$outputs" | wc -l)"
name="$(i3-msg -t get_tree \
| jq -r '.. | objects | select(.focused).output')"
if [ "$num_outs" -lt 2 ]; then
# only one monitor
workspace="$1"
else
name="$(i3-msg -t get_tree \
| jq -r '.. | objects | select(.focused).output')"
num="$(printf "%s\n" "$outputs" \
| grep -Fxn "$name" \
| cut -d: -f1)"
num="$((num - 1))"
# Omit the number on the first monitor
[ "$num" -gt 0 ] || num=
workspace="$num$1"
fi
# NOTE: See `strip-wsnames` in polybar config. With it every monitor has its own
# 1-10 workspaces
workspace="$1: $name"
if [ -z "$switch" ] && [ -z "$move" ]; then
printf "%s\n" "$workspace"

View File

@@ -7,21 +7,19 @@
# Print the current working directory of the focused kitty window. Returns 4 if
# none exist or is focused.
socket_path="${TMPDIR:-/tmp}/kitty.$USER/kitty${1:+-$1}.sock"
if [ -n "$KITTY_LISTEN_ON" ]; then
socket_path="${KITTY_LISTEN_ON#unix:}"
else
socket_path="${TMPDIR:-/tmp}/kitty.$USER/kitty${1:+-$1}.sock"
fi
[ -e "$socket_path" ] || exit 1
# NOTE: the backticks are used for hacky line-continuation, taken from
# https://stackoverflow.com/a/7729087/2092762c9
kitten @ --to unix:"$socket_path" ls \
| jq -er ".[]`
` | select(.is_focused).tabs.[]`
` | select(.is_focused).windows.[]`
` | select(.is_focused).cwd"
# An alternative version that uses recursive descent to find focused objects
# that also have a `.cwd` key:
#
# | jq -er "..`
# ` | objects`
# ` | select(.is_focused)`
# ` | to_entries.[]`
# ` | select(.key == \"cwd\").value"
# NOTE: Unfortunately kitten-@-ls(1) is slow, so communicate with the socket
# directly.
printf '\eP@kitty-cmd{%s,%s,%s}\e\\' \
'"cmd":"ls"' \
'"version":[0,26,0]' \
'"payload":{"match":"state:focused"}' \
| nc -U -q0 "$socket_path" \
| awk '{ print substr($0, 13, length($0) - 14) }' \
| jq -er ".data | fromjson | .[].tabs.[].windows.[].cwd"

View File

@@ -40,6 +40,7 @@ enable-ipc = true
type = internal/i3
pin-workspaces = true
format = <label-state> <label-mode>
strip-wsnames = true
index-sort = true
wrapping-scroll = false

View File

@@ -22,10 +22,11 @@ done
if ! pgrep -ax polybar >/dev/null 2>&1; then
# launch Polybar on every monitor
# https://github.com/polybar/polybar/issues/763
while read -r m; do
export MONITOR="${m%%:*}"
polybar --reload -c "$BASE_DIR/config" main &
done <<<"$(polybar --list-monitors)"
polybar --list-monitors \
| cut -d: -f1 \
| xargs -I'{}' -P0 \
env MONITOR='{}' \
polybar --reload -c "$BASE_DIR/config" main &
echo "Polybar launched..."
else

View File

@@ -37,18 +37,30 @@ setlocal showbreak=NONE
" This is very hacky.
" Only if WinResized is supported
if has('##WinResized')
if exists('##WinResized')
augroup man_resized
" The reload has to be delayed slightly, since with an `edit` directly in
" the autocmd, the buffer will just be cleared? (TODO)
" NOTE: One could add a wrapper function that checks for the existence of
" already running timers similar to how it's done in the
" highlight_current group (see autocommands.vim), but this feels
" overkill here.
au! WinResized <buffer> call timer_start(10, function("s:redraw_delayed"))
au! WinResized <buffer> call s:redraw_man(v:event)
augroup END
function s:redraw_man(event)
if exists('w:disable_man_resizing')
return
endif
if exists('w:man_resizing_timer_id')
call timer_stop(w:man_resizing_timer_id)
endif
echo a:event
" TODO: make sure that a:event contains window number and that the width
" actually changed with getwininfo()
let w:man_resizing_timer_id = timer_start(10, function("s:redraw_delayed"))
endfunction
" The function can't be redefined during the reload of the ftplugin (i.e.
" triggered by `edit`), since it is currently executing (i.e. `edit`):
"
@@ -56,6 +68,8 @@ augroup END
"
if !exists("*s:redraw_delayed")
function s:redraw_delayed(timer_id)
unlet w:man_resizing_timer_id
" Try to keep the position as close as possible, since edit will move to
" the start of the file
" TODO: this should be more accurate
@@ -72,5 +86,5 @@ endif
" lines, messing up the whole buffer. Since this is distracting, turn it off.
setlocal nowrap
endif " has('##WinResized')
endif " exists('##WinResized')
" ------------------------------------------------------------------------------

View File

@@ -20,3 +20,27 @@ let g:gutentags_enabled = 0
" When aborting a commit I usually use :cq which I can't when committing through
" fugitive. Abbreviate it to something that works.
cabbrev <buffer> cq %d <Bar> x
" Fold file listings (staged, unstaged, untracked, ...) and diff
setlocal foldmethod=syntax
" Unfold staged files and diff. inspired by:
" https://vi.stackexchange.com/questions/4050/how-to-search-for-pattern-in-certain-syntax-regions/27008#27008
if has("patch-8.2.0915") || has("nvim-0.7.0")
function s:open_fold(group, content)
" Find line containing `content` that is highlighted with `group`
let l:line_nr = search(a:content, "n", 0, 0, { ->
\ synstack('.', col('.'))
\ ->map('synIDattr(v:val, "name")')
\ ->match(a:group) < 0 })
if l:line_nr <= 0
return
endif
execute l:line_nr->string() .. "foldopen"
endfunction
call s:open_fold("gitcommitSelected", "Changes to be committed:")
call s:open_fold("gitcommitDiff", "diff --")
endif " has("patch-8.2.0915") || has("nvim-0.7.0")

View File

@@ -26,10 +26,13 @@ endif
" ctags
if (executable('ctags'))
packadd vim-gutentags
" Don't index these folders
let g:gutentags_ctags_exclude = [
\ 'node_modules/*',
\ '.git/*',
\ 'build/*'
\ 'build/*',
\ 'venv/*',
\ '__pycache__/*'
\]
endif
@@ -53,4 +56,6 @@ if exists("g:loaded_nrrw_rgn")
" Open narrow window above or to the left of the current window (default
" is topleft). See :h aboveleft etc.
let g:nrrw_topbot_leftright = 'aboveleft'
" Leave one more line of padding when the window is small
let g:nrrw_rgn_pad = 1
endif

View File

@@ -119,6 +119,15 @@ if (exists('g:loaded_gitgutter'))
" lines have been changed.
set foldtext=gitgutter#fold#foldtext()
endif
" Use the number column for the signcolumn (e.g. gitgutter, lsp diagnostics),
" but don't fallback to 'auto' when &number is off
" TODO: install autocommand to set signcolumn to yes when number is turned off
" (and back to number when turned back on)
if &number
set signcolumn=number
else
set signcolumn=yes
endif
" Netrw
" Use tree style listing

View File

@@ -50,14 +50,24 @@ if (get(g:, 'loaded_fzf'))
endif
endif
" Get red from my colorscheme
let s:red = {}
if exists("*onedark#GetColors")
let s:red = onedark#GetColors()->get("red", {})
endif
let s:red_cterm = s:red->get("cterm", "red")
let s:red_gui = s:red->get("gui", "red")
" Highlight trailing whitespaces
if match(&listchars, 'trail: \@!') > -1 && match(&listchars, '\vtab:( +)@!') > -1
" Use foreground for coloring if tabs and trailing spaces are displayed
" as non-space characters
highlight TrailingWhitespace ctermfg=red guifg=red
execute "highlight TrailingWhitespace ctermfg=" .. s:red_cterm
\ .. " guifg=" .. s:red_gui
else
" Background otherwise
highlight TrailingWhitespace ctermbg=red guibg=red
execute "highlight TrailingWhitespace ctermbg=" .. s:red_cterm
\ .. " guibg=" .. s:red_gui
endif
augroup HighlightTrailingWhitespace
au!
@@ -74,8 +84,10 @@ let g:spl_special_chars = {
\ 'fr': 'àâæçèéêëîïôœùûüÿÀÂÆÇÈÉÊËÎÏÔŒÙÛÜŸ',
\ }
" Highlight non-ASCII characters in the red used by my color scheme "OneDark"
highlight NonASCIIChars ctermfg=white guifg=white ctermbg=204 guibg=#e06c75
" Highlight non-ASCII characters in red
execute "highlight NonASCIIChars ctermfg=white guifg=white "
\ .. "ctermbg=" .. s:red_cterm .. " guibg=" .. s:red_gui
" Do not highlight special characters that are valid in the respective spelllang
function! HighlightNonASCIIChars()
if exists('w:non_ascii_match_id')