Skip to content

Instantly share code, notes, and snippets.

@benfrain
Last active Jul 1, 2022
Embed
What would you like to do?
Lua init file for NeoVim 0.7+ (Always a WIP!!)
-- note only needed when working with zmk. goes in the config root.
vim.filetype.add({
extension = {
keymap = "dts",
},
})
-- You will need to install language servers `npm i -g vscode-langservers-extracted` and `npm install -g typescript typescript-language-server`
require("plugins")
require("options")
require("setup.spelling")
require("mappings")
local function map(mode, lhs, rhs, opts)
local options = { noremap = true }
if opts then
options = vim.tbl_extend("force", options, opts)
end
vim.api.nvim_set_keymap(mode, lhs, rhs, options)
end
-- Map leader to space
vim.g.mapleader = ","
-- Nvim Tree
map("n", "<leader>e", ":NvimTreeToggle<CR>", { silent = true })
map("n", "<leader>u", ":NvimTreeFindFile<CR>", { silent = true })
-- Switch Session
-- map("n", "<Leader>1", ":Telescope sessions [save_current=true]<CR>")
map("n", "<Leader>1", ":SearchSession<CR>")
-- Update Plugins
map("n", "<Leader>u", ":PackerSync<CR>")
-- Open nvimrc file
map("n", "<Leader>v", "<cmd>e $MYVIMRC<CR>")
-- Source nvimrc file
map("n", "<Leader>sv", ":luafile %<CR>")
-- Quick new file
map("n", "<Leader>n", "<cmd>enew<CR>")
-- Easy select all of file
map("n", "<Leader>sa", "ggVG<c-$>")
-- Make visual yanks place the cursor back where started
map("v", "y", "ygv<Esc>")
-- Easier file save
map("n", "<Leader>w", "<cmd>:w<CR>")
map("n", "<Delete>", "<cmd>:w<CR>")
-- Tab to switch buffers in Normal mode
map("n", "<Tab>", ":bnext<CR>")
map("n", "<S-Tab>", ":bprevious<CR>")
-- More molecular undo of text
-- map("i", ",", ",<c-g>u")
map("i", ".", ".<c-g>u")
map("i", "!", "!<c-g>u")
map("i", "?", "?<c-g>u")
map("i", ";", ";<c-g>u")
map("i", ":", ":<c-g>u")
-- Keep search results centred
map("n", "n", "nzzzv")
map("n", "N", "Nzzzv")
map("n", "J", "mzJ`z")
-- Make Y yank to end of the line
map("n", "Y", "y$")
-- Line bubbling
map("n", "<c-j>", "<cmd>m .+1<CR>==", { silent = true })
map("n", "<c-k>", "<cmd>m .-2<CR>==", { silent = true })
map("v", "<c-j>", ":m '>+1<CR>==gv=gv", { silent = true })
map("v", "<c-k>", ":m '<-2<CR>==gv=gv", { silent = true })
--After searching, pressing escape stops the highlight
map("n", "<esc>", ":noh<cr><esc>", { silent = true })
-- Easy add date/time
map("n", "<Leader>t", "\"=strftime('%c')<CR>Pa", { silent = true })
-- Telescope
local km = vim.keymap
-- Add moves of more than 5 to the jump list
km.set("n", "j", [[(v:count > 5 ? "m'" . v:count : "") . 'j']], { expr = true, desc = "if j > 5 then add to jumplist" })
km.set("n", "<leader>p", function()
require("telescope.builtin").find_files()
end)
km.set("n", "<leader>r", function()
require("telescope.builtin").registers()
end)
km.set("n", "<leader>g", function()
require("telescope.builtin").live_grep()
end)
km.set("n", "<leader>b", function()
require("telescope.builtin").buffers()
end)
km.set("n", "<leader>j", function()
require("telescope.builtin").help_tags()
end)
km.set("n", "<leader>h", function()
require("telescope.builtin").git_bcommits()
end)
km.set("n", "<leader>f", function()
require("telescope").extensions.file_browser.file_browser()
end)
km.set("n", "<leader>s", function()
require("telescope.builtin").spell_suggest(require("telescope.themes").get_cursor({}))
end)
km.set("n", "<leader>i", function()
require("telescope.builtin").git_status()
end)
km.set("n", "<leader>ca", function()
vim.lsp.buf.code_action()
end)
km.set("n", "<leader>cs", function()
require("telescope.builtin").lsp_document_symbols()
end)
km.set("n", "<leader>cd", function()
require("telescope.builtin").diagnostics()
end)
km.set("n", "<leader>cr", function()
require("telescope.builtin").lsp_references()
end)
km.set({ "v", "n" }, "<leader>cn", function()
vim.lsp.buf.rename()
end, { noremap = true, silent = true })
km.set("n", "<leader>ci", function()
vim.diagnostic.open_float()
end)
-- Easier split mappings
map("n", "<Leader><Down>", "<C-W><C-J>", { silent = true })
map("n", "<Leader><Up>", "<C-W><C-K>", { silent = true })
map("n", "<Leader><Right>", "<C-W><C-L>", { silent = true })
map("n", "<Leader><Left>", "<C-W><C-H>", { silent = true })
map("n", "<Leader>;", "<C-W>R", { silent = true })
map("n", "<Leader>[", "<C-W>_", { silent = true })
map("n", "<Leader>]", "<C-W>|", { silent = true })
map("n", "<Leader>=", "<C-W>=", { silent = true })
-- Pounce
km.set({ "n", "v" }, "h", ":Pounce<CR>", { silent = true })
km.set("n", "H", ":PounceRepeat<CR>", { silent = true })
-- Symbols outline
map("n", "<leader>o", ":SymbolsOutline<cr>")
-- ZenMode toggle
map("n", "<leader>z", ":ZenMode<cr>")
-- Make Option and backspace delete whole words in OSX/Kitty. Requires `macos_option_as_alt yes` to be set in Kitty config
map("i", "<A-BS>", "<C-W>")
local opt = vim.opt -- to set options
opt.backspace = { "indent", "eol", "start" }
opt.clipboard = "unnamedplus"
opt.completeopt = "menu,menuone,noselect"
opt.cursorline = true
opt.cursorcolumn = true
opt.encoding = "utf-8" -- Set default encoding to UTF-8
opt.expandtab = true -- Use spaces instead of tabs
opt.foldenable = false
opt.foldmethod = "indent"
opt.formatoptions = "l"
opt.hidden = true -- Enable background buffers
opt.hlsearch = true -- Highlight found searches
opt.ignorecase = true -- Ignore case
opt.inccommand = "split" -- Get a preview of replacements
opt.incsearch = true -- Shows the match while typing
opt.joinspaces = false -- No double spaces with join
vim.o.lazyredraw = true
opt.linebreak = true -- Stop words being broken on wrap
opt.number = true -- Show line numbers
opt.list = true -- Show some invisible characters
opt.listchars = { tab = "", trail = "·" }
opt.relativenumber = true
opt.scrolloff = 4 -- Lines of context
opt.shiftround = true -- Round indent
opt.shiftwidth = 4 -- Size of an indent
opt.showmode = false -- Don't display mode
opt.sidescrolloff = 8 -- Columns of context
opt.signcolumn = "yes:1" -- always show signcolumns
opt.smartcase = true -- Do not ignore case with capitals
opt.smartindent = true -- Insert indents automatically
opt.spelllang = { "en_gb" }
opt.splitbelow = true -- Put new windows below current
opt.splitright = true -- Put new windows right of current
opt.tabstop = 4 -- Number of spaces tabs count for
opt.termguicolors = true -- You will have bad experience for diagnostic messages when it's default 4000.
opt.title = true -- Allows neovom to send the Terminal details of the current window, instead of just getting 'v'
vim.g.do_filetype_lua = 1 -- new filetype detection
vim.g.did_load_filetypes = 0
-- Give me some fenced codeblock goodness
vim.g.markdown_fenced_languages = { "html", "javascript", "typescript", "css", "scss", "lua", "vim" }
vim.o.whichwrap = vim.o.whichwrap .. "<,>" -- Wrap movement between lines in edit mode with arrows
opt.wrap = true
-- opt.cc = "80"
opt.mouse = "a"
opt.guicursor =
"n-v-c-sm:block-blinkwait50-blinkon50-blinkoff50,i-ci-ve:ver25-Cursor-blinkon100-blinkoff100,r-cr-o:hor20"
opt.undodir = vim.fn.stdpath("config") .. "/undo"
opt.undofile = true
vim.notify = require("notify")
local api = vim.api
-- Highlight on yank
local yankGrp = vim.api.nvim_create_augroup("YankHighlight", { clear = true })
api.nvim_create_autocmd("TextYankPost", {
group = yankGrp,
pattern = "*",
callback = function()
vim.highlight.on_yank()
end,
desc = "Highlight yank",
})
-- show cursor line only in active window
local cursorGrp = api.nvim_create_augroup("CursorLine", { clear = true })
api.nvim_create_autocmd({ "InsertLeave", "WinEnter" }, { pattern = "*", command = "set cursorline", group = cursorGrp })
api.nvim_create_autocmd(
{ "InsertEnter", "WinLeave" },
{ pattern = "*", command = "set nocursorline", group = cursorGrp }
)
-- show cursor col line only in active window
local cursorColGrp = api.nvim_create_augroup("CursorColumn", { clear = true })
api.nvim_create_autocmd(
{ "InsertLeave", "WinEnter" },
{ pattern = "*", command = "set cursorcolumn", group = cursorColGrp }
)
api.nvim_create_autocmd(
{ "InsertEnter", "WinLeave" },
{ pattern = "*", command = "set nocursorcolumn", group = cursorColGrp }
)
-- Deal with file loads after updating via git etc
opt.autoread = true
-- -- trigger `autoread` when files changes on disk
-- vim.cmd([[
-- autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
-- autocmd FileChangedShellPost *
-- \ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None
-- ]])
-- auto-reload files when modified externally
-- https://unix.stackexchange.com/a/383044
vim.o.autoread = true
vim.api.nvim_create_autocmd({ "BufEnter", "CursorHold", "CursorHoldI", "FocusGained" }, {
command = "if mode() != 'c' | checktime | endif",
pattern = { "*" },
})
local packer_group = vim.api.nvim_create_augroup("Packer", { clear = true })
vim.api.nvim_create_autocmd(
"BufWritePost",
{ command = "source <afile> | PackerCompile", group = packer_group, pattern = "plugins.lua" }
)
local fn = vim.fn
local install_path = fn.stdpath("data") .. "/site/pack/packer/start/packer.nvim"
if fn.empty(fn.glob(install_path)) > 0 then
packer_bootstrap = fn.system({
"git",
"clone",
"--depth",
"1",
"https://github.com/wbthomason/packer.nvim",
install_path,
})
end
vim.api.nvim_command("packadd packer.nvim")
-- returns the require for use in `config` parameter of packer's use
-- expects the name of the config file
function get_setup(name)
return string.format('require("setup/%s")', name)
end
return require("packer").startup({
function(use)
-- Packer can manage itself
use({ "wbthomason/packer.nvim" })
use({ "EdenEast/nightfox.nvim", config = get_setup("nightfox") })
use({ "kyazdani42/nvim-web-devicons" })
use({
"nvim-lualine/lualine.nvim",
config = get_setup("lualine"),
event = "VimEnter",
requires = { "kyazdani42/nvim-web-devicons", opt = true },
})
use({
"folke/zen-mode.nvim",
config = get_setup("zen-mode"),
})
use({
"norcalli/nvim-colorizer.lua",
event = "BufReadPre",
config = get_setup("colorizer"),
})
use({
"nvim-treesitter/nvim-treesitter",
config = get_setup("treesitter"),
run = ":TSUpdate",
})
use({ "nvim-treesitter/nvim-treesitter-textobjects" })
use({ "nvim-treesitter/nvim-treesitter-context" })
use({ "rcarriga/nvim-notify" })
use({
"windwp/nvim-autopairs",
after = "nvim-cmp",
config = get_setup("autopairs"),
})
use({
"hrsh7th/nvim-cmp",
requires = {
{ "hrsh7th/cmp-nvim-lsp" },
{ "hrsh7th/cmp-nvim-lua" },
{ "hrsh7th/cmp-buffer" },
{ "hrsh7th/cmp-path" },
{ "hrsh7th/cmp-cmdline" },
{ "hrsh7th/vim-vsnip" },
{ "hrsh7th/cmp-vsnip" },
{ "hrsh7th/vim-vsnip-integ" },
{ "hrsh7th/cmp-calc" },
{ "rafamadriz/friendly-snippets" },
},
config = get_setup("cmp"),
})
use({
"numToStr/Comment.nvim",
config = function()
require("Comment").setup()
end,
})
use({
"rlane/pounce.nvim",
config = get_setup("pounce"),
})
use({
"lewis6991/gitsigns.nvim",
requires = { "nvim-lua/plenary.nvim" },
event = "BufReadPre",
config = get_setup("gitsigns"),
})
use({ "p00f/nvim-ts-rainbow" })
use({ "jose-elias-alvarez/null-ls.nvim", config = get_setup("null-ls") })
use({ "neovim/nvim-lspconfig", config = get_setup("lsp") })
use({
"nvim-telescope/telescope.nvim",
module = "telescope",
cmd = "Telescope",
requires = {
{ "nvim-lua/plenary.nvim" },
{ "nvim-telescope/telescope-fzf-native.nvim", run = "make" },
},
config = get_setup("telescope"),
})
use({ "nvim-telescope/telescope-file-browser.nvim" })
use({ "onsails/lspkind-nvim", requires = { { "famiu/bufdelete.nvim" } } })
use({ "tpope/vim-repeat" })
use({ "tpope/vim-surround" })
use({ "wellle/targets.vim" })
use({
"rmagatti/session-lens",
requires = { "rmagatti/auto-session", "nvim-telescope/telescope.nvim" },
config = get_setup("session"),
})
use({ "windwp/nvim-ts-autotag" })
use({
"winston0410/range-highlight.nvim",
requires = { { "winston0410/cmd-parser.nvim" } },
config = get_setup("range-highlight"),
})
use({ "goolord/alpha-nvim", config = get_setup("alpha") })
use({ "luukvbaal/stabilize.nvim", config = get_setup("stabilize") })
use({
"simrat39/symbols-outline.nvim",
cmd = { "SymbolsOutline" },
setup = get_setup("outline"),
})
if packer_bootstrap then
require("packer").sync()
end
end,
config = {
display = {
open_fn = require("packer.util").float,
},
profile = {
enable = true,
threshold = 1, -- the amount in ms that a plugins load time must be over for it to be included in the profile
},
},
})
-- Dashboard
local dashboard = require("alpha.themes.dashboard")
math.randomseed(os.time())
local function button(sc, txt, keybind, keybind_opts)
local b = dashboard.button(sc, txt, keybind, keybind_opts)
b.opts.hl = "Function"
b.opts.hl_shortcut = "Type"
return b
end
local function pick_color()
local colors = { "String", "Identifier", "Keyword", "Number" }
return colors[math.random(#colors)]
end
local function footer()
local total_plugins = #vim.tbl_keys(packer_plugins)
local datetime = os.date(" %d-%m-%Y  %H:%M:%S")
return datetime
.. ""
.. total_plugins
.. " plugins"
.. "  v"
.. vim.version().major
.. "."
.. vim.version().minor
.. "."
.. vim.version().patch
end
dashboard.section.header.val = {
[[__/\\\\\\\\\\\\\____/\\\\\\\\\\\\\\\_ ]],
[[ _\/\\\/////////\\\_\/\\\///////////__ ]],
[[ _\/\\\_______\/\\\_\/\\\_____________ ]],
[[ _\/\\\\\\\\\\\\\\__\/\\\\\\\\\\\_____ ]],
[[ _\/\\\/////////\\\_\/\\\///////______ ]],
[[ _\/\\\_______\/\\\_\/\\\_____________ ]],
[[ _\/\\\_______\/\\\_\/\\\_____________ ]],
[[ _\/\\\\\\\\\\\\\/__\/\\\_____________]],
[[ _\/////////////____\///_____________]],
}
dashboard.section.header.opts.hl = pick_color()
dashboard.section.buttons.val = {
button("<Leader>f", " File Explorer"),
button("<Leader>p", " Find file"),
button("<Leader>g", " Find word"),
button("<Leader>1", " Open session"),
button("<Leader>n", " New file"),
button("<Leader>v", " Config"),
button("<Leader>u", " Update plugins"),
button("q", " Quit", "<Cmd>qa<CR>"),
}
dashboard.section.footer.val = footer()
dashboard.section.footer.opts.hl = "Constant"
require("alpha").setup(dashboard.opts)
require("nvim-autopairs").setup({})
local cmp = require("cmp")
local lspkind = require("lspkind")
cmp.setup({
snippet = {
expand = function(args)
-- For `vsnip` user.
vim.fn["vsnip#anonymous"](args.body)
end,
},
mapping = {
["<C-d>"] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }),
["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }),
["<Down>"] = cmp.mapping(cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }), { "i", "c" }),
["<Up>"] = cmp.mapping(cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }), { "i", "c" }),
["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
["<C-y>"] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
["<C-e>"] = cmp.mapping({
i = cmp.mapping.abort(),
c = cmp.mapping.close(),
}),
["<CR>"] = cmp.mapping(
cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Replace,
select = true,
}),
{ "i", "c" }
),
},
completion = {
completeopt = "menu,menuone,noinsert",
keyword_length = 2,
},
sources = {
{ name = "nvim_lsp" },
{ name = "vsnip" },
{
name = "buffer",
option = {
get_bufnrs = function()
local bufs = {}
for _, win in ipairs(vim.api.nvim_list_wins()) do
bufs[vim.api.nvim_win_get_buf(win)] = true
end
return vim.tbl_keys(bufs)
end,
},
},
{ name = "look", keyword_length = 3, option = { convert_case = true, loud = true } },
{ name = "nvim_lua" },
{ name = "calc" },
{ name = "path" },
},
formatting = {
format = lspkind.cmp_format({
with_text = true,
maxwidth = 50,
menu = {
buffer = "",
nvim_lsp = "",
spell = "",
look = "",
},
}),
},
experimental = {
ghost_text = true,
native_menu = false,
},
})
-- 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" },
}),
})
require("colorizer").setup()
require("Comment").setup()
-- gitsigns setup
require("gitsigns").setup({
numhl = true,
signcolumn = false,
})
-- LSP this is needed for LSP completions in CSS along with the snippets plugin
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem.snippetSupport = true
capabilities.textDocument.completion.completionItem.resolveSupport = {
properties = {
"documentation",
"detail",
"additionalTextEdits",
},
}
-- Different machine VAR for office
local envMachine = os.getenv("MACHINE")
if envMachine == "work" then
machineCmd =
"/System/Volumes/Data/usr/local/lib/node_modules/vscode-langservers-extracted/bin/vscode-css-language-server"
else
machineCmd = "vscode-css-language-server"
end
-- LSP Server config
require("lspconfig").cssls.setup({
cmd = { machineCmd, "--stdio" },
settings = {
scss = {
lint = {
idSelector = "warning",
zeroUnits = "warning",
duplicateProperties = "warning",
},
completion = {
completePropertyWithSemicolon = true,
triggerPropertyValueCompletion = true,
},
},
},
capabilities = require("cmp_nvim_lsp").update_capabilities(vim.lsp.protocol.make_client_capabilities()),
on_attach = function(client)
client.server_capabilities.document_formatting = false
end,
})
require("lspconfig").tsserver.setup({
capabilities = require("cmp_nvim_lsp").update_capabilities(vim.lsp.protocol.make_client_capabilities()),
on_attach = function(client)
client.server_capabilities.document_formatting = false
end,
})
require("lspconfig").html.setup({
capabilities = require("cmp_nvim_lsp").update_capabilities(vim.lsp.protocol.make_client_capabilities()),
on_attach = function(client)
client.server_capabilities.document_formatting = false
end,
})
-- LSP Prevents inline buffer annotations
vim.diagnostic.open_float()
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
virtual_text = false,
signs = true,
underline = true,
update_on_insert = false,
})
local signs = {
Error = "",
Warn = "",
Hint = "",
Info = "",
}
for type, icon in pairs(signs) do
local hl = "DiagnosticSign" .. type
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = nil })
end
vim.cmd([[autocmd CursorHold,CursorHoldI * lua vim.diagnostic.open_float()]])
local function getWords()
if vim.bo.filetype == "md" or vim.bo.filetype == "txt" or vim.bo.filetype == "markdown" then
if vim.fn.wordcount().visual_words == 1 then
return tostring(vim.fn.wordcount().visual_words) .. " word"
elseif not (vim.fn.wordcount().visual_words == nil) then
return tostring(vim.fn.wordcount().visual_words) .. " words"
else
return tostring(vim.fn.wordcount().words) .. " words"
end
else
return ""
end
end
-- local lineNum = vim.api.nvim_win_get_cursor(0)[1]
local function getLines()
return tostring(vim.api.nvim_win_get_cursor(0)[1]) .. "/" .. tostring(vim.api.nvim_buf_line_count(0))
end
local function getColumn()
local val = vim.api.nvim_win_get_cursor(0)[2]
-- pad value to 3 units to stop geometry shift
return string.format("%03d", val)
end
local function diff_source()
local gitsigns = vim.b.gitsigns_status_dict
if gitsigns then
return {
added = gitsigns.added,
modified = gitsigns.changed,
removed = gitsigns.removed,
}
end
end
-- get colors from Nightfox to use in the words count
-- local nfColors = require("nightfox.colors").init("nordfox")
-- print(vim.inspect(nfColors))
require("lualine").setup({
options = {
icons_enabled = true,
theme = "auto",
component_separators = { " ", " " },
section_separators = { left = "", right = "" },
disabled_filetypes = {},
},
sections = {
lualine_a = { {
"mode",
fmt = function(res)
return res:sub(1, 1)
end,
} },
lualine_b = {
{ "branch", icon = "" },
{ "diff", source = diff_source, color_added = "#a7c080", color_modified = "#ffdf1b", color_removed = "#ff6666" },
},
lualine_c = {
{ "diagnostics", sources = { "nvim_diagnostic" } },
function()
return "%="
end,
{ "filename", path = 1, shorting_target = 40 },
{
getWords,
-- color = { fg = nfColors["bg_alt"] or "#333333", bg = nfColors["fg"] or "#eeeeee" },
color = { fg = "#333333", bg = "#eeeeee" },
separator = { left = "", right = "" },
},
},
lualine_x = { { "filetype", icon_only = true } },
lualine_y = { { require("auto-session-library").current_session_name } },
lualine_z = {
{ getColumn, padding = { left = 1, right = 0 } },
{ getLines, icon = "", padding = 1 },
},
},
inactive_sections = {
lualine_a = {},
lualine_b = {
{ "diff", source = diff_source, color_added = "#a7c080", color_modified = "#ffdf1b", color_removed = "#ff6666" },
},
lualine_c = {
function()
return "%="
end,
{ "filename", path = 1, shorting_target = 40 },
},
lualine_x = { { getLines, icon = "", padding = 1 } },
lualine_y = {},
lualine_z = {},
},
tabline = {},
extensions = {
"quickfix",
},
})
-- Nightfox config
local nightfox = require("nightfox")
nightfox.setup({
options = {
dim_inactive = true,
styles = {
comments = "italic",
keywords = "bold",
functions = "italic,bold",
},
inverse = {
search = true,
match_paren = true,
},
},
groups = {
all = {
CursorLine = { bg = "#353A54" },
CmpItemAbbr = { fg = "#9FA4B6" },
CmpItemKind = { fg = "#8289A0" },
CmpItemMenu = { fg = "#8289A0" },
PmenuSel = { bg = "#73daca", fg = "#111111" },
Pmenu = { bg = "#2E3248" },
GitSignsAddNr = { fg = "#26A07A" },
GitSignsDeleteNr = { fg = "#E87D7D" },
GitSignsChangeNr = { fg = "#AD991F" },
Visual = { fg = "#111111", bg = "#73daca" },
},
},
})
vim.cmd("colorscheme duskfox") -- Put your favorite colorscheme here
-- Here is the formatting config
local null_ls = require("null-ls")
local lSsources = {
null_ls.builtins.formatting.prettierd.with({
filetypes = {
"javascript",
"typescript",
"css",
"scss",
"html",
"json",
"yaml",
"markdown",
"graphql",
"md",
"txt",
},
}),
null_ls.builtins.formatting.stylua.with({
filetypes = {
"lua",
},
args = { "--indent-width", "2", "--indent-type", "Spaces", "-" },
}),
}
require("null-ls").setup({
sources = lSsources,
on_attach = function(client, bufnr)
if client.supports_method("textDocument/formatting") then
vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
vim.api.nvim_create_autocmd("BufWritePre", {
group = augroup,
buffer = bufnr,
callback = function()
vim.lsp.buf.formatting_seq_sync()
end,
})
end
end,
})
vim.g.symbols_outline = {
highlight_hovered_item = true,
show_guides = true,
auto_preview = false,
width = 50,
position = "right",
show_numbers = false,
show_relative_numbers = false,
show_symbol_details = true,
keymaps = {
close = "<Esc>",
goto_location = "<Cr>",
focus_location = "o",
hover_symbol = "<C-space>",
rename_symbol = "r",
code_actions = "a",
},
lsp_blacklist = { "null-ls" },
}
require("pounce").setup({
accept_keys = "NTESIROAGJKDFVBYMCXWPQZ",
accept_best_key = "<enter>",
multi_window = true,
debug = false,
})
require("range-highlight").setup({})
require("renamer").setup()
require("session-lens").setup({
prompt_title = "Session Switcher",
})
-- Use spelling for markdown files ‘]s’ to find next, ‘[s’ for previous, 'z=‘ for suggestions when on one.
-- Source: http:--thejakeharding.com/tutorial/2012/06/13/using-spell-check-in-vim.html
vim.api.nvim_exec(
[[
augroup markdownSpell
autocmd!
autocmd FileType markdown,md,txt setlocal spell
autocmd BufRead,BufNewFile *.md,*.txt,*.markdown setlocal spell
augroup END
]],
false
)
require("stabilize").setup()
-- Telescope Global remapping
local action_state = require("telescope.actions.state")
local actions = require("telescope.actions")
local fb_actions = require("telescope._extensions.file_browser.actions")
require("telescope").setup({
defaults = {
winblend = 20,
sorting_strategy = "descending",
layout_strategy = "flex",
prompt_prefix = "",
layout_config = {
flex = {
flip_columns = 140,
},
vertical = {
prompt_position = "bottom",
},
horizontal = {
width = 0.9,
height = 0.8,
},
},
mappings = {
i = {
["<esc>"] = actions.close,
["<C-q>"] = actions.smart_send_to_qflist + actions.open_qflist,
},
},
},
extensions = {
file_browser = {
theme = "ivy",
mappings = {
["i"] = {
["<S-M>"] = fb_actions.move,
},
["n"] = {
-- your custom normal mode mappings
},
},
},
},
pickers = {
buffers = {
sort_lastused = true,
mappings = {
i = {
["<C-w>"] = "delete_buffer",
},
n = {
["<C-w>"] = "delete_buffer",
},
},
},
-- https://gitter.im/nvim-telescope/community?at=6113b874025d436054c468e6 Fabian David Schmidt
find_files = {
on_input_filter_cb = function(prompt)
local find_colon = string.find(prompt, ":")
if find_colon then
local ret = string.sub(prompt, 1, find_colon - 1)
vim.schedule(function()
local prompt_bufnr = vim.api.nvim_get_current_buf()
local picker = action_state.get_current_picker(prompt_bufnr)
local lnum = tonumber(prompt:sub(find_colon + 1))
if type(lnum) == "number" then
local win = picker.previewer.state.winid
local bufnr = picker.previewer.state.bufnr
local line_count = vim.api.nvim_buf_line_count(bufnr)
vim.api.nvim_win_set_cursor(win, { math.max(1, math.min(lnum, line_count)), 0 })
end
end)
return { prompt = ret }
end
end,
attach_mappings = function()
actions.select_default:enhance({
post = function()
-- if we found something, go to line
local prompt = action_state.get_current_line()
local find_colon = string.find(prompt, ":")
if find_colon then
local lnum = tonumber(prompt:sub(find_colon + 1))
vim.api.nvim_win_set_cursor(0, { lnum, 0 })
end
end,
})
return true
end,
},
},
})
require("telescope").load_extension("fzf")
require("telescope").load_extension("session-lens")
require("telescope").load_extension("file_browser")
require("nvim-treesitter.configs").setup({
rainbow = {
enable = true,
extended_mode = true, -- Also highlight non-bracket delimiters like html tags, boolean or table: lang -> boolean
max_file_lines = nil, -- Do not enable for files with more than n lines, int
},
autotag = {
enable = true,
filetypes = {
"html",
"javascript",
"typescript",
"markdown",
},
},
incremental_selection = {
enable = true,
keymaps = {
init_selection = "<CR>",
scope_incremental = "<CR>",
node_incremental = "<CR>",
node_decremental = "<TAB>",
},
},
})
-- Setup treesitter
local ts = require("nvim-treesitter.configs")
ts.setup({
ensure_installed = {
"c",
"css",
"scss",
"typescript",
"lua",
"html",
"javascript",
"json",
"php",
"rust",
"yaml",
"vim",
"toml",
},
highlight = { enable = true },
})
require("zen-mode").setup({
window = {
width = 90,
options = {
number = false,
relativenumber = false,
signcolumn = "no",
cursorcolumn = false,
},
},
plugins = {
kitty = {
enabled = true,
font = "+2",
},
},
})
@benfrain
Copy link
Author

benfrain commented Jan 3, 2022

Removed the Y to delete to the end of the line as it's standard now in 0.6 or Neovim, ref: https://www.reddit.com/r/neovim/comments/ruth5m/comment/hr3m80a/?utm_source=share&utm_medium=web2x&context=3

@benfrain
Copy link
Author

benfrain commented Jan 4, 2022

Further tweaks for 6.1 compatibility

@benfrain
Copy link
Author

benfrain commented Jan 17, 2022

Switched the auto-session plugin back to https://github.com/rmagatti/auto-session as that was the one now recommended on Telescope and the previous one had started causing errors.

@the-mrd
Copy link

the-mrd commented Feb 7, 2022

Don't you have the same key mapping for both NvimTreeFindFile and Update plugins? Leader - u

@benfrain
Copy link
Author

benfrain commented Feb 7, 2022

@the-mrd Ah, yes! Never noticed it as I rarely use nvim tree these days! I’ll re assign, thanks!

@benfrain
Copy link
Author

benfrain commented Mar 1, 2022

Updated the mappings as had the Telescope mapping for diagnostics still set to the old style

@benfrain
Copy link
Author

benfrain commented Mar 30, 2022

Switched from Hop to Pounce: https://github.com/rlane/pounce.nvim and removed nvim-tree (wasn't using it, use telescope file browser for that use case)

@benfrain
Copy link
Author

benfrain commented Apr 4, 2022

Added a command to the options.lua from https://www.reddit.com/r/neovim/comments/f0qx2y/comment/fgxa0f8/ to try and deal with git updates better

@benfrain
Copy link
Author

benfrain commented Apr 19, 2022

Updates for Neovim 0.7
Also added some augroups to make the cursor lines only appear on the focused windows in a split

@benfrain
Copy link
Author

benfrain commented Apr 28, 2022

added friendly snippets as a requirement of cmp, for easy boilerplate of HTML etc

@benfrain
Copy link
Author

benfrain commented May 3, 2022

Updated to use latest Tree Sitter setup with individually specified languages. If you want all available languages, set it to 'all' instead:

require("nvim-treesitter.configs").setup({
  rainbow = {
    enable = true,
    extended_mode = true, -- Also highlight non-bracket delimiters like html tags, boolean or table: lang -> boolean
    max_file_lines = nil, -- Do not enable for files with more than n lines, int
  },
  autotag = {
    enable = true,
    filetypes = {
      "html",
      "javascript",
      "typescript",
      "markdown",
    },
  },
  incremental_selection = {
    enable = true,
    keymaps = {
      init_selection = "<CR>",
      scope_incremental = "<CR>",
      node_incremental = "<CR>",
      node_decremental = "<TAB>",
    },
  },
})
-- Setup treesitter
local ts = require("nvim-treesitter.configs")
ts.setup({
  ensure_installed = {
    "all",
  },
  highlight = { enable = true },
})

@benfrain
Copy link
Author

benfrain commented May 3, 2022

Adding mapping into cmp config so when autocompleting on the cmd mode i can press ESC and exit autocomplete but keep typing

@benfrain
Copy link
Author

benfrain commented May 5, 2022

Undoing the change with ESC in cmp as it meant I needed to press ESC twice in insert mode everytime I want

@the-mrd
Copy link

the-mrd commented May 6, 2022

Shouldn't the packer compile autocmd reference plugins.lua instead of init.lua ?

vim.api.nvim_create_autocmd(
  "BufWritePost",
  { command = "source <afile> | PackerCompile", group = packer_group, pattern = "init.lua" }
)

We want the compile command to trigger when changing something related to the plugins, no?

@benfrain
Copy link
Author

benfrain commented May 6, 2022

Shouldn't the packer compile autocmd reference plugins.lua instead of init.lua ?

vim.api.nvim_create_autocmd(
  "BufWritePost",
  { command = "source <afile> | PackerCompile", group = packer_group, pattern = "init.lua" }
)

We want the compile command to trigger when changing something related to the plugins, no?

Yes! Thanks, I’ll update.

@benfrain
Copy link
Author

benfrain commented May 10, 2022

Updated Nightfox config so overrides actually work!

@benfrain
Copy link
Author

benfrain commented May 11, 2022

updated cmp to provide completions from all visible buffers.

@benfrain
Copy link
Author

benfrain commented May 12, 2022

Switched out separate renamer plugin for dressing.

@the-mrd
Copy link

the-mrd commented May 18, 2022

Is nvim-colorizer still useful/used with nightfox? Don't they conflict or override?

@benfrain
Copy link
Author

benfrain commented May 19, 2022

Is nvim-colorizer still useful/used with nightfox? Don't they conflict or override?

They serve different purposes. colorizer just changes text/hex values in the code you are editing into the appropriate color background. night fox is the color theme.

@benfrain
Copy link
Author

benfrain commented May 24, 2022

LSP/null-ls updates to deal with neovim 0.8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment