Convert Neovim VimL config to Lua

Well, I also explored a little bit with the ecosystem of Lua-written
Neovim plugins. I think it's ready to flourish along with the existing
plugins.

Lua is also nice to write compared to VimL especially with the compound
data and the like.
This commit is contained in:
Gabriel Arazas 2021-07-15 16:28:28 +08:00
parent cb091a5128
commit 085c17c26d
2 changed files with 274 additions and 216 deletions

274
nvim/init.lua Normal file
View File

@ -0,0 +1,274 @@
-- Aliases
local api = vim.api
local g, b = vim.g, vim.b
local cmd = vim.cmd
local highlight = vim.highlight
local opt, opt_local = vim.opt, vim.opt_local
local go = vim.go
local map = vim.api.nvim_set_keymap
local fn = vim.fn
g['mapleader'] = " "
g['syntax'] = true
-- Bootstrapping for the package manager
local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim'
if fn.empty(fn.glob(install_path)) > 0 then
fn.system({'git', 'clone', 'https://github.com/wbthomason/packer.nvim', install_path})
api.nvim_command('packadd packer.nvim')
end
cmd [[packadd packer.nvim]]
-- Plugins
require("packer").startup(function()
-- Let the package manager manage itself.
use {"wbthomason/packer.nvim", opt = true}
-- THEMES!
use {"chriskempson/base16-vim"}
-- EditorConfig plugin
use {"editorconfig/editorconfig-vim"}
-- Colorize common color strings
use {'lilydjwg/colorizer'}
-- A snippets engine.
-- One of the must-haves for me.
use { 'sirver/ultisnips' }
-- Text editor integration for the browser
use {'subnut/nvim-ghost.nvim', run = ':call nvim_ghost#installer#install()'}
-- Fuzzy finder of lists
use {
'nvim-telescope/telescope.nvim',
requires = {{'nvim-lua/popup.nvim'}, {'nvim-lua/plenary.nvim'}}
}
-- Contains various snippets for UltiSnips.
use {'honza/vim-snippets'}
-- A completion engine.
-- I chose this engine since it is linked from UltiSnips.
use { "hrsh7th/nvim-compe" }
-- A linting engine, a DAP client, and an LSP client entered into a bar.
use {
'dense-analysis/ale',
config = function()
g['ale_disable_lsp'] = 1
g['ale_linters'] = {
javascript = {"eslint", "prettier"}
}
end
}
use {'neovim/nvim-lspconfig'}
use {'mfussenegger/nvim-dap'}
-- One of the most popular plugins.
-- Allows to create more substantial status bars.
use {
'vim-airline/vim-airline',
config = function()
g['airline_powerline_fonts'] = 1
g['airline#extensions#ale#enabled'] = 1
end
}
-- Fuzzy finder for finding files freely and fastly.
use {'junegunn/fzf'}
use {'junegunn/fzf.vim'}
-- A full LaTeX toolchain plugin for Vim.
-- Also a must-have for me since writing LaTeX can be a PITA.
-- Most of the snippets and workflow is inspired from Gilles Castel's posts (at https://castel.dev/).
use {
'lervag/vimtex',
cmd = 'ALEEnable',
config = function()
-- Vimtex configuration
g['tex_flavor'] = 'latex'
g['vimtex_view_method'] = 'zathura'
g['vimtex_quickfix_mode'] = 0
g['tex_conceal'] = 'abdmg'
g['vimtex_compiler_latexmk'] = {
options = {
'-bibtex',
'-shell-escape',
'-verbose',
'-file-line-error',
}
}
-- I use LuaLaTeX for my documents so let me have it as the default, please?
g['vimtex_compiler_latexmk_engines'] = {
_ = '-lualatex',
pdflatex = '-pdf',
dvipdfex = '-pdfdvi',
lualatex = '-lualatex',
xelatex = '-xelatex',
}
end
}
-- Enable visuals for addition/deletion of lines in the gutter (side) similar to Visual Studio Code.
use {'airblade/vim-gitgutter'}
-- Language plugins.
use {'LnL7/vim-nix'}
use {'vmchale/dhall-vim'}
end)
g['UltiSnipsExpandTrigger'] = "<c-j>"
g['UltiSnipsEditSplit'] = "context"
g['UltiSnipsSnippetDirectories'] = {vim.env.HOME .. "/.config/nvim/own-snippets", ".snippets"}
-- Compe configuration
require'compe'.setup {
enabled = true;
autocomplete = true;
debug = false;
min_length = 1;
preselect = 'enable';
throttle_time = 80;
source_timeout = 200;
resolve_timeout = 800;
incomplete_delay = 400;
max_abbr_width = 100;
max_kind_width = 100;
max_menu_width = 100;
documentation = {
border = { '', '' ,'', ' ', '', '', '', ' ' }, -- the border option is the same as `|help nvim_open_win|`
winhighlight = "NormalFloat:CompeDocumentation,FloatBorder:CompeDocumentationBorder",
max_width = 120,
min_width = 60,
max_height = math.floor(vim.o.lines * 0.3),
min_height = 1,
};
source = {
path = true;
buffer = true;
calc = true;
nvim_lsp = true;
nvim_lua = true;
ultisnips = true;
luasnip = true;
};
}
local t = function(str)
return vim.api.nvim_replace_termcodes(str, true, true, true)
end
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
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 check_back_space() then
return t "<Tab>"
else
return vim.fn['compe#complete']()
end
end
_G.s_tab_complete = function()
if vim.fn.pumvisible() == 1 then
return t "<C-p>"
else
return t "<S-Tab>"
end
end
-- Editor configuration
opt.completeopt = "menuone,noselect"
opt.encoding = "utf-8"
opt.number = true
opt.relativenumber = true
opt.cursorline = true
opt.expandtab = true
opt.shiftwidth = 4
opt.tabstop = 4
opt.conceallevel = 1
opt.list = true
opt.listchars = { tab = " ", trail = "·" }
opt_local.spell = true
opt.smartindent = true
-- I have yet to solve how to do the following in Lua, lmao
cmd "highlight clear SpellBad"
cmd "highlight clear SpellLocal"
cmd "highlight clear SpellCap"
cmd "highlight clear SpellRare"
cmd "highlight CursorLineNr ctermfg=cyan"
cmd "highlight Visual term=reverse cterm=reverse"
-- Keybindings
map('i', 'jk', '<Esc>', {})
map('n', '<leader>hr', '<cmd>source $MYVIMRC<cr>', {})
map('i', "<Tab>", "v:lua.tab_complete()", { expr = true })
map('s', "<Tab>", "v:lua.tab_complete()", { expr = true })
map('i', "<S-Tab>", "v:lua.s_tab_complete()", { expr = true })
map('s', "<S-Tab>", "v:lua.s_tab_complete()", { expr = true })
map('i', '<cr>', 'compe#confirm("<cr>")', { expr = true })
map('i', '<c-space>', 'compe#complete()', { expr = true })
-- LSP config
local nvim_lsp = require('lspconfig')
-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end
-- Enable completion triggered by <c-x><c-o>
buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc')
-- Mappings.
local opts = { noremap=true, silent=true }
-- See `:help vim.lsp.*` for documentation on any of the below functions
buf_set_keymap('n', 'gD', '<Cmd>lua vim.lsp.buf.declaration()<CR>', opts)
buf_set_keymap('n', 'gd', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts)
buf_set_keymap('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>', opts)
buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts)
buf_set_keymap('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts)
buf_set_keymap('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts)
buf_set_keymap('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts)
buf_set_keymap('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts)
buf_set_keymap('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts)
buf_set_keymap('n', '<space>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts)
buf_set_keymap('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts)
buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts)
buf_set_keymap('n', '<space>e', '<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>', opts)
buf_set_keymap('n', '[d', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts)
buf_set_keymap('n', ']d', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts)
buf_set_keymap('n', '<space>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts)
buf_set_keymap("n", "<space>f", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
end
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem.snippetSupport = true
-- Enable the following language servers
local servers = { 'clangd', 'rust_analyzer', 'pyright', 'tsserver' }
for _, lsp in ipairs(servers) do
nvim_lsp[lsp].setup {
on_attach = on_attach,
capabilities = capabilities,
}
end

View File

@ -1,216 +0,0 @@
"""""""""""
" PLUGINS "
"""""""""""
" This configuration uses vim-plug (https://github.com/junegunn/vim-plug) as
" the plugin manager.
" Activate it with ':PlugInstall' for the first time (and when adding new plugins).
" And run ':PlugUpgrade' for upgrading the plugins.
call plug#begin('~/.config/nvim/plugged')
" Nord color scheme
Plug 'arcticicestudio/nord-vim'
Plug 'gruvbox-community/gruvbox'
Plug 'chriskempson/base16-vim'
" EditorConfig plugin
Plug 'editorconfig/editorconfig-vim'
" Colorize common color strings
Plug 'lilydjwg/colorizer'
" A snippets engine.
" One of the must-haves for me.
Plug 'sirver/ultisnips'
" Text editor integration for the browser
Plug 'subnut/nvim-ghost.nvim', {'do': ':call nvim_ghost#installer#install()'}
" Setting my private snippets in a consistent home directory and a relative snippets directory for project-specific snippets.
let g:UltiSnipsSnippetDirectories = [$HOME . "/.config/nvim/own-snippets", ".snippets"]
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
let g:UltiSnipsEditSplit="context"
" Contains various snippets for UltiSnips.
Plug 'honza/vim-snippets'
" A completion engine.
" I chose this engine since it is linked from UltiSnips.
if has('nvim')
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
Plug 'Shougo/deoplete.nvim'
Plug 'roxma/nvim-yarp'
Plug 'roxma/vim-hug-neovim-rpc'
endif
let g:deoplete#enable_at_startup = 1
" A linting engine and an LSP client.
Plug 'dense-analysis/ale'
" One of the most popular plugins.
" Allows to create more substantial status bars.
Plug 'vim-airline/vim-airline'
let g:airline_powerline_fonts = 1
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" Fuzzy finder for finding files freely and fastly.
Plug 'junegunn/fzf'
Plug 'junegunn/fzf.vim'
" Emmet is an HTML plugin for easy HTML writing
Plug 'mattn/emmet-vim'
" A full LaTeX toolchain plugin for Vim.
" Also a must-have for me since writing LaTeX can be a PITA.
" Most of the snippets and workflow is inspired from Gilles Castel's posts (at https://castel.dev/).
Plug 'lervag/vimtex'
let g:tex_flavor='latex'
let g:vimtex_view_method='zathura'
let g:vimtex_quickfix_mode=0
set conceallevel=1
let g:tex_conceal='abdmg'
let g:vimtex_compiler_latexmk = {
\ 'options': [
\ '-bibtex',
\ '-shell-escape',
\ '-verbose',
\ '-file-line-error',
\ ]
\}
" I use LuaLaTeX for my documents so let me have it as the default, please?
let g:vimtex_compiler_latexmk_engines = {
\ '_' : '-lualatex',
\ 'pdflatex' : '-pdf',
\ 'dvipdfex' : '-pdfdvi',
\ 'lualatex' : '-lualatex',
\ 'xelatex' : '-xelatex',
\ 'context (pdftex)' : '-pdf -pdflatex=texexec',
\ 'context (luatex)' : '-pdf -pdflatex=context',
\ 'context (xetex)' : '-pdf -pdflatex=''texexec --xtx''',
\}
" Enable visuals for addition/deletion of lines in the gutter (side) similar to Visual Studio Code.
Plug 'airblade/vim-gitgutter'
" Plugin for distraction-free writing.
Plug 'junegunn/goyo.vim'
" Language plugins.
Plug 'LnL7/vim-nix'
Plug 'vmchale/dhall-vim'
call plug#end()
"""""""""""""""""""""""""
" EDITOR CONFIGURATIONS "
"""""""""""""""""""""""""
set encoding=utf-8
let mapleader=" "
colorscheme nord
" Setting number lines in the gutter.
set number relativenumber
highlight CursorLineNr ctermfg=cyan
highlight Visual term=reverse cterm=reverse
" Setting line highlighting based on the position of the cursor.
set cursorline
" Set tab to enter spaces, instead.
set expandtab
" Set entering tab to 4 spaces.
set shiftwidth=4 tabstop=4
" Set list and other listing characters (:h listchars).
set list listchars=tab:→\ ,trail
" Enabling spell checker (for your local language, anyway).
setlocal spell
set spelllang=en_us
inoremap <C-l> <c-g>u<Esc>[s1z=`]a<c-g>u
" Quick escape to default mode.
inoremap jk <Esc>
" Instant Goyo toggle.
map <leader>w :Goyo<Enter>
" Trim all trailing whitespaces.
map <leader>s :%s/\s\+$/<Enter>
" Reload $MYVIMRC.
map <leader>hr :source $MYVIMRC<Enter>
" File explorer toggle.
" Turns out vim (and nvim) has a native file explorer with :Explore.
map <leader>ff :Lexplore<Return>:vertical resize 40<Return><C-w><C-w>
" Changing style of words.
highlight clear SpellBad
highlight clear SpellLocal
highlight clear SpellCap
highlight clear SpellRare
""""""""""
" EVENTS "
""""""""""
" Show leading spaces.
" SOURCE: https://www.reddit.com/r/vim/comments/5fxsfy/show_leading_spaces/
hi Conceal guibg=NONE ctermbg=NONE ctermfg=DarkGrey
autocmd BufWinEnter * setl conceallevel=1
autocmd BufWinEnter * syn match LeadingSpace /\(^ *\)\@<= / containedin=ALL conceal cchar=·
autocmd BufReadPre * setl conceallevel=1
autocmd BufReadPre * syn match LeadingSpace /\(^ *\)\@<= / containedin=ALL conceal cchar=·
" The template list is simply an array composed of vector that represents the
" prefix and the suffix of the template file name.
let template_list = [
\ ["_minted-", ""],
\ ["", ".synctex"],
\]
" Additional LaTeX files cleanup.
function VimtexAdditionalCleanup(template_list)
call vimtex#compiler#clean(1)
let file_name = expand("%:t:r")
let file_path = expand("%:p:h") . "/"
for template in a:template_list
let prefix = template[0]
let suffix = template[1]
let full_template_path = file_path . prefix . file_name . suffix
call delete(full_template_path, "rf")
endfor
endfunction
" Initiate LaTeX file compilation at the start and auto clean up.
augroup vimtex_events
au!
" auto-clean
au User QuitPre call VimtexAdditionalCleanup(template_list)
au User VimLeave call VimtexAdditionalCleanup(template_list)
au User VimtexEventQuit call vimtex#compiler#clean(1)
au User VimtexEventQuit call VimtexAdditionalCleanup(template_list)
" Auto-compile
au User VimtexEventInitPost call vimtex#compiler#compile()
augroup END