From 26e442f8f0c805b88c920874c393acf46bb1a1a9 Mon Sep 17 00:00:00 2001 From: turtlebasket <32886427+turtlebasket@users.noreply.github.com> Date: Thu, 5 Mar 2026 13:25:51 -0800 Subject: [PATCH] misc --- config/ghostty/config | 10 ++- config/neovim/init.lua | 125 +++++++++++++++++++++++++++++-- config/neovim/lazy-lock.json | 10 ++- config/tmux/tmux.conf | 24 ++++++ scripts/{ntfy-bell => ntfy-osc9} | 20 +---- 5 files changed, 157 insertions(+), 32 deletions(-) create mode 100644 config/tmux/tmux.conf rename scripts/{ntfy-bell => ntfy-osc9} (89%) diff --git a/config/ghostty/config b/config/ghostty/config index fe138bb..b86dd3e 100644 --- a/config/ghostty/config +++ b/config/ghostty/config @@ -11,7 +11,12 @@ window-height = 50 term = xterm-256color # reduce dimming for unfocused split panes (1.0 disables dimming) -unfocused-split-opacity = 0.88 +unfocused-split-opacity = 0.77 +split-divider-color = #666666 + +window-inherit-working-directory = false +tab-inherit-working-directory = true + # USE PRERELEASE # > While you can set this setting back to `stable` at any time, this will only take effect when a later stable @@ -19,13 +24,12 @@ unfocused-split-opacity = 0.88 auto-update-channel = tip auto-update = off -# window-inherit-working-directory = false - # binds keybind = cmd+,=open_config keybind = cmd+b>shift+'=new_split:down keybind = cmd+b>shift+5=new_split:right +keybind = cmd+b>cmd+b=goto_split:next keybind = cmd+b>right=goto_split:right keybind = cmd+b>left=goto_split:left diff --git a/config/neovim/init.lua b/config/neovim/init.lua index dca8fd1..bfd2949 100644 --- a/config/neovim/init.lua +++ b/config/neovim/init.lua @@ -14,34 +14,97 @@ opt.termguicolors = true opt.mouse = 'a' opt.smartindent = true opt.wrap = false -opt.relativenumber = true +opt.number = true +opt.relativenumber = false opt.tabstop = 4 opt.shiftwidth = 4 opt.expandtab = true +vim.o.sessionoptions = 'blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal,localoptions' vim.hl.priorities.semantic_tokens = 140 vim.hl.priorities.treesitter = 100 -vim.filetype.add({ extension = { svelte = 'svelte' } }) -vim.api.nvim_create_autocmd('FileType', { pattern = 'markdown', command = 'setlocal wrap' }) +vim.filetype.add({ + extension = { + svelte = 'svelte', + svx = 'markdown', + }, +}) +vim.api.nvim_create_autocmd('FileType', { pattern = { 'markdown', 'svx' }, command = 'setlocal wrap' }) local function map(mode, lhs, rhs) vim.keymap.set(mode, lhs, rhs, { silent = true }) end +local function confirm_clear_buffers() + local choice = vim.fn.confirm('Clear all buffers?', '&Yes\n&No', 2) + if choice ~= 1 then + return + end + + local listed_buffers = {} + for _, buf in ipairs(vim.api.nvim_list_bufs()) do + if vim.api.nvim_buf_is_valid(buf) and vim.bo[buf].buflisted then + listed_buffers[#listed_buffers + 1] = buf + end + end + + local ok, err = pcall(vim.cmd, 'enew') + if not ok then + vim.notify(err, vim.log.levels.WARN) + return + end + + local scratch = vim.api.nvim_get_current_buf() + vim.bo[scratch].buftype = 'nofile' + vim.bo[scratch].bufhidden = 'wipe' + vim.bo[scratch].buflisted = false + vim.bo[scratch].swapfile = false + + local failed = false + for _, buf in ipairs(listed_buffers) do + if buf ~= scratch and vim.api.nvim_buf_is_valid(buf) then + local deleted = pcall(vim.api.nvim_buf_delete, buf, {}) + failed = failed or not deleted + end + end + + if failed then + vim.notify('Some buffers could not be deleted', vim.log.levels.WARN) + end +end + +local function telescope_workspace_symbols() + local bufnr = vim.api.nvim_get_current_buf() + + for _, client in ipairs(vim.lsp.get_clients({ bufnr = bufnr })) do + if client:supports_method('workspace/symbol', bufnr) then + require('telescope.builtin').lsp_dynamic_workspace_symbols() + return + end + end + + vim.notify('No attached LSP client supports workspace/symbol for this buffer', vim.log.levels.WARN) +end + for _, m in ipairs({ - { 'n', '', 'NvimTreeToggle' }, + { 'n', '', 'NvimTreeFindFileToggle' }, { 'n', '', 'ToggleTerm direction="float"' }, { 't', '', 'ToggleTerm' }, { 'n', 'gs', 'Telescope git_status' }, { 'n', 'gc', 'Telescope git_commits' }, { 'n', ':', 'Telescope commands' }, { 'n', '', 'Telescope find_files' }, - { 'n', 'f', 'Telescope grep_string' }, + { 'n', 'ff', 'Telescope live_grep' }, + { 'n', 'fz', 'Telescope grep_string' }, + { 'n', 't', telescope_workspace_symbols }, { 'n', 'b', 'Telescope buffers' }, + { 'n', 'dB', confirm_clear_buffers }, { 'n', 'B', 'Telescope buffers' }, { 'n', 'e', vim.diagnostic.open_float }, { 'n', '\\', vim.lsp.buf.hover }, + { 'n', '', vim.lsp.buf.definition }, + { 'n', '', vim.lsp.buf.rename }, { 'n', '', 'GitGutterPrevHunk' }, { 'n', '', 'GitGutterNextHunk' }, { 'n', '', 'bp' }, @@ -72,21 +135,47 @@ require('lazy').setup({ config = function() require('vscode').setup({ transparent = true }) end, }, { 'airblade/vim-gitgutter' }, + { + 'numToStr/Comment.nvim', + config = function() + require('Comment').setup() + vim.keymap.set('n', '/', function() + return vim.v.count == 0 and '(comment_toggle_linewise_current)' + or '(comment_toggle_linewise_count)' + end, { expr = true, silent = true, desc = 'Toggle line comment' }) + + vim.keymap.set('x', '/', '(comment_toggle_blockwise_visual)', { + silent = true, + desc = 'Toggle block comment', + }) + end, + }, { 'nvim-lualine/lualine.nvim', dependencies = { 'nvim-tree/nvim-web-devicons' }, - config = function() require('lualine').setup({ options = { theme = 'vscode', globalstatus = true } }) end, + config = function() + require('lualine').setup({ + options = { theme = 'vscode', globalstatus = true }, + sections = { + lualine_z = { + 'location', + function() return 'L:' .. vim.api.nvim_buf_line_count(0) end, + }, + }, + }) + end, }, { 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate', config = function() - local wanted = { 'svelte', 'javascript', 'typescript', 'html', 'css' } + local wanted = { 'svelte', 'javascript', 'typescript', 'html', 'css', 'markdown', 'svx' } local ts_runtime = vim.fn.stdpath('data') .. '/lazy/nvim-treesitter/runtime' if vim.loop.fs_stat(ts_runtime) then vim.opt.rtp:append(ts_runtime) end require('nvim-treesitter').setup({ install_dir = vim.fn.stdpath('data') .. '/site' }) + vim.treesitter.language.register('markdown', 'svx') vim.api.nvim_create_autocmd('FileType', { pattern = wanted, @@ -161,7 +250,27 @@ require('lazy').setup({ { 'nvim-tree/nvim-tree.lua', dependencies = { 'nvim-tree/nvim-web-devicons' }, - config = function() require('nvim-tree').setup({ view = { width = 42 } }) end, + config = function() + vim.api.nvim_set_hl(0, 'NvimTreeNormal', { bg = '#0f0f12' }) + vim.api.nvim_set_hl(0, 'NvimTreeEndOfBuffer', { bg = '#0f0f12' }) + vim.api.nvim_set_hl(0, 'NvimTreeWinSeparator', { bg = '#0f0f12', fg = '#0f0f12' }) + require('nvim-tree').setup({ + view = { width = 42 }, + update_focused_file = { + enable = true, + update_root = false, + }, + }) + end, + }, + { + 'rmagatti/auto-session', + lazy = false, + opts = { + suppressed_dirs = { '~/', '~/Downloads', '/' }, + close_filetypes_on_save = { 'checkhealth', 'NvimTree' }, + auto_delete_empty_sessions = false, + }, }, { 'nvim-telescope/telescope.nvim', diff --git a/config/neovim/lazy-lock.json b/config/neovim/lazy-lock.json index a439147..4a53710 100644 --- a/config/neovim/lazy-lock.json +++ b/config/neovim/lazy-lock.json @@ -1,11 +1,13 @@ { + "Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" }, + "auto-session": { "branch": "main", "commit": "62437532b38495551410b3f377bcf4aaac574ebe" }, "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, - "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" }, + "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" }, "nvim-cmp": { "branch": "main", "commit": "da88697d7f45d16852c6b2769dc52387d1ddc45f" }, - "nvim-lspconfig": { "branch": "master", "commit": "44acfe887d4056f704ccc4f17513ed41c9e2b2e6" }, - "nvim-tree.lua": { "branch": "master", "commit": "e11ce83ed9a00f065bf676ae4e6c261c766989ba" }, - "nvim-treesitter": { "branch": "main", "commit": "3edb01f912867603c2aef9079f208f0244c0885b" }, + "nvim-lspconfig": { "branch": "master", "commit": "b7dcde3e6195b43476ae799720b177aedc16d44c" }, + "nvim-tree.lua": { "branch": "master", "commit": "e49b0d9bfa70989cf8b5abf5557f51e6e57f68d6" }, + "nvim-treesitter": { "branch": "main", "commit": "d660b7c002f3922b6bb3da47206645488a698426" }, "nvim-web-devicons": { "branch": "master", "commit": "746ffbb17975ebd6c40142362eee1b0249969c5c" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" }, diff --git a/config/tmux/tmux.conf b/config/tmux/tmux.conf new file mode 100644 index 0000000..b977ca0 --- /dev/null +++ b/config/tmux/tmux.conf @@ -0,0 +1,24 @@ +# ~/.tmux.conf + +set -g monitor-bell on + +# Ctrl+a instead of Ctrl+b for command prefix (like Screen) +# set -g prefix C-a +# unbind C-b +# bind C-a send-prefix + +# ctrl+b C creates a new window to the right (NOTE: capital C) +# NOTE: this doesn't work for some reason!! +# unbind -T prefix C +# bind -T prefix C new-window -a . + +unbind l +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R +bind -r H resize-pane -L 5 +bind -r J resize-pane -D 5 +bind -r K resize-pane -U 5 +bind -r L resize-pane -R 5 + diff --git a/scripts/ntfy-bell b/scripts/ntfy-osc9 similarity index 89% rename from scripts/ntfy-bell rename to scripts/ntfy-osc9 index 17af7e3..f947036 100755 --- a/scripts/ntfy-bell +++ b/scripts/ntfy-osc9 @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -# ntfy-bell - run a command, forwarding OSC 9 notifications and BEL to ntfy +# ntfy-bell - run a command, forwarding OSC 9 notifications to ntfy # # Usage: # ntfy-bell [args...] @@ -102,9 +102,9 @@ def _copy_winsize(src_fd: int, dst_fd: int) -> None: def main() -> int: - topic = os.environ.get("BELL2NTFY_TOPIC") + topic = os.environ.get("NTFY_ME_TOPIC") if not topic: - print("Error: environment variable BELL2NTFY_TOPIC not set", file=sys.stderr) + print("Error: environment variable NTFY_ME_TOPIC not set", file=sys.stderr) return 2 if len(sys.argv) < 2: @@ -155,7 +155,6 @@ def main() -> int: signal.signal(signal.SIGWINCH, _on_winch) osc_last_sent = 0.0 - bel_last_sent = 0.0 cooldown_s = 1.5 parse_buf = bytearray() stdin_eof_sent = False @@ -224,19 +223,6 @@ def main() -> int: except Exception: pass - if bytes([BEL]) in data and parse_buf.find(OSC9_PREFIX) == -1: - now = time.time() - if now - bel_last_sent >= cooldown_s: - bel_last_sent = now - try: - notify_ntfy( - topic=topic, - title="Terminal bell", - message=f"BEL from: {' '.join(cmd)}", - ) - except Exception: - pass - finally: if stdin_fd is not None and stdin_is_tty and old_tty_attrs is not None: try: