feat(neovim): migrate most vimscript to lua

This commit is contained in:
Felix Schröter 2022-03-10 20:34:06 +01:00
parent 09d1037a2a
commit a102a8000b
Signed by: felschr
GPG key ID: 671E39E6744C807D
12 changed files with 232 additions and 208 deletions

View file

@ -1,9 +0,0 @@
nnoremap <leader>dc <cmd>lua require'dap'.continue()<CR>
nnoremap <leader>db <cmd>lua require'dap'.toggle_breakpoint()<CR>
nnoremap <leader>do <cmd>lua require'dap'.step_over()<CR>
nnoremap <leader>di <cmd>lua require'dap'.step_into()<CR>
nnoremap <leader>dO <cmd>lua require'dap'.step_out()<CR>
nnoremap <leader>dh <cmd>lua require'dap'.goto()<CR>
nnoremap <leader>dk <cmd>lua require'dap.ui.variables'.hover()<CR>
nnoremap <leader>dr <cmd>lua require'dap'.repl.open()<CR>
nnoremap <leader>dl <cmd>lua require'dap'.repl.run_last()<CR>

View file

@ -0,0 +1,11 @@
local map = vim.api.nvim_set_keymap
map("n", "<leader>dc", "<cmd>lua require'dap'.continue()<CR>", { noremap = true })
map("n", "<leader>db", "<cmd>lua require'dap'.toggle_breakpoint()<CR>", { noremap = true })
map("n", "<leader>do", "<cmd>lua require'dap'.step_over()<CR>", { noremap = true })
map("n", "<leader>di", "<cmd>lua require'dap'.step_into()<CR>", { noremap = true })
map("n", "<leader>dO", "<cmd>lua require'dap'.step_out()<CR>", { noremap = true })
map("n", "<leader>dh", "<cmd>lua require'dap'.goto()<CR>", { noremap = true })
map("n", "<leader>dk", "<cmd>lua require'dap.ui.variables'.hover()<CR>", { noremap = true })
map("n", "<leader>dr", "<cmd>lua require'dap'.repl.open()<CR>", { noremap = true })
map("n", "<leader>dl", "<cmd>lua require'dap'.repl.run_last()<CR>", { noremap = true })

View file

@ -1,4 +1,4 @@
{ config, pkgs, ... }: { config, lib, pkgs, ... }:
let let
vimLua = lua: '' vimLua = lua: ''
@ -20,6 +20,7 @@ in {
fzf-vim fzf-vim
lightline-vim lightline-vim
nerdtree nerdtree
toggleterm-nvim
vim-startify vim-startify
vim-visual-multi vim-visual-multi
vim-surround vim-surround
@ -55,12 +56,21 @@ in {
vim-orgmode vim-orgmode
]; ];
extraConfig = with builtins; extraConfig = with builtins;
readFile ./init.vim # + readFile ./vim-surround-fix.vim # readFile ./vim-surround-fix.vim +
+ vimLua (readFile ./which-key.lua) + vimLua (readFile ./gitsigns.lua) vimLua (lib.foldl (r: f: r + "\n" + readFile f) "" [
+ readFile ./test.vim + vimLua (readFile ./lsp/extensions.lua) ./init.lua
+ readFile ./lsp/lsp.vim + vimLua (readFile ./lsp/lsp.lua) ./startify.lua
+ readFile ./dap/dap.vim + vimLua (readFile ./dap/dap.lua) ./lightline.lua
+ vimLua (readFile ./treesitter.lua); ./which-key.lua
./gitsigns.lua
./test.lua
./lsp/extensions.lua
./lsp/lsp.lua
./lsp/mappings.lua
./dap/dap.lua
./dap/mappings.lua
./treesitter.lua
]);
withNodeJs = false; withNodeJs = false;
withPython3 = false; withPython3 = false;
}; };

View file

