2023-04-02 13:26:27 +03:00
-- This is a mega file. Rather than make each plugin have its own config file,
-- which is how I managed my packer-based nvim config prior to Nix, I'm
-- putting everything in here in sections and themed functions. It just makes it
-- easier for me to quickly update things and it's cleaner when there's
-- interdependencies between plugins. We'll see how it goes.
local M = { }
local signs = require ( " pwnvim.signs " )
----------------------- UI --------------------------------
-- Tree, GitSigns, Indent markers, Colorizer, bufferline, lualine, treesitter
M.ui = function ( )
-- following options are the default
-- each of these are documented in `:help nvim-tree.OPTION_NAME`
-- local nvim_tree_config = require("nvim-tree.config")
-- local tree_cb = nvim_tree_config.nvim_tree_callback
require ( " pwnvim.plugins.nvim-tree " )
require ( " nvim-surround " ) . setup ( {
aliases = {
[ " e " ] = " ** " -- e for emphasis -- bold in markdown
}
} )
require ( " pwnvim.plugins.todo-comments " )
require ( " pwnvim.plugins.gitsigns " )
require ( " diffview " ) . setup { }
if not SimpleUI then require ( " colorizer " ) . setup ( { } ) end
require ( " pwnvim.plugins.lualine " )
require ( " pwnvim.plugins.treesitter " )
require ( " pwnvim.plugins.bufferline " )
end -- UI setup
----------------------- DIAGNOSTICS --------------------------------
2023-06-08 18:01:24 +03:00
M.diagnostics = function ( groovyls_cmd , groovy_lsp_settings )
2023-04-02 13:26:27 +03:00
-- IMPORTANT: make sure to setup neodev BEFORE lspconfig
require ( " neodev " ) . setup ( {
-- help for neovim lua api
override = function ( root_dir , library )
if string.match ( root_dir , " neovim " ) or
string.match ( root_dir , " pwnvim " ) or
string.match ( root_dir , " lua " ) then
library.enabled = true
library.plugins = true
library.types = true
library.runtime = true
end
end ,
lspconfig = true
} )
require " fidget " . setup { } -- shows status of lsp clients as they issue updates
vim.diagnostic . config ( {
virtual_text = false ,
signs = { active = { signs.signs } } ,
update_in_insert = true ,
underline = true ,
severity_sort = true ,
float = {
focusable = false ,
style = " minimal " ,
border = " rounded " ,
source = " always " ,
header = " " ,
prefix = " "
}
} )
vim.lsp . handlers [ " textDocument/hover " ] = vim.lsp . with (
vim.lsp . handlers.hover ,
{ border = " rounded " } )
vim.lsp . handlers [ " textDocument/signatureHelp " ] =
vim.lsp . with ( vim.lsp . handlers.signature_help , { border = " rounded " } )
require ( " trouble " ) . setup {
group = true , -- group results by file
icons = true ,
auto_preview = true ,
signs = {
error = signs.error ,
warning = signs.warn ,
hint = signs.hint ,
information = signs.info ,
other = " "
}
}
local function attached ( client , bufnr )
local function buf_set_keymap ( ... )
vim.api . nvim_buf_set_keymap ( bufnr , ... )
end
local opts = { noremap = true , silent = false }
if client.name == " tsserver " or client.name == " jsonls " or client.name ==
" nil " or client.name == " eslint " or client.name == " html " or
client.name == " cssls " or client.name == " tailwindcss " then
-- Most of these are being turned off because prettier handles the use case better
client.server_capabilities . documentFormattingProvider = false
client.server_capabilities . documentRangeFormattingProvider = false
else
client.server_capabilities . documentFormattingProvider = true
client.server_capabilities . documentRangeFormattingProvider = true
require ( " lsp-format " ) . on_attach ( client )
end
print ( " LSP attached " .. client.name )
vim.api . nvim_buf_set_option ( bufnr , " formatexpr " ,
" v:lua.vim.lsp.formatexpr() " )
vim.api . nvim_buf_set_option ( bufnr , " omnifunc " , " v:lua.vim.lsp.omnifunc " )
vim.api . nvim_buf_set_option ( bufnr , " tagfunc " , " v:lua.vim.lsp.tagfunc " )
local which_key = require ( " which-key " )
local local_leader_opts = {
mode = " n " , -- NORMAL mode
prefix = " <leader> " ,
buffer = bufnr , -- Local mappings.
silent = true , -- use `silent` when creating keymaps
noremap = true , -- use `noremap` when creating keymaps
nowait = true -- use `nowait` when creating keymaps
}
local local_leader_opts_visual = {
mode = " v " , -- VISUAL mode
prefix = " <leader> " ,
buffer = bufnr , -- Local mappings.
silent = true , -- use `silent` when creating keymaps
noremap = true , -- use `noremap` when creating keymaps
nowait = true -- use `nowait` when creating keymaps
}
require ( " symbols-outline " ) . setup ( {
keymaps = { close = { " <Esc> " , " q " , " #7 " } }
} )
local leader_mappings = {
[ " q " ] = { " <cmd>TroubleToggle<CR> " , " Show Trouble list " } ,
l = {
name = " Local LSP " ,
s = { " <cmd>SymbolsOutline<CR> " , " Show Symbols " } ,
d = {
" <Cmd>lua vim.lsp.buf.definition()<CR> " , " Go to definition "
} ,
D = {
" <cmd>lua vim.lsp.buf.implementation()<CR> " ,
" Implementation "
} ,
i = { " <Cmd>lua vim.lsp.buf.hover()<CR> " , " Info hover " } ,
I = {
" <Cmd>Telescope lsp_implementations<CR> " , " Implementations "
} ,
r = { " <cmd>Telescope lsp_references<CR> " , " References " } ,
f = { " <cmd>Lspsaga code_action<CR> " , " Fix Code Actions " } ,
t = { " <cmd>lua vim.lsp.buf.signature_help()<CR> " , " Signature " } ,
e = {
" <cmd>lua vim.diagnostic.open_float()<CR> " ,
" Show Line Diags "
}
} ,
f = {
[ " sd " ] = {
" <cmd>Telescope lsp_document_symbols<CR> " ,
" Find symbol in document "
} ,
[ " sw " ] = {
" <cmd>Telescope lsp_workspace_symbols<CR> " ,
" Find symbol in workspace "
}
}
}
which_key.register ( leader_mappings , local_leader_opts )
-- Create a new note after asking for its title.
buf_set_keymap ( ' ' , " #7 " , " <cmd>SymbolsOutline<CR> " , opts )
buf_set_keymap ( ' ! ' , " #7 " , " <cmd>SymbolsOutline<CR> " , opts )
buf_set_keymap ( ' ' , ' K ' , ' <cmd>lua vim.lsp.buf.hover()<CR> ' , opts )
-- override standard tag jump
buf_set_keymap ( ' ' , ' C-] ' , ' <cmd>lua vim.lsp.buf.definition()<CR> ' , opts )
buf_set_keymap ( ' ! ' , ' C-] ' , ' <cmd>lua vim.lsp.buf.definition()<CR> ' , opts )
-- Set some keybinds conditional on server capabilities
if client.server_capabilities . document_formatting then
which_key.register ( {
l = {
[ " = " ] = {
" <cmd>lua vim.lsp.buf.formatting_sync()<CR> " , " Format "
}
}
} , local_leader_opts )
-- vim.cmd([[
-- augroup LspFormatting
-- autocmd! * <buffer>
-- autocmd BufWritePre <buffer> lua vim.lsp.buf.formatting_sync()
-- augroup END
-- ]])
end
if client.server_capabilities . implementation then
which_key.register ( {
l = {
[ " I " ] = {
" <cmd>Telescope lsp_implementations<CR> " ,
" Implementations "
}
}
} , local_leader_opts )
end
if client.server_capabilities . document_range_formatting then
which_key.register ( {
l = {
[ " = " ] = {
" <cmd>lua vim.lsp.buf.range_formatting()<CR> " ,
" Format Range "
}
}
} , local_leader_opts_visual )
end
if client.server_capabilities . rename then
which_key.register ( {
l = { [ " R " ] = { " <cmd>lua vim.lsp.buf.rename()<CR> " , " Rename " } }
} , local_leader_opts )
end
end
-- LSP stuff - minimal with defaults for now
local null_ls = require ( " null-ls " )
-- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/formatting
local formatting = null_ls.builtins . formatting
-- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics
local diagnostics = null_ls.builtins . diagnostics
local codeactions = null_ls.builtins . code_actions
require ( " lsp-format " ) . setup { }
null_ls.setup {
debug = false ,
sources = {
-- formatting.lua_format,
2023-06-06 19:08:05 +03:00
formatting.alejandra , -- for nix
formatting.prismaFmt , -- for node prisma db orm
formatting.npm_groovy_lint , -- groovy lsp
2023-04-02 13:26:27 +03:00
formatting.prettier . with {
-- extra_args = {
-- "--use-tabs", "--single-quote", "--jsx-single-quote"
-- },
-- Disable markdown because formatting on save conflicts in weird ways
-- with the taskwiki (roam-task) stuff.
filetypes = {
" javascript " , " javascriptreact " , " typescript " ,
" typescriptreact " , " vue " , " scss " , " less " , " html " , " css " ,
" json " , " jsonc " , " yaml " , " graphql " , " handlebars " , " svelte "
} ,
disabled_filetypes = { " markdown " }
} , diagnostics.eslint_d . with {
args = {
" -f " , " json " , " --stdin " , " --stdin-filename " , " $FILENAME "
}
} , -- diagnostics.vale,
codeactions.eslint_d , codeactions.gitsigns , codeactions.statix , -- for nix
diagnostics.statix , -- for nix
null_ls.builtins . hover.dictionary , codeactions.shellcheck ,
2023-06-06 16:32:00 +03:00
diagnostics.shellcheck ,
2023-06-06 19:08:05 +03:00
diagnostics.npm_groovy_lint -- groovy lsp
2023-04-02 13:26:27 +03:00
-- removed formatting.rustfmt since rust_analyzer seems to do the same thing
} ,
on_attach = attached
}
local lspconfig = require ( " lspconfig " )
local cmp_nvim_lsp = require ( " cmp_nvim_lsp " )
local capabilities = vim.tbl_extend ( ' keep ' , vim.lsp . protocol
. make_client_capabilities ( ) ,
cmp_nvim_lsp.default_capabilities ( ) ) ;
2023-04-02 13:46:42 +03:00
-- require('rust-tools').setup({
-- server = {
-- on_attach = attached,
-- capabilities = capabilities,
-- standalone = false
-- },
-- tools = {
-- autoSetHints = true,
-- inlay_hints = { auto = true, only_current_line = true },
-- runnables = { use_telescope = true }
-- }
-- })
2023-04-02 13:26:27 +03:00
require ( ' crates ' ) . setup { }
require ( ' cmp-npm ' ) . setup ( { } )
lspconfig.tsserver . setup { capabilities = capabilities , on_attach = attached }
lspconfig.lua_ls . setup {
on_attach = attached ,
capabilities = capabilities ,
filetypes = { " lua " } ,
settings = {
Lua = {
runtime = {
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
version = ' LuaJIT '
} ,
diagnostics = {
-- Get the language server to recognize the `vim` global
globals = { ' vim ' , " string " , " require " }
} ,
workspace = {
-- Make the server aware of Neovim runtime files
library = vim.api . nvim_get_runtime_file ( " " , true ) ,
checkThirdParty = false
} ,
-- Do not send telemetry data containing a randomized but unique identifier
telemetry = { enable = false } ,
completion = { enable = true , callSnippet = " Replace " }
}
}
}
lspconfig.tailwindcss . setup {
on_attach = attached ,
capabilities = capabilities ,
settings = {
files = { exclude = { " **/.git/** " , " **/node_modules/** " , " **/*.md " } }
}
}
-- nil_ls is a nix lsp
lspconfig.nil_ls . setup { on_attach = attached , capabilities = capabilities }
lspconfig.cssls . setup {
on_attach = attached ,
capabilities = capabilities ,
settings = { css = { lint = { unknownAtRules = " ignore " } } }
}
lspconfig.eslint . setup { on_attach = attached , capabilities = capabilities }
lspconfig.html . setup { on_attach = attached , capabilities = capabilities }
lspconfig.bashls . setup { on_attach = attached , capabilities = capabilities }
-- TODO: investigate nvim-metals and remove line below
lspconfig.metals . setup { on_attach = attached , capabilities = capabilities } -- for scala
lspconfig.pylsp . setup { on_attach = attached , capabilities = capabilities } -- for python
lspconfig.jsonls . setup {
on_attach = attached ,
settings = {
json = {
schemas = require ( ' schemastore ' ) . json.schemas ( ) ,
validate = { enable = true }
}
} ,
setup = {
commands = {
Format = {
function ( )
vim.lsp . buf.range_formatting ( { } , { 0 , 0 } ,
{ vim.fn . line " $ " , 0 } )
end
}
}
} ,
capabilities = capabilities
}
2023-06-08 18:01:24 +03:00
lspconfig.terraformls . setup { on_attach = attached , capabilities = capabilities } -- terraform lsp
lspconfig.tflint . setup { on_attach = attached , capabilities = capabilities } -- terraform lsp
lspconfig.groovyls . setup { on_attach = attached , capabilities = capabilities , cmd = groovyls_cmd , settings =
groovy_lsp_settings } -- groovy lsp
2023-04-02 13:26:27 +03:00
require ' lspsaga ' . init_lsp_saga ( {
use_saga_diagnostic_sign = not SimpleUI ,
use_diagnostic_virtual_text = false ,
code_action_prompt = {
enable = true ,
sign = false ,
sign_priority = 20 ,
virtual_text = true
}
-- TODO: re-enable this at next update - getting error 2022-08-02
-- code_action_lightbulb = {
-- enable = false,
-- sign = true,
-- enable_in_insert = true,
-- sign_priority = 20,
-- virtual_text = false,
-- },
} )
end -- Diagnostics setup
----------------------- TELESCOPE --------------------------------
M.telescope = function ( )
local actions = require ( ' telescope.actions ' )
local action_state = require ( ' telescope.actions.state ' )
local function quicklook_selected_entry ( prompt_bufnr )
local entry = action_state.get_selected_entry ( )
-- actions.close(prompt_bufnr)
vim.cmd ( " silent !qlmanage -p ' " .. entry.value .. " ' " )
end
local function yank_selected_entry ( prompt_bufnr )
local entry = action_state.get_selected_entry ( )
actions.close ( prompt_bufnr )
-- Put it in the unnamed buffer and the system clipboard both
vim.api . nvim_call_function ( " setreg " , { ' " ' , entry.value } )
vim.api . nvim_call_function ( " setreg " , { " * " , entry.value } )
end
local function system_open_selected_entry ( prompt_bufnr )
local entry = action_state.get_selected_entry ( )
actions.close ( prompt_bufnr )
os.execute ( " open ' " .. entry.value .. " ' " )
end
require ( ' telescope ' ) . setup {
file_ignore_patterns = {
" *.bak " , " .git/ " , " node_modules " , " .zk/ " , " Caches/ "
} ,
prompt_prefix = SimpleUI and " > " or " " ,
selection_caret = SimpleUI and " ↪ " or " " ,
-- path_display = { "smart" },
defaults = {
path_display = function ( _ , path )
local tail = require ( " telescope.utils " ) . path_tail ( path )
return string.format ( " %s (%s) " , tail ,
require ( " telescope.utils " ) . path_smart (
path : gsub ( " /Users/[^/]*/ " , " ~/ " ) : gsub (
" /[^/]*$ " , " " ) : gsub (
" /Library/Containers/co.noteplan.NotePlan3/Data/Library/Application Support/co.noteplan.NotePlan3 " ,
" /NotePlan " ) ) )
end ,
-- path_display = { "truncate" },
mappings = {
n = {
[ " <C-y> " ] = yank_selected_entry ,
[ " <C-o> " ] = system_open_selected_entry ,
[ " <F10> " ] = quicklook_selected_entry ,
[ " q " ] = require ( " telescope.actions " ) . close
} ,
i = {
[ " <C-y> " ] = yank_selected_entry ,
[ " <F10> " ] = quicklook_selected_entry ,
[ " <C-o> " ] = system_open_selected_entry
}
} ,
vimgrep_arguments = {
" rg " , " --color=never " , " --no-heading " , " --with-filename " ,
" --line-number " , " --column " , " --smart-case "
} ,
-- Telescope smart history
history = {
path = ' ~/.local/share/nvim/databases/telescope_history.sqlite3 ' ,
limit = 100
} ,
layout_strategy = " flex " ,
layout_config = {
horizontal = { prompt_position = " bottom " , preview_width = 0.55 } ,
vertical = { mirror = false } ,
width = 0.87 ,
height = 0.80 ,
preview_cutoff = 1
} ,
color_devicons = not SimpleUI ,
set_env = { [ " COLORTERM " ] = " truecolor " } , -- default = nil,
file_previewer = require ( " telescope.previewers " ) . vim_buffer_cat.new ,
grep_previewer = require ( " telescope.previewers " ) . vim_buffer_vimgrep
. new ,
qflist_previewer = require ( " telescope.previewers " ) . vim_buffer_qflist
. new
} ,
extensions = {
fzy_native = {
override_generic_sorter = true ,
override_file_sorter = true
}
}
}
require ' telescope ' . load_extension ( ' fzy_native ' )
require ( " telescope " ) . load_extension ( " zk " )
if vim.fn . has ( ' mac ' ) ~= 1 then
-- doesn't currently work on mac
require ' telescope ' . load_extension ( ' media_files ' )
end
end -- telescope
----------------------- COMPLETIONS --------------------------------
-- cmp, luasnip
M.completions = function ( )
require ( " luasnip/loaders/from_vscode " ) . lazy_load ( )
local luasnip = require ( " luasnip " )
local check_backspace = function ( )
local col = vim.fn . col " . " - 1
return col == 0 or
vim.fn . getline ( vim.fn . line ( " . " ) ) : sub ( col , col ) : match " %s "
end
local cmp = require ' cmp '
cmp.setup {
enabled = function ( )
local context = require ' cmp.config.context '
local buftype = vim.api . nvim_buf_get_option ( 0 , " buftype " )
-- prevent completions in prompts like telescope prompt
if buftype == " prompt " then return false end
-- allow completions in command mode
if vim.api . nvim_get_mode ( ) . mode == ' c ' then return true end
-- forbid completions in comments
return not context.in_treesitter_capture ( " comment " ) and
not context.in_syntax_group ( " Comment " )
end ,
mapping = {
[ ' <C-p> ' ] = cmp.mapping . select_prev_item ( ) ,
[ ' <C-n> ' ] = cmp.mapping . select_next_item ( ) ,
[ ' <C-d> ' ] = cmp.mapping . scroll_docs ( - 4 ) ,
[ ' <C-f> ' ] = cmp.mapping . scroll_docs ( 4 ) ,
[ ' <C-Space> ' ] = cmp.mapping . complete ( { } ) ,
[ ' <C-e> ' ] = cmp.mapping . close ( ) ,
[ ' <CR> ' ] = cmp.mapping . confirm {
behavior = cmp.ConfirmBehavior . Replace ,
select = false
} ,
[ " <Tab> " ] = cmp.mapping ( function ( fallback )
if cmp.visible ( ) then
cmp.select_next_item ( )
elseif luasnip.expandable ( ) then
luasnip.expand ( { } )
elseif luasnip.expand_or_jumpable ( ) then
luasnip.expand_or_jump ( )
elseif check_backspace ( ) then
fallback ( )
else
cmp.mapping . complete ( { } )
-- fallback()
end
end , { " i " , " s " } ) ,
[ " <S-Tab> " ] = cmp.mapping ( function ( fallback )
if cmp.visible ( ) then
cmp.select_prev_item ( )
elseif luasnip.jumpable ( - 1 ) then
luasnip.jump ( - 1 )
else
fallback ( )
end
end , { " i " , " s " } )
} ,
window = { documentation = cmp.config . window.bordered ( ) } ,
sources = {
{ name = ' nvim_lsp ' } , { name = ' nvim_lsp_signature_help ' } ,
{ name = ' nvim_lua ' } , { name = ' emoji ' } , { name = ' luasnip ' } ,
{ name = ' path ' } , { name = " crates " } ,
{ name = ' npm ' , keyword_length = 3 } ,
{ name = " buffer " , keyword_length = 3 }
} ,
formatting = {
fields = { " kind " , " abbr " , " menu " } ,
format = function ( entry , vim_item )
-- Kind icons
vim_item.kind = string.format ( " %s " ,
signs.kind_icons [ vim_item.kind ] )
vim_item.menu = ( {
nvim_lsp = " [LSP] " ,
nvim_lsp_signature_help = " [LSPS] " ,
luasnip = " [Snippet] " ,
buffer = " [Buffer] " ,
path = " [Path] "
} ) [ entry.source . name ]
return vim_item
end
} ,
snippet = { expand = function ( args ) luasnip.lsp_expand ( args.body ) end }
}
cmp.setup . cmdline ( ' / ' , {
mapping = cmp.mapping . preset.cmdline ( ) ,
sources = { { name = ' buffer ' } }
} )
cmp.setup . cmdline ( ' : ' , {
mapping = cmp.mapping . preset.cmdline ( ) ,
sources = cmp.config . sources ( { { name = ' path ' } } , {
{ name = ' cmdline ' , option = { ignore_cmds = { ' Man ' , ' ! ' } } }
} )
} )
end -- completions
----------------------- NOTES --------------------------------
-- zk (zettelkasten lsp), taskwiki, focus mode, grammar
M.notes = function ( )
require ( " zk " ) . setup ( {
picker = " telescope " ,
-- automatically attach buffers in a zk notebook that match the given filetypes
lsp = {
auto_attach = {
enabled = true ,
filetypes = { " markdown " , " vimwiki " , " md " }
} ,
config = {
on_attach = function ( _ , bufnr )
print ( " ZK attached " )
local which_key = require ( " which-key " )
local local_leader_opts = {
mode = " n " , -- NORMAL mode
prefix = " <leader> " ,
buffer = bufnr , -- Local mappings.
silent = true , -- use `silent` when creating keymaps
noremap = true , -- use `noremap` when creating keymaps
nowait = true -- use `nowait` when creating keymaps
}
local local_leader_opts_visual = {
mode = " v " , -- VISUAL mode
prefix = " <leader> " ,
buffer = bufnr , -- Local mappings.
silent = true , -- use `silent` when creating keymaps
noremap = true , -- use `noremap` when creating keymaps
nowait = true -- use `nowait` when creating keymaps
}
local leader_mappings = {
K = { " <Cmd>lua vim.lsp.buf.hover()<CR> " , " Info preview " } ,
n = {
-- Create the note in the same directory as the current buffer after asking for title
p = {
" <Cmd>ZkNew { dir = vim.fn.expand('%:p:h'), title = vim.fn.input('Title: ') }<CR> " ,
" New peer note (same dir) "
} ,
l = { " <Cmd>ZkLinks<CR> " , " Show note links " } ,
-- the following duplicate with the ,l_ namespace on purpose because of programming muscle memory
r = {
" <cmd>Telescope lsp_references<CR> " ,
" References to this note "
}
} ,
l = {
name = " Local LSP " ,
-- Open notes linking to the current buffer.
r = {
" <cmd>Telescope lsp_references<CR> " ,
" References to this note "
} ,
i = {
" <Cmd>lua vim.lsp.buf.hover()<CR> " ,
" Info preview "
} ,
f = {
" <cmd>Lspsaga code_action<CR> " ,
" Fix Code Actions "
} ,
e = {
" <cmd>lua vim.diagnostic.open_float()<CR> " ,
" Show Line Diags "
}
}
}
which_key.register ( leader_mappings , local_leader_opts )
local leader_mappings_visual = {
n = {
p = {
" :'<,'>ZkNewFromTitleSelection { dir = vim.fn.expand('%:p:h') }<CR> " ,
" New peer note (same dir) selection for title "
}
-- Create a new note in the same directory as the current buffer, using the current selection for title.
}
}
which_key.register ( leader_mappings_visual ,
local_leader_opts_visual )
local opts = { noremap = true , silent = true }
-- TODO: Make <CR> magic...
-- in normal mode, if on a link, it should open the link (note or url)
-- in visual mode, it should prompt for folder, create a note, and make a link
-- Meanwhile, just go to definition
vim.api . nvim_buf_set_keymap ( bufnr , " n " , " <CR> " ,
" <Cmd>lua vim.lsp.buf.definition()<CR> " ,
opts )
-- Preview a linked note.
vim.api . nvim_buf_set_keymap ( bufnr , " " , " K " ,
" <Cmd>lua vim.lsp.buf.hover()<CR> " ,
opts )
require ( ' pwnvim.options ' ) . tabindent ( )
end
}
}
} )
-- Focus mode dimming of text out of current block
--[[ require("twilight").setup {
dimming = {
alpha = 0.25 , -- amount of dimming
-- we try to get the foreground from the highlight groups or fallback color
color = { " Normal " , " #ffffff " } ,
term_bg = " #000000 " , -- if guibg=NONE, this will be used to calculate text color
inactive = true -- when true, other windows will be fully dimmed (unless they contain the same buffer)
} ,
context = 12 , -- amount of lines we will try to show around the current line
treesitter = true , -- use treesitter when available for the filetype
-- treesitter is used to automatically expand the visible text,
-- but you can further control the types of nodes that should always be fully expanded
expand = { -- for treesitter, we we always try to expand to the top-most ancestor with these types
" function " , " method " , " table " , " if_statement "
} ,
exclude = { } -- exclude these filetypes
} ] ]
-- Focus mode / centering
require ( " true-zen " ) . setup {
-- your config goes here
-- or just leave it empty :)
modes = {
-- configurations per mode
ataraxis = {
shade = " dark " , -- if `dark` then dim the padding windows, otherwise if it's `light` it'll brighten said windows
backdrop = 0 , -- percentage by which padding windows should be dimmed/brightened. Must be a number between 0 and 1. Set to 0 to keep the same background color
minimum_writing_area = {
-- minimum size of main window
width = 70 ,
height = 44
} ,
quit_untoggles = true , -- type :q or :qa to quit Ataraxis mode
padding = {
-- padding windows
left = 52 ,
right = 52 ,
top = 0 ,
bottom = 0
} ,
callbacks = {
-- run functions when opening/closing Ataraxis mode
open_pre = function ( )
vim.opt . scrolloff = 999 -- keep cursor in vertical middle of screen
end ,
open_pos = nil ,
close_pre = nil ,
close_pos = function ( )
vim.opt . scrolloff = 8
end
}
} ,
minimalist = {
ignored_buf_types = { " nofile " } , -- save current options from any window except ones displaying these kinds of buffers
options = {
-- options to be disabled when entering Minimalist mode
number = false ,
relativenumber = false ,
showtabline = 0 ,
signcolumn = " no " ,
statusline = " " ,
cmdheight = 1 ,
laststatus = 0 ,
showcmd = false ,
showmode = false ,
ruler = false ,
numberwidth = 1
} ,
callbacks = {
-- run functions when opening/closing Minimalist mode
open_pre = nil ,
open_pos = nil ,
close_pre = nil ,
close_pos = nil
}
} ,
narrow = {
--- change the style of the fold lines. Set it to:
--- `informative`: to get nice pre-baked folds
--- `invisible`: hide them
--- function() end: pass a custom func with your fold lines. See :h foldtext
folds_style = " informative " ,
run_ataraxis = true , -- display narrowed text in a Ataraxis session
callbacks = {
-- run functions when opening/closing Narrow mode
open_pre = nil ,
open_pos = nil ,
close_pre = nil ,
close_pos = nil
}
} ,
focus = {
callbacks = {
-- run functions when opening/closing Focus mode
open_pre = nil ,
open_pos = nil ,
close_pre = nil ,
close_pos = nil
}
}
} ,
integrations = {
tmux = false , -- hide tmux status bar in (minimalist, ataraxis)
kitty = {
-- increment font size in Kitty. Note: you must set `allow_remote_control socket-only` and `listen_on unix:/tmp/kitty` in your personal config (ataraxis)
enabled = false , -- disabled 2023-03-20 because it doesn't reset the font size on exit
font = " +2 "
} ,
twilight = false , -- enable twilight text dimming outside cursor block
lualine = true -- hide nvim-lualine (ataraxis)
}
}
-- Grammar
vim.g [ " grammarous#disabled_rules " ] = {
[ ' * ' ] = {
' WHITESPACE_RULE ' , ' EN_QUOTES ' , ' ARROWS ' , ' SENTENCE_WHITESPACE ' ,
' WORD_CONTAINS_UNDERSCORE ' , ' COMMA_PARENTHESIS_WHITESPACE ' ,
' EN_UNPAIRED_BRACKETS ' , ' UPPERCASE_SENTENCE_START ' ,
' ENGLISH_WORD_REPEAT_BEGINNING_RULE ' , ' DASH_RULE ' , ' PLUS_MINUS ' ,
' PUNCTUATION_PARAGRAPH_END ' , ' MULTIPLICATION_SIGN ' , ' PRP_CHECKOUT ' ,
' CAN_CHECKOUT ' , ' SOME_OF_THE ' , ' DOUBLE_PUNCTUATION ' , ' HELL ' ,
' CURRENCY ' , ' POSSESSIVE_APOSTROPHE ' , ' ENGLISH_WORD_REPEAT_RULE ' ,
' NON_STANDARD_WORD '
}
}
-- Grammar stuff
vim.cmd (
[[command StartGrammar2 lua require('pwnvim.plugins').grammar_check()]] )
end -- notes
M.grammar_check = function ( )
vim.cmd ( ' packadd vim-grammarous ' )
local opts = { noremap = false , silent = true }
local function buf_set_keymap ( ... ) vim.api . nvim_buf_set_keymap ( 0 , ... ) end
buf_set_keymap ( ' ' , ' <leader>gf ' , ' <Plug>(grammarous-fixit) ' , opts )
buf_set_keymap ( ' ' , ' <leader>gx ' , ' <Plug>(grammarous-remove-error) ' , opts )
buf_set_keymap ( ' ' , ' ]g ' , ' <Plug>(grammarous-move-to-next-error) ' , opts )
buf_set_keymap ( ' ' , ' [g ' , ' <Plug>(grammarous-move-to-previous-error) ' , opts )
vim.cmd ( ' GrammarousCheck ' )
end
----------------------- MISC --------------------------------
-- rooter, kommentary, autopairs, tmux, toggleterm
M.misc = function ( )
vim.g . lf_map_keys = 0 -- lf.vim disable default keymapping
-- Change project directory using local cd only
-- vim.g.rooter_cd_cmd = 'lcd'
-- Look for these files/dirs as hints
-- vim.g.rooter_patterns = {
-- '.git', '_darcs', '.hg', '.bzr', '.svn', 'Makefile', 'package.json',
-- '.zk', 'Cargo.toml', 'build.sbt', 'Package.swift', 'Makefile.in'
-- }
require ( ' project_nvim ' ) . setup ( {
active = true ,
on_config_done = nil ,
manual_mode = false ,
detection_methods = { " pattern " , " lsp " } ,
patterns = {
" .git " , " _darcs " , " .hg " , " .bzr " , " .svn " , " Makefile " , " package.json " ,
" .zk " , " build.sbt " , " Package.swift " , " Makefile.in " , " README.md " ,
" flake.nix "
} ,
show_hidden = false ,
silent_chdir = true ,
ignore_lsp = { }
} )
require ( ' telescope ' ) . load_extension ( ' projects ' )
require ( ' Comment ' ) . setup ( )
require ( " which-key " ) . register ( {
[ " <leader>c<space> " ] = {
' <Plug>(comment_toggle_linewise_current) ' , " Toggle comments "
} ,
[ " g/ " ] = { ' <Plug>(comment_toggle_linewise_current) ' , " Toggle comments " }
} , { mode = " n " , silent = true , norewrap = true } )
require ( " which-key " ) . register ( {
[ " <leader>c<space> " ] = {
' <Plug>(comment_toggle_linewise_visual) ' , " Toggle comments "
} ,
[ " g/ " ] = { ' <Plug>(comment_toggle_linewise_visual) ' , " Toggle comments " }
} , { mode = " v " , silent = true , norewrap = true } )
require ( ' nvim-autopairs ' ) . setup ( { } )
vim.g . tmux_navigator_no_mappings = 1
require ( " toggleterm " ) . setup {
open_mapping = [[<c-\>]] ,
insert_mappings = true , -- from normal or insert mode
start_in_insert = true ,
hide_numbers = true ,
direction = ' vertical ' ,
size = function ( _ ) return vim.o . columns * 0.3 end ,
close_on_exit = true
}
vim.api . nvim_set_keymap ( ' t ' , [[<C-\]] , " <Cmd>ToggleTermToggleAll<cr> " ,
{ noremap = true } )
end -- misc
return M