diff --git a/.gitignore b/.gitignore index fa5aa9d..ad6a98d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ doc plugin bundle !bundle/Vundle.vim +lazy-lock.json diff --git a/.gitmodules b/.gitmodules index 75554b2..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "bundle/Vundle.vim"] - path = bundle/Vundle.vim - url = https://github.com/VundleVim/Vundle.vim.git diff --git a/bundle/Vundle.vim b/bundle/Vundle.vim deleted file mode 160000 index b255382..0000000 --- a/bundle/Vundle.vim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b255382d6242d7ea3877bf059d2934125e0c4d95 diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..819f7ab --- /dev/null +++ b/init.lua @@ -0,0 +1,3 @@ +require("core.keymaps") +require("core.plugins") +require("core.plugin_config") diff --git a/init.vim b/init.vim deleted file mode 100644 index 857cfcc..0000000 --- a/init.vim +++ /dev/null @@ -1,110 +0,0 @@ -" An example for a vimrc file. -" -" Maintainer: Bram Moolenaar -" Last change: 2019 Jan 26 -" -" To use it, copy it to -" for Unix and OS/2: ~/.vimrc -" for Amiga: s:.vimrc -" for MS-DOS and Win32: $VIM\_vimrc -" for OpenVMS: sys$login:.vimrc - -" When started as "evim", evim.vim will already have done these settings, bail -" out. -if v:progname =~? "evim" - finish -endif - -" Get the defaults that most users want. -if !has('nvim') - source $VIMRUNTIME/defaults.vim -endif - -if has("vms") - set nobackup " do not keep a backup file, use versions instead -else - set backup " keep a backup file (restore to previous version) - if has('persistent_undo') - set undofile " keep an undo file (undo changes after closing) - endif -endif - -if &t_Co > 2 || has("gui_running") - " Switch on highlighting the last used search pattern. - set hlsearch -endif - -" Put these in an autocmd group, so that we can delete them easily. -augroup vimrcEx - au! - - " For all text files set 'textwidth' to 78 characters. - "autocmd FileType text setlocal textwidth=78 - autocmd FileType mail,asciidoc,vimwiki,tex,text setlocal textwidth=80 - autocmd FileType mail,asciidoc,vimwiki,tex,text setlocal linebreak - autocmd FileType mail,asciidoc,vimwiki,tex,text setlocal spell spelllang=en_gb - - -augroup END - -" Add optional packages. -" -" The matchit plugin makes the % command work better, but it is not backwards -" compatible. -" The ! means the package won't be loaded right away but when plugins are -" loaded during initialization. -if has('syntax') && has('eval') - packadd! matchit -endif - - -" :W sudo saves the file when the file is open in readonly mode -command W w !sudo tee % > /dev/null - -set number -set expandtab -" 1 tab = 2 spaces -set tabstop=4 shiftwidth=4 -set smarttab -set autoindent -" Ignore case when searching -set ignorecase -set smartcase -" highlight search results (after pressing Enter) -set hlsearch -" highlight all pattern matches WHILE typing the pattern -set incsearch -" show the mathing brackets -set showmatch -" Create backup directory if it doesn't exist -silent !mkdir ~/.cache/vim > /dev/null 2>&1 -" tell vim where to put its backup files -set backupdir=~/.cache/vim -set undodir=~/.cache/vim -set dir=~/.cache/vim - -" set colors -if has("termguicolors") - set termguicolors -endif -colorscheme desert -hi Normal guibg=NONE ctermbg=NONE -hi EndOfBuffer guibg=NONE ctermbg=NONE -" highlight current line -set cursorline -hi clear CursorLine -hi CursorLine ctermbg=8 guibg=#404040 -hi Cursor ctermbg=15 -" set spellcheck -"set spell - -" Make reading easier -set wrap linebreak nolist -set concealcursor="" - -"Leader mapping -let mapleader = "\" -nnoremap ? :echon " n :Lex \n l? lsp help (if implemented in buffer)\n w? vimWiki help" -nnoremap n :Sexplore -" Load Plugins -so plugins.vim diff --git a/lua/core/keymaps.lua b/lua/core/keymaps.lua new file mode 100644 index 0000000..33e3ad2 --- /dev/null +++ b/lua/core/keymaps.lua @@ -0,0 +1,16 @@ +-- set leaders to space +vim.g.mapleader = ' ' +vim.g.maplocalleader = ' ' + +vim.opt.backspace = '2' +vim.opt.showcmd = true +vim.opt.laststatus = 2 +vim.opt.autowrite = true +vim.opt.cursorline = true +vim.opt.autoread = true + +-- use spaces for tabs etc +vim.opt.tabstop = 2 -- Seems to be default for most lsp's now +vim.opt.shiftwidth = 2 +vim.opt.shiftround = true +vim.opt.expandtab = true diff --git a/lua/core/plugin_config/completions.lua b/lua/core/plugin_config/completions.lua new file mode 100644 index 0000000..f257a56 --- /dev/null +++ b/lua/core/plugin_config/completions.lua @@ -0,0 +1,18 @@ +local cmp = require("cmp") + +cmp.setup({ + mapping = cmp.mapping.preset.insert({ + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.confirm({ select = true }), + }), + snippet = { + }, + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + }, { + { name = 'buffer' }, + }), +}) diff --git a/lua/core/plugin_config/gruvbox.lua b/lua/core/plugin_config/gruvbox.lua new file mode 100644 index 0000000..8c37093 --- /dev/null +++ b/lua/core/plugin_config/gruvbox.lua @@ -0,0 +1,2 @@ +vim.o.termguicolors = true +vim.cmd [[colorscheme gruvbox]] diff --git a/lua/core/plugin_config/init.lua b/lua/core/plugin_config/init.lua new file mode 100644 index 0000000..b7d8729 --- /dev/null +++ b/lua/core/plugin_config/init.lua @@ -0,0 +1,7 @@ +require("core.plugin_config.gruvbox") +require("core.plugin_config.lualine") +require("core.plugin_config.nvim-tree") +require("core.plugin_config.telescope") +require("core.plugin_config.treesitter") +require("core.plugin_config.lsp_config") +require("core.plugin_config.completions") diff --git a/lua/core/plugin_config/lsp_config.lua b/lua/core/plugin_config/lsp_config.lua new file mode 100644 index 0000000..9b1b31c --- /dev/null +++ b/lua/core/plugin_config/lsp_config.lua @@ -0,0 +1,67 @@ +require("mason").setup() +require("mason-lspconfig").setup({ + ensure_installed = {"lua_ls", "clangd", "cmake", "ltex"} +}) +-- gloabal mappings +vim.keymap.set('n', 'le', vim.diagnostic.open_float) +--vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) +--vim.keymap.set('n', ']d', vim.diagnostic.goto_next) +vim.keymap.set('n', 'lj', vim.diagnostic.setloclist) + +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + -- Enable completion triggered by + vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' + + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local opts = { buffer = ev.buf } + vim.keymap.set('n', 'lD', vim.lsp.buf.declaration, opts) + vim.keymap.set('n', 'ld', vim.lsp.buf.definition, opts) + vim.keymap.set('n', 'lk', vim.lsp.buf.hover, opts) + vim.keymap.set('n', 'li', vim.lsp.buf.implementation, opts) + --vim.keymap.set('n', '', vim.lsp.buf.signature_help, opts) + --vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, opts) + --vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, opts) + --vim.keymap.set('n', 'wl', function() + -- print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + --end, opts) + vim.keymap.set('n', 'ltd', vim.lsp.buf.type_definition, opts) + vim.keymap.set('n', 'lrn', vim.lsp.buf.rename, opts) + vim.keymap.set({ 'n', 'v' }, 'la', vim.lsp.buf.code_action, opts) + vim.keymap.set('n', 'lrf', vim.lsp.buf.references, opts) + vim.keymap.set('n', 'lf', function() + vim.lsp.buf.format { async = true } + end, opts) + end, +}) + +-- Attach lsp to completion engine +local capabilities = require("cmp_nvim_lsp").default_capabilities() + +require("lspconfig").lua_ls.setup { + caplbilities = capabilities, + settings = { + Lua = { + diagnostics = { + -- Get the language server to recognize the `vim` global + globals = { + 'vim', + 'require' + }, + }, + workspace = { + -- Make the server aware of Neovim runtime files + library = vim.api.nvim_get_runtime_file("", true), + }, + -- Do not send telemetry data containing a randomized but unique identifier + telemetry = { + enable = false, + }, + }, + }, +} +require("lspconfig").clangd.setup {capabilities = capabilities} +require("lspconfig").cmake.setup {capabilities = capabilities} +require("lspconfig").ltex.setup {capabilities = capabilities} diff --git a/lua/core/plugin_config/lualine.lua b/lua/core/plugin_config/lualine.lua new file mode 100644 index 0000000..9fc76c0 --- /dev/null +++ b/lua/core/plugin_config/lualine.lua @@ -0,0 +1,6 @@ +require('lualine').setup { + options = { + icons_enabled = true, + theme = 'gruvbox', + } +} diff --git a/lua/core/plugin_config/nvim-tree.lua b/lua/core/plugin_config/nvim-tree.lua new file mode 100644 index 0000000..9653950 --- /dev/null +++ b/lua/core/plugin_config/nvim-tree.lua @@ -0,0 +1,12 @@ +-- disable netrw at the very start of your init.lua +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 + +-- set termguicolors to enable highlight groups +vim.opt.termguicolors = true + +-- empty setup using defaults +require("nvim-tree").setup() + +-- keymap +vim.keymap.set("n", "n", ':NvimTreeFindFileToggle') diff --git a/lua/core/plugin_config/telescope.lua b/lua/core/plugin_config/telescope.lua new file mode 100644 index 0000000..8174253 --- /dev/null +++ b/lua/core/plugin_config/telescope.lua @@ -0,0 +1,6 @@ +local builtin = require('telescope.builtin') + +vim.keymap.set('n', '', builtin.find_files, {}) +vim.keymap.set('n', '', builtin.oldfiles, {}) +vim.keymap.set('n', 'fg', builtin.live_grep, {}) +vim.keymap.set('n', 'fh', builtin.help_tags, {}) diff --git a/lua/core/plugin_config/treesitter.lua b/lua/core/plugin_config/treesitter.lua new file mode 100644 index 0000000..54c6a25 --- /dev/null +++ b/lua/core/plugin_config/treesitter.lua @@ -0,0 +1,11 @@ +require('nvim-treesitter.configs').setup({ + -- list of languages to grab + ensure_installed = 'all', + + -- how to install them + sync_install = false, + auto_install = true, + + -- enable highlight + highlight = {enable = true} +}) diff --git a/lua/core/plugins.lua b/lua/core/plugins.lua new file mode 100644 index 0000000..0506268 --- /dev/null +++ b/lua/core/plugins.lua @@ -0,0 +1,40 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) + +local plugins = { + 'folke/lazy.nvim', + 'ellisonleao/gruvbox.nvim', + 'nvim-tree/nvim-tree.lua', + 'nvim-tree/nvim-web-devicons', + 'nvim-lualine/lualine.nvim', + 'nvim-treesitter/nvim-treesitter', + -- fzf + { + 'nvim-telescope/telescope.nvim', + branch = "0.1.x", + dependencies = {{'nvim-lua/plenary.nvim'}} + }, + -- Lsp + { + 'williamboman/mason.nvim', + 'williamboman/mason-lspconfig.nvim', + 'neovim/nvim-lspconfig' + }, + -- completion + 'hrsh7th/nvim-cmp', + 'hrsh7th/cmp-nvim-lsp', +} + +local opts = {} + +require("lazy").setup(plugins, opts) diff --git a/plugins.vim b/plugins.vim deleted file mode 100644 index 077edb3..0000000 --- a/plugins.vim +++ /dev/null @@ -1,133 +0,0 @@ -set nocompatible " be iMproved, required -filetype off " required - -call plug#begin() - -" Pretty -Plug 'itchyny/lightline.vim' -Plug 'morhetz/gruvbox' -Plug 'vim-scripts/ShowTrailingWhitespace' -"Plug 'Yggdroot/indentLine' - -" Functional -Plug 'tpope/vim-fugitive' -Plug 'jiangmiao/auto-pairs' -Plug 'tpope/vim-surround' -"Plug 'dhruvasagar/vim-dotoo' -Plug 'vimwiki/vimwiki' -"Plug 'tools-life/taskwiki' -Plug 'sheerun/vim-polyglot' -Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } -Plug 'junegunn/fzf.vim' -" Language C++/glsl -"Plug 'ycm-core/YouCompleteMe' -Plug 'prabirshrestha/vim-lsp' -Plug 'mattn/vim-lsp-settings' -Plug 'prabirshrestha/asyncomplete.vim' -Plug 'tikhomirov/vim-glsl' -Plug 'mattn/calendar-vim' - -call plug#end() - - -"Always show lightline -set laststatus=2 -set showtabline=2 -set noshowmode - -" Gruvbox colours -let g:gruvbox_contrast_dark='hard' -let g:gruvbox_contrast_light='hard' -set background=dark -if has("termguicolors") - let g:gruvbox_termcolors=256 -else - let g:gruvbox_termcolors=16 -endif -"let g:gruvbox_improved_strings=1 -let g:gruvbox_improved_warnings=1 -let g:gruvbox_italic=1 -colorscheme gruvbox - -" Plugin leader mappings - -" Tab completion -inoremap pumvisible() ? "\" : "\" -inoremap pumvisible() ? "\" : "\" -inoremap pumvisible() ? asyncomplete#close_popup() : "\" - -" clangd vim lsp -function! s:on_lsp_buffer_enabled() abort - setlocal omnifunc=lsp#complete - setlocal signcolumn=yes - if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif - nmap l? :echon " ld lsp-definition \n lrf lsp document reformat \n ls lsp document symbol search \n lS lsp workspace symbol search \n lr lsp references \n li lsp implementation \n lt lsp type definition \n lj lsp document diagnostics \n lrn lsp rename \n l[g lsp previous diagnostic \n l]g lsp next diagnostic \n lK lsp hover" - nmap ld (lsp-definition) - nmap lrf (lsp-document-reformat) - nmap ls (lsp-document-symbol-search) - nmap lS (lsp-workspace-symbol-search) - nmap lr (lsp-references) - nmap li (lsp-implementation) - nmap lt (lsp-type-definition) - nmap lj (lsp-document-diagnostics) - nmap lrn (lsp-rename) - nmap l[g (lsp-previous-diagnostic) - nmap l]g (lsp-next-diagnostic) - nmap lK (lsp-hover) - nmap la (lsp-code-action-float) - - let g:lsp_format_sync_timeout = 1000 - autocmd! BufWritePre *.rs,*.go,*.cpp,*.c,*.h,*.cs,*.js,*.jsx,*.ts call execute('LspDocumentFormatSync') - - " refer to doc to add more commands -endfunction - -augroup lsp_install - au! - " call s:on_lsp_buffer_enabled only for languages that has the server registered. - autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled() -augroup END - -" C++ Clangd if installed on system already -if executable('clangd') - augroup lsp_clangd - autocmd! - autocmd User lsp_setup call lsp#register_server({ - \ 'name': 'clangd', - \ 'cmd': {server_info->['clangd']}, - \ 'whitelist': ['h', 'c', 'cpp', 'objc', 'objcpp'], - \ }) - autocmd FileType c setlocal omnifunc=lsp#complete - autocmd FileType cpp setlocal omnifunc=lsp#complete - autocmd FileType objc setlocal omnifunc=lsp#complete - autocmd FileType objcpp setlocal omnifunc=lsp#complete - augroup end -endif - -" GLSL -autocmd! BufNewFile,BufRead *.vs,*.fs,*.glsl,*.frag,*.vert set ft=glsl - -" Vimwiki -let g:vimwiki_list = [{'path': '~/.vimwiki/', - \ 'path_html': '~/.vimwiki/HTML', - \ 'auto_diary_index': 1, - \ 'syntax': 'markdown', 'ext': '.md', - \ 'links_space_char': '_', - \ 'vimwiki_use_calendar': 1}] -nnoremap c :Calendar - -" A little function to insert user input functionality into remaps -function! TagSearch() - call inputsave() - let replacement = input('Enter Tag: ') - call inputrestore() - execute ':VimwikiSearchTags '.replacement - execute ':lopen' -endfunction - -nmap w? :echon " wts search-tags" -autocmd FileType vimwiki nmap wts :call TagSearch() - -" fzf git find -nnoremap fg :GFiles -nnoremap ff :Files