Neovimrc

󰃭 2025-06-28 (updated: 2025-06-28 )
vim.g.mapleader = " "

vim.opt.number = true
vim.opt.clipboard = 'unnamedplus'
vim.opt.hidden = true
vim.opt.tabstop = 4
vim.opt.expandtab = false
vim.opt.shiftwidth = 4

vim.opt.smartindent = true
vim.opt.autoindent = true
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.incsearch = true
vim.opt.hlsearch = true
vim.opt.encoding = "utf-8"
vim.opt.linebreak = true
vim.opt.breakindent = true
vim.opt.undofile = true

vim.opt.wildmenu = true
vim.opt.wildmode = "full"
vim.opt.wildignore = "*.o,*.obj,.terraform*,*.mov"
vim.opt.wildignorecase = true
vim.opt.wildoptions = "pum,tagfile,fuzzy"

vim.opt.mouse = "a"
vim.opt.conceallevel = 3
vim.opt.scrolloff = 999
vim.opt.cursorline = true
vim.opt.cursorlineopt = "both"
vim.opt.shortmess = "filnwxtToO"
vim.opt.ruler = true
vim.opt.signcolumn = "yes:2"

vim.opt.list = true
vim.opt.listchars = [[tab:┃ ]]

vim.opt.updatetime = 100

vim.cmd [[
colorscheme sorbet
highlight NonText ctermfg=245
highlight SpellBad cterm=underline ctermfg=11 ctermbg=16

filetype  plugin indent   on

highlight CurSearch           ctermfg = 255  ctermbg = 0
highlight Search              ctermfg = 11   ctermbg = 0
highlight IndentGuidesOdd                    ctermbg = 234
highlight IndentGuidesEven                   ctermbg = 233
highlight Conceal             ctermfg = 6    ctermbg  = 16
highlight Folded              ctermfg = 7    ctermbg  = 16
highlight Pmenu               ctermfg  = 255 ctermbg = 234
highlight jsObjectKey         ctermfg = 60
highlight jsObjectValue       ctermfg = 144
highlight jsxExpressionBlock  ctermfg = 144
highlight ExtraWhitespace                    ctermbg = red
match     ExtraWhitespace     /\s\+$/
]]

local ensure_packer = function()
	local fn = vim.fn
	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', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path })
		vim.cmd [[packadd packer.nvim]]
		return true
	end
	return false
end

local packer_bootstrap = ensure_packer()

require('packer').startup(function(use)
	use 'wbthomason/packer.nvim'

	use 'tpope/vim-fugitive'
	use 'lewis6991/gitsigns.nvim'
	use 'nvim-lualine/lualine.nvim'
	use 'neovim/nvim-lspconfig'
	use 'hashivim/vim-terraform'
	use {
		'nvim-telescope/telescope.nvim', tag = '0.1.8',
		requires = { { 'nvim-lua/plenary.nvim' } }
	}
	use({
		"iamcco/markdown-preview.nvim",
		run = function() vim.fn["mkdp#util#install"]() end,
	})

	-- Automatically set up your configuration after cloning packer.nvim
	-- Put this at the end after all plugins
	if packer_bootstrap then
		require('packer').sync()
	end
end)

-- GitSigns
require('gitsigns').setup {
	current_line_blame = true,
	signs = {
		add          = { text = '+' },
		change       = { text = '~' },
		delete       = { text = '-' },
		topdelete    = { text = '‾' },
		changedelete = { text = '~' },
		untracked    = { text = '┆' },
	},
}
vim.cmd [[
	highlight GitSignsAdd    ctermfg=10
	highlight GitSignsChange ctermfg=11
	highlight GitSignsDelete ctermfg=9
]]

