From 18edf9861d1b38591b51b42465b224d77736db04 Mon Sep 17 00:00:00 2001
From: listout <listout@protonmail.com>
Date: Tue, 2 Aug 2022 01:10:05 +0530
Subject: nvim: moving init to lua

Signed-off-by: listout <listout@protonmail.com>
---
 init.lua                   |  15 +++++
 init.vim                   |  91 ---------------------------
 init.vim.bak               |  91 +++++++++++++++++++++++++++
 lua/core/appearance.lua    |  52 +++++++++++++++
 lua/core/colorscheme.lua   |  10 +++
 lua/core/keymaps.lua       |  52 +++++++++++++++
 lua/core/options.lua       |  89 ++++++++++++++++++++++++++
 lua/core/settings.lua      |  19 ++++++
 lua/core/utils.lua         |  17 +++++
 lua/plugins/coc.lua        | 153 +++++++++++++++++++++++++++++++++++++++++++++
 lua/plugins/plugins.lua    |  38 +++++++++++
 lua/plugins/statusline.lua |  56 +++++++++++++++++
 12 files changed, 592 insertions(+), 91 deletions(-)
 create mode 100644 init.lua
 delete mode 100644 init.vim
 create mode 100644 init.vim.bak
 create mode 100644 lua/core/appearance.lua
 create mode 100644 lua/core/colorscheme.lua
 create mode 100644 lua/core/keymaps.lua
 create mode 100644 lua/core/options.lua
 create mode 100644 lua/core/settings.lua
 create mode 100644 lua/core/utils.lua
 create mode 100644 lua/plugins/coc.lua
 create mode 100644 lua/plugins/plugins.lua
 create mode 100644 lua/plugins/statusline.lua

