From 1d683ac3842a32904465631b0be4d2138113ac6f Mon Sep 17 00:00:00 2001 From: Konstantin Bukley Date: Sat, 5 Feb 2022 23:49:52 +0200 Subject: [PATCH] vim: vimrc -> init.lua --- init.lua | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 init.lua diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..5234c8d --- /dev/null +++ b/init.lua @@ -0,0 +1,155 @@ +-- Author: Konstantin Bukley +-- License: WTFPL +-- Description: Personal neovim configuration + +-- Helpers +local cmd = vim.cmd -- to execute Vim commands e.g. cmd('pwd') +local fn = vim.fn -- to call Vim functions e.g. fn.bufnr() +local g = vim.g -- a table to access global variables +local opt = vim.opt -- to set options + +local function map(mode, lhs, rhs, opts) + local options = { noremap = true } + if opts then options = vim.tbl_extend('force', options, opts) end + vim.api.nvim_set_keymap(mode, lhs, rhs, options) +end + +local function nmap(lhs, rhs, opts) + map('n', lhs, rhs, opts) +end + +require('packer').startup(function() + use 'wbthomason/packer.nvim' + use 'arcticicestudio/nord-vim' + use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' } + use 'tpope/vim-commentary' + use 'tpope/vim-surround' + use { 'junegunn/fzf', run = 'cd ~/.fzf && ./install --all' } + use 'junegunn/fzf.vim' + use 'junegunn/vim-easy-align' + use 'christoomey/vim-tmux-navigator' +end) + +cmd('au TextYankPost * lua vim.highlight.on_yank { timeout = 250 }') +cmd('colorscheme nord') + +opt.smartindent = true -- Autoindenting when starting a new line +opt.tabstop = 2 -- Tab counts as 2 columns +opt.shiftwidth = 2 -- Numbers of spaces to (auto)indent +opt.expandtab = true -- Tabs to spaces +opt.clipboard = 'unnamed' -- Share clipboard with the OS +opt.number = true -- Display line numbers +opt.fillchars = 'diff:⣿,vert:│' -- Nicer separators +opt.synmaxcol = 500 -- Do not try to highlight lines longer than 500 characters +opt.lazyredraw = true -- Do not redraw while running macros +opt.showmatch = true -- Show matching braces +opt.matchtime = 2 -- Show matching braces for 2 tenths of second +opt.showmode = true -- Shows when you are in insert mode +opt.title = true -- Show title in console status bar +opt.wrap = false -- Dont wrap lines +opt.scrolloff = 5 -- Keep 5 rows on the screen when scrolling +opt.sidescrolloff = 15 -- Horizontal scrolloff +opt.visualbell = false -- No visual bell +opt.backup = false -- No backups +opt.writebackup = false -- No backups +opt.swapfile = false -- No backups +opt.mouse = 'a' -- Support mouse (for proper mouse highlight) +opt.list = true -- List mode +opt.timeoutlen = 1000 -- Delay for mappings +opt.ttimeoutlen = 0 -- Delay between modes +opt.shellcmdflag = '-ic' -- Enables aliases from .bashrc in :! commands +opt.grepprg = 'rg -i --vimgrep' -- TODO: check for existance of rg otherwise fallback to grep +opt.diffopt:append({ vertical = true }) -- Vertical splits in diff mode +opt.shortmess:append({ I = true }) -- Remove welcome message (:intro) +opt.shortmess:append({ a = true }) -- Short messages for everything + +-- Ignore when autocompleting TODO: review +opt.wildignore:append('*.o,*.obj,*~') +opt.wildignore:append('*vim/backups*') +opt.wildignore:append('*sass-cache*') +opt.wildignore:append('*DS_Store*') +opt.wildignore:append('vendor/rails/**') +opt.wildignore:append('vendor/cache/**') +opt.wildignore:append('*.gem') +opt.wildignore:append('log/**,tmp/**') +opt.wildignore:append('*.png,*.jpg,*.gif') + +-- TODO :h gcr +-- " Disable cursor blink +-- set gcr=a:blinkon0 +-- " Conceal mostly for markdown TODO :h conceallevel +-- set conceallevel=2 +-- " Highlight VCS conflict markers TODO: translate to LUA +-- match ErrorMsg '^\(<\|=\|>\)\{7\}\([^=].\+\)\?$' +-- " Russian keymap support TODO: do I still need this? +-- set langmap=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯЖ;ABCDEFGHIJKLMNOPQRSTUVWXYZ:,фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz +-- " W invokes sudo TODO +-- command! W w !sudo tee % > /dev/null + +g.mapleader = ' ' + +-- Netrw +g.netrw_banner = 0 +g.netrw_liststyle = 4 + +-- fzf +g.fzf_preview_window = '' +g.fzf_layout = { window = { width = 0.6, height = 0.6, border = 'sharp' } } + +--- Mappings +-- Essentials +nmap(';', ':') +nmap(',,', '') +nmap('w', ':w') -- TODO: stop this madness, :h autowrite +nmap('Q', ':q!') +nmap('', ':nohlsearch', { silent = true }) + +-- Convenience +nmap('yy', 'Y') +nmap('Y', 'y$') +nmap('N', 'Nzz') +nmap('n', 'nzz') +nmap('j', 'gj') +nmap('k', 'gk') +nmap('H', '^') +nmap('L', '$') +nmap('J', 'mzJ`z') +nmap('K', '') +nmap('gQ', '') + +-- Tabs +nmap('t', ':tabnew') +nmap('', ':tabnext') +nmap('', ':tabprevious') +nmap('1', '1gt') +nmap('2', '2gt') +nmap('3', '3gt') +nmap('4', '4gt') +nmap('5', '5gt') + +-- Visual mode +map('v', '.', ':normal .') +map('v', 'J', ':m \'>+1gv=gv') +map('v', 'K', ':m \'<-2gv=gv') +map('v', '<', '', '>gv') + +-- fzf +nmap('ff', ':Files') +nmap('ft', ':Files ~/Tmp') +nmap('fo', ":call fzf#run(fzf#wrap(fzf#vim#with_preview({ 'source': 'fd . --type f --extension=md --follow --exclude .git ~/ownCloud/Obsidian/Personal' })))", { silent = true }) + +-- vim-easy-align +map('x', 'ga', ':EasyAlign') -- TODO: this should allow for gaip, but does not +map('v', 'ga', ':EasyAlign') + +-- Plugin config +-- Tree-sitter +require('nvim-treesitter.configs').setup { + -- one of "all", "maintained" (parsers with maintainers), or a list of languages + ensure_installed = 'maintained', + ignore_install = { 'norg' }, + highlight = { enable = true }, + indent = { enable = true }, + autopairs = { enable = true }, +}