require('lualine').setup {
	options = {
		theme = "gruvbox",
		always_show_tabline = true,
	},
	sections = {
		lualine_a = { 'mode' },
		lualine_b = { 'branch', 'diff', 'diagnostics' },
		lualine_c = { 'filename', 'filesize' },
		lualine_x = { 'encoding', 'fileformat', 'filetype' },
		lualine_y = { 'progress' },
		lualine_z = { 'location', 'searchcount' }
	},
	tabline = {
		lualine_a = { 'buffers' },
		lualine_b = {},
		lualine_c = {},
		lualine_x = {},
		lualine_y = { 'filename' },
		lualine_z = { 'tabs' }
	}
}


vim.diagnostic.config({
	signs = {
		text = {
			[vim.diagnostic.severity.ERROR] = '',
			[vim.diagnostic.severity.WARN] = '',
			[vim.diagnostic.severity.HINT] = '',
		},
		numhl = {
			[vim.diagnostic.severity.WARN] = 'WarningMsg',
		},
	},
})
local lspconfig = require('lspconfig')
--vim.lsp.set_log_level 'debug'
lspconfig.lua_ls.setup {
	settings = {
		Lua = {
			diagnostics = {
				globals = { "vim" }
			}
		}
	}
}
lspconfig.harper_ls.setup {
	filetypes = {
		'gitcommit',
		'markdown',
		'text',
	},
	settings = {
		["harper-ls"] = {
			userDictPath = "~/.config/harper/dict.txt",
			diagnosticSeverity = "warning"
		}
	},
}
require 'lspconfig'.ltex.setup {
	filetypes = { 'tex' }
}
require 'lspconfig'.bashls.setup {}
require 'lspconfig'.pyright.setup {
	settings = {
		python = {
			pythonPath = '~/.local/python/bin/python' }
	}
}
require 'lspconfig'.ts_ls.setup {}
--require'lspconfig'.terraform_lsp.setup{}
require 'lspconfig'.terraformls.setup {}

vim.g.terraform_fmt_on_save = 1
vim.g.terraform_fold_sections = 1
vim.g.mkdp_auto_start = 1

vim.cmd(
	[[
function OpenMarkdownPreview (url)
endfunction
]]
)
--execute "silent ! firefox --new-window " . a:url
vim.g.mkdp_browserfunc = 'OpenMarkdownPreview'

vim.keymap.set('i', 'jk', '<esc>', { noremap = true })
vim.keymap.set('i', 'JK', '<esc>', { noremap = true })
vim.keymap.set('n', '<Leader><Space>', 'o<Esc>', { noremap = true })
vim.keymap.set('n', '<leader>l', '$', { noremap = true })
vim.keymap.set('n', '<leader>h', '^', { noremap = true })
vim.keymap.set('n', '<leader>q', ':bdelete<CR>', { noremap = true })
vim.keymap.set('n', '<leader>ss', ':up<CR>', { noremap = true })
vim.keymap.set('n', '<leader>tt', ':! st & disown<CR><CR>', { noremap = true })
vim.keymap.set('n', '<leader>pp', ':CtrlP<CR>', { noremap = true })
vim.keymap.set('n', '<leader>j', ':m .+1<CR>==', { noremap = true })
vim.keymap.set('n', '<leader>k', ':m .-2<CR>==', { noremap = true })
vim.keymap.set('i', '<C-j>', '<Esc>:m .+1<CR>==gi', { noremap = true })
vim.keymap.set('i', '<C-k>', '<Esc>:m .-2<CR>==gi', { noremap = true })
vim.keymap.set('v', 'J', ":m '>+1<CR>gv=gv", { noremap = true })
vim.keymap.set('v', 'K', ":m '<-2<CR>gv=gv", { noremap = true })

vim.keymap.set('n', '<C-l>', ":bn<CR>", { noremap = true })
vim.keymap.set('n', '<C-h>', ":bp<CR>", { noremap = true })

