Compare commits

...

11 Commits

Author SHA1 Message Date
Radu Macocian (admac) 3fe4aa1205 added go dap 2026-06-27 22:08:38 +02:00
Radu Macocian (admac) c6739ea0da Removed C-e C-y shortcuts on neoscroll 2026-06-22 20:08:03 +02:00
Radu Macocian (admac) 1b406704ad Fixed tidal 2026-06-12 16:56:09 +02:00
Radu Macocian (admac) aeab462a8b fixed eslint 2026-06-01 09:13:18 +02:00
Radu Macocian (admac) 7ba072972f enabled ts_ls 2026-05-31 10:16:12 +02:00
Radu Macocian (admac) 99a9f3ae12 added smooth scroll 2026-05-12 16:32:42 +02:00
Radu Macocian (admac) 5d1755fe96 changed code companion models 2026-05-12 16:27:32 +02:00
Radu Macocian (admac) 815f689f3c fixed code companion 2026-04-30 16:27:09 +02:00
Radu Macocian (admac) c201aa51db added autoread 2026-04-30 15:33:24 +02:00
Radu Macocian (admac) 15e7488d64 removed install.sh 2026-04-30 15:23:49 +02:00
Radu Macocian (admac) dab574ff79 added snacks terminal handling 2026-04-30 15:20:12 +02:00
15 changed files with 262 additions and 93 deletions
+19 -3
View File
@@ -5,13 +5,13 @@ require('codecompanion').setup({
opts = {
title_generation_opts = {
adapter = "openrouter",
model = "minimax/minimax-m2.5"
model = "qwen/qwen3.6-flash"
}
},
summary = {
generation_opts = {
adapter = "openrouter",
model = "minimax/minimax-m2.5"
model = "qwen/qwen3.6-flash"
}
}
},
@@ -41,7 +41,7 @@ require('codecompanion').setup({
},
schema = {
model = {
default = "qwen/qwen3.5-plus-02-15",
default = "qwen/qwen3.6-flash",
},
},
})
@@ -64,3 +64,19 @@ require('codecompanion').setup({
})
vim.keymap.set('n', '<leader>gpt', function() require("codecompanion").chat({ strategy = "agent" }) end);
vim.keymap.set('n', 'gpi', function()
Snacks.input({ prompt = "Prompt: " }, function(input)
if input and input ~= "" then
vim.cmd("CodeCompanion " .. input)
end
end)
end)
vim.keymap.set('v', 'gpi', function()
Snacks.input({ prompt = "Prompt (with context): " }, function(input)
if input and input ~= "" then
vim.cmd("'<,'>CodeCompanion " .. input)
end
end)
end)
+8 -1
View File
@@ -10,6 +10,7 @@ dap.listeners.after.event_exited["dapui_config"] = function() dapui.close() end
local dotnet = require("dap.dap-dotnet")
local odoo = require("dap.dap-odoo")
local haskell = require("dap.dap-haskell")
local go = require("dap.dap-go")
vim.keymap.set("n", "<leader>5", function()
@@ -18,6 +19,10 @@ vim.keymap.set("n", "<leader>5", function()
return
end
local ft = vim.bo.filetype
if ft == "go" then
go.debug_go()
return
end
if ft == "cs" or ft == "fsharp" or ft == "vb" then
dotnet.debug_dotnet_from_sln()
return
@@ -39,7 +44,9 @@ vim.keymap.set("n", "<leader>b", function() dap.toggle_breakpoint() end)
vim.keymap.set("n", "<leader>B", function() dap.set_breakpoint(vim.fn.input("Breakpoint condition: ")) end)
vim.keymap.set("n", "<leader>qd", function() dap.terminate() end)
vim.keymap.set("n", "<leader>rd", function() dap.restart() end)
vim.keymap.set("n", "<leader>dt", odoo.run_odoo_test_at_cursor, { desc = "Debug Odoo Test unde Cursor" })
vim.keymap.set("n", "<leader>dt", function()
odoo.run_odoo_test_at_cursor()
end, { desc = "Debug Test under Cursor" })
dap.configurations.python = {
{
+10 -3
View File
@@ -12,7 +12,7 @@ local angular_cmd = {
'--tsProbeLocations',
project_library_path,
'--ngProbeLocations',
project_library_path .. '@angular/language-server'
project_library_path .. '/@angular/language-server'
}
vim.lsp.config("ts_ls", {})
@@ -23,6 +23,7 @@ vim.lsp.config("angularls", {
end
})
vim.lsp.config("ruff", {})
vim.lsp.config("gopls", {})
vim.lsp.config("cssls", {})
vim.lsp.config("lua_ls", {})
vim.lsp.config("hls", {})
@@ -41,15 +42,21 @@ vim.lsp.config("eslint", {
root_markers = { ".eslintrc", ".eslintrc.json", ".eslintrc.js", "package.json", ".git" },
filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact", "vue", "svelte" },
settings = {
eslint = {
validate = "on",
packageManager = "npm",
workingDirectory = { mode = "auto" },
debug = true,
format = true,
format = { enable = true },
}
},
on_attach = function(client, bufnr)
client.server_capabilities.documentFormattingProvider = true
client.server_capabilities.documentRangeFormattingProvider = true
end,
})
vim.lsp.enable({ "angularls", "odoo_ls", "hls", "ruff", "eslint", "cssls", "lua_ls", "lemminx", "qmlls" })
vim.lsp.enable({ "angularls", "ts_ls", "odoo_ls", "hls", "ruff", "eslint", "cssls", "lua_ls", "lemminx", "qmlls", "gopls" })
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('user_lsp_attach', { clear = true }),
+1 -1
View File
@@ -1,6 +1,6 @@
local neogit = require('neogit')
vim.keymap.set("n", "<leader>gs", function()
neogit.open({ kind= "floating" })
neogit.open()
end
)
+19
View File
@@ -0,0 +1,19 @@
local neoscroll = require('neoscroll')
neoscroll.setup({
easing = 'quadratic',
mappings = {
},
})
local keymap = {
['<C-u>'] = function() neoscroll.ctrl_u({ duration = 125 }) end,
['<C-d>'] = function() neoscroll.ctrl_d({ duration = 125 }) end,
['<C-b>'] = function() neoscroll.ctrl_b({ duration = 200 }) end,
['<C-f>'] = function() neoscroll.ctrl_f({ duration = 200 }) end,
['zt'] = function() neoscroll.zt({ half_win_duration = 125 }) end,
['zz'] = function() neoscroll.zz({ half_win_duration = 125 }) end,
['zb'] = function() neoscroll.zb({ half_win_duration = 125 }) end,
}
for key, func in pairs(keymap) do
vim.keymap.set({ 'n', 'v', 'x' }, key, func)
end
+6 -2
View File
@@ -86,5 +86,9 @@ local function toggle_term(fullscreen)
end
end
vim.keymap.set({ "n", "t" }, "<leader>tt", function() toggle_term(false) end, { desc = "Terminal (split)" })
vim.keymap.set({ "n", "t" }, "<leader>tT", function() toggle_term(true) end, { desc = "Terminal (fullscreen)" })
vim.keymap.set("n", "<leader>tt", function() toggle_term(false) end, { desc = "Terminal (split)" })
vim.keymap.set("n", "<leader>tT", function() toggle_term(true) end, { desc = "Terminal (fullscreen)" })
vim.keymap.set("t", "<C-t>", function()
local w = find_term_win()
if w then vim.api.nvim_win_close(w, true) end
end, { desc = "Hide terminal" })
+72
View File
@@ -1,2 +1,74 @@
vim.keymap.set("n", "<leader>tl", "<cmd>TidalLaunch<cr>")
vim.keymap.set("n", "<leader>tq", "<cmd>TidalQuit<cr>")
local scd = os.getenv("HOME") .. "/.local/share/tidal/BootSuperDirt.scd"
local function superdirt_running()
local id = vim.g.superdirt_job
return id and id > 0 and vim.fn.jobwait({ id }, 0)[1] == -1
end
local function log_buf()
local b = vim.g.superdirt_buf
if not (b and vim.api.nvim_buf_is_valid(b)) then
b = vim.api.nvim_create_buf(false, true)
vim.api.nvim_buf_set_name(b, "SuperDirt")
vim.g.superdirt_buf = b
end
return b
end
local function append(_, data)
if not data then return end
vim.schedule(function()
local lines = {}
for _, l in ipairs(data) do
l = l:gsub("\r", "")
table.insert(lines, l)
if l:match("SuperDirt:%s*listening") then
vim.notify("SuperDirt ready", vim.log.levels.INFO)
elseif l:match("ERROR") then
vim.notify("SuperDirt: " .. l, vim.log.levels.ERROR)
end
end
vim.api.nvim_buf_set_lines(log_buf(), -1, -1, false, lines)
end)
end
vim.api.nvim_create_user_command("SuperDirtLog", function()
vim.cmd("botright split")
vim.api.nvim_win_set_buf(0, log_buf())
end, { desc = "Open SuperDirt output log" })
local group = vim.api.nvim_create_augroup("TidalSuperDirt", { clear = true })
vim.api.nvim_create_autocmd("User", {
group = group,
pattern = "TidalLaunch",
callback = function()
if superdirt_running() then
vim.notify("SuperDirt already running", vim.log.levels.INFO)
return
end
vim.fn.deletebufline(log_buf(), 1, "$")
vim.g.superdirt_job = vim.fn.jobstart({ "sclang", scd }, {
on_stdout = append,
on_stderr = append,
on_exit = function() vim.g.superdirt_job = nil end,
})
if vim.g.superdirt_job <= 0 then
vim.notify("Failed to start sclang (is SuperCollider installed?)", vim.log.levels.ERROR)
else
vim.notify("Booting SuperDirt... (:SuperDirtLog for output)", vim.log.levels.INFO)
end
end,
})
vim.api.nvim_create_autocmd("VimLeavePre", {
group = group,
callback = function()
if superdirt_running() then
vim.fn.jobstop(vim.g.superdirt_job)
end
end,
})
+1 -1
View File
@@ -5,7 +5,7 @@ local M = {}
-- Adapter (netcoredbg)
dap.adapters.coreclr = {
type = "executable",
command = "/home/radu/.local/share/nvim/mason/bin/netcoredbg",
command = vim.fn.expand("$HOME/.local/share/nvim/mason/bin/netcoredbg"),
args = { "--interpreter=vscode" },
}
+53
View File
@@ -0,0 +1,53 @@
local dap = require("dap")
local M = {}
-- Locate the delve binary (prefer mason, fall back to PATH).
local function dlv_command()
local mason = vim.fn.expand("$HOME/.local/share/nvim/mason/bin/dlv")
if vim.fn.filereadable(mason) == 1 then
return mason
end
return "dlv"
end
-- Adapter: run delve in DAP server mode on a free port.
dap.adapters.go = {
type = "server",
port = "${port}",
executable = {
command = dlv_command(),
args = { "dap", "-l", "127.0.0.1:${port}" },
},
}
-- Walk upwards from the current file to find the Go module root (go.mod).
local function find_go_root()
local start = vim.fn.expand("%:p:h")
if start == "" then
start = vim.fn.getcwd()
end
local found = vim.fs.find("go.mod", { upward = true, path = start })[1]
if found then
return vim.fn.fnamemodify(found, ":h")
end
return nil
end
-- Find the module root and launch a delve debug session of the whole project.
function M.debug_go()
local root = find_go_root()
if not root then
vim.notify("No go.mod found upwards from current file.", vim.log.levels.ERROR)
return
end
dap.run({
type = "go",
request = "launch",
name = "Debug project",
program = root,
cwd = root,
})
end
return M
+2 -8
View File
@@ -35,18 +35,11 @@ require("lazy").setup({
end,
},
{
"thgrund/tidal.nvim",
"https://codeberg.org/MrReason/tidal.nvim",
opts = {
boot = {
tidal = {
cmd = os.getenv("HOME") .. "/.ghcup/bin/ghci",
highlight = {
autostart = true,
},
},
sclang = {
enabled = true,
file = os.getenv("HOME") .. "/.local/share/tidal/BootSuperDirt.scd",
},
},
},
@@ -89,6 +82,7 @@ require("lazy").setup({
},
'tpope/vim-surround',
'sphamba/smear-cursor.nvim',
'karb94/neoscroll.nvim',
{
"folke/persistence.nvim",
event = "BufReadPre",
+14 -2
View File
@@ -1,5 +1,5 @@
vim.g.mapleader = " "
vim.keymap.set("n", "<leader>pv", function ()
vim.keymap.set("n", "<leader>pv", function()
require("oil").toggle_float()
end)
@@ -37,6 +37,18 @@ vim.keymap.set("n", "<leader>k", "<cmd>lnext<CR>zz")
vim.keymap.set("n", "<leader>j", "<cmd>lprev<CR>zz")
vim.keymap.set("n", "<leader>s", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gi<Left><Left><Left>]])
vim.keymap.set("n", "<leader>x", "<cmd>!chmod _x %<CR>", { silent = true})
vim.keymap.set("n", "<leader>x", "<cmd>!chmod _x %<CR>", { silent = true })
vim.keymap.set('n', '<leader>;', ':A<CR>', { desc = 'Alternate file' })
vim.keymap.set('n', '<leader>\\', function()
local path = vim.fn.expand('%:p')
local target
if path:find('/pos_loyalty_new/', 1, true) then
target = path:gsub('/pos_loyalty_new/', '/pos_loyalty/')
elseif path:find('/pos_loyalty/', 1, true) then
target = path:gsub('/pos_loyalty/', '/pos_loyalty_new/')
else
return vim.notify('Not in pos_loyalty or pos_loyalty_new', vim.log.levels.WARN)
end
vim.cmd('edit ' .. vim.fn.fnameescape(target))
end, { desc = 'Toggle pos_loyalty ↔ pos_loyalty_new' })
+7
View File
@@ -26,5 +26,12 @@ vim.opt.signcolumn = "yes"
vim.opt.isfname:append("@-@")
vim.opt.updatetime = 50
vim.opt.autoread = true
vim.api.nvim_create_autocmd({ "FocusGained", "BufEnter", "CursorHold" }, {
callback = function()
vim.cmd("checktime")
end,
})
vim.g.mapleader = " "
+39
View File
@@ -0,0 +1,39 @@
# AGENTS.md
Agent-agnostic guidance for any coding agent working in this repository. Keep all agent-agnostic instructions in this file. Agent-specific guidance lives in the agent's own file (e.g. `CLAUDE.md`).
## Repository purpose
Personal dotfiles repo. The working tree is structured to be cloned/symlinked at `$HOME` — the path `.config/nvim/` here corresponds to `~/.config/nvim/` on the user's machine. There is no build, test, or lint step; changes are validated by reloading Neovim.
`.gitignore` excludes `.config/nvim/lazy-lock.json` (lazy.nvim's plugin lockfile is not tracked).
## Neovim configuration architecture
Entry points and load order:
1. `.config/nvim/init.lua``require("wicked")`
2. `.config/nvim/lua/wicked/init.lua` requires, in order: `wicked.remap` (keymaps), `wicked.set` (options), `wicked.lazy` (plugin manager bootstrap + spec).
3. After `lazy.setup` runs, Neovim sources every file under `.config/nvim/after/plugin/*.lua` automatically (standard `after/` runtime path). Each of those files configures one plugin loaded by lazy.
This means: plugin **declarations** live in `lua/wicked/lazy.lua`, but plugin **configuration** (setup calls, keymaps, autocmds) lives in `after/plugin/<name>.lua`. When adding a plugin, both files usually need a change unless the plugin is configured inline via `opts`/`config` in the lazy spec.
DAP adapters are split out under `lua/dap/` (`dap-haskell.lua`, `dap-odoo.lua`, `dap-dotnet.lua`) and are required from `after/plugin/dap.lua`.
Leader key is `<Space>`, set in both `remap.lua` and `set.lua` (the duplicate in `set.lua` is intentional defensive ordering).
## Notable plugin choices
- **lazy.nvim** with `checker.enabled = true` (auto-checks for updates daily).
- **snacks.nvim** is used for picker/terminal/etc. — it replaced telescope (see commit `12db5d8`). Don't reintroduce telescope.
- **everforest** is the active colorscheme; nord is installed but not active.
- **codecompanion.nvim** pinned to `^18.0.0`.
- **roslyn.nvim** for C# LSP (separate from the standard `nvim-lspconfig` flow).
- **tidal.nvim** + **strudel.nvim** for live-coding music; tidal expects `ghci` at `~/.ghcup/bin/ghci` and a SuperDirt boot file at `~/.local/share/tidal/BootSuperDirt.scd`.
- **obsidian.nvim** workspace points at `~/notes`.
- **persistence.nvim** stores sessions under `stdpath("state")/sessions/`.
- Undo files live at `~/.vim/undodir` (set in `wicked/set.lua`), not the default location.
## Working in this repo
- To preview changes, reload Neovim or `:source` the affected file. There are no CI or test commands to run.
- `lazy-lock.json` is gitignored — don't try to commit it. Plugin version pinning happens via the spec in `lua/wicked/lazy.lua`.
+7
View File
@@ -0,0 +1,7 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
See [AGENTS.md](./AGENTS.md) for the repository overview, architecture, and working conventions. All agent-agnostic instructions belong in `AGENTS.md`. Only Claude-specific instructions or skill references belong in this file.
<!-- Add Claude-specific instructions or skill references below this line. -->
-68
View File
@@ -1,68 +0,0 @@
#!/bin/bash
echo "----- Cloning homefull-api -----"
if [ -d "$HOME/projects/homefull-api" ]; then
echo "[Skipped] homefull-api already exists"
else
git clone https://github.com/macocianradu/homefull-api.git\
~/projects/homefull-api
fi
echo "----- Cloning homefull-gui -----"
if [ -d "$HOME/projects/homefull-gui" ]; then
echo "[Skipped] homefull-gui already exists"
else
git clone https://github.com/macocianradu/homefull-gui.git\
~/projects/homefull-gui
fi
if [[ "$OSTYPE" == "linux"* ]]; then
echo "----- Linux-Gnu detected -----"
nvim_path="/opt/nvim-linux64"
echo "----- Downloading NVIM -----"
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz
sudo rm -rf /opt/nvim
echo "Copying NVIM to /opt/nvim-linux64"
sudo tar -C /opt -xzf nvim-linux64.tar.gz
echo "Adding NVIM to PATH in ./bashrc"
echo "export PATH="\$PATH:$nvim_path/bin"" >> ~/.bashrc
echo "NVIM added to path, run '. ~/.bashrc' to reload PATH variable"
elif [[ "$OSTYPE" == "darwin"* ]]; then
echo "----- OSX detected -----"
nvim_path="~/Applications/nvim"
if [ -d "$HOME/Applications/nvim" ]; then
echo "[Skipped] NVIM already installed"
else
echo "----- Downloading nvim -----"
curl -LO https://github.com/neovim/neovim/releases/download/nightly/nvim-macos-arm64.tar.gz
tar xzf nvim-macos-arm64.tar.gz
mv nvim-macos-arm64 $nvim_path
fi
fi
if [[ ! -d "$HOME/.local/share/nvim/roslyn" ]] then
echo "----- Roslyn LS not detected: Downloading now -----"
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
ls_url="https://zaxvsblobprodwus215.vsblob.vsassets.io/b-63b6279ad2f14bc3a21cdb7614e92831/5787C047B250801723E628CEF9CA582F82C848FE406E4553BA02BF5ECA870EBD00.blob?sv=2019-07-07&sr=b&si=1&sig=L9sr005TS6IonkYAeB7KYh7kW9CnWNr9MAqNu4ypEUo%3D&spr=https&se=2024-08-19T00%3A25%3A13Z&rscl=x-e2eid-ec16adad-34c8456c-80536072-32aeec7d-session-ec16adad-34c8456c-80536072-32aeec7d&rscd=attachment%3B%20filename%3D%22Microsoft.CodeAnalysis.LanguageServer.linux-x64.4.12.0-2.24417.1.nupkg%22&P1=1724037911&P2=1&P3=2&P4=gWMe2EcOpfH3DR3WcrRHHNy7Tdsz8N7QuAZdgHUJfyk%3d"
elif [[ "$OSTYPE" == "darwin"* ]]; then
ls_url="https://etjvsblobprodwus2172.vsblob.vsassets.io/b-63b6279ad2f14bc3a21cdb7614e92831/270B5B41FCC924B78FFAAEC2E2F6623DDEE782E2EB8AD71C9661A7144E9B399C00.blob?sv=2019-07-07&sr=b&si=1&sig=Y2Eil5keeY2ZyHlm%2FOZPZz%2FfkZhWgII31wn0q0Kuu0g%3D&spr=https&se=2024-08-19T00%3A42%3A54Z&rscl=x-e2eid-0ae75aa5-b81e4f13-bef4006c-4791577b-session-0ae75aa5-b81e4f13-bef4006c-4791577b&rscd=attachment%3B%20filename%3D%22Microsoft.CodeAnalysis.LanguageServer.osx-arm64.4.12.0-2.24417.1.nupkg%22&P1=1724038971&P2=1&P3=2&P4=4%2b936oMTgkM4TFkxnmVVzhCHlRl4L3LpTq2trVyzSMQ%3d"
mkdir temp
curl $ls_url\
-o temp/language_server.nupkg
cd temp
unzip temp/language_server.nupkg
mv temp/content/LanguageServer/linux-x64 $HOME/.local/share/nvim/roslyn
rm -rf temp
fi
echo "----- Copying NVIM configuration -----"
if [ ! -d "$HOME/.config" ]; then
echo ".config folder not found. Creating one"
mkdir ~/.config
fi
ln -s ~/projects/setup/.config/nvim ~/.config/
if [ ! -d "$HOME/.vim" ]; then
echo ".vim folder not found. Creating one"
mkdir ~/.vim
fi
ln -s ~/projects/setup/.vim/undodir ~/.vim/