@ -0,0 +1,48 @@
-- vim.opt.shell = "/bin/sh"
vim.opt.title = true
vim.opt.titlestring = "%t - nvim"
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.termguicolors = true
vim.opt.timeoutlen = 500
-- reduce CursorHold delay
vim.opt.updatetime = 500
vim.g.mapleader = " "
vim.g.maplocalleader = ","
vim.g.camelcasemotion_key = "<leader>"
vim.opt.relativenumber = true
vim.opt.splitbelow = true
vim.g.nvcode_termcolors = 256
vim.cmd("syntax on")
vim.cmd("colorscheme nvcode")
vim.cmd("hi TSCurrentScope guifg=NONE ctermfg=NONE guibg=#252526 ctermbg=235 gui=NONE cterm=NONE")
-- vim-closetag
vim.g.closetag_filenames = "*.html,*.jsx,*.tsx,*.vue,*.xhml,*.xml"
vim.g.closetag_regions = {
["typescript.tsx"] = "jsxRegion,tsxRegion",
["javascript.jsx"] = "jsxRegion",
}
local map = vim.api.nvim_set_keymap
map("", ";", ":Files<CR>", {})
map("n", "<C-p>", ":NERDTreeToggle<CR>", {})
-- map("n", "<C-p>" ":Lexplore<CR>", { silent = true })
vim.g.netrw_banner = 0
vim.g.netrw_liststyle = 3
vim.g.netrw_browse_split = 4
vim.g.netrw_altv = 1
vim.g.netrw_winsize = 20
require("toggleterm").setup{
open_mapping = "<A-t>",
}

View file

@ -1,144 +0,0 @@
" set shell=/bin/sh
set ignorecase
set smartcase
set termguicolors
set timeoutlen=500
" reduce CursorHold delay
set updatetime=500
let g:nvcode_termcolors=256
syntax on
colorscheme nvcode
hi TSCurrentScope guifg=NONE ctermfg=NONE guibg=#252526 ctermbg=235 gui=NONE cterm=NONE
function! s:gitModified()
let files = systemlist('git ls-files -m 2>/dev/null')
return map(files, "{'line': v:val, 'path': v:val}")
endfunction
function! s:gitUntracked()
let files = systemlist('git ls-files -o --exclude-standard 2>/dev/null')
return map(files, "{'line': v:val, 'path': v:val}")
endfunction
function! s:list_projects() abort
return map(['/etc/nixos/'] + finddir('.git', $HOME . '/dev/**4', -1),
\ {_, dir -> {
\ 'line': fnamemodify(dir, ':h:s?' . $HOME . '??'),
\ 'path': fnamemodify(dir, ':h')}})
endfunction
let g:startify_commands = [
\ {'h': ['Vim Help', 'help']},
\ {'r': ['Vim Reference', 'help reference']},
\ ]
let g:startify_lists = [
\ { 'header': [' Sessions'], 'type': 'sessions' },
\ { 'header': [' git modified'], 'type': function('s:gitModified') },
\ { 'header': [' git untracked'], 'type': function('s:gitUntracked') },
\ { 'header': [' Projects'], 'type': function('s:list_projects') },
\ { 'header': [' Recent files'], 'type': 'files' },
\ { 'header': [' Commands'], 'type': 'commands' },
\ ]
let mapleader=" "
let maplocalleader=","
let g:camelcasemotion_key = '<leader>'
function! LspStatus() abort
let sl = ''
if luaeval('not vim.tbl_isempty(vim.lsp.buf_get_clients(0))')
let errors = luaeval("#vim.diagnostic.get(0, { severity = vim.diagnostic.severity.ERROR })")
let warnings = luaeval("#vim.diagnostic.get(0, { severity = vim.diagnostic.severity.WARN })")
let infos = luaeval("#vim.diagnostic.get(0, { severity = vim.diagnostic.severity.INFO })")
let hints = luaeval("#vim.diagnostic.get(0, { severity = vim.diagnostic.severity.HINT })")
if (errors || warnings || infos || hints)
if errors
let sl .= 'E' . errors
endif
if warnings
let sl .= ' W' . warnings
endif
if infos
let sl .= ' I' . infos
endif
if hints
let sl .= ' H' . hints
endif
else
let sl .= '🗸'
endif
endif
return trim(sl)
endfunction
function! GitStatus()
return get(b:,'gitsigns_status','')
endfunction
let g:lightline = {
\ 'colorscheme': 'powerline',
\ 'active': {
\ 'left': [ [ 'mode', 'paste' ],
\ [ 'lspstatus', 'readonly', 'filename', 'gitstatus', 'modified' ] ]
\ },
\ 'component_function': {
\ 'lspstatus': 'LspStatus',
\ 'gitstatus': 'GitStatus'
\ },
\ }
set relativenumber
set splitbelow
map ; :Files<CR>
nmap <C-p> :NERDTreeToggle<CR>
" nmap <silent> <C-p> :Lexplore<CR>
let g:netrw_banner = 0
let g:netrw_liststyle = 3
let g:netrw_browse_split = 4
let g:netrw_altv = 1
let g:netrw_winsize = 20
" Terminal Function
let g:term_buf = 0
let g:term_win = 0
function! TermToggle(height)
if win_gotoid(g:term_win)
hide
else
botright new
exec "resize " . a:height
try
exec "buffer " . g:term_buf
catch
call termopen($SHELL, {"detach": 0})
let g:term_buf = bufnr("")
set nonumber
set norelativenumber
set signcolumn=no
endtry
startinsert!
let g:term_win = win_getid()
endif
endfunction
" Toggle terminal on/off (neovim)
nnoremap <A-t> :call TermToggle(12)<CR>
inoremap <A-t> <Esc>:call TermToggle(12)<CR>
tnoremap <A-t> <C-\><C-n>:call TermToggle(12)<CR>
" Terminal go back to normal mode
tnoremap :q! <C-\><C-n>:q!<CR>
" vim-closetag
let g:closetag_filenames = "*.html,*.jsx,*.tsx,*.vue,*.xhml,*.xml"
let g:closetag_regions = {
\ 'typescript.tsx': 'jsxRegion,tsxRegion',
\ 'javascript.jsx': 'jsxRegion',
\ }

