Commit b10c54d8 authored by Tim van Deurzen's avatar Tim van Deurzen

Updated keybindings and settings for Neovim.

parent d58a3608
local t = function(str)
return vim.api.nvim_replace_termcodes(str, true, true, true)
end
local lspkind = require("lspkind")
lspkind.init()
local check_back_space = function()
local col = vim.fn.col('.') - 1
if col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then
return true
else
return false
end
local has_words_before = function()
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
end
-- Use (s-)tab to:
--- move to prev/next item in completion menuone
--- jump to prev/next snippet's placeholder
_G.tab_complete = function()
if vim.fn.pumvisible() == 1 then
return t "<C-n>"
elseif vim.fn.call("vsnip#available", {1}) == 1 then
return t "<Plug>(vsnip-expand-or-jump)"
elseif check_back_space() then
return t "<Tab>"
local luasnip = require("luasnip")
local cmp_autopairs = require("nvim-autopairs.completion.cmp")
local cmp = require("cmp")
cmp.setup({
completion = {
completeopt = "menu,menuone,noinsert",
},
mapping = {
["<C-d>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(2),
["<C-e>"] = cmp.mapping.close(),
["<c-y>"] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Insert,
select = true,
}),
["<c-q>"] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Replace,
select = true,
}),
["<CR>"] = cmp.mapping.confirm({ select = true }),
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
elseif has_words_before() then
cmp.complete()
else
return vim.fn['compe#complete']()
fallback()
end
end
_G.s_tab_complete = function()
if vim.fn.pumvisible() == 1 then
return t "<C-p>"
elseif vim.fn.call("vsnip#jumpable", {-1}) == 1 then
return t "<Plug>(vsnip-jump-prev)"
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
return t "<S-Tab>"
fallback()
end
end
end, {
"i",
"s",
}),
},
-- Youtube:
-- the order of your sources matter (by default). That gives them priority
-- you can configure:
-- keyword_length
-- priority
-- max_item_count
-- (more?)
sources = {
{ name = "nvim_lsp" },
{ name = "nvim_lua" },
{ name = "path" },
{ name = "luasnip" },
{ name = "buffer", keyword_length = 5 },
},
sorting = {
-- TODO: Would be cool to add stuff like "See variable names before method names" in rust, or something like that.
comparators = {
cmp.config.compare.offset,
cmp.config.compare.exact,
cmp.config.compare.score,
cmp.config.compare.kind,
cmp.config.compare.sort_text,
cmp.config.compare.length,
cmp.config.compare.order,
},
},
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
formatting = {
-- Youtube: How to set up nice formatting for your sources.
format = lspkind.cmp_format({
with_text = true,
menu = {
buffer = "[buf]",
nvim_lsp = "[LSP]",
nvim_lua = "[api]",
path = "[path]",
luasnip = "[snip]",
gh_issues = "[issues]",
},
}),
},
experimental = {
-- I like the new menu better! Nice work hrsh7th
native_menu = false,
vim.api.nvim_set_keymap("i", "<Tab>", "v:lua.tab_complete()", {expr = true})
vim.api.nvim_set_keymap("s", "<Tab>", "v:lua.tab_complete()", {expr = true})
vim.api.nvim_set_keymap("i", "<S-Tab>", "v:lua.s_tab_complete()", {expr = true})
vim.api.nvim_set_keymap("s", "<S-Tab>", "v:lua.s_tab_complete()", {expr = true})
-- Let's play with this for a day or two
ghost_text = true,
},
})
local opts = {noremap = true, silent = true, expr = true}
vim.api.nvim_set_keymap("i", "<CR>", [[compe#confirm({'keys': "\<Plug>delimitMateCR", 'mode': ''})]], opts)
vim.api.nvim_set_keymap("i", "<c-c>", [[compe#complete()]], opts)
vim.api.nvim_set_keymap("i", "<c-e>", [[compe#close('<c-e>')]], opts)
cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done({ map_char = { tex = "" } }))
local lsp_config = require('lspconfig')
local lsp_config = require("lspconfig")
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = require("cmp_nvim_lsp").update_capabilities(capabilities)
capabilities.textDocument.completion.completionItem.snippetSupport = true
lsp_config.gopls.setup{
lsp_config.gopls.setup({
capabilities = capabilities,
settings = {
gopls = {
......@@ -18,9 +19,13 @@ lsp_config.gopls.setup{
bools = true,
},
staticcheck = true,
usePlaceholders = true,
codelenses = {
gc_details = true,
},
},
}
},
})
-- lsp_config.rust_analyzer.setup{
-- capabilities = capabilities,
......@@ -51,14 +56,14 @@ local opts = {
runnables = {
-- whether to use telescope for selection menu or not
use_telescope = true
use_telescope = true,
-- rest of the opts are forwarded to telescope
},
debuggables = {
-- whether to use telescope for selection menu or not
use_telescope = true
use_telescope = true,
-- rest of the opts are forwarded to telescope
},
......@@ -105,59 +110,63 @@ local opts = {
-- the border that is used for the hover window
-- see vim.api.nvim_open_win()
border = {
{"╭", "FloatBorder"}, {"─", "FloatBorder"},
{"╮", "FloatBorder"}, {"│", "FloatBorder"},
{"╯", "FloatBorder"}, {"─", "FloatBorder"},
{"╰", "FloatBorder"}, {"│", "FloatBorder"}
{ "╭", "FloatBorder" },
{ "─", "FloatBorder" },
{ "╮", "FloatBorder" },
{ "│", "FloatBorder" },
{ "╯", "FloatBorder" },
{ "─", "FloatBorder" },
{ "╰", "FloatBorder" },
{ "│", "FloatBorder" },
},
-- whether the hover action window gets automatically focused
auto_focus = false
}
auto_focus = false,
},
},
-- all the opts to send to nvim-lspconfig
-- these override the defaults set by rust-tools.nvim
-- see https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md#rust_analyzer
server = {} -- rust-analyer options
server = {}, -- rust-analyer options
}
require('rust-tools').setup(opts)
require("rust-tools").setup(opts)
lsp_config.angularls.setup{
lsp_config.angularls.setup({
capabilities = capabilities,
}
})
lsp_config.yamlls.setup{
lsp_config.yamlls.setup({
capabilities = capabilities,
}
})
lsp_config.dartls.setup{}
lsp_config.dartls.setup({})
lsp_config.ccls.setup{
lsp_config.ccls.setup({
capabilities = capabilities,
}
})
lsp_config.sumneko_lua.setup{
cmd = {'/usr/bin/lua-language-server'},
lsp_config.sumneko_lua.setup({
cmd = { "/usr/bin/lua-language-server" },
capabilities = capabilities,
settings = {
Lua = {
runtime = {
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
version = 'LuaJIT',
version = "LuaJIT",
-- Setup your lua path
path = vim.split(package.path, ';'),
path = vim.split(package.path, ";"),
},
diagnostics = {
-- Get the language server to recognize the `vim` global
globals = {'vim'},
globals = { "vim" },
},
workspace = {
-- Make the server aware of Neovim runtime files
library = {
[vim.fn.expand('$VIMRUNTIME/lua')] = true,
[vim.fn.expand('$VIMRUNTIME/lua/vim/lsp')] = true,
[vim.fn.expand("$VIMRUNTIME/lua")] = true,
[vim.fn.expand("$VIMRUNTIME/lua/vim/lsp")] = true,
},
},
-- Do not send telemetry data containing a randomized but unique identifier
......@@ -166,34 +175,32 @@ lsp_config.sumneko_lua.setup{
},
},
},
}
})
local eslint = {
lintCommand = "eslint_d -f unix --stdin --stdin-filename ${INPUT}",
lintStdin = true,
lintFormats = {"%f:%l:%c: %m"},
lintFormats = { "%f:%l:%c: %m" },
lintIgnoreExitCode = true,
formatCommand = "eslint_d --fix-to-stdout --stdin --stdin-filename=${INPUT}",
formatStdin = true
formatStdin = true,
}
lsp_config.efm.setup {
init_options = {documentFormatting = true},
filetypes = {"javascript", "typescript"},
lsp_config.efm.setup({
init_options = { documentFormatting = true },
filetypes = { "javascript", "typescript" },
root_dir = function(fname)
return lsp_config.util.root_pattern("tsconfig.json")(fname) or
lsp_config.util.root_pattern(".eslintrc.js", ".git")(fname);
return lsp_config.util.root_pattern("tsconfig.json")(fname)
or lsp_config.util.root_pattern(".eslintrc.js", ".git")(fname)
end,
settings = {
rootMarkers = {".eslintrc.js", ".git/"},
rootMarkers = { ".eslintrc.js", ".git/" },
languages = {
javascript = {eslint},
typescript = {eslint}
}
}
}
javascript = { eslint },
typescript = { eslint },
},
},
})
-- vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(
-- vim.lsp.diagnostic.on_publish_diagnostics, {
......@@ -208,22 +215,237 @@ lsp_config.efm.setup {
-- }
-- )
require('lsp_signature').on_attach({
bind = true, -- This is mandatory, otherwise border config won't get registered.
-- If you want to hook lspsaga or other signature handler, pls set to false
doc_lines = 4, -- will show two lines of comment/doc(if there are more than two lines in doc, will be truncated);
-- set to 0 if you do not want any API comments be shown
-- This setting only take effect in insert mode, it does not affect signature help in normal
-- mode
hint_enable = true, -- virtual hint enable
hint_prefix = "↑ ", -- Panda for parameter
hint_scheme = "String",
use_lspsaga = false, -- set to true if you want to use lspsaga popup
handler_opts = {
border = "shadow" -- double, single, shadow, none
},
decorator = {"`", "`"} -- decoractor can be `decorator = {"***", "***"}` `decorator = {"**", "**"}` `decorator = {"**_", "_**"}`
-- `decorator = {"*", "*"} see markdown help for more details
-- <u></u> ~ ~ does not supported by nvim
-- require('lsp_signature').on_attach({
-- bind = true, -- This is mandatory, otherwise border config won't get registered.
-- -- If you want to hook lspsaga or other signature handler, pls set to false
-- doc_lines = 4, -- will show two lines of comment/doc(if there are more than two lines in doc, will be truncated);
-- -- set to 0 if you do not want any API comments be shown
-- -- This setting only take effect in insert mode, it does not affect signature help in normal
-- -- mode
--
-- hint_enable = true, -- virtual hint enable
-- hint_prefix = "↑ ", -- Panda for parameter
-- hint_scheme = "String",
-- use_lspsaga = false, -- set to true if you want to use lspsaga popup
-- handler_opts = {
-- border = "shadow" -- double, single, shadow, none
-- },
-- decorator = {"`", "`"} -- decoractor can be `decorator = {"***", "***"}` `decorator = {"**", "**"}` `decorator = {"**_", "_**"}`
-- -- `decorator = {"*", "*"} see markdown help for more details
-- -- <u></u> ~ ~ does not supported by nvim
-- })
if vim.g.snippets ~= "luasnip" then
return
end
local ls = require("luasnip")
ls.config.set_config({
history = true,
updateevents = "TextChanged,TextChangedI",
})
-- create snippet
-- s(context, nodes, condition, ...)
local snippet = ls.s
local snippet_from_nodes = ls.sn
-- This a choice snippet. You can move through with <c-e> (in my config)
-- tbl_snip {
-- trig = "c",
-- t { "-- this has a choice: " },
-- c(1, { t {"hello"}, t {"world"}, }),
-- i(0),
-- }
local c = ls.c -- choice node
local f = ls.f -- function node
local i = ls.i -- insert node
local t = ls.t -- text node
local d = ls.d -- dynamic node
local str = function(text)
return t({ text })
end
local newline = function(text)
return t({ "", text })
end
local str_snip = function(trig, expanded)
return ls.parser.parse_snippet({ trig = trig }, expanded)
end
local tbl_snip = function(t)
return snippet({ trig = t.trig, dscr = t.desc }, { unpack(t) })
end
local function char_count_same(c1, c2)
local line = vim.api.nvim_get_current_line()
local _, ct1 = string.gsub(line, c1, "")
local _, ct2 = string.gsub(line, c2, "")
return ct1 == ct2
end
local function neg(fn, ...)
return not fn(...)
end
-- {{{ Go stuff
local ts_locals = require("nvim-treesitter.locals")
local ts_utils = require("nvim-treesitter.ts_utils")
local get_node_text = vim.treesitter.get_node_text
vim.treesitter.set_query(
"go",
"LuaSnip_Result",
[[
[
(method_declaration result: (*) @id)
(function_declaration result: (*) @id)
(func_literal result: (*) @id)
]
]]
)
local transform = function(text, info)
if text == "int" then
return str("0")
elseif text == "error" then
if info then
info.index = info.index + 1
return c(info.index, {
str(string.format('errors.Wrap(%s, "%s")', info.err_name, info.func_name)),
str(info.err_name),
})
else
return str("err")
end
elseif text == "bool" then
return str("false")
elseif string.find(text, "*", 1, true) then
return str("nil")
end
return str(text)
end
local handlers = {
["parameter_list"] = function(node, info)
local result = {}
local count = node:named_child_count()
for i = 0, count - 1 do
table.insert(result, transform(get_node_text(node:named_child(i), 0), info))
if i ~= count - 1 then
table.insert(result, t({ ", " }))
end
end
return result
end,
["type_identifier"] = function(node, info)
local text = get_node_text(node, 0)
return { transform(text, info) }
end,
}
local function go_result_type(info)
local cursor_node = ts_utils.get_node_at_cursor()
local scope = ts_locals.get_scope_tree(cursor_node, 0)
local function_node
for _, v in ipairs(scope) do
if v:type() == "function_declaration" or v:type() == "method_declaration" or v:type() == "func_literal" then
function_node = v
break
end
end
local query = vim.treesitter.get_query("go", "LuaSnip_Result")
for id, node in query:iter_captures(function_node, 0) do
if handlers[node:type()] then
return handlers[node:type()](node, info)
end
end
end
-- }}}
local shortcut = function(val)
if type(val) == "string" then
return { t({ val }), i(0) }
end
if type(val) == "table" then
for k, v in ipairs(val) do
if type(v) == "string" then
val[k] = t({ v })
end
end
end
return val
end
local make = function(tbl)
local result = {}
for k, v in pairs(tbl) do
table.insert(result, (snippet({ trig = k, desc = v.desc }, shortcut(v))))
end
return result
end
local same = function(index)
return f(function(args)
return args[1]
end, { index })
end
local snippets = {}
local go_ret_vals = function(args, old_state)
local info = { index = 0, err_name = args[1][1], func_name = args[2][1] }
return snippet_from_nodes(nil, go_result_type(info))
end
--stylua: ignore
snippets.go = make {
main = {
t { "func main() {", "\t" },
i(0),
t { "", "}" },
},
ef = {
i(1, { "val" }),
str ", err := ",
i(2, { "f" }),
str "(",
i(3),
str ")",
i(0),
},
efi = {
i(1, { "val" }),
", ",
i(2, { "err" }),
" := ",
i(3, { "f" }),
"(",
i(4),
")",
t { "", "if " },
same(2),
t { " != nil {", "\treturn " },
d(5, go_ret_vals, { 2, 3 }),
t { "", "}" },
i(0),
},
-- TODO: Fix this up so that it actually uses the tree sitter thing
ie = { "if err != nil {", "\treturn err", i(0), "}" },
}
return require('packer').startup(function()
use 'wbthomason/packer.nvim'
return require("packer").startup(function()
use("wbthomason/packer.nvim")
-- Color schemes
use 'morhetz/gruvbox'
use 'icymind/NeoSolarized'
use 'romgrk/doom-one.vim'
use {
'tjdevries/gruvbuddy.nvim',
use("morhetz/gruvbox")
use("icymind/NeoSolarized")
use("romgrk/doom-one.vim")
use({
"tjdevries/gruvbuddy.nvim",
requires = {'tjdevries/colorbuddy.vim'},
requires = { "tjdevries/colorbuddy.vim" },
config = function()
--require('colorbuddy').colorscheme('gruvbox')
vim.cmd[[colo gruvbox]]
end
}
vim.cmd([[colo gruvbox]])
end,
})
-- UI
use 'ntpeters/vim-better-whitespace'
use 'Yggdroot/indentLine'
use 'haya14busa/incsearch.vim'
use {
'junegunn/fzf.vim',
requires = {'junegunn/fzf'}
}
use("ntpeters/vim-better-whitespace")
use("Yggdroot/indentLine")
use("haya14busa/incsearch.vim")
use({
"junegunn/fzf.vim",
requires = { "junegunn/fzf" },
})
-- Look at feline for a leaner better maintained alternative.
use {
'glepnir/galaxyline.nvim',
use({
"glepnir/galaxyline.nvim",
branch = 'main',
branch = "main",
config = function()
require('statusline')
require("statusline")
end,
requires = {'kyazdani42/nvim-web-devicons'}
}
use 'liuchengxu/vista.vim'
use 'kyazdani42/nvim-tree.lua'
use {
'AckslD/nvim-whichkey-setup.lua',
requires = {'liuchengxu/vim-which-key'}
}
use {
'akinsho/nvim-bufferline.lua',
requires = { "kyazdani42/nvim-web-devicons" },
})
use("liuchengxu/vista.vim")
use({
"kyazdani42/nvim-tree.lua",
requires = "kyazdani42/nvim-web-devicons",
config = function()
require("nvim-tree").setup({})
end,
})
use({
"AckslD/nvim-whichkey-setup.lua",
requires = { "liuchengxu/vim-which-key" },
})
use({
"akinsho/nvim-bufferline.lua",
requires = 'kyazdani42/nvim-web-devicons',
requires = "kyazdani42/nvim-web-devicons",
config = function()
require('bufferline').setup{}
end
}
require("bufferline").setup({})
end,
})
-- Utilities
use 'editorconfig/editorconfig-vim'
use {
'nvim-treesitter/nvim-treesitter',
use("editorconfig/editorconfig-vim")
use({
"nvim-treesitter/nvim-treesitter",
run = ':TSUpdate',
run = ":TSUpdate",
requires = {
'nvim-treesitter/nvim-treesitter-refactor',
'nvim-treesitter/nvim-treesitter-textobjects'
"nvim-treesitter/nvim-treesitter-refactor",
"nvim-treesitter/nvim-treesitter-textobjects",
},
}
use {
'nvim-telescope/telescope.nvim',
})
use({
"nvim-telescope/telescope.nvim",
requires = {
{'nvim-lua/popup.nvim'},
{'nvim-lua/plenary.nvim'},
{'nvim-telescope/telescope-project.nvim'}
{ "nvim-lua/popup.nvim" },
{ "nvim-lua/plenary.nvim" },
{ "nvim-telescope/telescope-project.nvim" },
},
config = function()
require('telescope').load_extension('project')
end
}
use 'Chiel92/vim-autoformat'
use 'Raimondi/delimitMate'
use {
'Shougo/echodoc.vim',
config = function()
vim.cmd [[let g:echodoc#enable_at_start=1]]
end
}
-- Completion
use {
'hrsh7th/nvim-compe',
require("telescope").load_extension("project")
end,
})
use("Chiel92/vim-autoformat")
use("Raimondi/delimitMate")
use({
"Shougo/echodoc.vim",
config = function()
require('compe').setup {
enabled = true;
autocomplete = true;
debug = false;
min_length = 1;
preselect = 'enable';
throttle_time = 80;
source_timeout = 200;
incomplete_delay = 400;
max_abbr_width = 100;
max_kind_width = 100;
max_menu_width = 100;
documentation = true;
source = {
path = true;
buffer = true;
calc = true;
nvim_lsp = true;
nvim_lua = true;
vsnip = true;
};
}
vim.cmd([[let g:echodoc#enable_at_start=1]])
end,
requires = {
{
'hrsh7th/vim-vsnip',
requires = {'hrsh7th/vim-vsnip-integ'}
}
}
}
})
-- LSP
use 'neovim/nvim-lspconfig'
use {
'RishabhRD/nvim-lsputils',
requires = {'RishabhRD/popfix'},
disable = true
}
use {
'glepnir/lspsaga.nvim',
requires = {'neovim/nvim-lspconfig'},
use("neovim/nvim-lspconfig")
use({
"RishabhRD/nvim-lsputils",
config = function()
require('lspsaga').init_lsp_saga {
error_sign = '•',
warn_sign = '•',
hint_sign = '•',
infor_sign = '•',
code_action_icon = '?',
border_style = 2,
code_action_prompt = {
enable = true,
sign = true,
sign_priority = 20,
virtual_text = false,
},
code_action_keys = {
quit = '<esc>',
exec = '<CR>'
},
finder_action_keys = {
open = 'o',
vsplit = 's',
split = 'i',
quit = '<esc>',
scroll_down = '<C-n>',
scroll_up = '<C-p>'
},
}
requires = { "RishabhRD/popfix" },
disable = true,
})
-- vim.api.nvim_command [[autocmd CursorHold,CursorHoldI * :lua require('lspsaga.signaturehelp').signature_help()]]
end
}
use {
'nvim-lua/lsp_extensions.nvim',
use({
"nvim-lua/lsp_extensions.nvim",
requires = {'neovim/nvim-lspconfig'},
requires = { "neovim/nvim-lspconfig" },
disable = true,
config = function()
require('lsp_extensions').inlay_hints{
require("lsp_extensions").inlay_hints({
highlight = "Comment",
prefix = " » ",
aligned = true,
only_current_line = false,
enabled = { "ChainingHint" }
}
end
}
enabled = { "ChainingHint" },
})
end,
})
use {
use({
"folke/lsp-trouble.nvim",
requires = "kyazdani42/nvim-web-devicons",
config = function()
require("trouble").setup {
require("trouble").setup({
-- your configuration comes here
-- or leave it empty to use the default settings
-- refer to the configuration section below
}
end
}
})
end,
})
use {
"ray-x/lsp_signature.nvim",
-- Completion
use("onsails/lspkind-nvim")
use("hrsh7th/cmp-buffer")
use("hrsh7th/cmp-path")
use("hrsh7th/cmp-nvim-lua")
use("hrsh7th/cmp-nvim-lsp")
use("hrsh7th/nvim-cmp")
use({
"saadparwaiz1/cmp_luasnip",
-- config = function()
-- end
}
requires = {
"L3MON4D3/LuaSnip",
},
})
use {
'simrat39/rust-tools.nvim',
-- use "hrsh7th/cmp-vsnip"
-- use "hrsh7th/vim-vsnip"
requires = {
'nvim-lua/popup.nvim'
}
}
use("windwp/nvim-autopairs")
use({
"simrat39/rust-tools.nvim",
use {
'lewis6991/gitsigns.nvim',
requires = {
'nvim-lua/plenary.nvim'
"nvim-lua/popup.nvim",
},
})
use({
"lewis6991/gitsigns.nvim",
requires = {
"nvim-lua/plenary.nvim",
},
config = function()
require('gitsigns').setup()
end
}
require("gitsigns").setup()
end,
})
use 'tomlion/vim-solidity'
use("tomlion/vim-solidity")
end)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment