Skip to content

Commit 161310a

Browse files
dlondclaude
andcommitted
feat: add Harpoon and Training mode plugins
- Add Harpoon for quick file navigation - Add Training mode for learning vim motions without crutches - Configure keymaps for both plugins - Add Nix integration for training mode toggle 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 9e6b01e commit 161310a

File tree

6 files changed

+446
-0
lines changed

6 files changed

+446
-0
lines changed

lua/core/keymaps.lua

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,35 @@ end
3434
-- Reload LSP keybind
3535
vim.keymap.set('n', '<leader>lr', reload_lsp, { desc = '[L]SP [R]eload all servers' })
3636

37+
-- Buffer management keymaps
38+
vim.keymap.set('n', '<leader>bb', '<cmd>Telescope buffers<CR>', { desc = '[B]rowse [B]uffers' })
39+
vim.keymap.set('n', '[b', '<cmd>bprevious<CR>', { desc = 'Previous buffer' })
40+
vim.keymap.set('n', ']b', '<cmd>bnext<CR>', { desc = 'Next buffer' })
41+
vim.keymap.set('n', '<leader>bd', '<cmd>bdelete<CR>', { desc = '[B]uffer [D]elete' })
42+
vim.keymap.set('n', '<leader>ba', '<cmd>%bd|e#<CR>', { desc = '[B]uffers close [A]ll but current' })
43+
vim.keymap.set('n', '<leader>bn', '<cmd>enew<CR>', { desc = '[B]uffer [N]ew' })
44+
45+
-- Quick buffer switching with numbers
46+
for i = 1, 9 do
47+
vim.keymap.set('n', '<leader>' .. i, '<cmd>buffer ' .. i .. '<CR>', { desc = 'Switch to buffer ' .. i })
48+
end
49+
50+
-- Alternate file (toggle between two most recent files)
51+
vim.keymap.set('n', '<leader><leader>', '<C-^>', { desc = 'Toggle alternate file' })
52+
53+
-- Window management keymaps
54+
vim.keymap.set('n', '<leader>ws', '<cmd>split<CR>', { desc = '[W]indow [S]plit horizontal' })
55+
vim.keymap.set('n', '<leader>wv', '<cmd>vsplit<CR>', { desc = '[W]indow [V]ertical split' })
56+
vim.keymap.set('n', '<leader>wc', '<cmd>close<CR>', { desc = '[W]indow [C]lose' })
57+
vim.keymap.set('n', '<leader>wo', '<cmd>only<CR>', { desc = '[W]indow [O]nly (close others)' })
58+
vim.keymap.set('n', '<leader>ww', '<C-w>w', { desc = '[W]indow cycle' })
59+
vim.keymap.set('n', '<leader>w=', '<C-w>=', { desc = '[W]indow balance sizes' })
60+
61+
-- Window resizing with arrow keys
62+
vim.keymap.set('n', '<C-Up>', '<cmd>resize +2<CR>', { desc = 'Increase window height' })
63+
vim.keymap.set('n', '<C-Down>', '<cmd>resize -2<CR>', { desc = 'Decrease window height' })
64+
vim.keymap.set('n', '<C-Left>', '<cmd>vertical resize -2<CR>', { desc = 'Decrease window width' })
65+
vim.keymap.set('n', '<C-Right>', '<cmd>vertical resize +2<CR>', { desc = 'Increase window width' })
66+
3767
-- Standard practice for Lua modules that don't need to return complex data
3868
return {}

lua/core/options.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
vim.g.mapleader = ' '
55
vim.g.maplocalleader = ' '
66

7+
-- Load Nix-controlled settings if available
8+
pcall(require, 'nix-settings')
9+
710
-- Place custom vim options here
811

912
-- Set based on your font installation

