Split laptop/work into independent stow packages with shared/ base
- Remove work/laptop detection logic from nvim and emacs configs; each
package now has a self-contained init that requires no runtime checks
- Create shared/ stow package containing nvim/init.lua, emacs/init.el,
common-dev-settings.el, org-bindings.el, tmux, ghostty, and ranger
- Rename laptop-languages.lua / work-languages.lua → languages.lua in
each package; shared/init.lua uses require('languages') generically
- Rename work-dev-settings.el → dev-settings.el to match laptop naming
- Expand work/ to include the full set of dev tools (tmux, ghostty,
ranger, emacs, neovim) without email/calendar tooling
- Add Makefile with `make laptop` and `make work` targets (each runs
a single `stow shared <profile>` invocation)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,77 +0,0 @@
|
||||
;;; common-dev-settings.el --- Dev tooling shared across all hosts
|
||||
|
||||
;;; Completion
|
||||
|
||||
(use-package company
|
||||
:defer 1
|
||||
:config
|
||||
(global-company-mode)
|
||||
(setq company-idle-delay 0.2
|
||||
company-minimum-prefix-length 2
|
||||
company-show-numbers t
|
||||
company-tooltip-align-annotations t))
|
||||
|
||||
;;; LSP
|
||||
|
||||
(use-package eglot
|
||||
:ensure nil
|
||||
:defer t
|
||||
:commands (eglot eglot-ensure)
|
||||
:config
|
||||
(setq eglot-autoshutdown t
|
||||
eglot-send-changes-idle-time 0.5)
|
||||
(setq eldoc-echo-area-use-multiline-p nil)
|
||||
(add-to-list 'eglot-stay-out-of 'eldoc))
|
||||
|
||||
;;; Tree-sitter mode management
|
||||
;; Grammar sources and installation are host-specific; see dev-settings.el.
|
||||
|
||||
(use-package treesit-auto
|
||||
:custom
|
||||
(treesit-auto-install 'prompt)
|
||||
:config
|
||||
(treesit-auto-add-to-auto-mode-alist 'all)
|
||||
(global-treesit-auto-mode))
|
||||
|
||||
;;; Utilities
|
||||
|
||||
(use-package helpful
|
||||
:defer t
|
||||
:commands (helpful-callable helpful-variable helpful-key))
|
||||
|
||||
(use-package smartparens
|
||||
:defer 1
|
||||
:hook (prog-mode . smartparens-mode)
|
||||
:config
|
||||
(require 'smartparens-config))
|
||||
|
||||
(use-package yasnippet
|
||||
:defer 2
|
||||
:config
|
||||
(yas-global-mode 1))
|
||||
|
||||
(use-package yasnippet-snippets
|
||||
:defer t
|
||||
:after yasnippet)
|
||||
|
||||
;;; Emacs Lisp
|
||||
|
||||
(add-hook 'emacs-lisp-mode-hook #'eldoc-mode)
|
||||
(add-hook 'emacs-lisp-mode-hook #'company-mode)
|
||||
|
||||
;;; LSP Keybindings
|
||||
|
||||
(with-eval-after-load 'eglot
|
||||
(keymap-set eglot-mode-map "C-c l d" #'xref-find-definitions)
|
||||
(keymap-set eglot-mode-map "C-c l r" #'xref-find-references)
|
||||
(keymap-set eglot-mode-map "C-c l i" #'eglot-find-implementation)
|
||||
(keymap-set eglot-mode-map "C-c l t" #'eglot-find-typeDefinition)
|
||||
(keymap-set eglot-mode-map "C-c l h" #'eldoc-doc-buffer)
|
||||
(keymap-set eglot-mode-map "C-c l s" #'eldoc)
|
||||
(keymap-set eglot-mode-map "C-c l a" #'eglot-code-actions)
|
||||
(keymap-set eglot-mode-map "C-c l n" #'eglot-rename)
|
||||
(keymap-set eglot-mode-map "C-c l e" #'flymake-show-buffer-diagnostics)
|
||||
(keymap-set eglot-mode-map "C-c l f" #'eglot-format-buffer))
|
||||
|
||||
(provide 'common-dev-settings)
|
||||
;;; common-dev-settings.el ends here
|
||||
@@ -1,168 +0,0 @@
|
||||
;; init.el
|
||||
|
||||
(defun rh/load-user-file (file)
|
||||
"Load FILE from `user-emacs-directory' when it exists."
|
||||
(let ((path (expand-file-name file user-emacs-directory)))
|
||||
(when (file-exists-p path)
|
||||
(load path nil 'nomessage))))
|
||||
|
||||
;;; Startup/UI ---------------------------------------------------------------
|
||||
|
||||
(setq inhibit-startup-message t
|
||||
visible-bell t)
|
||||
|
||||
(scroll-bar-mode -1)
|
||||
(tool-bar-mode -1)
|
||||
(tooltip-mode -1)
|
||||
(menu-bar-mode -1)
|
||||
|
||||
;;; Editing Defaults ---------------------------------------------------------
|
||||
|
||||
(global-display-line-numbers-mode 1)
|
||||
(setq display-line-numbers-type 'relative)
|
||||
|
||||
(setq make-backup-files nil
|
||||
auto-save-default nil
|
||||
create-lockfiles nil)
|
||||
|
||||
(setq vc-follow-symlinks t
|
||||
find-file-visit-truename t)
|
||||
|
||||
;;; Package Manager ----------------------------------------------------------
|
||||
|
||||
(require 'package)
|
||||
|
||||
(setq package-archives '(("melpa" . "https://melpa.org/packages/")
|
||||
("elpa" . "https://elpa.gnu.org/packages/")))
|
||||
|
||||
(package-initialize)
|
||||
(unless package-archive-contents
|
||||
(package-refresh-contents))
|
||||
|
||||
(unless (package-installed-p 'use-package)
|
||||
(package-install 'use-package))
|
||||
|
||||
(require 'use-package)
|
||||
(setq use-package-always-ensure t)
|
||||
|
||||
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
|
||||
|
||||
;;; Style/Theme --------------------------------------------------------------
|
||||
|
||||
(use-package catppuccin-theme
|
||||
:init
|
||||
(setq catppuccin-flavor 'mocha)
|
||||
:config
|
||||
(load-theme 'catppuccin t))
|
||||
|
||||
;; Icons are only useful in GUI Emacs.
|
||||
(use-package all-the-icons
|
||||
:if (display-graphic-p))
|
||||
|
||||
;; Color nested delimiters in programming buffers.
|
||||
(use-package rainbow-delimiters
|
||||
:hook (prog-mode . rainbow-delimiters-mode))
|
||||
|
||||
(use-package doom-modeline
|
||||
:init
|
||||
(doom-modeline-mode 1)
|
||||
:config
|
||||
(setq doom-modeline-height 15))
|
||||
|
||||
;;; Completion/Search/Navigation ---------------------------------------------
|
||||
|
||||
(use-package vertico
|
||||
:init
|
||||
(vertico-mode))
|
||||
|
||||
(use-package consult
|
||||
:bind (("C-x b" . consult-buffer)
|
||||
("C-s" . consult-line)
|
||||
("M-y" . consult-yank-pop)))
|
||||
|
||||
(use-package orderless
|
||||
:config
|
||||
(setq completion-styles '(orderless basic)
|
||||
completion-category-defaults nil))
|
||||
|
||||
(use-package marginalia
|
||||
:init
|
||||
(marginalia-mode))
|
||||
|
||||
(use-package embark
|
||||
:bind (("C-." . embark-act)
|
||||
("M-." . embark-dwim)))
|
||||
|
||||
(use-package embark-consult
|
||||
:after (embark consult))
|
||||
|
||||
(use-package which-key
|
||||
:init
|
||||
(which-key-mode)
|
||||
:config
|
||||
(setq which-key-idle-delay 1))
|
||||
|
||||
;;; Key Bindings -------------------------------------------------------------
|
||||
|
||||
;; Make ESC quit prompts.
|
||||
(global-set-key (kbd "<escape>") #'keyboard-escape-quit)
|
||||
|
||||
;; windmove: S-Arrow to move between windows (built-in since Emacs 27).
|
||||
(windmove-default-keybindings)
|
||||
|
||||
;;; Projects -----------------------------------------------------------------
|
||||
|
||||
(use-package projectile
|
||||
:init
|
||||
(when (file-directory-p "~/src")
|
||||
(setq projectile-project-search-path '("~/src")))
|
||||
(setq projectile-switch-project-action #'projectile-dired)
|
||||
:config
|
||||
(projectile-mode 1)
|
||||
:bind-keymap
|
||||
("C-c p" . projectile-command-map))
|
||||
|
||||
(use-package consult-projectile
|
||||
:bind (("C-c h" . consult-projectile)))
|
||||
|
||||
;;; Git ----------------------------------------------------------------------
|
||||
|
||||
(use-package magit
|
||||
:commands (magit-status magit-get-current-branch)
|
||||
:bind (("C-x g" . magit-status)
|
||||
("C-x M-g" . magit-dispatch)
|
||||
("C-c M-g" . magit-file-dispatch))
|
||||
:custom
|
||||
(magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)
|
||||
(magit-diff-refine-hunk t)
|
||||
(magit-auto-revert-mode nil)
|
||||
(magit-process-find-password-functions '(magit-process-password-auth-source)))
|
||||
|
||||
;;; Org ----------------------------------------------------------------------
|
||||
|
||||
(defun rh/org-mode-setup ()
|
||||
(org-indent-mode)
|
||||
(visual-line-mode 1))
|
||||
|
||||
(use-package org
|
||||
:hook (org-mode . rh/org-mode-setup)
|
||||
:config
|
||||
(setq org-agenda-files
|
||||
(if (file-directory-p "~/org")
|
||||
(directory-files-recursively "~/org" "\\.org$")
|
||||
nil)))
|
||||
|
||||
(defun rh/wsl-p ()
|
||||
(and (eq system-type 'gnu/linux)
|
||||
(file-exists-p "/proc/version")
|
||||
(with-temp-buffer
|
||||
(insert-file-contents "/proc/version")
|
||||
(string-match-p "microsoft" (buffer-string)))))
|
||||
|
||||
(rh/load-user-file "org-bindings.el")
|
||||
(rh/load-user-file "common-dev-settings.el")
|
||||
(if (rh/wsl-p)
|
||||
(rh/load-user-file "work-dev-settings.el")
|
||||
(rh/load-user-file "dev-settings.el"))
|
||||
(rh/load-user-file "latex-settings.el")
|
||||
(rh/load-user-file "custom.el")
|
||||
@@ -1,35 +0,0 @@
|
||||
;;; org-bindings.el --- Standard Emacs keybindings for Org mode
|
||||
|
||||
(with-eval-after-load 'org
|
||||
;; Org agenda and capture
|
||||
(global-set-key (kbd "C-c o a") 'org-agenda)
|
||||
(global-set-key (kbd "C-c o c") 'org-capture)
|
||||
|
||||
;; Link commands
|
||||
(define-key org-mode-map (kbd "C-c o l") 'org-store-link)
|
||||
(define-key org-mode-map (kbd "C-c o i") 'org-insert-link)
|
||||
|
||||
;; TODO and scheduling
|
||||
(define-key org-mode-map (kbd "C-c o t") 'org-todo)
|
||||
(define-key org-mode-map (kbd "C-c o s") 'org-schedule)
|
||||
(define-key org-mode-map (kbd "C-c o d") 'org-deadline)
|
||||
(define-key org-mode-map (kbd "C-c o T") 'org-time-stamp)
|
||||
(define-key org-mode-map (kbd "C-c o p") 'org-priority)
|
||||
|
||||
;; Checkboxes and lists
|
||||
(define-key org-mode-map (kbd "C-c o x") 'org-toggle-checkbox)
|
||||
(define-key org-mode-map (kbd "C-c o -") 'org-ctrl-c-minus)
|
||||
|
||||
;; Refile
|
||||
(define-key org-mode-map (kbd "C-c o r") 'org-refile))
|
||||
|
||||
;; Theme selection
|
||||
(global-set-key (kbd "C-c t t") 'consult-theme)
|
||||
|
||||
;; Text scaling with standard Emacs bindings
|
||||
(global-set-key (kbd "C-x C-=") 'text-scale-increase)
|
||||
(global-set-key (kbd "C-x C--") 'text-scale-decrease)
|
||||
(global-set-key (kbd "C-x C-0") 'text-scale-adjust)
|
||||
|
||||
(provide 'org-bindings)
|
||||
;;; org-bindings.el ends here
|
||||
@@ -1,15 +0,0 @@
|
||||
font-family = Hack Nerd Font Mono
|
||||
font-size = 11
|
||||
theme = "Catppuccin Mocha"
|
||||
cursor-style = block
|
||||
|
||||
# Unbind alt+number tab switching so weechat can use them
|
||||
keybind = alt+one=unbind
|
||||
keybind = alt+two=unbind
|
||||
keybind = alt+three=unbind
|
||||
keybind = alt+four=unbind
|
||||
keybind = alt+five=unbind
|
||||
keybind = alt+six=unbind
|
||||
keybind = alt+seven=unbind
|
||||
keybind = alt+eight=unbind
|
||||
keybind = alt+nine=unbind
|
||||
@@ -1,625 +0,0 @@
|
||||
-- init.lua
|
||||
-- Based on kickstart.nvim — mirrors emacs setup
|
||||
|
||||
vim.g.mapleader = ' '
|
||||
vim.g.maplocalleader = '\\' -- vimtex uses \ll, \lv, etc.
|
||||
vim.g.have_nerd_font = true
|
||||
|
||||
-- work-languages.lua (work stow) → work mode; laptop-languages.lua → laptop mode.
|
||||
-- The two are mutually exclusive: work mode suppresses laptop languages.
|
||||
local _work = {}
|
||||
pcall(function() _work = require('work-languages') end)
|
||||
local _lang = {}
|
||||
if not next(_work) then
|
||||
pcall(function() _lang = require('laptop-languages') end)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Options
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
vim.opt.number = true
|
||||
vim.opt.relativenumber = true
|
||||
vim.opt.mouse = 'a'
|
||||
vim.opt.showmode = false
|
||||
vim.opt.clipboard = 'unnamedplus'
|
||||
vim.opt.breakindent = true
|
||||
vim.opt.undofile = true
|
||||
vim.opt.ignorecase = true
|
||||
vim.opt.smartcase = true
|
||||
vim.opt.signcolumn = 'yes'
|
||||
vim.opt.updatetime = 250
|
||||
vim.opt.timeoutlen = 300
|
||||
vim.opt.splitright = true
|
||||
vim.opt.splitbelow = true
|
||||
vim.opt.inccommand = 'split'
|
||||
vim.opt.cursorline = true
|
||||
vim.opt.scrolloff = 8
|
||||
vim.opt.backup = false
|
||||
vim.opt.swapfile = false
|
||||
vim.opt.writebackup = false
|
||||
vim.opt.expandtab = true
|
||||
vim.opt.shiftwidth = 4
|
||||
vim.opt.tabstop = 4
|
||||
vim.opt.smartindent = true
|
||||
vim.opt.list = true
|
||||
vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Keymaps
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>')
|
||||
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Prev diagnostic' })
|
||||
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next diagnostic' })
|
||||
vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float, { desc = 'Show diagnostic' })
|
||||
|
||||
vim.keymap.set('n', '<C-h>', '<C-w>h', { desc = 'Move to left window' })
|
||||
vim.keymap.set('n', '<C-l>', '<C-w>l', { desc = 'Move to right window' })
|
||||
vim.keymap.set('n', '<C-j>', '<C-w>j', { desc = 'Move to lower window' })
|
||||
vim.keymap.set('n', '<C-k>', '<C-w>k', { desc = 'Move to upper window' })
|
||||
|
||||
vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Bootstrap lazy.nvim
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
|
||||
if not (vim.uv or vim.loop).fs_stat(lazypath) then
|
||||
local out = vim.fn.system({
|
||||
'git', 'clone', '--filter=blob:none', '--branch=stable',
|
||||
'https://github.com/folke/lazy.nvim.git', lazypath,
|
||||
})
|
||||
if vim.v.shell_error ~= 0 then
|
||||
error('Error cloning lazy.nvim:\n' .. out)
|
||||
end
|
||||
end
|
||||
vim.opt.rtp:prepend(lazypath)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Plugins
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
require('lazy').setup({
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Theme
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'catppuccin/nvim',
|
||||
name = 'catppuccin',
|
||||
priority = 1000,
|
||||
opts = {
|
||||
flavour = 'mocha',
|
||||
integrations = {
|
||||
cmp = true,
|
||||
gitsigns = true,
|
||||
telescope = { enabled = true },
|
||||
treesitter = true,
|
||||
which_key = true,
|
||||
mason = true,
|
||||
rainbow_delimiters = true,
|
||||
indent_blankline = { enabled = true },
|
||||
dap = true,
|
||||
dap_ui = true,
|
||||
native_lsp = {
|
||||
enabled = true,
|
||||
underlines = {
|
||||
errors = { 'underline' },
|
||||
hints = { 'underline' },
|
||||
warnings = { 'underline' },
|
||||
information = { 'underline' },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
require('catppuccin').setup(opts)
|
||||
vim.cmd.colorscheme('catppuccin')
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Status line (doom-modeline equivalent)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'nvim-lualine/lualine.nvim',
|
||||
dependencies = { 'nvim-tree/nvim-web-devicons' },
|
||||
opts = {
|
||||
options = {
|
||||
theme = 'catppuccin',
|
||||
component_separators = '|',
|
||||
section_separators = '',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- UI
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'HiPhish/rainbow-delimiters.nvim',
|
||||
config = function()
|
||||
local rainbow = require('rainbow-delimiters')
|
||||
vim.g.rainbow_delimiters = {
|
||||
strategy = { [''] = rainbow.strategy['global'] },
|
||||
query = { [''] = 'rainbow-delimiters', lua = 'rainbow-blocks' },
|
||||
highlight = {
|
||||
'RainbowDelimiterRed', 'RainbowDelimiterYellow',
|
||||
'RainbowDelimiterBlue', 'RainbowDelimiterOrange',
|
||||
'RainbowDelimiterGreen', 'RainbowDelimiterViolet',
|
||||
'RainbowDelimiterCyan',
|
||||
},
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
{
|
||||
'lukas-reineke/indent-blankline.nvim',
|
||||
main = 'ibl',
|
||||
opts = {},
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Which-key (identical to emacs which-key)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'folke/which-key.nvim',
|
||||
event = 'VimEnter',
|
||||
opts = {
|
||||
delay = 1000,
|
||||
icons = { mappings = vim.g.have_nerd_font },
|
||||
spec = {
|
||||
{ '<leader>f', group = 'find' },
|
||||
{ '<leader>l', group = 'lsp' },
|
||||
{ '<leader>d', group = 'debug' },
|
||||
{ '<leader>g', group = 'git' },
|
||||
{ '<leader>b', group = 'buffer' },
|
||||
{ '<leader>x', group = 'latex' },
|
||||
{ '<leader>h', group = 'harpoon' },
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Telescope (vertico + consult + projectile)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'nvim-telescope/telescope.nvim',
|
||||
event = 'VimEnter',
|
||||
branch = '0.1.x',
|
||||
dependencies = {
|
||||
'nvim-lua/plenary.nvim',
|
||||
{
|
||||
'nvim-telescope/telescope-fzf-native.nvim',
|
||||
build = 'make',
|
||||
cond = function() return vim.fn.executable('make') == 1 end,
|
||||
},
|
||||
'nvim-tree/nvim-web-devicons',
|
||||
},
|
||||
config = function()
|
||||
require('telescope').setup({
|
||||
defaults = {
|
||||
file_ignore_patterns = { 'node_modules', '.git/' },
|
||||
},
|
||||
})
|
||||
pcall(require('telescope').load_extension, 'fzf')
|
||||
|
||||
local b = require('telescope.builtin')
|
||||
vim.keymap.set('n', '<leader><space>', b.find_files, { desc = 'Find files' })
|
||||
vim.keymap.set('n', '<leader>ff', b.find_files, { desc = 'Find files' })
|
||||
vim.keymap.set('n', '<leader>fg', b.live_grep, { desc = 'Live grep' })
|
||||
vim.keymap.set('n', '<leader>fb', b.buffers, { desc = 'Buffers' })
|
||||
vim.keymap.set('n', '<leader>fh', b.help_tags, { desc = 'Help tags' })
|
||||
vim.keymap.set('n', '<leader>fr', b.oldfiles, { desc = 'Recent files' })
|
||||
vim.keymap.set('n', '<leader>fd', b.diagnostics, { desc = 'Diagnostics' })
|
||||
vim.keymap.set('n', '<leader>fs', b.grep_string, { desc = 'Grep word under cursor' })
|
||||
vim.keymap.set('n', '<leader>/', b.current_buffer_fuzzy_find, { desc = 'Search buffer' })
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Git — lazygit float + gutter signs
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'folke/snacks.nvim',
|
||||
priority = 1000,
|
||||
lazy = false,
|
||||
opts = { lazygit = { enabled = true } },
|
||||
keys = {
|
||||
{ '<leader>gg', function() Snacks.lazygit() end, desc = 'Lazygit' },
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
'lewis6991/gitsigns.nvim',
|
||||
opts = {
|
||||
signs = {
|
||||
add = { text = '+' },
|
||||
change = { text = '~' },
|
||||
delete = { text = '_' },
|
||||
topdelete = { text = '‾' },
|
||||
changedelete = { text = '~' },
|
||||
},
|
||||
on_attach = function(bufnr)
|
||||
local gs = require('gitsigns')
|
||||
local map = function(l, r, desc)
|
||||
vim.keymap.set('n', l, r, { buffer = bufnr, desc = desc })
|
||||
end
|
||||
map(']h', gs.next_hunk, 'Next hunk')
|
||||
map('[h', gs.prev_hunk, 'Prev hunk')
|
||||
map('<leader>gs', gs.stage_hunk, 'Stage hunk')
|
||||
map('<leader>gr', gs.reset_hunk, 'Reset hunk')
|
||||
map('<leader>gS', gs.stage_buffer, 'Stage buffer')
|
||||
map('<leader>gp', gs.preview_hunk, 'Preview hunk')
|
||||
map('<leader>gb', gs.blame_line, 'Blame line')
|
||||
map('<leader>gd', gs.diffthis, 'Diff this')
|
||||
end,
|
||||
},
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Treesitter (treesit-auto equivalent)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'nvim-treesitter/nvim-treesitter',
|
||||
build = ':TSUpdate',
|
||||
main = 'nvim-treesitter.configs',
|
||||
opts = {
|
||||
ensure_installed = (function()
|
||||
local t = { 'bash', 'json', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'vim', 'vimdoc', 'yaml' }
|
||||
vim.list_extend(t, _lang.parsers or {})
|
||||
vim.list_extend(t, _work.parsers or {})
|
||||
return t
|
||||
end)(),
|
||||
auto_install = true,
|
||||
highlight = { enable = true },
|
||||
indent = { enable = true },
|
||||
},
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Snippets (yasnippet + yasnippet-snippets equivalent)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'L3MON4D3/LuaSnip',
|
||||
build = 'make install_jsregexp',
|
||||
dependencies = { 'rafamadriz/friendly-snippets' },
|
||||
config = function()
|
||||
require('luasnip.loaders.from_vscode').lazy_load()
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Completion (company equivalent)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'hrsh7th/nvim-cmp',
|
||||
event = 'InsertEnter',
|
||||
dependencies = {
|
||||
'saadparwaiz1/cmp_luasnip',
|
||||
'hrsh7th/cmp-nvim-lsp',
|
||||
'hrsh7th/cmp-path',
|
||||
'hrsh7th/cmp-buffer',
|
||||
},
|
||||
config = function()
|
||||
local cmp = require('cmp')
|
||||
local luasnip = require('luasnip')
|
||||
|
||||
cmp.setup({
|
||||
snippet = {
|
||||
expand = function(args) luasnip.lsp_expand(args.body) end,
|
||||
},
|
||||
completion = { completeopt = 'menu,menuone,noinsert' },
|
||||
mapping = cmp.mapping.preset.insert({
|
||||
['<C-n>'] = cmp.mapping.select_next_item(),
|
||||
['<C-p>'] = cmp.mapping.select_prev_item(),
|
||||
['<C-b>'] = cmp.mapping.scroll_docs(-4),
|
||||
['<C-f>'] = cmp.mapping.scroll_docs(4),
|
||||
['<C-Space>'] = cmp.mapping.complete(),
|
||||
['<CR>'] = cmp.mapping.confirm({ select = true }),
|
||||
['<Tab>'] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_next_item()
|
||||
elseif luasnip.expand_or_locally_jumpable() then
|
||||
luasnip.expand_or_jump()
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { 'i', 's' }),
|
||||
['<S-Tab>'] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_prev_item()
|
||||
elseif luasnip.locally_jumpable(-1) then
|
||||
luasnip.jump(-1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { 'i', 's' }),
|
||||
}),
|
||||
sources = cmp.config.sources(
|
||||
{ { name = 'nvim_lsp' }, { name = 'luasnip' }, { name = 'path' } },
|
||||
{ { name = 'buffer' } }
|
||||
),
|
||||
formatting = {
|
||||
format = function(entry, item)
|
||||
item.menu = ({
|
||||
nvim_lsp = '[LSP]', luasnip = '[Snip]',
|
||||
buffer = '[Buf]', path = '[Path]',
|
||||
})[entry.source.name]
|
||||
return item
|
||||
end,
|
||||
},
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Autopairs (smartparens equivalent)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'windwp/nvim-autopairs',
|
||||
event = 'InsertEnter',
|
||||
config = function()
|
||||
require('nvim-autopairs').setup({})
|
||||
require('cmp').event:on('confirm_done',
|
||||
require('nvim-autopairs.completion.cmp').on_confirm_done()
|
||||
)
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Formatting (prettier, stylua, clang-format, etc.)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'stevearc/conform.nvim',
|
||||
event = { 'BufWritePre' },
|
||||
cmd = { 'ConformInfo' },
|
||||
keys = {
|
||||
{
|
||||
'<leader>lf',
|
||||
function() require('conform').format({ async = true }) end,
|
||||
mode = { 'n', 'v' },
|
||||
desc = 'Format buffer',
|
||||
},
|
||||
},
|
||||
opts = {
|
||||
formatters_by_ft = vim.tbl_extend('force',
|
||||
{ lua = { 'stylua' } },
|
||||
_lang.formatters or {},
|
||||
_work.formatters or {}
|
||||
),
|
||||
format_on_save = { timeout_ms = 500, lsp_fallback = true },
|
||||
},
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- LSP (eglot equivalent — nvim-lspconfig + mason)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'neovim/nvim-lspconfig',
|
||||
dependencies = {
|
||||
{ 'williamboman/mason.nvim', opts = {} },
|
||||
'williamboman/mason-lspconfig.nvim',
|
||||
'WhoIsSethDaniel/mason-tool-installer.nvim',
|
||||
{ 'j-hui/fidget.nvim', opts = {} },
|
||||
},
|
||||
config = function()
|
||||
vim.api.nvim_create_autocmd('LspAttach', {
|
||||
group = vim.api.nvim_create_augroup('lsp-attach', { clear = true }),
|
||||
callback = function(event)
|
||||
local map = function(keys, func, desc)
|
||||
vim.keymap.set('n', keys, func, { buffer = event.buf, desc = desc })
|
||||
end
|
||||
local b = require('telescope.builtin')
|
||||
|
||||
-- mirrors emacs C-c l bindings
|
||||
map('gd', b.lsp_definitions, 'Go to definition')
|
||||
map('gr', b.lsp_references, 'Find references')
|
||||
map('gi', b.lsp_implementations, 'Go to implementation')
|
||||
map('<leader>lt', b.lsp_type_definitions, 'Type definition')
|
||||
map('<leader>ls', b.lsp_document_symbols, 'Document symbols')
|
||||
map('K', vim.lsp.buf.hover, 'Hover documentation')
|
||||
map('<leader>la', vim.lsp.buf.code_action, 'Code action')
|
||||
map('<leader>ln', vim.lsp.buf.rename, 'Rename')
|
||||
map('<leader>le', vim.diagnostic.open_float, 'Show diagnostics')
|
||||
map('<leader>lh', vim.lsp.buf.signature_help, 'Signature help')
|
||||
|
||||
local client = vim.lsp.get_client_by_id(event.data.client_id)
|
||||
if client then
|
||||
-- highlight references to word under cursor
|
||||
if client.supports_method('textDocument/documentHighlight') then
|
||||
local grp = vim.api.nvim_create_augroup('lsp-highlight', { clear = false })
|
||||
vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
|
||||
buffer = event.buf, group = grp,
|
||||
callback = vim.lsp.buf.document_highlight,
|
||||
})
|
||||
vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
|
||||
buffer = event.buf, group = grp,
|
||||
callback = vim.lsp.buf.clear_references,
|
||||
})
|
||||
end
|
||||
-- inlay hints toggle
|
||||
if client.supports_method('textDocument/inlayHint') then
|
||||
map('<leader>li', function()
|
||||
vim.lsp.inlay_hint.enable(
|
||||
not vim.lsp.inlay_hint.is_enabled({ bufnr = event.buf })
|
||||
)
|
||||
end, 'Toggle inlay hints')
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
local capabilities = vim.tbl_deep_extend('force',
|
||||
vim.lsp.protocol.make_client_capabilities(),
|
||||
require('cmp_nvim_lsp').default_capabilities()
|
||||
)
|
||||
|
||||
local servers = vim.tbl_extend('force',
|
||||
{
|
||||
lua_ls = {
|
||||
settings = {
|
||||
Lua = {
|
||||
completion = { callSnippet = 'Replace' },
|
||||
diagnostics = { globals = { 'vim', 'Snacks' } },
|
||||
workspace = {
|
||||
library = vim.api.nvim_get_runtime_file('', true),
|
||||
checkThirdParty = false,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
_lang.servers or {},
|
||||
_work.servers or {}
|
||||
)
|
||||
|
||||
require('mason-tool-installer').setup({
|
||||
ensure_installed = vim.list_extend(
|
||||
vim.list_extend({ 'stylua' }, _lang.tools or {}),
|
||||
_work.tools or {}
|
||||
),
|
||||
})
|
||||
|
||||
require('mason-lspconfig').setup({
|
||||
ensure_installed = vim.tbl_keys(servers),
|
||||
handlers = {
|
||||
function(server_name)
|
||||
local cfg = servers[server_name] or {}
|
||||
cfg.capabilities = vim.tbl_deep_extend('force', capabilities, cfg.capabilities or {})
|
||||
require('lspconfig')[server_name].setup(cfg)
|
||||
end,
|
||||
},
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Debugging (dap-mode equivalent)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'mfussenegger/nvim-dap',
|
||||
cond = function() return not next(_work) end,
|
||||
dependencies = {
|
||||
{
|
||||
'rcarriga/nvim-dap-ui',
|
||||
dependencies = { 'nvim-neotest/nvim-nio' },
|
||||
config = function()
|
||||
local dap, dapui = require('dap'), require('dapui')
|
||||
dapui.setup()
|
||||
-- auto-open/close UI with debug sessions
|
||||
dap.listeners.after.event_initialized['dapui_config'] = dapui.open
|
||||
dap.listeners.before.event_terminated['dapui_config'] = dapui.close
|
||||
dap.listeners.before.event_exited['dapui_config'] = dapui.close
|
||||
end,
|
||||
},
|
||||
{ 'theHamsta/nvim-dap-virtual-text', opts = {} },
|
||||
{ 'leoluz/nvim-dap-go', config = function() require('dap-go').setup() end },
|
||||
},
|
||||
config = function()
|
||||
local dap = require('dap')
|
||||
|
||||
-- codelldb for C / C++ / Rust (installed via mason)
|
||||
dap.adapters.codelldb = {
|
||||
type = 'server',
|
||||
port = '${port}',
|
||||
executable = {
|
||||
command = vim.fn.stdpath('data') .. '/mason/bin/codelldb',
|
||||
args = { '--port', '${port}' },
|
||||
},
|
||||
}
|
||||
local codelldb_cfg = {{
|
||||
name = 'Launch',
|
||||
type = 'codelldb',
|
||||
request = 'launch',
|
||||
program = function()
|
||||
return vim.fn.input('Executable: ', vim.fn.getcwd() .. '/', 'file')
|
||||
end,
|
||||
cwd = '${workspaceFolder}',
|
||||
stopOnEntry = false,
|
||||
}}
|
||||
dap.configurations.c = codelldb_cfg
|
||||
dap.configurations.cpp = codelldb_cfg
|
||||
dap.configurations.rust = codelldb_cfg
|
||||
end,
|
||||
keys = {
|
||||
{ '<leader>dd', function() require('dap').continue() end, desc = 'Debug: start/continue' },
|
||||
{ '<leader>db', function() require('dap').toggle_breakpoint() end, desc = 'Debug: toggle breakpoint' },
|
||||
{ '<leader>dn', function() require('dap').step_over() end, desc = 'Debug: step over' },
|
||||
{ '<leader>di', function() require('dap').step_into() end, desc = 'Debug: step into' },
|
||||
{ '<leader>do', function() require('dap').step_out() end, desc = 'Debug: step out' },
|
||||
{ '<leader>dr', function() require('dap').restart() end, desc = 'Debug: restart' },
|
||||
{ '<leader>dq', function() require('dap').disconnect() end, desc = 'Debug: disconnect' },
|
||||
{ '<leader>du', function() require('dapui').toggle() end, desc = 'Debug: toggle UI' },
|
||||
{ '<leader>de', function() require('dapui').eval(vim.fn.input('Eval: ')) end, desc = 'Debug: eval expression' },
|
||||
},
|
||||
},
|
||||
|
||||
-- install codelldb via mason (laptop only)
|
||||
{
|
||||
'williamboman/mason.nvim',
|
||||
cond = function() return not next(_work) end,
|
||||
opts = function(_, opts)
|
||||
opts.ensure_installed = opts.ensure_installed or {}
|
||||
vim.list_extend(opts.ensure_installed, { 'codelldb' })
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- LaTeX (AUCTeX + latexmk + zathura equivalent)
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'lervag/vimtex',
|
||||
cond = function() return not next(_work) end,
|
||||
lazy = false,
|
||||
init = function()
|
||||
vim.g.vimtex_view_method = 'zathura'
|
||||
vim.g.vimtex_compiler_method = 'latexmk'
|
||||
vim.g.vimtex_compiler_latexmk = {
|
||||
options = { '-pdf', '-interaction=nonstopmode', '-synctex=1' },
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Harpoon
|
||||
--------------------------------------------------------------------------
|
||||
{
|
||||
'ThePrimeagen/harpoon',
|
||||
branch = 'harpoon2',
|
||||
dependencies = { 'nvim-lua/plenary.nvim' },
|
||||
config = function()
|
||||
local harpoon = require('harpoon')
|
||||
harpoon:setup()
|
||||
|
||||
vim.keymap.set('n', '<leader>a', function() harpoon:list():add() end, { desc = 'Harpoon: add file' })
|
||||
vim.keymap.set('n', '<leader>h', function() harpoon.ui:toggle_quick_menu(harpoon:list()) end, { desc = 'Harpoon: menu' })
|
||||
vim.keymap.set('n', '<leader>1', function() harpoon:list():select(1) end, { desc = 'Harpoon: file 1' })
|
||||
vim.keymap.set('n', '<leader>2', function() harpoon:list():select(2) end, { desc = 'Harpoon: file 2' })
|
||||
vim.keymap.set('n', '<leader>3', function() harpoon:list():select(3) end, { desc = 'Harpoon: file 3' })
|
||||
vim.keymap.set('n', '<leader>4', function() harpoon:list():select(4) end, { desc = 'Harpoon: file 4' })
|
||||
end,
|
||||
},
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Misc
|
||||
--------------------------------------------------------------------------
|
||||
{ 'tpope/vim-sleuth' }, -- automatic indent detection
|
||||
{
|
||||
'folke/todo-comments.nvim',
|
||||
event = 'VimEnter',
|
||||
dependencies = { 'nvim-lua/plenary.nvim' },
|
||||
opts = { signs = false },
|
||||
},
|
||||
|
||||
}, {
|
||||
ui = {
|
||||
icons = vim.g.have_nerd_font and {} or {
|
||||
cmd = '⌘', config = '🛠', event = '📅', ft = '📂', init = '⚙',
|
||||
keys = '🗝', plugin = '🔌', runtime = '💻', source = '📄',
|
||||
start = '🚀', task = '📌', lazy = '💤',
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -1,5 +1,7 @@
|
||||
-- Loaded by init.lua when work-languages.lua is absent (laptop stow only).
|
||||
-- Mirrors dev-settings.el: C/C++, Go, Rust, DAP.
|
||||
-- Laptop language pack: C/C++, Go, Rust, LaTeX, DAP.
|
||||
-- Loaded by shared/init.lua via require('languages').
|
||||
|
||||
|
||||
return {
|
||||
servers = {
|
||||
clangd = {},
|
||||
@@ -13,5 +15,5 @@ return {
|
||||
c = { 'clang_format' },
|
||||
cpp = { 'clang_format' },
|
||||
},
|
||||
tools = { 'clang-format' },
|
||||
tools = { 'clang-format', 'codelldb' },
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
from ranger.gui.colorscheme import ColorScheme
|
||||
from ranger.gui.color import *
|
||||
|
||||
# Catppuccin Mocha — 256-color approximations
|
||||
rosewater = 224
|
||||
flamingo = 217
|
||||
pink = 218
|
||||
mauve = 183
|
||||
red = 211
|
||||
maroon = 217
|
||||
peach = 216
|
||||
yellow = 223
|
||||
green = 150
|
||||
teal = 116
|
||||
sky = 117
|
||||
sapphire = 110
|
||||
blue = 111
|
||||
lavender = 147
|
||||
text = 189
|
||||
subtext1 = 182
|
||||
subtext0 = 146
|
||||
overlay2 = 103
|
||||
overlay1 = 244
|
||||
overlay0 = 242
|
||||
surface2 = 240
|
||||
surface1 = 238
|
||||
surface0 = 237
|
||||
base = 235
|
||||
mantle = 234
|
||||
crust = 233
|
||||
|
||||
|
||||
class Default(ColorScheme):
|
||||
progress_bar_color = blue
|
||||
|
||||
def use(self, context):
|
||||
fg, bg, attr = default_colors
|
||||
|
||||
if context.reset:
|
||||
return default_colors
|
||||
|
||||
elif context.in_browser:
|
||||
fg = text
|
||||
if context.selected:
|
||||
attr = reverse
|
||||
else:
|
||||
attr = normal
|
||||
if context.empty or context.error:
|
||||
fg = red
|
||||
attr = bold
|
||||
if context.border:
|
||||
fg = overlay0
|
||||
bg = default
|
||||
if context.media:
|
||||
fg = mauve if context.image else flamingo
|
||||
if context.container:
|
||||
fg = red
|
||||
attr = bold
|
||||
if context.directory:
|
||||
attr = bold
|
||||
fg = blue
|
||||
elif context.executable and not any((
|
||||
context.media, context.container,
|
||||
context.fifo, context.socket)):
|
||||
attr = bold
|
||||
fg = green
|
||||
if context.socket:
|
||||
fg = yellow
|
||||
attr = bold
|
||||
if context.fifo or context.device:
|
||||
fg = peach
|
||||
if context.device:
|
||||
attr = bold
|
||||
if context.link:
|
||||
fg = teal if context.good else red
|
||||
if context.tag_marker and not context.selected:
|
||||
attr = bold
|
||||
fg = red if context.tag in 'Rr' else yellow
|
||||
if not context.selected and context.cut:
|
||||
attr = bold
|
||||
fg = red
|
||||
if not context.selected and context.copied:
|
||||
attr = bold
|
||||
fg = yellow
|
||||
if context.main_column:
|
||||
if context.selected:
|
||||
attr = bold
|
||||
if context.marked:
|
||||
attr = bold | reverse
|
||||
fg = yellow
|
||||
if context.badinfo:
|
||||
fg = red if not (attr & reverse) else default
|
||||
if attr & reverse:
|
||||
bg = red
|
||||
|
||||
elif context.text:
|
||||
if context.highlight:
|
||||
attr = reverse
|
||||
|
||||
elif context.in_titlebar:
|
||||
fg = subtext1
|
||||
if context.hostname:
|
||||
attr = bold
|
||||
fg = red if context.bad else green
|
||||
elif context.directory:
|
||||
fg = blue
|
||||
elif context.tab:
|
||||
if context.good:
|
||||
bg = green
|
||||
fg = base
|
||||
elif context.link:
|
||||
fg = teal
|
||||
|
||||
elif context.in_statusbar:
|
||||
fg = text
|
||||
if context.permissions:
|
||||
fg = teal if context.good else red
|
||||
if context.marked:
|
||||
attr = bold | reverse
|
||||
fg = yellow
|
||||
if context.message:
|
||||
if context.bad:
|
||||
attr = bold
|
||||
fg = red
|
||||
if context.loaded:
|
||||
bg = self.progress_bar_color
|
||||
fg = base
|
||||
if context.vcsinfo:
|
||||
attr = bold
|
||||
fg = blue
|
||||
if context.vcscommit:
|
||||
attr = bold
|
||||
fg = yellow
|
||||
if context.vcsdate:
|
||||
attr = bold
|
||||
fg = teal
|
||||
|
||||
if context.vcsfile and not context.selected:
|
||||
attr = normal
|
||||
if context.vcschanged:
|
||||
fg = red
|
||||
elif context.vcsunknown:
|
||||
fg = red
|
||||
elif context.vcsstaged:
|
||||
fg = green
|
||||
elif context.vcsnewfile:
|
||||
fg = yellow
|
||||
elif context.vcsrenamed:
|
||||
fg = blue
|
||||
elif context.vcsignored:
|
||||
fg = overlay0
|
||||
|
||||
elif context.vcsremote and not context.selected:
|
||||
attr = normal
|
||||
if context.vcssync:
|
||||
fg = green
|
||||
elif context.vcsbehind:
|
||||
fg = red
|
||||
elif context.vcsahead:
|
||||
fg = blue
|
||||
elif context.vcsdiverged:
|
||||
fg = red
|
||||
elif context.vcsunknown:
|
||||
fg = red
|
||||
|
||||
return fg, bg, attr
|
||||
@@ -1,11 +0,0 @@
|
||||
set colorscheme catppuccin
|
||||
set preview_images true
|
||||
set preview_images_method kitty
|
||||
set unicode_ellipsis true
|
||||
set show_hidden false
|
||||
set confirm_on_delete multiple
|
||||
set use_preview_script true
|
||||
set automatically_count_files true
|
||||
set open_all_images true
|
||||
set vcs_aware true
|
||||
set vcs_backend_git enabled
|
||||
@@ -1,56 +0,0 @@
|
||||
# tmux.conf — vim-style keybindings
|
||||
|
||||
# Prefix
|
||||
set -g prefix C-Space
|
||||
unbind C-b
|
||||
bind C-Space send-prefix
|
||||
|
||||
# Splits
|
||||
unbind '"'
|
||||
unbind %
|
||||
bind s split-window -v -c "#{pane_current_path}"
|
||||
bind v split-window -h -c "#{pane_current_path}"
|
||||
|
||||
# Close
|
||||
bind x kill-pane
|
||||
|
||||
# Pane navigation: prefix+hjkl and M-hjkl without prefix
|
||||
bind h select-pane -L
|
||||
bind j select-pane -D
|
||||
bind k select-pane -U
|
||||
bind l select-pane -R
|
||||
|
||||
bind -n M-h select-pane -L
|
||||
bind -n M-j select-pane -D
|
||||
bind -n M-k select-pane -U
|
||||
bind -n M-l select-pane -R
|
||||
|
||||
# Copy mode with vi keys
|
||||
set-window-option -g mode-keys vi
|
||||
|
||||
# General
|
||||
set -g mouse on
|
||||
set -g history-limit 10000
|
||||
set -sg escape-time 0 # no delay for escape — important for vim
|
||||
set -g focus-events on
|
||||
set -g default-terminal "tmux-256color"
|
||||
set -as terminal-overrides ',*:Tc' # true color passthrough
|
||||
set -g xterm-keys on # pass modified keys (S-Arrow etc.) to inner apps
|
||||
|
||||
set -g base-index 1
|
||||
set -g pane-base-index 1
|
||||
set -g renumber-windows on
|
||||
|
||||
# Status bar — catppuccin mocha
|
||||
set -g status-style "bg=#1e1e2e fg=#cdd6f4"
|
||||
set -g status-left "#[fg=#89b4fa,bold] #S "
|
||||
set -g status-right "#[fg=#a6e3a1]#H #[fg=#cdd6f4]%H:%M "
|
||||
set -g status-left-length 30
|
||||
|
||||
set -g window-status-format "#[fg=#6c7086] #I #W "
|
||||
set -g window-status-current-format "#[fg=#cdd6f4,bold] #I #W "
|
||||
|
||||
set -g pane-border-style "fg=#313244"
|
||||
set -g pane-active-border-style "fg=#89b4fa"
|
||||
|
||||
set -g message-style "bg=#313244 fg=#cdd6f4"
|
||||
Reference in New Issue
Block a user