DEVenv/Internal/os_nvim_init.vim
2025-08-13 22:04:29 +10:00

442 lines
17 KiB
VimL

" Plugins //////////////////////////////////////////////////////////////////////////////////////////
call plug#begin(stdpath('config') . '/plugged')
" nerdtree provides a file tree explorer
" vim-dispatch allows running async jobs in vim (i.e. builds in the background)
Plug 'https://github.com/scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
Plug 'https://github.com/tpope/vim-dispatch'
Plug 'https://github.com/tpope/vim-fugitive'
Plug 'https://github.com/tpope/vim-abolish'
Plug 'https://github.com/LunarVim/bigfile.nvim'
" FZF
Plug 'junegunn/fzf'
Plug 'ibhagwan/fzf-lua', {'branch': 'main'}
Plug 'nvim-tree/nvim-web-devicons'
" Other ////////////////////////////////////////////////////////////////////////////////////////
" TODO: 2022-06-19 Treesitter is too slow on large C++ files
" Plug 'https://github.com/nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
Plug 'junegunn/vim-easy-align'
Plug 'https://github.com/bfrg/vim-cpp-modern'
Plug 'https://github.com/ggandor/leap.nvim'
Plug 'https://github.com/sainnhe/gruvbox-material'
Plug 'https://github.com/Tetralux/odin.vim' "Odin Syntax highlighting
" NOTE: LLM
Plug 'nvim-lua/plenary.nvim'
Plug 'olimorris/codecompanion.nvim'
" lsp-zero begin
" LSP Support
Plug 'williamboman/mason.nvim'
Plug 'williamboman/mason-lspconfig.nvim'
Plug 'neovim/nvim-lspconfig'
Plug 'hrsh7th/nvim-cmp'
Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'L3MON4D3/LuaSnip'
Plug 'hrsh7th/cmp-buffer'
Plug 'hrsh7th/cmp-path'
" lsp-zero end
call plug#end()
" Lua Setup ////////////////////////////////////////////////////////////////////////////////////////
lua <<EOF
local leap = require('leap')
vim.keymap.set({'n', 'x', 'o'}, '<tab>', '<Plug>(leap)')
vim.keymap.set({'n', 'x', 'o'}, '<S-tab>', '<Plug>(leap-from-window)')
require('bigfile').setup()
require('fzf-lua').setup{
winopts = {
height=0.95,
width=0.95
}
}
-- Vim Dispatch //////////////////////////////////////////////////////////////////////////////////
if vim.fn.has('win64') or vim.fn.has('win32') or vim.fn.has('win16') then
if os.getenv('SHELL') ~= nil then
vim.o.shellcmdflag = '-c'
vim.o.makeprg = "./build.sh"
else
vim.o.makeprg = "build.bat"
end
else
-- vim.api.nvim_set_keymap('t', '<Esc>', '<C-\\><C-n>', {noremap = true})
vim.o.makeprg = "./build.sh"
end
vim.api.nvim_set_keymap('n', '<C-b>', ':Make<CR>', {noremap = true})
-- LSP Setup /////////////////////////////////////////////////////////////////////////////////////
require('mason').setup({})
require('mason-lspconfig').setup({
ensure_installed = { "clangd" },
automatic_enable = true
})
local opts = { noremap = true, silent = true }
vim.keymap.set("n", "<F2>", vim.lsp.buf.rename, opts)
vim.keymap.set("n", "<F4>", vim.lsp.buf.code_action, opts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
local cmp = require('cmp')
cmp.setup({
sources = {
{name = 'nvim_lsp'},
{name = 'buffer'},
{name = 'path'},
},
mapping = cmp.mapping.preset.insert({
['<CR>'] = cmp.mapping.confirm({select = false}),
['<Tab>'] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }),
['<S-Tab>'] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }),
}),
snippet = {
expand = function(args)
require('luasnip').lsp_expand(args.body)
end,
},
--- (Optional) Show source name in completion menu
formatting = cmp_format,
})
require("codecompanion").setup({
display = {
chat = {
auto_scroll = false,
fold_context = true,
show_settings = true,
show_header_separator = true,
}
},
adapters = {
opts = {
show_defaults = false,
},
llamafile = function()
return require("codecompanion.adapters").extend("openai_compatible", {
env = {
url = "http://127.0.0.1:7483", -- optional: default value is ollama url http://127.0.0.1:11434
chat_url = "/v1/chat/completions", -- optional: default value, override if different
-- api_key = "OpenAI_API_KEY", -- optional: if your endpoint is authenticated
-- models_endpoint = "/v1/models", -- optional: attaches to the end of the URL to form the endpoint to retrieve models
},
-- schema = {
-- model = {
-- default = "deepseek-r1-671b", -- define llm model to be used
-- },
-- temperature = {
-- order = 2,
-- mapping = "parameters",
-- type = "number",
-- optional = true,
-- default = 0.8,
-- desc = "What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We generally recommend altering this or top_p but not both.",
-- validate = function(n)
-- return n >= 0 and n <= 2, "Must be between 0 and 2"
-- end,
-- },
-- max_completion_tokens = {
-- order = 3,
-- mapping = "parameters",
-- type = "integer",
-- optional = true,
-- default = nil,
-- desc = "An upper bound for the number of tokens that can be generated for a completion.",
-- validate = function(n)
-- return n > 0, "Must be greater than 0"
-- end,
-- },
-- stop = {
-- order = 4,
-- mapping = "parameters",
-- type = "string",
-- optional = true,
-- default = nil,
-- desc = "Sets the stop sequences to use. When this pattern is encountered the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.",
-- validate = function(s)
-- return s:len() > 0, "Cannot be an empty string"
-- end,
-- },
-- logit_bias = {
-- order = 5,
-- mapping = "parameters",
-- type = "map",
-- optional = true,
-- default = nil,
-- desc = "Modify the likelihood of specified tokens appearing in the completion. Maps tokens (specified by their token ID) to an associated bias value from -100 to 100. Use https://platform.openai.com/tokenizer to find token IDs.",
-- subtype_key = {
-- type = "integer",
-- },
-- subtype = {
-- type = "integer",
-- validate = function(n)
-- return n >= -100 and n <= 100, "Must be between -100 and 100"
-- end,
-- },
-- },
-- },
})
end,
},
strategies = {
chat = {
adapter = "llamafile"
},
inline = {
adapter = "llamafile"
},
cmd = {
adapter = "llamafile"
},
}
})
-- Treesitter ////////////////////////////////////////////////////////////////////////////////////
-- TODO: 2022-06-19 Treesitter is too slow on large C++ files
-- require('nvim-treesitter.configs').setup {
-- ensure_installed = { "c", "cpp" }, -- A list of parser names, or "all"
-- sync_install = false, -- Install parsers synchronously (only applied to `ensure_installed`)
-- ignore_install = { }, -- List of parsers to ignore installing (for "all")
-- highlight = {
-- enable = false, -- `false` will disable the whole extension
-- -- 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 = { },
-- -- 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 = false,
-- },
-- }
-- Per-Project Bindings /////////////////////////////////////////////////////////////////////////////
-- Automatically load project file on buffer enter
vim.api.nvim_create_autocmd({"BufEnter"}, {
callback = function(ev)
local project_file = vim.fn.expand('%:p:h') .. '/project_nvim.lua'
if vim.fn.filereadable(project_file) == 1 then
vim.cmd('luafile ' .. vim.fn.fnameescape(project_file))
end
end
})
-- Vim Options ///////////////////////////////////////////////////////////////////////////////////
vim.opt.autowrite=true -- Automatically save before cmds like :next and :prev
vim.opt.colorcolumn={80, 100} -- Set a 80 and 100 char column ruler
vim.opt.completeopt={'menu', 'menuone', 'noselect'}
vim.opt.cpoptions:append('$') -- $ as end marker for the change operator
vim.opt.cursorline=true -- Highlight current line
vim.opt.expandtab=true -- Replace tabs with spaces
vim.opt.guifont='JetBrains_Mono:h9','Consolas:h9','InputMonoCondensed:h9'
vim.opt.hlsearch=false -- Highlight just the first match on search
vim.opt.ignorecase=true -- Search is not case sensitive
vim.opt.linebreak=true -- On wrapped lines, break on the wrapping word intelligently
vim.opt.list=true -- Show the 'listchar' characters on trailing spaces, tabs e.t.c ===
vim.opt.listchars:append('tab:>-,trail:■,extends:»,precedes:«')
vim.opt.number=true -- Show line numbers
vim.opt.relativenumber=true -- Show relative line numbers
vim.opt.shiftwidth=4 -- Number of spaces for each autoindent step
vim.opt.splitright=true -- Open new splits to the right of the current one
vim.opt.swapfile=false -- Disable swapfile (stores the things changed in a file)
vim.opt.textwidth=80 -- On format, format to 80 char long lines
vim.opt.visualbell=true -- Flash the screen on error
vim.opt.wrap=false -- Don't wrap lines of text automatically
vim.opt.signcolumn = 'no'
vim.diagnostic.config({
-- Turn off the diagnostics signs on the line number. In LSP mode, editing
-- a C++ buffer constantly toggles the sign column on and off as you change
-- modes which is very visually distracting.
signs = false,
virtual_text = true
})
-- Automatically scroll to bottom of quickfix window when opened
vim.cmd([[
autocmd FileType qf lua vim.cmd('normal! G')
]])
EOF
" Theme ////////////////////////////////////////////////////////////////////////////////////////////
let g:gruvbox_material_background='hard'
let g:gruvbox_material_foreground='mix'
let g:gruvbox_material_disable_italic_comment=1
let g:gruvbox_material_enable_italic=0
let g:gruvbox_material_enable_bold=0
let g:gruvbox_material_diagnostic_virtual_text='colored'
let g:gruvbox_material_better_performance=1
colorscheme gruvbox-material
" Vim-cpp-modern customisation
" Disable function highlighting (affects both C and C++ files)
let g:cpp_function_highlight = 1
" Enable highlighting of C++11 attributes
let g:cpp_attributes_highlight = 1
" Highlight struct/class member variables (affects both C and C++ files)
let g:cpp_member_highlight = 0
" Put all standard C and C++ keywords under Vim's highlight group 'Statement'
" (affects both C and C++ files)
let g:cpp_simple_highlight = 1
" Options //////////////////////////////////////////////////////////////////////////////////////////
" Show EOL type and last modified timestamp, right after the filename
set statusline=%<%F%h%m%r\ [%{&ff}]\ (%{strftime(\"%H:%M\ %d/%m/%Y\",getftime(expand(\"%:p\")))})%=%l,%c%V\ %P
" File patterns to ignore in command line auto complete
set wildignore+=*.class,*.o,*\\tmp\\*,*.swp,*.zip,*.exe,*.obj,*.vcxproj,*.pdb,*.idb
" Setup undo file
set undofile
let &undodir=stdpath('config') . '/undo'
" Setup backup directory
let &backupdir=stdpath('config') . '/backup'
" Enable mouse support
if has('mouse')
set mouse=a
endif
" Functions ////////////////////////////////////////////////////////////////////////////////////////
" Increase font size using (Ctrl+Up Arrow) or (Ctrl+Down Arrow) if we are using
" gvim Otherwise font size is determined in terminal
nnoremap <C-Up> :silent! let &guifont = substitute(
\ &guifont,
\ ':h\zs\d\+',
\ '\=eval(submatch(0)+1)',
\ 'g')<CR>
nnoremap <C-Down> :silent! let &guifont = substitute(
\ &guifont,
\ ':h\zs\d\+',
\ '\=eval(submatch(0)-1)',
\ 'g')<CR>
" Formatting options (see :h fo-table)
augroup persistent_settings
au!
au bufenter * :set formatoptions=q1j
augroup end
function! RADDbgOpenFile()
execute("!dev raddbg --ipc open " . substitute(expand("%:p"), '\\', '/', 'g'))
execute("!dev raddbg --ipc goto_line " . line("."))
execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate('The RAD Debugger')")
endfunction
command RADDbgOpenFile call RADDbgOpenFile()
function! RADDbgStartDebugging()
execute("!dev raddbg --ipc run")
endfunction
command RADDbgStartDebugging call RADDbgStartDebugging()
function! RADDbgStopDebugging()
execute("!dev raddbg --ipc kill_all")
endfunction
command RADDbgStopDebugging call RADDbgStopDebugging()
function! RADDbgRunToCursor()
execute("!dev raddbg --ipc open " . substitute(expand("%:p"), '\\', '/', 'g'))
execute("!dev raddbg --ipc goto_line " . line("."))
execute("!dev raddbg --ipc run_to_cursor " . substitute(expand("%:p"), '\\', '/', 'g') . ":" . line("."))
execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate('The RAD Debugger')")
endfunction
command RADDbgRunToCursor call RADDbgRunToCursor()
function! RADDbgAddBreakpointAtFile()
execute("!dev raddbg --ipc open " . substitute(expand("%:p"), '\\', '/', 'g'))
execute("!dev raddbg --ipc goto_line " . line("."))
execute("!dev raddbg --ipc toggle_breakpoint " . substitute(expand("%:p"), '\\', '/', 'g') . ":" . line("."))
execute("!powershell -Command Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::AppActivate('The RAD Debugger')")
endfunction
command RADDbgAddBreakpointAtFile call RADDbgAddBreakpointAtFile()
nnoremap <silent> <F6> <cmd>RADDbgOpenFile<cr><cr>
nnoremap <silent> <F5> <cmd>RADDbgStartDebugging<cr><cr>
nnoremap <silent> <S-F5> <cmd>RADDbgStopDebugging<cr><cr>
nnoremap <silent> <F9> <cmd>RADDbgAddBreakpointAtFile<cr><cr>
nnoremap <silent> <C-F10> <cmd>RADDbgRunToCursor<cr><cr>
" General Key Bindings /////////////////////////////////////////////////////////////////////////////
" FZF Bindings
nnoremap <leader>h <cmd>FzfLua oldfiles<cr>
nnoremap <leader>f <cmd>FzfLua files<cr>
nnoremap <leader>r <cmd>FzfLua live_grep<cr>
nnoremap <leader>R <cmd>FzfLua grep_cword<cr>
nnoremap <leader>t <cmd>FzfLua lsp_live_workspace_symbols<cr>
nnoremap <leader>T <cmd>FzfLua lsp_finder<cr>
nnoremap <leader>b <cmd>FzfLua buffers<cr>
nnoremap <leader>c <cmd>CodeCompanionChat toggle<cr>
nnoremap <leader><leader> <cmd>FzfLua<cr>
" Map Ctrl+HJKL to navigate buffer window
nmap <silent> <C-h> :wincmd h<CR>
nmap <silent> <C-j> :wincmd j<CR>
nmap <silent> <C-k> :wincmd k<CR>
nmap <silent> <C-l> :wincmd l<CR>
" Move by wrapped lines instead of line numbers
nnoremap j gj
nnoremap k gk
nnoremap gj j
nnoremap gk k
" Map NERDTree to Ctrl-N
map <C-n> :NERDTreeToggle<CR>
" Change to current buffer's directory
nmap cd :cd <C-R>=expand("%:p:h")<CR><CR>
" Buffer Splitting
nnoremap <leader>s :vs<CR>
" Go to next error
" Go to previous error
nnoremap <A-j> :cn<CR>
nnoremap <A-k> :cp<CR>
" In Neovim terminal, pressing <ESC> should go back into normal mode.
" Without this, this doesn't happen and you stay stuck in insert mode.
tnoremap <Esc> <C-\><C-n>
" Easy-Align ///////////////////////////////////////////////////////////////////////////////////////
let g:easy_align_delimiters = {
\ '>': { 'pattern': '>>\|=>\|>' },
\ '/': {
\ 'pattern': '//\+\|/\*\|\*/',
\ 'delimiter_align': 'l',
\ 'ignore_groups': ['!Comment'] },
\ ']': {
\ 'pattern': '[[\]]',
\ 'left_margin': 0,
\ 'right_margin': 0,
\ 'stick_to_left': 0
\ },
\ ')': {
\ 'pattern': '[)]',
\ 'left_margin': 0,
\ 'right_margin': 0,
\ 'stick_to_left': 0
\ },
\ '(': {
\ 'pattern': '[(]',
\ 'left_margin': 0,
\ 'right_margin': 0,
\ 'stick_to_left': 0
\ },
\ }
" Enter live-interactive easy align mode when a visual selection is active
xmap <leader>a <Plug>(LiveEasyAlign