lua/plugins/config/harpoon.lua

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
local M = {}
2+
3+
function M.setup()
4+
local harpoon = require 'harpoon'
5+
harpoon:setup {
6+
settings = {
7+
save_on_toggle = false,
8+
sync_on_ui_close = false,
9+
key = function()
10+
return vim.loop.cwd()
11+
end,
12+
},
13+
}
14+
15+
-- Add current file to list
16+
vim.keymap.set('n', '<leader>ma', function()
17+
harpoon:list():add()
18+
vim.notify('Added to Harpoon', vim.log.levels.INFO)
19+
end, { desc = '[M]ark [A]dd file (Harpoon)' })
20+
21+
-- Toggle quick menu
22+
vim.keymap.set('n', '<C-e>', function()
23+
harpoon.ui:toggle_quick_menu(harpoon:list())
24+
end, { desc = 'Toggle Harpoon menu' })
25+
26+
-- Quick navigation to files 1-4 using leader+m prefix
27+
vim.keymap.set('n', '<leader>m1', function()
28+
harpoon:list():select(1)
29+
end, { desc = 'Jump to mark 1' })
30+
31+
vim.keymap.set('n', '<leader>m2', function()
32+
harpoon:list():select(2)
33+
end, { desc = 'Jump to mark 2' })
34+
35+
vim.keymap.set('n', '<leader>m3', function()
36+
harpoon:list():select(3)
37+
end, { desc = 'Jump to mark 3' })
38+
39+
vim.keymap.set('n', '<leader>m4', function()
40+
harpoon:list():select(4)
41+
end, { desc = 'Jump to mark 4' })
42+
43+
-- Alternative quick access with Alt/Option key (doesn't conflict)
44+
vim.keymap.set('n', '<M-1>', function()
45+
harpoon:list():select(1)
46+
end, { desc = 'Harpoon file 1' })
47+
48+
vim.keymap.set('n', '<M-2>', function()
49+
harpoon:list():select(2)
50+
end, { desc = 'Harpoon file 2' })
51+
52+
vim.keymap.set('n', '<M-3>', function()
53+
harpoon:list():select(3)
54+
end, { desc = 'Harpoon file 3' })
55+
56+
vim.keymap.set('n', '<M-4>', function()
57+
harpoon:list():select(4)
58+
end, { desc = 'Harpoon file 4' })
59+
60+
-- Navigate between harpoon files
61+
vim.keymap.set('n', '[m', function()
62+
harpoon:list():prev()
63+
end, { desc = 'Previous marked file' })
64+
65+
vim.keymap.set('n', ']m', function()
66+
harpoon:list():next()
67+
end, { desc = 'Next marked file' })
68+
69+
-- Show harpoon files in Telescope
70+
local conf = require('telescope.config').values
71+
local function toggle_telescope(harpoon_files)
72+
local file_paths = {}
73+
for _, item in ipairs(harpoon_files.items) do
74+
table.insert(file_paths, item.value)
75+
end
76+
77+
require('telescope.pickers')
78+
.new({}, {
79+
prompt_title = 'Harpoon',
80+
finder = require('telescope.finders').new_table {
81+
results = file_paths,
82+
},
83+
previewer = conf.file_previewer {},
84+
sorter = conf.generic_sorter {},
85+
})
86+
:find()
87+
end
88+
89+
vim.keymap.set('n', '<leader>mm', function()
90+
toggle_telescope(harpoon:list())
91+
end, { desc = '[M]arked files in Telescope' })
92+
93+
-- Clear all marks
94+
vim.keymap.set('n', '<leader>mc', function()
95+
harpoon:list():clear()
96+
vim.notify('Cleared all Harpoon marks', vim.log.levels.INFO)
97+
end, { desc = '[M]arks [C]lear all' })
98+
99+
-- Remove current file from harpoon
100+
vim.keymap.set('n', '<leader>mr', function()
101+
harpoon:list():remove()
102+
vim.notify('Removed from Harpoon', vim.log.levels.INFO)
103+
end, { desc = '[M]ark [R]emove current file' })
104+
end
105+
106+
return M

0 commit comments

Comments
 (0)