View file

@ -0,0 +1,54 @@
function LspStatus()
local sl = ""
if not vim.tbl_isempty(vim.lsp.buf_get_clients(0)) then
local errors = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.ERROR })
local warnings = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.WARN })
local infos = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.INFO })
local hints = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.HINT })
if (errors > 0 or warnings > 0 or infos > 0 or hints > 0) then
if errors > 0 then
sl = sl .. "E" .. errors
end
if warnings > 0 then
sl = sl .. " W" .. warnings
end
if infos > 0 then
sl = sl .. " I" .. infos
end
if hints > 0 then
sl = sl .. " H" .. hints
end
else
sl = sl .. "🗸"
end
end
return sl
end
function GitStatus()
local status = vim.b.gitsigns_status
return status ~= nil and status or ""
end
vim.g.lightline = {
colorscheme = "powerline",
active = {
left = {
{ "mode", "paste" },
{ "lspstatus", "readonly", "filename", "gitstatus", "modified" },
},
},
component_expand = {
lspstatus = "{ -> luaeval('LspStatus()')}",
gitstatus = "{ -> luaeval('GitStatus()')}",
},
}
-- update on lsp status changes
vim.cmd([[
augroup lightline_diagnostics
autocmd!
autocmd User LspProgressUpdate call lightline#update()
autocmd DiagnosticChanged * call lightline#update()
augroup END
]])

View file

