Add neovim configuration

This commit is contained in:
Eugen Wissner 2025-01-02 04:46:02 +01:00
parent 34224deff7
commit a8c4ea36cc
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
5 changed files with 418 additions and 5 deletions

View File

@ -1,4 +0,0 @@
setlocal et
setlocal ts=2
setlocal sts=2
setlocal sw=2

371
.config/nvim/init.vim Normal file
View File

@ -0,0 +1,371 @@
set ts=4
set sw=4
set noet
set ignorecase
set smartcase
set ruler
set nobackup
set number
set colorcolumn=120
set exrc
set secure
set hidden
"set completeopt=menuone,noinsert,noselect
set completeopt=menu,menuone,noselect
set shortmess+=c
" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
" delays and poor user experience.
set updatetime=300
" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
" Recently vim can merge signcolumn and number column into one
set signcolumn=yes
set mouse=a " Enable mouse in all modes.
lua << EOF
require'lsphelp'
--
-- Packer
--
vim.cmd [[packadd packer.nvim]]
require('packer').startup(function()
-- Packer can manage itself
use 'wbthomason/packer.nvim'
use 'mfussenegger/nvim-dap'
use 'airblade/vim-gitgutter'
use 'neovim/nvim-lspconfig'
use 'dense-analysis/ale'
use 'liuchengxu/vista.vim' -- Tag bar.
-- Git.
use 'tpope/vim-fugitive'
use {
'sindrets/diffview.nvim',
requires = {'nvim-lua/plenary.nvim'}
}
-- File browser.
use {
'kyazdani42/nvim-tree.lua',
requires = {'nvim-tree/nvim-web-devicons'} -- optional, for file icon
}
use {
'nvim-telescope/telescope.nvim',
requires = {'nvim-lua/plenary.nvim'}
}
use 'nvim-telescope/telescope-ui-select.nvim'
use {
'kevinhwang91/nvim-ufo',
requires = {'kevinhwang91/promise-async'}
}
-- Theme.
use 'EdenEast/nightfox.nvim'
-- Status line.
use {
'nvim-lualine/lualine.nvim',
requires = {'nvim-tree/nvim-web-devicons'} -- optional, for status line icons
}
-- Syntax.
use 'leafOfTree/vim-vue-plugin'
use 'mfussenegger/nvim-jdtls'
use 'hhsnopek/vim-sugarss'
use 'dart-lang/dart-vim-plugin'
use {
'akinsho/flutter-tools.nvim',
requires = {
'nvim-lua/plenary.nvim'
}
}
-- nvim-cmp
use 'dcampos/nvim-snippy'
use 'hrsh7th/cmp-nvim-lsp'
use 'hrsh7th/nvim-cmp'
use 'dcampos/cmp-snippy'
use 'hrsh7th/cmp-path'
use 'hrsh7th/cmp-buffer'
end)
local configuration = read_configuration()
--
-- ALE
--
-- Run linters only on save
vim.g.ale_lint_on_text_changed = 'never'
vim.g.ale_lint_on_insert_leave = 0
-- Include the linter name (e.g. 'hack' or 'hhast'), code, and message in errors
vim.g.ale_echo_msg_format = '[%linter%] %s'
vim.g.ale_linters = {
hack = {'hack', 'hhast'},
haskell = {"hlint"},
javascript = {'eslint'},
d = {'dmd'},
php = {'phpcs', 'phpstan'},
ruby = {'rubocop'},
cpp = {},
}
vim.g.ale_ruby_rubocop_executable = 'bundle'
vim.g.ale_cpp_cc_options = '-std=c++17 -Wall'
vim.g.ale_open_list = 1
vim.g.ale_disable_lsp = 1
--
-- nvim-cmp
--
local cmp = require'cmp'
cmp.setup({
snippet = {
-- REQUIRED - you must specify a snippet engine
expand = function(args)
require'snippy'.expand_snippet(args.body)
end,
},
mapping = {
['<C-b>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }),
['<C-f>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }),
['<C-Space>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }),
-- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
['<C-y>'] = cmp.config.disable,
['<C-e>'] = cmp.mapping({
i = cmp.mapping.abort(),
c = cmp.mapping.close(),
}),
['<CR>'] = cmp.mapping.confirm({ select = false }),
},
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
{ name = 'snippy' },
}, {
{ name = 'path' },
}, {
{ name = 'buffer' },
}),
view = {
entries = 'native',
},
})
-- Setup lspconfig.
local capabilities = require('cmp_nvim_lsp').default_capabilities(vim.lsp.protocol.make_client_capabilities())
capabilities.textDocument.foldingRange = {
dynamicRegistration = false,
lineFoldingOnly = true
}
--
-- LSPConfig
--
local nvim_lsp = require('lspconfig')
-- Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap=true, silent=true }
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts)
nvim_lsp['hls'].setup {
on_attach = default_on_attach,
capabilities = capabilities,
flags = {
debounce_text_changes = 150,
},
settings = {
haskell = {
plugin = {
stan = {
globalOn = false
}
}
}
}
}
nvim_lsp['intelephense'].setup {
on_attach = default_on_attach,
flags = {
debounce_text_changes = 150,
},
init_options = {
licenceKey = configuration.intelephenseKey,
storagePath = '/tmp/intelephense',
},
capabilities = capabilities,
settings = {
intelephense = {
environment = {
phpVersion = '8.2.0'
}
}
}
}
nvim_lsp['clangd'].setup {
on_attach = default_on_attach,
capabilities = capabilities
}
require("flutter-tools").setup {
outline = {
open_cmd = "Vista"
},
lsp = {
on_attach = default_on_attach,
capabilities = capabilities
}
}
nvim_lsp['twiggy_language_server'].setup {
on_attach = default_on_attach,
capabilities = capabilities,
settings = {
twiggy = {
framework = 'symfony',
phpExecutable = '/usr/bin/php',
symfonyConsolePath = 'bin/console',
diagnostics = {
twigCsFixer = false
}
}
}
}
vim.g.vim_vue_plugin_config = {
syntax = {
template = {'html'},
script = {'javascript'},
style = {'css'},
},
full_syntax = {},
initial_indent = {},
attribute = 0,
keyword = 0,
foldexpr = 0,
debug = 0
}
--
-- Telescope
--
require('telescope').setup {
extensions = {
["ui-select"] = {
require("telescope.themes").get_dropdown {
}
}
}
}
require("telescope").load_extension("ui-select")
vim.api.nvim_set_keymap('n', '<leader>ff', "<cmd>lua require('telescope.builtin').find_files()<cr>",
{ noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>fg', "<cmd>lua require('telescope.builtin').live_grep()<cr>",
{ noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>fb', "<cmd>lua require('telescope.builtin').buffers()<cr>",
{ noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>fh', "<cmd>lua require('telescope.builtin').help_tags()<cr>",
{ noremap = true, silent = true })
--
-- NvimTree
--
require('nvim-tree').setup {}
vim.api.nvim_set_keymap('n', '<C-n>', ':NvimTreeToggle<CR>', { noremap = true })
vim.api.nvim_set_keymap('n', '<leader>r', ':NvimTreeRefresh<CR>', { noremap = true })
vim.api.nvim_set_keymap('n', '<leader>n', ':NvimTreeFindFile<CR>', { noremap = true })
--
-- Theme
--
vim.cmd('colorscheme duskfox')
vim.opt.termguicolors = true
--
-- Lualine
--
require('lualine').setup {
options = {
theme = 'codedark'
},
extensions = {'quickfix', 'nvim-tree', 'fugitive'},
sections = {
lualine_c = {
'filename'
}
}
}
--
-- Diffview.nvim
--
require('diffview').setup {}
--
-- Vista
--
vim.g.vista_default_executive = 'nvim_lsp'
--
-- nvim-ufo
--
vim.wo.foldcolumn = '1'
vim.wo.foldlevel = 99 -- feel free to decrease the value
vim.wo.foldenable = true
require('ufo').setup()
--
-- nvim-dap
--
vim.keymap.set('n', '<F5>', function() require('dap').continue() end)
vim.keymap.set('n', '<F10>', function() require('dap').step_over() end)
vim.keymap.set('n', '<F11>', function() require('dap').step_into() end)
vim.keymap.set('n', '<F12>', function() require('dap').step_out() end)
vim.keymap.set('n', '<Leader>b', function() require('dap').toggle_breakpoint() end)
vim.keymap.set('n', '<Leader>B', function() require('dap').set_breakpoint() end)
vim.keymap.set('n', '<Leader>lp', function() require('dap').set_breakpoint(nil, nil, vim.fn.input('Log point message: ')) end)
vim.keymap.set('n', '<Leader>dr', function() require('dap').repl.open() end)
vim.keymap.set('n', '<Leader>dl', function() require('dap').run_last() end)
vim.keymap.set({'n', 'v'}, '<Leader>dh', function()
require('dap.ui.widgets').hover()
end)
vim.keymap.set({'n', 'v'}, '<Leader>dp', function()
require('dap.ui.widgets').preview()
end)
vim.keymap.set('n', '<Leader>df', function()
local widgets = require('dap.ui.widgets')
widgets.centered_float(widgets.frames)
end)
vim.keymap.set('n', '<Leader>ds', function()
local widgets = require('dap.ui.widgets')
widgets.centered_float(widgets.scopes)
end)
local dap = require("dap")
dap.adapters.gdb = {
type = "executable",
command = "gdb",
args = { "-i", "dap" }
}
dap.configurations.cpp = {
{
name = "Launch",
type = "gdb",
request = "launch",
program = function()
return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file')
end,
cwd = "${workspaceFolder}",
stopAtBeginningOfMainSubprogram = false,
},
}
EOF

View File

@ -0,0 +1,40 @@
-- Helper function for creating keymaps.
function nnoremap(rhs, lhs, desc)
local bufopts = { noremap=true, silent=true, buffer=bufnr, desc = desc }
vim.keymap.set("n", rhs, lhs, bufopts)
end
-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
function default_on_attach(client, bufnr)
-- Enable completion triggered by <c-x><c-o>
vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
-- Mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
nnoremap('gD', vim.lsp.buf.declaration, "Go to declaration")
nnoremap('gd', vim.lsp.buf.definition, "Go to definition")
nnoremap('K', vim.lsp.buf.hover, "Hover text")
nnoremap('gi', vim.lsp.buf.implementation, "Go to implementation")
nnoremap('<C-k>', vim.lsp.buf.signature_help, "Show signature")
nnoremap('<space>wa', vim.lsp.buf.add_workspace_folder, "Add workspace folder")
nnoremap('<space>wr', vim.lsp.buf.remove_workspace_folder, "Remove workspace folder")
nnoremap('<space>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, "List workspace folders")
nnoremap('<space>D', vim.lsp.buf.type_definition, "Go to type definition")
nnoremap('<space>rn', vim.lsp.buf.rename, "Rename")
nnoremap('<space>ca', vim.lsp.buf.code_action, "Code actions")
nnoremap('gr', vim.lsp.buf.references, "Find references")
nnoremap('<space>f', function() vim.lsp.buf.format { async = true } end, "Format file")
end
function read_configuration()
local configuration = {}
local chunk, err = loadfile(os.getenv('HOME') .. '/.config/nvim/config', 't', configuration)
if chunk then
chunk()
end
return configuration
end

3
.gitignore vendored
View File

@ -1 +1,2 @@
node_modules/
.config/nvim/config
.config/nvim/plugin/

View File

@ -14,6 +14,11 @@ else
export SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
fi
if [ -d /opt/homebrew/opt/php@8.3 ]
then
PATH="/opt/homebrew/opt/php@8.3/bin:/opt/homebrew/opt/php@8.3/sbin:$PATH"
fi
if [ -d "$HOME/Android/Sdk" ]
then
export ANDROID_HOME="$HOME/Android/Sdk"