vim.keymap.set('o', 'q', [[i"]], { noremap = true })
vim.keymap.set('o', 'q', [[i"]], { noremap = true })
vim.keymap.set('o', 'l', [[$]], { noremap = true })
vim.keymap.set('o', 'h', [[^]], { noremap = true })
vim.keymap.set('o', 'p', [[i(]], { noremap = true })
vim.keymap.set('o', 'P', [[a(]], { noremap = true })
vim.keymap.set('o', 'b', [[i[]], { noremap = true })
vim.keymap.set('o', 'B', [[a[]], { noremap = true })
vim.keymap.set('o', 'c', [[i{]], { noremap = true })
vim.keymap.set('o', 'C', [[a{]], { noremap = true })

vim.keymap.set('n', 'ghr', [[:Gitsigns reset_hunk<CR>]], { noremap = true })
vim.keymap.set('n', 'ghs', [[:Gitsigns stage_hunk<CR>]], { noremap = true })
vim.keymap.set('n', 'ghu', [[:Gitsigns undo_stage_hunk<CR>]], { noremap = true })
vim.keymap.set('n', 'ghp', [[:Gitsigns nav_hunk prev<CR>]], { noremap = true })
vim.keymap.set('n', 'ghn', [[:Gitsigns nav_hunk next<CR>]], { noremap = true })

vim.keymap.set('n', '<C-g>s', [[:Git<CR>]], { noremap = true })
vim.keymap.set('n', '<C-g>l', [[:G gr<CR>]], { noremap = true })
vim.keymap.set('n', '<C-g>c', [[:G commit<CR>]], { noremap = true })
vim.keymap.set('n', '<C-g>w', [[:Gwrite<CR>]], { noremap = true })
vim.keymap.set('n', '<C-g>b', [[:G blame<CR>]], { noremap = true })
vim.keymap.set('n', '<C-g>ps', [[:G push<CR>]], { noremap = true })
vim.keymap.set('n', '<C-g>pl', [[:G pull<CR>]], { noremap = true })

vim.keymap.set('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>', { noremap = true })
vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>', { noremap = true })
vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>', { noremap = true })
vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>', { noremap = true })
vim.keymap.set('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>', { noremap = true })
vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>', { noremap = true })
vim.keymap.set('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>', { noremap = true })
vim.keymap.set('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>', { noremap = true })
vim.keymap.set({ 'n', 'x' }, '<F3>', '<cmd>lua vim.lsp.buf.format({async = true})<cr>', { noremap = true })
vim.keymap.set('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>', { noremap = true })
vim.keymap.set('n', '<C-[>', '<cmd>lua vim.diagnostic.goto_prev()<CR>', { noremap = true })
vim.keymap.set('n', '<C-]>', '<cmd>lua vim.diagnostic.goto_next()<CR>', { noremap = true })

vim.keymap.set('n', '<leader>ff', '<cmd>Telescope find_files<cr>', { noremap = true })
vim.keymap.set('n', '<leader>fg', '<cmd>Telescope live_grep<cr>', { noremap = true })
vim.keymap.set('n', '<leader>fb', '<cmd>Telescope buffers<cr>', { noremap = true })
vim.keymap.set('n', '<leader>fh', '<cmd>Telescope help_tags<cr>', { noremap = true })

vim.cmd [[
inoreabbrev dont don't
inoreabbrev cant can't
inoreabbrev im i'm
inoreabbrev Im I'm
]]

vim.api.nvim_create_autocmd("BufWritePre", {
	pattern = {
		"*.lua",
		"*.json",
		"*.ts",
		"*.tf"
	},
	callback = function()
		vim.lsp.buf.format()
	end
})

vim.cmd [[autocmd BufWritePost *.py silent! execute "!black " expand("%") " >/dev/null 2>&1" | redraw!]]

vim.cmd [[autocmd BufWritePost *.tex execute "!pdflatex " expand("%") ]]

vim.cmd [[autocmd BufWritePost *.json silent! execute "!prettier -w --parser json " expand("%") " >/dev/null 2>&1" | redraw!]]