commit ec3acd59763db54735f71438a1fe79b0b11a1161 Author: twig Date: Mon Oct 10 18:12:32 2022 -0700 My current neovim config diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8fe88e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +[Pp]lugin/ diff --git a/after/plugin/color.lua b/after/plugin/color.lua new file mode 100644 index 0000000..690332a --- /dev/null +++ b/after/plugin/color.lua @@ -0,0 +1,13 @@ +vim.opt.termguicolors = true +vim.opt.background = "dark" + +vim.g.everforest_better_performance = 1 +vim.g.everforest_disable_italic_comment = 1 +vim.g.sonokai_better_performance = 1 +vim.g.sonokai_disable_italic_comment = 1 + +--vim.cmd("colorscheme sonokai") +vim.cmd("colorscheme gruvbox") + +--vim.cmd('highlight Comment guifg=#f8c0a0') +vim.cmd('highlight Comment guifg=#9296a0') diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..ea80148 --- /dev/null +++ b/init.lua @@ -0,0 +1,53 @@ +-- Only required if you have packer configured as `opt` +require('buildcmd') +require('statusline') +require('packer_init') +require('keybindings') +--vim.opt.guicursor = " " + +vim.opt.nu = true +vim.opt.relativenumber = true + +vim.opt.tabstop = 4 +vim.opt.softtabstop = 4 +vim.opt.shiftwidth = 4 +vim.opt.expandtab = true + +vim.opt.smartindent = true + +vim.opt.wrap = false +require('nvim-treesitter.configs').setup { + ensure_installed = { "c", "cpp", "lua", "zig", "rust" }, + sync_install = false, + auto_install = false, + highlight = { + enable = true, + additional_vim_regex_highlighting = false, + }, + incremental_selection = { + }, + indent = { + enable = true, + }, +} +require('treesitter-context').setup { + enable = true, + max_lines = 0, + min_window_height = 0, +} +require('nvim-autopairs').setup{ +} +require('telescope').setup{ + defaults = { + }, + pickers = { + find_files = { + --theme = "dropdown", + }, + git_files = { + --theme = "dropdown", + } + }, + extensions = { + } +} diff --git a/lua/buildcmd.lua b/lua/buildcmd.lua new file mode 100644 index 0000000..fd8e668 --- /dev/null +++ b/lua/buildcmd.lua @@ -0,0 +1,35 @@ +local job_id, job_buffer + +local function job_exit(jobId, exit_code, _) + job_id = nil + echo("Job done") +end + +local function has_buffer() + return job_buffer and vim.fn.buflisted(job_buffer) == 1 +end + +function save_all_and_build() + if job_id then + echo ("Job processing") + return + end + + local opts = {} + vim.api.nvim_exec('wa', opts) + + if not has_buffer() then + job_buffer = vim.api.nvim_create_buf(true, true) + end + local job_window = vim.fn.bufwinnr(job_buffer) + if job_window ~= -1 then + vim.cmd(job_window .. ' wincmd w') + else + vim.cmd('buffer ' .. job_buffer) + end + vim.api.nvim_buf_set_option(job_buffer, 'filetype', 'build') + vim.api.nvim_buf_set_option(job_buffer, 'modified', false) + -- TODO: if I want to get fancy I can set a build string per language. + job_id = vim.fn.termopen("zig build", {on_exit = job_exit}) + vim.api.nvim_buf_set_name(job_buffer, '[build]') +end diff --git a/lua/keybindings.lua b/lua/keybindings.lua new file mode 100644 index 0000000..4f2c5d8 --- /dev/null +++ b/lua/keybindings.lua @@ -0,0 +1,44 @@ +require('buildcmd') + +local tbuiltin = require('telescope.builtin') +vim.g.mapleader = ' ' --space + +local function project_files() + local opts = {} + local ok = pcall(tbuiltin.git_files, opts) + if not ok then tbuiltin.find_files(opts) end +end + +-- Mappings, mostly taken from nvim-lspconfig +local opts = { noremap=true, silent=true } +vim.keymap.set('n', 'q', vim.diagnostic.open_float, opts) +vim.keymap.set('n', 'e', 'Ex', opts) +vim.keymap.set('n', 'ff', project_files, opts) +vim.keymap.set('n', 'fb', 'Telescope buffers', opts) +vim.keymap.set('n', 'bb', save_all_and_build, opts) +-- TODO: get fancy and read the commentstring and user +-- Would love to have this be alt but that doesn't work... +vim.keymap.set('i', '', '// TODO(twig): ', opts) +vim.keymap.set('i', '', '// NOTE(twig): ', opts) + +local on_attach = function(client, bufnr) + vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') + + -- Mappings + local bufopts = { noremap=true, silent=true, buffer=bufnr } + -- Replace these with telescope equivalent + vim.keymap.set('n', 'rb', vim.lsp.buf.declaration, bufopts) + vim.keymap.set('n', 'rd', vim.lsp.buf.definition, bufopts) + vim.keymap.set('n', 'rf', tbuiltin.lsp_references, bufopts) + vim.keymap.set('n', 'rs', tbuiltin.lsp_document_symbols, bufopts) + vim.keymap.set('n', 'rr', vim.lsp.buf.rename, bufopts) +end + +local lsp_flags = { + debounce_text_changes = 150, --wtf is this +} +require('lspconfig')['zls'].setup { + on_attach = on_attach, + flags = lsp_flags +} +--TODO: other languages I care about. diff --git a/lua/packer_init.lua b/lua/packer_init.lua new file mode 100644 index 0000000..cb19347 --- /dev/null +++ b/lua/packer_init.lua @@ -0,0 +1,15 @@ +vim.cmd [[packadd packer.nvim]] + +return require('packer').startup(function(use) + -- Packer can manage itself + use 'wbthomason/packer.nvim' + use 'sainnhe/everforest' + use 'sainnhe/sonokai' + use { 'nvim-treesitter/nvim-treesitter' } + use 'neovim/nvim-lspconfig' + use 'nvim-treesitter/nvim-treesitter-context' + use { 'nvim-telescope/telescope.nvim', tag = '0.1.0', requires = {{'nvim-lua/plenary.nvim'}} } + use { 'windwp/nvim-autopairs' } + use { 'tomasr/molokai' } + use 'morhetz/gruvbox' +end) diff --git a/lua/statusline.lua b/lua/statusline.lua new file mode 100644 index 0000000..9d2b0b2 --- /dev/null +++ b/lua/statusline.lua @@ -0,0 +1,147 @@ +local modes = { + ["n"] = "NORMAL", + ["no"] = "NORMAL", + ["v"] = "VISUAL", + ["V"] = "VISUAL LINE", + [""] = "VISUAL BLOCK", + ["s"] = "SELECT", + ["S"] = "SELECT LINE", + [""] = "SELECT BLOCK", + ["i"] = "INSERT", + ["ic"] = "INSERT", + ["R"] = "REPLACE", + ["Rv"] = "VISUAL REPLACE", + ["c"] = "COMMAND", + ["cv"] = "VIM EX", + ["ce"] = "EX", + ["r"] = "PROMPT", + ["rm"] = "MOAR", + ["r?"] = "CONFIRM", + ["!"] = "SHELL", + ["t"] = "TERMINAL", +} + +local function mode() + local current_mode = vim.api.nvim_get_mode().mode + return string.format(" %s ", modes[current_mode]):upper() +end + +local function update_mode_colors() + local current_mode = vim.api.nvim_get_mode().mode + local mode_color = "%#StatusLineAccent#" + if current_mode == "n" then + mode_color = "%#StatuslineAccent#" + elseif current_mode == "i" or current_mode == "ic" then + mode_color = "%#Search#" + elseif current_mode == "v" or current_mode == "V" or current_mode == "" then + mode_color = "%#DiffText#" + elseif current_mode == "R" then + mode_color = "%#Visual#" + elseif current_mode == "c" then + mode_color = "%#Cursor#" + elseif current_mode == "t" then + mode_color = "%#FloatShadow#" + end + return mode_color +end + +local function filepath() + local fpath = vim.fn.fnamemodify(vim.fn.expand "%", ":~:.:h") + if fpath == "" or fpath == "." then + return " " + end + + return string.format(" %%<%s/", fpath) +end + +local function filename() + local fname = vim.fn.expand "%:t" + -- wtf + if fname == "" then + return "" + end + return fname .. " " +end + +local function lsp() + local count = {} + local levels = { + errors = "Error", + warnings = "Warn", + info = "Info", + hints = "Hint", + } + + for k, level in pairs(levels) do + count[k] = vim.tbl_count(vim.diagnostic.get(0, {severity = level })) + end + + local errors = "" + local warnings = "" + local hints = "" + local info = "" + + if count["errors"] ~= 0 then + errors = " %#LspDiagnosticsSignError# " .. count["errors"] + end + + if count["warnings"] ~= 0 then + warnings = " %#LspDiagnosticsSignHint# " .. count["warnings"] + end + + if count["hints"] ~= 0 then + hints = " %#LspDiagnosticsSignHint# " .. count["hints"] + end + + if count["info"] ~= 0 then + info = " %#LspDiagnosticsSignInformation# " .. count["info"] + end + + return errors .. warnings .. hints .. info .. "%#Normal#" +end + +local function filetype() + return string.format(" %s ", vim.bo.filetype):upper() +end + +local function lineinfo() + if vim.bo.filetype == "alpha" then + return "" + end + return " %l:%c %P %" +end + +Statusline = {} + +Statusline.active = function() + return table.concat { + "%#Statusline#", + update_mode_colors(), + mode(), + "%#Statusline# ", + filepath(), + filename(), + "%#Normal#", + lsp(), + "%=%#StatusLineExtra#", + filetype(), + lineinfo(), + } +end + +function Statusline.inactive() + return " %#Statusline#%F" +end + +function Statusline.short() + return "%#StatusLineNC#  NvimTree" +end + +vim.api.nvim_exec([[ + augroup Statusline + au! + au WinEnter,BufEnter * setlocal statusline=%!v:lua.Statusline.active() + au WinLeave,BufLeave * setlocal statusline=%!v:lua.Statusline.inactive() + au WinEnter,BufEnter,FileType NvimTree setlocal statusline=%!v:lua.Statusline.short() + augroup END +]], false)