From 88a2b3dadf609ceb6aa50323a97969ec47f84404 Mon Sep 17 00:00:00 2001 From: Ismo Vuorinen Date: Mon, 13 Oct 2025 13:49:44 +0300 Subject: [PATCH] chore: sesh, and removal of zed settings.json Signed-off-by: Ismo Vuorinen --- .gitignore | 1 + config/fish/completions/sesh.fish | 235 ++++++++++++++++++++++++++++++ config/sesh/sesh.toml | 59 ++++++++ config/tmux/tmux.conf | 22 +++ config/zed/settings.json | 156 -------------------- 5 files changed, 317 insertions(+), 156 deletions(-) create mode 100644 config/fish/completions/sesh.fish create mode 100644 config/sesh/sesh.toml delete mode 100644 config/zed/settings.json diff --git a/.gitignore b/.gitignore index 9733946..e8baff2 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,4 @@ dependency-check-report.html local/bin/yabai local/man/yabai.1 config/op/plugins/used_items/gh.json +config/zed/settings.json diff --git a/config/fish/completions/sesh.fish b/config/fish/completions/sesh.fish new file mode 100644 index 0000000..76b9ed8 --- /dev/null +++ b/config/fish/completions/sesh.fish @@ -0,0 +1,235 @@ +# fish completion for sesh -*- shell-script -*- + +function __sesh_debug + set -l file "$BASH_COMP_DEBUG_FILE" + if test -n "$file" + echo "$argv" >> $file + end +end + +function __sesh_perform_completion + __sesh_debug "Starting __sesh_perform_completion" + + # Extract all args except the last one + set -l args (commandline -opc) + # Extract the last arg and escape it in case it is a space + set -l lastArg (string escape -- (commandline -ct)) + + __sesh_debug "args: $args" + __sesh_debug "last arg: $lastArg" + + # Disable ActiveHelp which is not supported for fish shell + set -l requestComp "SESH_ACTIVE_HELP=0 $args[1] __complete $args[2..-1] $lastArg" + + __sesh_debug "Calling $requestComp" + set -l results (eval $requestComp 2> /dev/null) + + # Some programs may output extra empty lines after the directive. + # Let's ignore them or else it will break completion. + # Ref: https://github.com/spf13/cobra/issues/1279 + for line in $results[-1..1] + if test (string trim -- $line) = "" + # Found an empty line, remove it + set results $results[1..-2] + else + # Found non-empty line, we have our proper output + break + end + end + + set -l comps $results[1..-2] + set -l directiveLine $results[-1] + + # For Fish, when completing a flag with an = (e.g., -n=) + # completions must be prefixed with the flag + set -l flagPrefix (string match -r -- '-.*=' "$lastArg") + + __sesh_debug "Comps: $comps" + __sesh_debug "DirectiveLine: $directiveLine" + __sesh_debug "flagPrefix: $flagPrefix" + + for comp in $comps + printf "%s%s\n" "$flagPrefix" "$comp" + end + + printf "%s\n" "$directiveLine" +end + +# this function limits calls to __sesh_perform_completion, by caching the result behind $__sesh_perform_completion_once_result +function __sesh_perform_completion_once + __sesh_debug "Starting __sesh_perform_completion_once" + + if test -n "$__sesh_perform_completion_once_result" + __sesh_debug "Seems like a valid result already exists, skipping __sesh_perform_completion" + return 0 + end + + set --global __sesh_perform_completion_once_result (__sesh_perform_completion) + if test -z "$__sesh_perform_completion_once_result" + __sesh_debug "No completions, probably due to a failure" + return 1 + end + + __sesh_debug "Performed completions and set __sesh_perform_completion_once_result" + return 0 +end + +# this function is used to clear the $__sesh_perform_completion_once_result variable after completions are run +function __sesh_clear_perform_completion_once_result + __sesh_debug "" + __sesh_debug "========= clearing previously set __sesh_perform_completion_once_result variable ==========" + set --erase __sesh_perform_completion_once_result + __sesh_debug "Successfully erased the variable __sesh_perform_completion_once_result" +end + +function __sesh_requires_order_preservation + __sesh_debug "" + __sesh_debug "========= checking if order preservation is required ==========" + + __sesh_perform_completion_once + if test -z "$__sesh_perform_completion_once_result" + __sesh_debug "Error determining if order preservation is required" + return 1 + end + + set -l directive (string sub --start 2 $__sesh_perform_completion_once_result[-1]) + __sesh_debug "Directive is: $directive" + + set -l shellCompDirectiveKeepOrder 32 + set -l keeporder (math (math --scale 0 $directive / $shellCompDirectiveKeepOrder) % 2) + __sesh_debug "Keeporder is: $keeporder" + + if test $keeporder -ne 0 + __sesh_debug "This does require order preservation" + return 0 + end + + __sesh_debug "This doesn't require order preservation" + return 1 +end + + +# This function does two things: +# - Obtain the completions and store them in the global __sesh_comp_results +# - Return false if file completion should be performed +function __sesh_prepare_completions + __sesh_debug "" + __sesh_debug "========= starting completion logic ==========" + + # Start fresh + set --erase __sesh_comp_results + + __sesh_perform_completion_once + __sesh_debug "Completion results: $__sesh_perform_completion_once_result" + + if test -z "$__sesh_perform_completion_once_result" + __sesh_debug "No completion, probably due to a failure" + # Might as well do file completion, in case it helps + return 1 + end + + set -l directive (string sub --start 2 $__sesh_perform_completion_once_result[-1]) + set --global __sesh_comp_results $__sesh_perform_completion_once_result[1..-2] + + __sesh_debug "Completions are: $__sesh_comp_results" + __sesh_debug "Directive is: $directive" + + set -l shellCompDirectiveError 1 + set -l shellCompDirectiveNoSpace 2 + set -l shellCompDirectiveNoFileComp 4 + set -l shellCompDirectiveFilterFileExt 8 + set -l shellCompDirectiveFilterDirs 16 + + if test -z "$directive" + set directive 0 + end + + set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2) + if test $compErr -eq 1 + __sesh_debug "Received error directive: aborting." + # Might as well do file completion, in case it helps + return 1 + end + + set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) + set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) + if test $filefilter -eq 1; or test $dirfilter -eq 1 + __sesh_debug "File extension filtering or directory filtering not supported" + # Do full file completion instead + return 1 + end + + set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) + set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) + + __sesh_debug "nospace: $nospace, nofiles: $nofiles" + + # If we want to prevent a space, or if file completion is NOT disabled, + # we need to count the number of valid completions. + # To do so, we will filter on prefix as the completions we have received + # may not already be filtered so as to allow fish to match on different + # criteria than the prefix. + if test $nospace -ne 0; or test $nofiles -eq 0 + set -l prefix (commandline -t | string escape --style=regex) + __sesh_debug "prefix: $prefix" + + set -l completions (string match -r -- "^$prefix.*" $__sesh_comp_results) + set --global __sesh_comp_results $completions + __sesh_debug "Filtered completions are: $__sesh_comp_results" + + # Important not to quote the variable for count to work + set -l numComps (count $__sesh_comp_results) + __sesh_debug "numComps: $numComps" + + if test $numComps -eq 1; and test $nospace -ne 0 + # We must first split on \t to get rid of the descriptions to be + # able to check what the actual completion will be. + # We don't need descriptions anyway since there is only a single + # real completion which the shell will expand immediately. + set -l split (string split --max 1 \t $__sesh_comp_results[1]) + + # Fish won't add a space if the completion ends with any + # of the following characters: @=/:., + set -l lastChar (string sub -s -1 -- $split) + if not string match -r -q "[@=/:.,]" -- "$lastChar" + # In other cases, to support the "nospace" directive we trick the shell + # by outputting an extra, longer completion. + __sesh_debug "Adding second completion to perform nospace directive" + set --global __sesh_comp_results $split[1] $split[1]. + __sesh_debug "Completions are now: $__sesh_comp_results" + end + end + + if test $numComps -eq 0; and test $nofiles -eq 0 + # To be consistent with bash and zsh, we only trigger file + # completion when there are no other completions + __sesh_debug "Requesting file completion" + return 1 + end + end + + return 0 +end + +# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves +# so we can properly delete any completions provided by another script. +# Only do this if the program can be found, or else fish may print some errors; besides, +# the existing completions will only be loaded if the program can be found. +if type -q "sesh" + # The space after the program name is essential to trigger completion for the program + # and not completion of the program name itself. + # Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. + complete --do-complete "sesh " > /dev/null 2>&1 +end + +# Remove any pre-existing completions for the program since we will be handling all of them. +complete -c sesh -e + +# this will get called after the two calls below and clear the $__sesh_perform_completion_once_result global +complete -c sesh -n '__sesh_clear_perform_completion_once_result' +# The call to __sesh_prepare_completions will setup __sesh_comp_results +# which provides the program's completion choices. +# If this doesn't require order preservation, we don't use the -k flag +complete -c sesh -n 'not __sesh_requires_order_preservation && __sesh_prepare_completions' -f -a '$__sesh_comp_results' +# otherwise we use the -k flag +complete -k -c sesh -n '__sesh_requires_order_preservation && __sesh_prepare_completions' -f -a '$__sesh_comp_results' diff --git a/config/sesh/sesh.toml b/config/sesh/sesh.toml new file mode 100644 index 0000000..b617d2a --- /dev/null +++ b/config/sesh/sesh.toml @@ -0,0 +1,59 @@ +# +# ███████╗███████╗███████╗██╗ ██╗ ██████╗ ██████╗ ███╗ ██╗███████╗██╗ ██████╗ +# ██╔════╝██╔════╝██╔════╝██║ ██║ ██╔════╝██╔═══██╗████╗ ██║██╔════╝██║██╔════╝ +# ███████╗█████╗ ███████╗███████║ ██║ ██║ ██║██╔██╗ ██║█████╗ ██║██║ ███╗ +# ╚════██║██╔══╝ ╚════██║██╔══██║ ██║ ██║ ██║██║╚██╗██║██╔══╝ ██║██║ ██║ +# ███████║███████╗███████║██║ ██║ ╚██████╗╚██████╔╝██║ ╚████║██║ ██║╚██████╔╝ +# ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ +# +# Smart session manager for the terminal +# https://github.com/joshmedeski/sesh + +strict_mode = false + +# [marker] +# inactivity_threshold = 10 # Seconds before alerts start +# alert_level_1_time = 60 # Light alert duration +# alert_level_2_time = 300 # Medium alert duration +# alert_level_3_time = 600 # Urgent alert duration + +blacklist = [ + "^scratch$", + "^_" +] + +[[session]] +name = "home (~)" +path = "~" +disable_startup_command = true +# startup_command = "l" + +[[session]] +name = "dotfiles" +path = "~/.dotfiles" + +[[session]] +name = "neovim config" +path = "~/.dotfiles/config/nvim" + +[[session]] +name = "sesh config" +path = "~/.dotfiles/config/sesh" +startup_command = "nvim sesh.toml" +preview_command = "bat --language=toml --style=snip --color=always ~/.dotfiles/config/sesh/sesh.toml" + +[[session]] +name = "my custom binaries" +path = "~/.dotfiles/local/bin" + +[[session]] +name = "code" +path = "~/Code/" +disable_startup_command = true +# startup_command = "l" + +[[session]] +name = "Downloads" +path = "~/Downloads" +startup_command = "lsa" + diff --git a/config/tmux/tmux.conf b/config/tmux/tmux.conf index 092161d..acb54ab 100644 --- a/config/tmux/tmux.conf +++ b/config/tmux/tmux.conf @@ -106,6 +106,28 @@ bind -N "tms windows" C-w display-popup -E "tms windows" bind -N "tms switch" C-s display-popup -E "tms switch" bind -N "tms refresh" C-r display-popup -E "tms refresh" +# global sessions +# bind-key "K" display-popup -h 90% -w 50% -E "sesh ui" +bind-key "K" run-shell "sesh connect \"$( + sesh list --icons --hide-duplicates | fzf-tmux -p 100%,100% --no-border \ + --list-border \ + --no-sort --prompt '⚡ ' \ + --input-border \ + --header-border \ + --bind 'tab:down,btab:up' \ + --bind 'ctrl-b:abort' \ + --bind 'ctrl-a:change-prompt(⚡ )+reload(sesh list --icons)' \ + --bind 'ctrl-t:change-prompt( )+reload(sesh list -t --icons)' \ + --bind 'ctrl-g:change-prompt(⚙️ )+reload(sesh list -c --icons)' \ + --bind 'ctrl-x:change-prompt(📁 )+reload(sesh list -z --icons)' \ + --bind 'ctrl-f:change-prompt(🔎 )+reload(fd -H -d 2 -t d -E .Trash . ~)' \ + --bind 'ctrl-d:execute(tmux kill-session -t {2..})+change-prompt(⚡ )+reload(sesh list --icons)' \ + --preview-window 'right:70%' \ + --preview 'sesh preview {}' \ +)\"" + +bind-key "N" display-popup -E "sesh ui" + # ╭──────────────────────────────────────────────────────────╮ # │ Plugins │ # ╰──────────────────────────────────────────────────────────╯ diff --git a/config/zed/settings.json b/config/zed/settings.json deleted file mode 100644 index ad8c8f8..0000000 --- a/config/zed/settings.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "features": { - "edit_prediction_provider": "copilot" - }, - "context_servers": { - "github-activity-summarizer": { - "source": "extension", - "settings": {} - }, - "mcp-server-time": { - "source": "custom", - "command": "uvx", - "args": ["mcp-server-time"] - } - }, - "telemetry": { - "metrics": false - }, - "agent": { - "always_allow_tool_actions": true, - "default_profile": "write", - "default_model": { - "provider": "copilot_chat", - "model": "claude-sonnet-4" - }, - "play_sound_when_agent_done": true - }, - "languages": { - "PHP": { - "language_servers": ["intelephense", "phpactor"], - "formatter": "language_server" - }, - "Python": { - "enable_language_server": true, - "allow_rewrap": "anywhere", - "auto_indent_on_paste": true - }, - "Shell Script": { - "enable_language_server": true - }, - "JavaScript": { - "enable_language_server": true, - "code_actions_on_format": { - "source.fixAll.eslint": true - } - }, - "Markdown": { - "enable_language_server": true, - "preferred_line_length": 120, - "formatter": "language_server" - }, - "Lua": { - "enable_language_server": true, - "tab_size": 2 - }, - "Go": { - "language_servers": ["gopls", "golangci-lint"] - } - }, - "lsp": { - "eslint": { - "settings": { - "nodePath": "./node_modules/.bin" - } - }, - "gopls": { - "initialization_options": { - "hints": { - "assignVariableTypes": true, - "compositeLiteralFields": true, - "compositeLiteralTypes": true, - "constantValues": true, - "functionTypeParameters": true, - "parameterNames": true, - "rangeVariableTypes": true - } - } - } - }, - "diagnostics": { - "button": true, - "include_warnings": true, - "lsp_pull_diagnostics": { - "enabled": true, - "debounce_ms": 50 - }, - "inline": { - "enabled": true, - "update_debounce_ms": 150 - } - }, - "multi_cursor_modifier": "cmd_or_ctrl", - "indent_guides": { - "enabled": true, - "coloring": "indent_aware" - }, - "preferred_line_length": 100, - "soft_wrap": "bounded", - "wrap_guides": [100, 120, 160, 200], - "format_on_save": "on", - "vim_mode": true, - "theme": { - "mode": "system", - "light": "Everforest Dark Soft", - "dark": "Everforest Dark Hard" - }, - "inlay_hints": { - "enabled": true, - "show_type_hints": true, - "show_parameter_hints": true, - "show_other_hints": true - }, - "ui_font_size": 16, - "buffer_font_size": 16, - "buffer_font_fallbacks": ["JetBrainsMono Nerd Font"], - "use_autoclose": false, - "auto_install_extensions": { - "angular": true, - "ansible": true, - "basher": true, - "biome": true, - "blade": true, - "csharp": true, - "css-modules-kit": true, - "dockerfile": true, - "git-firefly": true, - "github-activity-summarizer": true, - "go-snippets": true, - "golangci-lint": true, - "gosum": true, - "html": true, - "ini": true, - "json": true, - "json5": true, - "just": true, - "just-ls": true, - "lua": true, - "make": true, - "php": true, - "python-requirements": true, - "python-snippets": true, - "rose-pine-theme": true, - "ruff": true, - "scss": true, - "sieve": true, - "sql": true, - "stylelint": true, - "templ": true, - "toml": true, - "vue": true, - "vue-snippets": true, - "wakatime": true, - "xcode-themes": true, - "yaml": true - } -}