diff --git a/init.lua b/init.lua
new file mode 100644
index 0000000..09f2ad4
--- /dev/null
+++ b/init.lua
@@ -0,0 +1,15 @@
+--[[
+Neovim init file
+--]]
+
+-- Import Lua modules
+require('plugins/plugins')
+require('plugins/coc')
+require('plugins/statusline')
+
+require('core/colorscheme')
+require('core/appearance')
+require('core/options')
+require('core/utils')
+require('core/settings')
+require('core/keymaps')
diff --git a/init.vim b/init.vim
deleted file mode 100644
index 22188f7..0000000
--- a/init.vim
+++ /dev/null
@@ -1,91 +0,0 @@
-let g:markdown_fenced_languages = [
-			\ 'html',
-			\ 'python',
-			\ 'bash=sh',
-			\ 'java',
-			\ 'c',
-			\ 'cpp',
-			\ 'php',
-			\ 'sql',
-			\ 'js=javascript',
-			\ 'pro=prolog',
-			\ 'vim',
-			\ 'help',
-			\ ]
-let g:pandoc#syntax#codeblocks#embeds#langs = [
-			\ "php",
-			\ "html",
-			\ "bash=sh",
-			\ "java",
-			\ "c",
-			\ "cpp",
-			\ "python",
-			\ "sql",
-			\ "js=javascript",
-			\ 'pro=prolog',
-			\ 'vim',
-			\ 'help',
-			\ ]
-
-let g:markdown_syntax_conceal = 1
-let g:markdown_minlines = 100
-
-let g:tex_flavor='latex'
-
-"let ch_syntax_for_h = 1
-
-augroup pandoc_syntax
-	au! BufNewFile,BufFilePre,BufRead *.md set filetype=markdown.pandoc
-augroup END
-autocmd BufEnter,BufNewFile,BufFilePre,BufRead *.md :syntax sync fromstart
-autocmd BufEnter * :syntax sync fromstart
-
-if &diff
-source $HOME/.config/nvim/configs/plugins.vim
-source $HOME/.config/nvim/configs/basic.vim
-source $HOME/.config/nvim/configs/appearance.vim
-source $HOME/.config/nvim/configs/statusline.vim
-else
-source $HOME/.config/nvim/configs/plugins.vim
-source $HOME/.config/nvim/configs/basic.vim
-source $HOME/.config/nvim/configs/appearance.vim
-source $HOME/.config/nvim/configs/statusline.vim
-source $HOME/.config/nvim/configs/coc.vim
-source $HOME/.config/nvim/configs/snippets.vim
-source $HOME/.config/nvim/configs/keys.vim
-source $HOME/.config/nvim/configs/fzf.vim
-endif
-
-lua <<EOF
-require'nvim-treesitter.configs'.setup {
-	-- A list of parser names, or "all"
-	ensure_installed = { "c", "cpp", "vim" },
-
-	-- Install parsers synchronously (only applied to `ensure_installed`)
-	sync_install = false,
-
-
-	highlight = {
-		-- `false` will disable the whole extension
-		enable = true,
-
-		-- NOTE: these are the names of the parsers and not the filetype. (for example if you want to
-		-- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is
-		-- the name of the parser)
-		-- list of language that will be disabled
-		-- disable = { "c", "rust" },
-
-		-- Setting this to true will run `:h syntax` and tree-sitter at the same time.
-		-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
-		-- Using this option may slow down your editor, and you may see some duplicate highlights.
-		-- Instead of true it can also be a list of languages
-		additional_vim_regex_highlighting = true,
-	},
-}
-EOF
-
-let g:AutoPairsCenterLine = 0
-let g:AutoPairsMapSpace = 0
-let g:AutoPairsMapCR = 0
-
-let g:c_syntax_for_h = 1
diff --git a/init.vim.bak b/init.vim.bak
new file mode 100644
index 0000000..22188f7
--- /dev/null
+++ b/init.vim.bak
@@ -0,0 +1,91 @@
+let g:markdown_fenced_languages = [
+			\ 'html',
+			\ 'python',
+			\ 'bash=sh',
+			\ 'java',
+			\ 'c',
+			\ 'cpp',
+			\ 'php',
+			\ 'sql',
+			\ 'js=javascript',
+			\ 'pro=prolog',
+			\ 'vim',
+			\ 'help',
+			\ ]
+let g:pandoc#syntax#codeblocks#embeds#langs = [
+			\ "php",
+			\ "html",
+			\ "bash=sh",
+			\ "java",
+			\ "c",
+			\ "cpp",
+			\ "python",
+			\ "sql",
+			\ "js=javascript",
+			\ 'pro=prolog',
+			\ 'vim',
+			\ 'help',
+			\ ]
+
+let g:markdown_syntax_conceal = 1
+let g:markdown_minlines = 100
+
+let g:tex_flavor='latex'
+
+"let ch_syntax_for_h = 1
+
+augroup pandoc_syntax
+	au! BufNewFile,BufFilePre,BufRead *.md set filetype=markdown.pandoc
+augroup END
+autocmd BufEnter,BufNewFile,BufFilePre,BufRead *.md :syntax sync fromstart
+autocmd BufEnter * :syntax sync fromstart
+
+if &diff
+source $HOME/.config/nvim/configs/plugins.vim
+source $HOME/.config/nvim/configs/basic.vim
+source $HOME/.config/nvim/configs/appearance.vim
+source $HOME/.config/nvim/configs/statusline.vim
+else
+source $HOME/.config/nvim/configs/plugins.vim
+source $HOME/.config/nvim/configs/basic.vim
+source $HOME/.config/nvim/configs/appearance.vim
+source $HOME/.config/nvim/configs/statusline.vim
+source $HOME/.config/nvim/configs/coc.vim
+source $HOME/.config/nvim/configs/snippets.vim
+source $HOME/.config/nvim/configs/keys.vim
+source $HOME/.config/nvim/configs/fzf.vim
+endif
+
+lua <<EOF
+require'nvim-treesitter.configs'.setup {
+	-- A list of parser names, or "all"
+	ensure_installed = { "c", "cpp", "vim" },
+
+	-- Install parsers synchronously (only applied to `ensure_installed`)
+	sync_install = false,
+
+
+	highlight = {
+		-- `false` will disable the whole extension
+		enable = true,
+
+		-- NOTE: these are the names of the parsers and not the filetype. (for example if you want to
+		-- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is
+		-- the name of the parser)
+		-- list of language that will be disabled
+		-- disable = { "c", "rust" },
+
+		-- Setting this to true will run `:h syntax` and tree-sitter at the same time.
+		-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
+		-- Using this option may slow down your editor, and you may see some duplicate highlights.
+		-- Instead of true it can also be a list of languages
+		additional_vim_regex_highlighting = true,
+	},
+}
+EOF
+
+let g:AutoPairsCenterLine = 0
+let g:AutoPairsMapSpace = 0
+let g:AutoPairsMapCR = 0
+
+let g:c_syntax_for_h = 1
diff --git a/lua/core/appearance.lua b/lua/core/appearance.lua
new file mode 100644
index 0000000..452c4b9
--- /dev/null
+++ b/lua/core/appearance.lua
@@ -0,0 +1,52 @@
+local opt = vim.opt   -- Set options (global/buffer/windows-scoped)
+
+-----------------------------------------------------------
+-- Neovim UI
+-----------------------------------------------------------
+opt.number = true           -- Show line number
+opt.relativenumber = true   -- Show relative line number
+opt.showmatch = true        -- Highlight matching parenthesis
+opt.foldmethod = 'marker'   -- Enable folding (default 'foldmarker')
+opt.splitright = true       -- Vertical split to the right
+opt.splitbelow = true       -- Horizontal split to the bottom
+opt.ignorecase = true       -- Ignore case letters when search
+opt.smartcase = true        -- Ignore lowercase for the whole pattern
+opt.linebreak = true        -- Wrap on word boundary
+opt.termguicolors = true    -- Enable 24-bit RGB colors
+opt.laststatus = 2          -- Set global statusline
+opt.splitbelow = true
+opt.splitright = true
+opt.scrolloff = 2
+opt.sidescrolloff = 5
+opt.foldlevelstart = 99
+opt.ruler = false
+opt.list = true
+opt.showtabline = 0
+opt.winwidth = 30
+opt.winminwidth = 10
+opt.pumheight = 15
+opt.helpheight = 12
+opt.previewheight = 12
+opt.showcmd = false
+opt.listchars = 'tab:▸ ,extends:›,precedes:‹,nbsp:·,trail:·'
+opt.background = 'dark'
+opt.cmdheight = 2
+opt.fillchars = {
+	diff = "╱",
+	vert = "│",
+	fold = "⠀",
+	eob = " ", -- suppress ~ at EndOfBuffer
+	--diff = "⣿", -- alternatives = ⣿ ░ ─ ╱
+	msgsep = "‾",
+	foldopen = "▾",
+	foldsep = "│",
+	foldclose = "▸",
+}
+
+vim.cmd [[
+	" Function, identifier and comments in italic
+	highlight Function cterm=italic gui=italic
+	highlight Indentifier cterm=none gui=italic
+	highlight Comment cterm=italic gui=italic
+]]
+
diff --git a/lua/core/colorscheme.lua b/lua/core/colorscheme.lua
new file mode 100644
index 0000000..f8c782b
--- /dev/null
+++ b/lua/core/colorscheme.lua
@@ -0,0 +1,10 @@
+-- Config in lua
+vim.g.nord_contrast = true
+vim.g.nord_borders = true
+vim.g.nord_disable_background = false
+vim.g.nord_italic = true
+vim.g.nord_uniform_diff_background = true
+
+-- Load the colorscheme
+require('nord').set()
+vim.cmd[[colorscheme nord]]
diff --git a/lua/core/keymaps.lua b/lua/core/keymaps.lua
new file mode 100644
index 0000000..ca80862
--- /dev/null
+++ b/lua/core/keymaps.lua
@@ -0,0 +1,52 @@
+-----------------------------------------------------------
+-- Define keymaps of Neovim and installed plugins.
+-----------------------------------------------------------
+
+local function map(mode, lhs, rhs, opts)
+	local options = { noremap = true, silent = true }
+	if opts then
+		options = vim.tbl_extend('force', options, opts)
+	end
+	vim.api.nvim_set_keymap(mode, lhs, rhs, options)
+end
+
+-- Change leader to a comma
+vim.g.mapleader = ','
+
+-----------------------------------------------------------
+-- Neovim shortcuts
+-----------------------------------------------------------
+
+-- Disable arrow keys
+map('', '<up>', '<nop>')
+map('', '<down>', '<nop>')
+map('', '<left>', '<nop>')
+map('', '<right>', '<nop>')
+
+-- Reload configuration without restart nvim
+map('n', '<leader>r', ':so %<CR>')
+
+-- Change split orientation
+map('n', '<leader>tk', '<C-w>t<C-w>K') -- change vertical to horizontal
+map('n', '<leader>th', '<C-w>t<C-w>H') -- change horizontal to vertical
+
+map('n', 'M-j', ':resize -2<CR>')
+map('n', 'M-k', ':resize +2<CR>')
+map('n', 'M-l', ':vertical resize -2<CR>')
+map('n', 'M-h', ':vertical resize +2<CR>')
+
+map('t', 'C-w', '<C-\\><C-n><C-w>')
+
+map('n', '<leader>b', ':Buffers<CR>');
+map('n', '<leader>n', ':Files<CR>');
+
+vim.cmd([[
+	let $FZF_DEFAULT_COMMAND =  "find * -path
+			\ '*/\.*' -prune -o -path 'node_modules/**'
+			\ -prune -o -path 'target/**' -prune -o -path
+			\'dist/**' -prune -o  -type f -print -o -type
+			\ l -print 2> /dev/null"
+]])
+
+map('n', '<silent><leader>l', ':Buffers<CR>')
+
diff --git a/lua/core/options.lua b/lua/core/options.lua
new file mode 100644
index 0000000..6a5cc30
--- /dev/null
+++ b/lua/core/options.lua
@@ -0,0 +1,89 @@
+-----------------------------------------------------------
+-- General Neovim settings and configuration
+-----------------------------------------------------------
+
+local g = vim.g       -- Global variables
+local opt = vim.opt   -- Set options (global/buffer/windows-scoped)
+local cache_dir = os.getenv('HOME') .. '/.cache/nvim/'
+
+-----------------------------------------------------------
+-- General
+-----------------------------------------------------------
+opt.mouse = 'a'                       -- Enable mouse support
+opt.clipboard = 'unnamedplus'         -- Copy/paste to system clipboard
+opt.swapfile = false                  -- Don't use swapfile
+opt.completeopt = 'menuone,noinsert,noselect'  -- Autocomplete options
+opt.history = 500                     -- Lines vim should remember
+opt.backup = false
+opt.writebackup = false
+opt.shell = 'zsh'
+opt.magic = true                      -- Vim's regular expression magic
+opt.mat = 2                           -- How many tenths of seconds ro blink
+opt.fileformats = 'unix,mac,dos'      -- Unix as standard file format
+opt.encoding = 'utf-8'                -- Encoding
+opt.viewoptions = 'folds,cursor,curdir,slash,unix'
+opt.wildignorecase = true
+opt.wildignore =
+  '.git,.hg,.svn,*.pyc,*.o,*.out,*.jpg,*.jpeg,*.png,*.gif,*.zip,**/tmp/**,*.DS_Store,**/node_modules/**,**/bower_modules/**'
+opt.hlsearch = false        -- No highlight search
+opt.incsearch = true
+opt.ignorecase = true
+opt.backspace = 'indent,eol,start'
+
+-----------------------------------------------------------
+-- Tabs, indent
+-----------------------------------------------------------
+opt.shiftwidth = 4          -- Shift 4 spaces when tab
+opt.tabstop = 4             -- 1 tab == 4 spaces
+opt.softtabstop = 4         -- 1 tab == 4 spaces
+opt.expandtab = false       -- Use spaces instead of tabs
+opt.smartindent = true      -- Autoindent new lines
+opt.autoindent = true       -- Copy indent from current line when starting new line
+opt.cindent = true          -- C programming indentation
+
+-----------------------------------------------------------
+-- Memory, CPU
+-----------------------------------------------------------
+opt.hidden = true           -- Enable background buffers
+opt.lazyredraw = true       -- Faster scrolling
+opt.synmaxcol = 240         -- Max column for syntax highlight
+opt.updatetime = 300        -- ms to wait for trigger an event
+opt.timeoutlen = 500        -- ms to wait for a mapped sequence to complete.
+
+-----------------------------------------------------------
+-- Startup
+-----------------------------------------------------------
+-- Disable nvim intro
+opt.shortmess:append "csI"
+
+-- -- Disable builtin plugins
+local disabled_built_ins = {
+   "2html_plugin",
+   "getscript",
+   "getscriptPlugin",
+   "gzip",
+   "logipat",
+   "netrw",
+   "netrwPlugin",
+   "netrwSettings",
+   "netrwFileHandlers",
+   "matchit",
+   "tar",
+   "tarPlugin",
+   "rrhelper",
+   "spellfile_plugin",
+   "vimball",
+   "vimballPlugin",
+   "zip",
+   "zipPlugin",
+   "tutor",
+   "rplugin",
+   "synmenu",
+   "optwin",
+   "compiler",
+   "bugreport",
+}
+
+for _, plugin in pairs(disabled_built_ins) do
+   g["loaded_" .. plugin] = 1
+end
diff --git a/lua/core/settings.lua b/lua/core/settings.lua
new file mode 100644
index 0000000..20858b1
--- /dev/null
+++ b/lua/core/settings.lua
@@ -0,0 +1,19 @@
+--
+-- Mainly filetype settings
+--
+
+local cmd = vim.cmd
+local u = require('core/utils')
+
+u.create_augroup({
+    { 'BufRead,BufNewFile', '/tmp/nail-*', 'setlocal', 'ft=mail' },
+    { 'BufRead,BufNewFile', '*s-nail-*', 'setlocal', 'ft=mail' },
+    { 'BufRead,BufNewFile', '*mutt-*', 'setlocal', 'ft=mail' },
+    { 'BufRead', '/tmp/*mutt-*', 'setlocal', 'tw=72' },
+}, 'ftmail')
+
+-- Autoremove unwanted whitespaces
+cmd [[
+    au BufWritePre * %s/\s\+$//e
+    au BufRead,BufNewFile *mutt-* setfiletype mail
+]]
diff --git a/lua/core/utils.lua b/lua/core/utils.lua
new file mode 100644
index 0000000..7c8a7bf
--- /dev/null
+++ b/lua/core/utils.lua
@@ -0,0 +1,17 @@
+--
+-- Auto group utilites
+--
+
+local M = {}
+local cmd = vim.cmd
+
+function M.create_augroup(autocmds, name)
+    cmd('augroup ' .. name)
+    cmd('autocmd!')
+    for _, autocmd in ipairs(autocmds) do
+        cmd('autocmd ' .. table.concat(autocmd, ' '))
+    end
+    cmd('augroup END')
+end
+
+return M
diff --git a/lua/plugins/coc.lua b/lua/plugins/coc.lua
new file mode 100644
index 0000000..0e997a9
--- /dev/null
+++ b/lua/plugins/coc.lua
@@ -0,0 +1,153 @@
+-- vim.cmd('source ' .. 'lua/plugins/coc.vim')
+vim.cmd([[
+	" Global extensions
+	let g:coc_global_extensions = [
+			\ 'coc-lists',
+			\ 'coc-snippets',
+			\ 'coc-highlight',
+			\ 'coc-json',
+			\ 'coc-dictionary',
+			\ 'coc-word',
+			\ 'coc-syntax',
+			\ 'coc-ultisnips',
+			\ 'coc-vimtex'
+			\]
+
+	" Use tab for trigger completion with characters ahead and navigate.
+	" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
+	" other plugin before putting this into your config.
+	inoremap <silent><expr> <TAB>
+		  \ coc#pum#visible() ? coc#pum#next(1):
+		  \ CheckBackspace() ? "\<Tab>" :
+		  \ coc#refresh()
+	inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
+
+	" Make <CR> to accept selected completion item or notify coc.nvim to format
+	" <C-g>u breaks current undo, please make your own choice.
+	inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
+								  \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
+
+	function! CheckBackspace() abort
+	  let col = col('.') - 1
+	  return !col || getline('.')[col - 1]  =~# '\s'
+	endfunction
+
+	" Use <c-space> to trigger completion.
+	if has('nvim')
+	  inoremap <silent><expr> <c-space> coc#refresh()
+	else
+	  inoremap <silent><expr> <c-@> coc#refresh()
+	endif
+
+	" Use `[g` and `]g` to navigate diagnostics
+	" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list.
+	nmap <silent> [g <Plug>(coc-diagnostic-prev)
+	nmap <silent> ]g <Plug>(coc-diagnostic-next)
+
+	" GoTo code navigation.
+	nmap <silent> gd <Plug>(coc-definition)
+	nmap <silent> gy <Plug>(coc-type-definition)
+	nmap <silent> gi <Plug>(coc-implementation)
+	nmap <silent> gr <Plug>(coc-references)
+
+	" Use K to show documentation in preview window.
+	nnoremap <silent> K :call ShowDocumentation()<CR>
+
+	function! ShowDocumentation()
+	  if CocAction('hasProvider', 'hover')
+		call CocActionAsync('doHover')
+	  else
+		call feedkeys('K', 'in')
+	  endif
+	endfunction
+
+	" Highlight the symbol and its references when holding the cursor.
+	autocmd CursorHold * silent call CocActionAsync('highlight')
+
+	" Symbol renaming.
+	nmap <leader>rn <Plug>(coc-rename)
+
+	" Formatting selected code.
+	xmap <leader>f  <Plug>(coc-format-selected)
+	nmap <leader>f  <Plug>(coc-format-selected)
+
+	augroup mygroup
+	  autocmd!
+	  " Setup formatexpr specified filetype(s).
+	  autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
+	  " Update signature help on jump placeholder.
+	  autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
+	augroup end
+
+	" Applying codeAction to the selected region.
+	" Example: `<leader>aap` for current paragraph
+	xmap <leader>a  <Plug>(coc-codeaction-selected)
+	nmap <leader>a  <Plug>(coc-codeaction-selected)
+
+	" Remap keys for applying codeAction to the current buffer.
+	nmap <leader>ac  <Plug>(coc-codeaction)
+	" Apply AutoFix to problem on the current line.
+	nmap <leader>qf  <Plug>(coc-fix-current)
+
+	" Run the Code Lens action on the current line.
+	nmap <leader>cl  <Plug>(coc-codelens-action)
+
+	" Map function and class text objects
+	" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
+	xmap if <Plug>(coc-funcobj-i)
+	omap if <Plug>(coc-funcobj-i)
+	xmap af <Plug>(coc-funcobj-a)
+	omap af <Plug>(coc-funcobj-a)
+	xmap ic <Plug>(coc-classobj-i)
+	omap ic <Plug>(coc-classobj-i)
+	xmap ac <Plug>(coc-classobj-a)
+	omap ac <Plug>(coc-classobj-a)
+
+	" Remap <C-f> and <C-b> for scroll float windows/popups.
+	if has('nvim-0.4.0') || has('patch-8.2.0750')
+	  nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
+	  nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
+	  inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
+	  inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
+	  vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
+	  vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
+	endif
+
+	" Use CTRL-S for selections ranges.
+	" Requires 'textDocument/selectionRange' support of language server.
+	nmap <silent> <C-s> <Plug>(coc-range-select)
+	xmap <silent> <C-s> <Plug>(coc-range-select)
+
+	" Add `:Format` command to format current buffer.
+	command! -nargs=0 Format :call CocActionAsync('format')
+
+	" Add `:Fold` command to fold current buffer.
+	command! -nargs=? Fold :call     CocAction('fold', <f-args>)
+
+	" Add `:OR` command for organize imports of the current buffer.
+	command! -nargs=0 OR   :call     CocActionAsync('runCommand', 'editor.action.organizeImport')
+
+	" Add (Neo)Vim's native statusline support.
+	" NOTE: Please see `:h coc-status` for integrations with external plugins that
+	" provide custom statusline: lightline.vim, vim-airline.
+	set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}
+
+	" Mappings for CoCList
+	" Show all diagnostics.
+	nnoremap <silent><nowait> <space>a  :<C-u>CocList diagnostics<cr>
+	" Manage extensions.
+	nnoremap <silent><nowait> <space>e  :<C-u>CocList extensions<cr>
+	" Show commands.
+	nnoremap <silent><nowait> <space>c  :<C-u>CocList commands<cr>
+	" Find symbol of current document.
+	nnoremap <silent><nowait> <space>o  :<C-u>CocList outline<cr>
+	" Search workspace symbols.
+	nnoremap <silent><nowait> <space>s  :<C-u>CocList -I symbols<cr>
+	" Do default action for next item.
+	nnoremap <silent><nowait> <space>j  :<C-u>CocNext<CR>
+	" Do default action for previous item.
+	nnoremap <silent><nowait> <space>k  :<C-u>CocPrev<CR>
+	" Resume latest coc list.
+	nnoremap <silent><nowait> <space>p  :<C-u>CocListResume<CR>
+
+]])
diff --git a/lua/plugins/plugins.lua b/lua/plugins/plugins.lua
new file mode 100644
index 0000000..c78ffc1
--- /dev/null
+++ b/lua/plugins/plugins.lua
@@ -0,0 +1,38 @@
+-- This file can be loaded by calling `lua require('plugins')` from your init.vim
+
+-- Only required if you have packer configured as `opt`
+vim.cmd [[packadd packer.nvim]]
+
+return require('packer').startup(function(use)
+	-- Packer can manage itself
+	use 'wbthomason/packer.nvim'
+
+	-- Nord color scheme
+	use 'shaunsingh/nord.nvim'
+
+	-- Completion
+	use {'neoclide/coc.nvim', branch = 'release'}
+
+
+	use {'ap/vim-css-color'}
+
+	use {'jiangmiao/auto-pairs'}
+	use {'preservim/nerdcommenter'}
+	use { 'dhruvasagar/vim-table-mode', ft = {'markdown', 'markdown.pandoc'} }
+
+	use { 'vim-pandoc/vim-pandoc-syntax', ft = { 'markdown', 'markdown.pandoc' } }
+	use { 'lervag/vimtex', ft = { 'tex' } }
+
+	use { 'junegunn/fzf', run = ":call fzf#install()" }
+	use { 'junegunn/fzf.vim' }
+
+	use { 'honza/vim-snippets' }
+	use { 'SirVer/ultisnips' }
+
+	use {'tpope/vim-surround'}
+	use {'junegunn/vim-easy-align'}
+
+
+	use { 'tpope/vim-fugitive', ft = {'cpp', 'c'} }
+	use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' }
+end)
diff --git a/lua/plugins/statusline.lua b/lua/plugins/statusline.lua
new file mode 100644
index 0000000..11c1435
--- /dev/null
+++ b/lua/plugins/statusline.lua
@@ -0,0 +1,56 @@
+vim.cmd([[
+	function! StatusDiagnostic() abort
+		let info = get(b:, 'coc_diagnostic_info', {})
+		if empty(info) | return '' | endif
+		let msgs = []
+		if get(info, 'error', 0)
+			call add(msgs, 'E' . info['error'])
+		endif
+		if get(info, 'warning', 0)
+			call add(msgs, 'W' . info['warning'])
+		endif
+		return join(msgs, ' '). ' ' . get(g:, 'coc_status', '')
+	endfunction
+
+	"let g:currentmode={
+				"\ 'n'  : 'NORMAL ',
+				"\ 'no' : 'N·Operator Pending ',
+				"\ 'v'  : 'VISUAL ',
+				"\ 'V'  : 'V·Line ',
+				"\ "\<C-V>" : 'V·Block ',
+				"\ 's'  : 'Select ',
+				"\ 'S'  : 'S·Line ',
+				"\ 'x19' : 'S·Block ',
+				"\ 'i'  : 'INSERT ',
+				"\ 'R'  : 'REPLACE ',
+				"\ 'Rv' : 'V·Replace ',
+				"\ 'c'  : 'Command ',
+				"\ 'cv' : 'Vim Ex ',
+				"\ 'ce' : 'Ex ',
+				"\ 'r'  : 'Prompt ',
+				"\ 'rm' : 'More ',
+				"\ 'r?' : 'Confirm ',
+				"\ '!'  : 'Shell ',
+				"\ 't'  : 'Terminal '
+				"\}
+
+	function! ReadOnly()
+	  if &readonly || !&modifiable
+		return ''
+	  else
+		return ''
+	endfunction
+
+	set statusline=
+	"set statusline+=\ %{toupper(g:currentmode[mode()])}
+	set statusline^=%{StatusDiagnostic()}
+	set statusline+=%8*\ %<%f\ %{ReadOnly()}\ %w
+	set statusline+=%{&modified?'[+]':''}
+	set statusline+=%=
+	set statusline+=\ %y
+	"set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
+	"set statusline+=\[%{&fileformat}\]
+	set statusline+=\ %p%%
+	set statusline+=\ %l:%c
+	set statusline+=\ "
+]])
-- 
cgit v1.2.3