nvim preferences/convenience
In my new config I've been creating a global variable as a tabel and mimicking the vim options for names (so I can just do help on whatever is in the table), setting them with a function, and making hot keys to toggle them on and off.
I have something like this at the top of my T383838init.lua:
T282828
Te6edf3MY_USER_PREFS Tff7b72= Tb4b4b4{
T8b949e-- The prefix key for all plugins (space bar):
Te6edf3mapleader Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4,
T8b949e-- I set this, but I don't really use buffer-local leader keys.
Te6edf3maplocalleader Tff7b72= Ta5d6ff"Tffea00\\Ta5d6ff"Tb4b4b4,
T8b949e-- general stuff
Te6edf3mouse Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
T8b949e-- _ _ _
T8b949e-- | |__ ___| |__ __ ___ _(_) ___ _ __
T8b949e-- | '_ \ / _ \ '_ \ / _` \ \ / / |/ _ \| '__|
T8b949e-- | |_) | __/ | | | (_| |\ V /| | (_) | |
T8b949e-- |_.__/ \___|_| |_|\__,_| \_/ |_|\___/|_|
T8b949e--
T8b949e-- behavior settings stuff
T8b949e--
T8b949e-- hidden: let me navigate away from a file without having to
T8b949e-- explicitly save it right now. This *can* result in a bunch of swap
T8b949e-- files if the editor gets killed, but that doesn't happen so much
T8b949e-- these days.
Te6edf3hidden Tff7b72= Tff7b72trueTb4b4b4,
T8b949e-- _ _ _ _
T8b949e-- __| (_) __ _ __ _ _ __ ___ ___| |_(_) ___ ___
T8b949e-- / _` | |/ _` |/ _` | '_ \ / _ \/ __| __| |/ __/ __|
T8b949e-- | (_| | | (_| | (_| | | | | (_) \__ \ |_| | (__\__ \
T8b949e-- \__,_|_|\__,_|\__, |_| |_|\___/|___/\__|_|\___|___/
T8b949e-- |___/
T8b949e--
T8b949e-- diagnostic stuff
T8b949e--
T8b949e-- signs: gutter signs for diagnostic messages
T8b949e-- I turn these on at a minimum, but I have keys and such to turn them
T8b949e-- off.
Te6edf3signs Tff7b72= Tb4b4b4{
Te6edf3text Tff7b72= Tb4b4b4{
Tb4b4b4[Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Te6edf3severityTb4b4b4.Te6edf3ERRORTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4,
Tb4b4b4[Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Te6edf3severityTb4b4b4.Te6edf3WARNTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4,
Tb4b4b4[Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Te6edf3severityTb4b4b4.Te6edf3INFOTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4,
Tb4b4b4[Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Te6edf3severityTb4b4b4.Te6edf3HINTTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4,
Tb4b4b4},
Tb4b4b4},
T8b949e-- virtual_text: ghostly text that trails on a line with the problem
T8b949e-- These damn things get cut off all the time and are hard to see anyway,
T8b949e-- so I have them set to be off. I can toggle them on, but I think I prefer
T8b949e-- the virtual line setting anyway.
Te6edf3virtual_text Tff7b72= Tff7b72falseTb4b4b4,
T8b949e-- virtual_lines: insert a fake line below a line with an error so we
T8b949e-- can point directly at the spot with the error, it's much clearer to
T8b949e-- me than virtual_text, but I still have this off until I want to
T8b949e-- toggle them on.
Te6edf3virtual_lines Tff7b72= Tff7b72falseTb4b4b4,
T8b949e-- _ _
T8b949e-- __ _(_)___ _ _ __ _| |___
T8b949e-- \ \ / / / __| | | |/ _` | / __|
T8b949e-- \ V /| \__ \ |_| | (_| | \__ \
T8b949e-- \_/ |_|___/\__,_|\__,_|_|___/
T8b949e--
T8b949e-- visuals and general appearance stuff
T8b949e--
Te6edf3list_chars Tff7b72= Ta5d6ff"Ta5d6ffeol:◀,tab:▷◁,extends:▶,trail:▭Ta5d6ff"Tb4b4b4,
Te6edf3list Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3number Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3relativenumber Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3conceallevel Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3concealcursor Tff7b72= Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4, T8b949e-- only hide things in normal mode
Te6edf3cursorcolumn Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3cursorline Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4}
I can document it in-line with slick T383838figlet output to make sections visually distinct as I'm scrolling through, heavily annotate it with reminders and notes, and then later make use of it with something like the following function to apply them en masse:
T282828
T8b949e-- SET_DEFAULT_PREFS: Take every value from the user preferences and apply it
T8b949e-- immediately to the global program state. It's not as good as completely
T8b949e-- exiting and relaunching, but it should be pretty close.
Tff7b72function Td2a8ffSET_DEFAULT_PREFSTb4b4b4()
Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Td2a8ffconfigTb4b4b4({ Te6edf3virtual_text Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3virtual_text Tb4b4b4})
Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Td2a8ffconfigTb4b4b4({ Te6edf3virtual_lines Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3virtual_lines Tb4b4b4})
Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Td2a8ffconfigTb4b4b4({ Te6edf3signs Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3signs Tb4b4b4})
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3mouse Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3mouse
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3lcs Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3list_chars
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3list Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3list
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3number Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3number
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3relativenumber Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3relativenumber
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3conceallevel Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3conceallevel
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3concealcursor Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3concealcursor
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3cursorcolumn Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3cursorcolumn
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3cursorline Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3cursorline
Tff7b72end
With this I can now set my defaults for when the application opens and after changing things on the fly I can reset them back to some sane(ish) defaults.
This lends itself well to doing something like a Zen Mode. Here's the start of a function for that:
T282828
T8b949e-- ENTER_ZEN: Turn off a lot of the visual distractions so that I'm just left
T8b949e-- with the document content. Once this has been done it's still possible to
T8b949e-- toggle anything else back on via the various menus. Every time this is
T8b949e-- called it clears all of that noise, this is on purpose.
Tff7b72function Td2a8ffENTER_ZENTb4b4b4()
T8b949e-- hide diagnostics
Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Td2a8ffconfigTb4b4b4({ Te6edf3virtual_text Tff7b72= Tff7b72false Tb4b4b4})
Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Td2a8ffconfigTb4b4b4({ Te6edf3virtual_lines Tff7b72= Tff7b72false Tb4b4b4})
Te6edf3vimTb4b4b4.Te6edf3diagnosticTb4b4b4.Td2a8ffconfigTb4b4b4({ Te6edf3signs Tff7b72= Tff7b72false Tb4b4b4})
T8b949e-- turn mouse back on if that was on, it's not a visual distraction
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3mouse Tff7b72= Te6edf3MY_USER_PREFSTb4b4b4.Te6edf3mouse
T8b949e-- turn off a whole unch of visual distractions
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3list Tff7b72= Tff7b72false
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3number Tff7b72= Tff7b72false
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3relativenumber Tff7b72= Tff7b72false
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3conceallevel Tff7b72= T79c0ff0
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3concealcursor Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3cursorline Tff7b72= Tff7b72false
Te6edf3vimTb4b4b4.Te6edf3oTb4b4b4.Te6edf3cursorcolumn Tff7b72= Tff7b72false
Tff7b72end
Then I define two key bindings to call them:
T282828
Te6edf3vimTb4b4b4.Te6edf3keymapTb4b4b4.Td2a8ffsetTb4b4b4(Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff<Leader>zTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff:lua ENTER_ZEN()<cr>Ta5d6ff"Tb4b4b4, Td2a8ffDESCTb4b4b4(Ta5d6ff"Ta5d6ffEmbrace the Inner Peace of [z]enTa5d6ff"Tb4b4b4))
Te6edf3vimTb4b4b4.Te6edf3keymapTb4b4b4.Td2a8ffsetTb4b4b4(Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff<Leader>ZTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff:lua SET_DEFAULT_PREFS()<cr>Ta5d6ff"Tb4b4b4, Td2a8ffDESCTb4b4b4(Ta5d6ff"Ta5d6ffEscape [Z]en/Reset DefaultsTa5d6ff"Tb4b4b4))
Note that these use a global T383838DESC function which creates a table with the specified description and also the directive to silence the command executed by the binding:
T282828
T8b949e-- DESC: Helper function to return a new table with the provided description
T8b949e-- (as desc) and silent set to true.
Tff7b72function Td2a8ffDESCTb4b4b4(Te6edf3descriptionTb4b4b4)
T8b949e-- I use this to make a key binding options table that makes the key binding
T8b949e-- silent and with the provided description.
Tff7b72return Tb4b4b4{ Te6edf3desc Tff7b72= Te6edf3descriptionTb4b4b4, Te6edf3silent Tff7b72= Tff7b72true Tb4b4b4}
Tff7b72end
The motivation for the descriptions is two-fold: a reminder of what they do, and also input to T383838whichkey so that it's displayed when I type commands in normal mode..
In the above, I use T383838<Space>z to enter zen mode and then T383838<Space>Z to get out of it. I dont have to use a complicated zen mode plugin, I can just add what features I want to the function.
Tags: nvim
Tags
Navigation
Backlinks
created: 2025-10-18
updated: 2025-10-19 09:59:30
(re)generated: 2026-07-17