447 lines
17 KiB
VimL
447 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-treesitter/nvim-treesitter'
|
|
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"
|
|
},
|
|
}
|
|
})
|
|
|
|
require'nvim-treesitter.configs'.setup {
|
|
auto_install = false,
|
|
}
|
|
|
|
-- 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
|