@ -1,4 +1,18 @@
local config = require'lspconfig' -- autocomplete config
vim.opt.completeopt="menuone,noinsert"
vim.opt.shortmess:append("c")
require'compe'.setup {
enabled = true,
preselect = "always",
allow_prefix_unmatch = true,
source = {
path = true,
calc = true,
nvim_lsp = true,
vsnip = true,
},
}
local pid = vim.fn.getpid() local pid = vim.fn.getpid()
@ -21,6 +35,8 @@ end
require('lspfuzzy').setup {} require('lspfuzzy').setup {}
-- enable lsp snippets for nvim-compe -- enable lsp snippets for nvim-compe
local config = require'lspconfig'
local capabilities = vim.lsp.protocol.make_client_capabilities() local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem.snippetSupport = true capabilities.textDocument.completion.completionItem.snippetSupport = true
local servers = { local servers = {
@ -32,6 +48,7 @@ local servers = {
"dockerls", "dockerls",
"rnix", "rnix",
"tsserver", "tsserver",
"graphql",
"pylsp", "pylsp",
"terraformls", "terraformls",
"hls", "hls",
@ -222,7 +239,7 @@ config.diagnosticls.setup {
} }
-- nvim-autoclose & nvim-compe compatibility -- nvim-autoclose & nvim-compe compatibility
local remap = vim.api.nvim_set_keymap local map = vim.api.nvim_set_keymap
local npairs = require('nvim-autopairs') local npairs = require('nvim-autopairs')
npairs.setup({ npairs.setup({
@ -244,4 +261,4 @@ MUtils.completion_confirm=function()
end end
end end
remap('i' , '<CR>','v:lua.MUtils.completion_confirm()', {expr = true , noremap = true}) map('i' , '<CR>','v:lua.MUtils.completion_confirm()', {expr = true , noremap = true})

View file

@ -1,42 +0,0 @@
" autocomplete config
set completeopt=menuone,noinsert
set shortmess+=c
let g:compe = {}
let g:compe.enabled = v:true
let g:compe.preselect = 'always'
let g:compe.allow_prefix_unmatch = v:true
let g:compe.source = {}
let g:compe.source.path = v:true
let g:compe.source.calc = v:true
let g:compe.source.nvim_lsp = v:true
let g:compe.source.vsnip = v:true
inoremap <silent><expr> <C-Space> compe#complete()
inoremap <silent><expr> <CR> compe#confirm('<CR>')
inoremap <silent><expr> <C-e> compe#close('<C-e>')
inoremap <silent><expr> <C-f> compe#scroll({ 'delta': +4 })
inoremap <silent><expr> <C-d> compe#scroll({ 'delta': -4 })
" Use <Tab> and <S-Tab> to navigate through popup menu
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
" maps
nnoremap <silent> gd <cmd>lua vim.lsp.buf.definition()<CR>
nnoremap <silent> gp <cmd>lua peek_definition()<CR>
nnoremap <silent> gy <cmd>lua vim.lsp.buf.type_definition()<CR>
nnoremap <silent> gi <cmd>lua vim.lsp.buf.implementation()<CR>
nnoremap <silent> gr <cmd>lua vim.lsp.buf.references()<CR>
nnoremap <silent> gD <cmd>lua vim.lsp.buf.declaration()<CR>
nnoremap <silent> K <cmd>lua vim.lsp.buf.hover()<CR>
nnoremap <silent> <c-k> <cmd>lua vim.lsp.buf.signature_help()<CR>
nnoremap <silent> <leader>sd <cmd>lua vim.lsp.buf.document_symbol()<CR>
nnoremap <silent> <leader>sw <cmd>lua vim.lsp.buf.workspace_symbol()<CR>
nnoremap <silent> <leader>f <cmd>lua vim.lsp.buf.formatting_seq_sync(nil, nil, { 'tsserver', 'diagnosticls' })<CR>
nnoremap <silent> <leader>a <cmd>lua vim.lsp.buf.code_action()<CR>
nnoremap <silent> <leader>r <cmd>lua vim.lsp.buf.rename()<CR>
nnoremap <silent> <leader>i <cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>
nnoremap <silent> <leader>q <cmd>lua vim.lsp.diagnostic.set_loclist()<CR>
nnoremap <silent> [d <cmd>lua vim.lsp.diagnostic.goto_prev()<CR>
nnoremap <silent> ]d <cmd>lua vim.lsp.diagnostic.goto_next()<CR>

View file

@ -0,0 +1,30 @@
local map = vim.api.nvim_set_keymap
map("i", "<C-Space>", "compe#complete()", { noremap = true, expr = true, silent = true })
map("i", "<CR>", "compe#confirm('<CR>')", { noremap = true, expr = true, silent = true })
map("i", "<C-e>", "compe#close('<C-e>')", { noremap = true, expr = true, silent = true })
map("i", "<C-f>", "compe#scroll({ 'delta': +4 })", { noremap = true, expr = true, silent = true })
map("i", "<C-d>", "compe#scroll({ 'delta': -4 })", { noremap = true, expr = true, silent = true })
-- Use <Tab> and <S-Tab> to navigate through popup menu
map("i", "<Tab>", "pumvisible() ? '<C-n>' : '<Tab>'", { noremap = true, expr = true })
map("i", "<S-Tab>", "pumvisible() ? '<C-p>' : '<S-Tab>'", { noremap = true, expr = true })
-- maps
map("n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", { noremap = true, silent = true })
map("n", "gp", "<cmd>lua peek_definition()<CR>", { noremap = true, silent = true })
map("n", "gy", "<cmd>lua vim.lsp.buf.type_definition()<CR>", { noremap = true, silent = true })
map("n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", { noremap = true, silent = true })
map("n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", { noremap = true, silent = true })
map("n", "gD", "<cmd>lua vim.lsp.buf.declaration()<CR>", { noremap = true, silent = true })
map("n", "K", "<cmd>lua vim.lsp.buf.hover()<CR>", { noremap = true, silent = true })
map("n", "<c-k>", "<cmd>lua vim.lsp.buf.signature_help()<CR>", { noremap = true, silent = true })
map("n", "<leader>sd", "<cmd>lua vim.lsp.buf.document_symbol()<CR>", { noremap = true, silent = true })
map("n", "<leader>sw", "<cmd>lua vim.lsp.buf.workspace_symbol()<CR>", { noremap = true, silent = true })
map("n", "<leader>f", "<cmd>lua vim.lsp.buf.formatting_seq_sync(nil, nil, { 'tsserver', 'diagnosticls' })<CR>", { noremap = true, silent = true })
map("n", "<leader>a", "<cmd>lua vim.lsp.buf.code_action()<CR>", { noremap = true, silent = true })
map("n", "<leader>r", "<cmd>lua vim.lsp.buf.rename()<CR>", { noremap = true, silent = true })
map("n", "<leader>i", "<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>", { noremap = true, silent = true })
map("n", "<leader>q", "<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>", { noremap = true, silent = true })
map("n", "[d", "<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>", { noremap = true, silent = true })
map("n", "]d", "<cmd>lua vim.lsp.diagnostic.goto_next()<CR>", { noremap = true, silent = true })

View file

@ -0,0 +1,49 @@
local function formatDirs(files)
local results = {}
for _, file in ipairs(files) do
table.insert(results, { line = file, path = file })
end
return results
end
local function gitModified()
local files = vim.fn.systemlist("git ls-files -m 2>/dev/null")
return formatDirs(files)
end
local function gitUntracked()
local files = vim.fn.systemlist("git ls-files -o --exclude-standard 2>/dev/null")
return formatDirs(files)
end
local function escapePattern(text)
return text:gsub("([^%w])", "%%%1")
end
local function listProjects()
local gitDirs = vim.fn.finddir(".git", vim.env.HOME .. "/dev/**4", -1)
table.insert(gitDirs, 1, "/etc/nixos")
return vim.fn.map(gitDirs, function(_, gitDir)
local dir = gitDir:gsub(escapePattern(".git"), "")
dir = dir == "" and "." or dir
local line = dir:gsub(escapePattern(vim.env.HOME), "~")
return {
line = line,
path = dir,
} end
)
end
vim.g.startify_commands = {
{h = {"Vim Help", "help"}},
{r = {"Vim Reference", "help reference"}},
}
vim.g.startify_lists = {
{ header = {" Sessions"}, type = "sessions" },
{ header = {" git modified"}, type = gitModified },
{ header = {" git untracked"}, type = gitUntracked },
{ header = {" Projects"}, type = listProjects },
{ header = {" Recent files"}, type = "files" },
{ header = {" Commands"}, type = "commands" },
}

View file

@ -0,0 +1,3 @@
vim.g["test#strategy"] = "neovim"
vim.g["test#csharp#runner"] = "dotnettest"
-- vim.g["test#csharp#dotnettest#options"] = "-v q"

View file

@ -1,3 +0,0 @@
let g:test#strategy = 'neovim'
let g:test#csharp#runner = 'dotnettest'
" let test#csharp#dotnettest#options = '-v q'