summaryrefslogtreecommitdiffstats
path: root/lua/conf/binds.lua
blob: 42c609eb7f63bbf714afb53f6247435e199bc61c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
local conf = require('core.conf')

local function map(mode, bind, cmd, opts)
  opts = opts or {}
  opts['noremap'] = true
  opts['silent'] = true

  if type(bind) == 'table' then
    for i in pairs(bind) do
      vim.keymap.set(mode, bind[i], cmd, opts)
    end
  elseif type(bind) == 'string' then
    vim.keymap.set(mode, bind, cmd, opts)
  end
end

-- vim binds ------------------------------------------------------------------
g.mapleader = ' ' -- set leader key

map('x', '<leader>p', [["_dP]], { desc = 'Greatest remap of all time.' })
map('n', '<esc>', ':nohlsearch<Bar>:echo<CR>', { desc = 'Clear search.' })
map('t', '<esc>', '<C-\\><C-n>', { desc = 'make <esc> work in terminals.' })
-- move selected text up/down
map('v', '<S-k>', ":m '<-2<CR>gv=gv", { desc = 'Move selected text up.' })
map('v', '<S-j>', ":m '>+1<CR>gv=gv", { desc = 'Move selected text down.' })

-- the cursor STAYS IN THE MIDDLE
map('n', '<S-j>', 'mzJ`z<cmd>delm z<CR>') -- when combining lines
map('n', 'n', 'nzzzv') -- when searching
map('n', 'N', 'Nzzzv')
map('n', '<C-d>', '<C-d>zz') -- half page jumping
map('n', '<C-u>', '<C-u>zz')

map('n', '<leader>x', function() -- execute order 111
  local fn = vim.fn.expand("%:p")
  if vim.fn.getftype(fn) == "file" then
    local perm = vim.fn.getfperm(fn)
    if string.match(perm, "x", 3) then
      vim.notify("Removed executable flags", vim.log.levels.INFO, { title = misc.appid })
      vim.fn.setfperm(fn, string.sub(fn, 1, 2).."-"..string.sub(fn, 4, 5).."-"..string.sub(fn, 7, 8).."-")
    else
      vim.notify("Add executable flags", vim.log.levels.INFO, { title = misc.appid })
      vim.fn.setfperm(fn, string.sub(fn, 1, 2).."x"..string.sub(fn, 4, 5).."x"..string.sub(fn, 7, 8).."x")
    end
  else
    vim.notify("File doesn't exist", vim.log.levels.INFO, { title = misc.appid })
  end
end)

-- add some keybinds to the file view (netrw)
a.nvim_create_autocmd('FileType', {
  pattern = 'netrw',
  callback = function()
    local function bind(lhs, rhs)
      vim.keymap.set('n', lhs, rhs, { remap = true, buffer = true })
    end
    bind('h', '-^') -- Go up a directory
    bind('l', '<CR>') -- Go down a directory / open a file
    bind('.', 'gh') -- Toggle hidden files
    bind('P', '<C-w>z') -- Close preview window
    bind('<esc>', '<cmd>q<CR>') -- Close netrw
  end
})

-- tabs
map('n', '[]', '<cmd>tabnew<CR>')
map('n', '][', '<cmd>tabc<CR>')
map('n', '[[', '<cmd>tabp<CR>')
map('n', ']]', '<cmd>tabn<CR>')

-- config binds ---------------------------------------------------------------
map('n', '<leader>m', conf.configmenu, { desc = 'Neovim config manager menu', })

-- plugin binds ---------------------------------------------------------------

-- pretty lsp view
map('n', 'gd', '<CMD>Glance definitions<CR>')
map('n', 'gr', '<CMD>Glance references<CR>')
map('n', 'gy', '<CMD>Glance type_definitions<CR>')
map('n', 'gi', '<CMD>Glance implementations<CR>')

if pcall(require, "treesj") then
  local treesj = require('treesj') -- treesj
  map('n', '<leader>j', treesj.toggle)
end

if pcall(require, "telescope") then
  local telebuilt = require('telescope.builtin') -- telescope
  -- local telexten = require('telescope').extensions
  map('n', '<leader>sf', telebuilt.find_files, { desc = 'Find files.' })
  map('n', '<leader>so', telebuilt.oldfiles, { desc = 'Find old files.' })
  map('n', '<leader>sg', telebuilt.git_files, { desc = 'Find git files.' })
  -- search urls in buffer
  map('n', '<leader>su', '<Cmd>UrlView<CR>', { desc = 'Find urls in buffer.' })
  -- search lsp symbols
  map('n', '<leader>ss', telebuilt.lsp_document_symbols,
    { desc = 'Find LSP Symbols.' })
  -- search for keybinds
  map('n', '<leader>sk', telebuilt.keymaps,
    { desc = 'Find nvim Keymaps.' })
  -- search for highlights
  map('n', '<leader>sh', telebuilt.highlights,
    { desc = 'Find nvim Highlights.' })
  -- search for autocommands
  map('n', '<leader>sa', telebuilt.autocommands,
    { desc = 'Find nvim Autocommands.' })
  -- search for vim options
  map('n', '<leader>sv', telebuilt.vim_options, { desc = 'Find vim options.' })
  -- search for string in project
  map('n', '<leader>sp', telebuilt.live_grep, { desc = 'Find string in project.' })

  -- Code Actions (requires telescope)
  if pcall(require, "actions-preview") then
    map({ "n", "v" }, "<leader>ca", require("actions-preview").code_actions, {
      desc = 'preview code actions'
    })
  end
end

-- todo list
if pcall(require, "todo-comments") then
  map("n", "<leader>td", "<cmd>TodoQuickFix<CR>", { desc = 'open up list of TODO\'s' })
end

-- harpoon
if (pcall(require, 'harpoon')) then
  local harpoon = require("harpoon")

  map("n", "<leader>a", function()
    harpoon:list():append()
    vim.notify('added new file to quickmarks', vim.log.levels.INFO, {
      title = misc.appid,
    })
  end)
  map('n', '<C-q>', function() harpoon:list():select(1) end)
  map('n', '<C-g>', function() harpoon:list():select(2) end)
  map('n', '<C-h>', function() harpoon:list():select(3) end)
  map('n', '<C-i>', function() harpoon:list():select(4) end)

  map("n", "<C-S-P>", function() harpoon:list():prev() end)
  map("n", "<C-S-N>", function() harpoon:list():next() end)

  map("n", "<C-e>", function() require("core.harpoon").switcher() end)
end

map('n', '<leader>u', '<cmd>UndotreeToggle<CR>', { desc = 'Open undo tree.' })
map('n', '<leader>f', '<cmd>SFMToggle<CR>', { desc = 'Open file tree view.' })
map('n', '<C-j>', '<cmd>JABSOpen<CR>', { desc = 'Switch between buffers.' })

if pcall(require, "smart-splits") then
  local smartsplits = require('smart-splits') -- resizing buffers (toggleable)
  map('n', '<leader>r', smartsplits.start_resize_mode)
end

-- neogen
if pcall(require, "neogen") then
  map('n', '<leader>df', require("neogen").generate, {
    desc = 'Generate anotations',
  })
end

-- venn
function _G.Toggle_venn()
  local mapb = vim.api.nvim_buf_set_keymap
  local venn_enabled = vim.inspect(vim.b.venn_enabled)
  if venn_enabled == "nil" then
    vim.notify("Enabled venn mode", vim.log.levels.LOW, { title = misc.appid })
    vim.b.venn_enabled = true
    vim.cmd([[setlocal ve=all]])
    -- draw a line on HJKL keystokes
    mapb(0, "n", "J", "<C-v>j:VBox<CR>", { noremap = true })
    mapb(0, "n", "K", "<C-v>k:VBox<CR>", { noremap = true })
    mapb(0, "n", "L", "<C-v>l:VBox<CR>", { noremap = true })
    mapb(0, "n", "H", "<C-v>h:VBox<CR>", { noremap = true })
    -- draw a box by pressing "f" with visual selection
    mapb(0, "v", "f", ":VBox<CR>", { noremap = true })
  else
    vim.notify("Disabled venn mode", vim.log.levels.LOW, { title = misc.appid })
    vim.cmd[[setlocal ve=]]
    vim.cmd[[mapclear <buffer>]]
    vim.b.venn_enabled = nil
  end
end
-- toggle keymappings for venn using <leader>v
map('n', '<leader>v', ":lua Toggle_venn()<CR>")