From 978bc31eae9362106a14299f90e458b774280ee1 Mon Sep 17 00:00:00 2001 From: qwjyh Date: Wed, 5 Oct 2022 21:50:04 +0900 Subject: [PATCH] add: neovim configs (init.lua & basic LSP support) - basic settings - Packer.nvim for package managing - LSP support - lsp-cmp - mason --- dotfiles/neovim/init.lua | 140 ++++++++++++++++++++++++++++++++ dotfiles/neovim/lua/plugins.lua | 23 ++++++ 2 files changed, 163 insertions(+) create mode 100644 dotfiles/neovim/init.lua create mode 100644 dotfiles/neovim/lua/plugins.lua diff --git a/dotfiles/neovim/init.lua b/dotfiles/neovim/init.lua new file mode 100644 index 0000000..d7bdd8e --- /dev/null +++ b/dotfiles/neovim/init.lua @@ -0,0 +1,140 @@ +----------------------------------------------------------- +-- basic configurations +vim.o.number = true +vim.o.relativenumber = true +vim.cmd([[ +highlight LineNr cterm=none ctermfg=256 +]]) +vim.o.tabstop = 4 +vim.o.shiftwidth = 4 +vim.o.autoindent = true +vim.o.cursorcolumn = true +vim.o.cursorline = true +vim.cmd([[ +highlight cursorline term=reverse cterm=none ctermbg=239 +highlight cursorcolumn ctermbg=235 +]]) +vim.o.mouse = 'a' +vim.o.signcolumn = 'yes' +vim.o.ignorecase = true +vim.o.smartcase = true + +----------------------------------------------------------- +-- to use PowerShell on Windows +-- original code from :h powershell +-- vim script func returns 1/0, while lua evals false only if gets false or nil +-- so be sure to compare with 1/0 +if vim.fn.has('win32') == 1 then + if vim.fn.executable('pwsh') == 1 then + vim.opt.shell = 'pwsh' + else + vim.opt.shell = 'powershell' + end + vim.opt.shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;' + vim.opt.shellredir = '-RedirectStandardOutput %s -NoNewWindow -Wait' + vim.opt.shellpipe = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode' + vim.opt.shellquote = '' + vim.opt.shellxquote = '' +end + + +----------------------------------------------------------- +-- Plugins +require 'plugins' +vim.cmd [[autocmd BufWritePost plugins.lua PackerCompile]] + + +-- LSP +-- https://zenn.dev/botamotch/articles/21073d78bc68bf +-- 1. LSP Sever management +require('mason').setup() +require('mason-lspconfig').setup_handlers({ function(server) + local opt = { + -- -- Function executed when the LSP server startup + -- on_attach = function(client, bufnr) + -- local opts = { noremap=true, silent=true } + -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'K', 'lua vim.lsp.buf.hover()', opts) + -- vim.cmd 'autocmd BufWritePre * lua vim.lsp.buf.formatting_sync(nil, 1000)' + -- end, + capabilities = require('cmp_nvim_lsp').update_capabilities( + vim.lsp.protocol.make_client_capabilities() + ) + } + require('lspconfig')[server].setup(opt) +end }) + +-- 2. build-in LSP function +-- keyboard shortcut +vim.keymap.set('n', 'K', 'lua vim.lsp.buf.hover()') +vim.keymap.set('n', 'gf', 'lua vim.lsp.buf.formatting()') +vim.keymap.set('n', 'gr', 'lua vim.lsp.buf.references()') +vim.keymap.set('n', 'gd', 'lua vim.lsp.buf.definition()') +vim.keymap.set('n', 'gD', 'lua vim.lsp.buf.declaration()') +vim.keymap.set('n', 'gi', 'lua vim.lsp.buf.implementation()') +vim.keymap.set('n', 'gt', 'lua vim.lsp.buf.type_definition()') +vim.keymap.set('n', 'gn', 'lua vim.lsp.buf.rename()') +vim.keymap.set('n', 'ga', 'lua vim.lsp.buf.code_action()') +vim.keymap.set('n', 'ge', 'lua vim.diagnostic.open_float()') +vim.keymap.set('n', 'g]', 'lua vim.diagnostic.goto_next()') +vim.keymap.set('n', 'g[', 'lua vim.diagnostic.goto_prev()') +-- LSP handlers +vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( + vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = false } +) +-- Reference highlight +vim.cmd [[ +set updatetime=500 +highlight LspReferenceText cterm=underline ctermfg=1 ctermbg=8 gui=underline guifg=#A00000 guibg=#104040 +highlight LspReferenceRead cterm=underline ctermfg=1 ctermbg=8 gui=underline guifg=#A00000 guibg=#104040 +highlight LspReferenceWrite cterm=underline ctermfg=1 ctermbg=8 gui=underline guifg=#A00000 guibg=#104040 +augroup lsp_document_highlight + autocmd! + autocmd CursorHold,CursorHoldI * lua vim.lsp.buf.document_highlight() + autocmd CursorMoved,CursorMovedI * lua vim.lsp.buf.clear_references() +augroup END +]] + +-- 3. completion (hrsh7th/nvim-cmp) +local cmp = require("cmp") +cmp.setup({ + snippet = { + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) + end, + }, + sources = { + { name = "nvim_lsp" }, + -- { name = "buffer" }, + -- { name = "path" }, + }, + mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.select_prev_item(), + [""] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.abort(), + [""] = cmp.mapping.confirm { select = true }, + }), + experimental = { + ghost_text = true, + }, +}) +-- cmp.setup.cmdline('/', { +-- mapping = cmp.mapping.preset.cmdline(), +-- sources = { +-- { name = 'buffer' } +-- } +-- }) +-- cmp.setup.cmdline(":", { +-- mapping = cmp.mapping.preset.cmdline(), +-- sources = { +-- { name = "path" }, +-- { name = "cmdline" }, +-- }, +-- }) + + +----------------------------------------------------------- +-- Ctrl + P to invoke fzf file search +vim.api.nvim_set_keymap('n', '', + "lua require('fzf-lua').files()", + { noremap = true, silent = true }) diff --git a/dotfiles/neovim/lua/plugins.lua b/dotfiles/neovim/lua/plugins.lua new file mode 100644 index 0000000..86506f7 --- /dev/null +++ b/dotfiles/neovim/lua/plugins.lua @@ -0,0 +1,23 @@ +vim.cmd [[packadd packer.nvim]] + +return require('packer').startup(function(use) + use 'wbthomason/packer.nvim' + + -- fzf + use { 'ibhagwan/fzf-lua', + -- optional icon + --requires = { 'kyazdan142/nvim-web/devicons' } -- not found + } + + -- LSP + use 'neovim/nvim-lspconfig' + use "williamboman/mason.nvim" + use "williamboman/mason-lspconfig.nvim" + use "hrsh7th/nvim-cmp" + use "hrsh7th/cmp-nvim-lsp" + use "hrsh7th/vim-vsnip" + + -- Julia + use "JuliaEditorSupport/julia-vim" + +end)