Skip to content

Commit 306a928

Browse files
committed
feat: Add keymap descriptions.
* Fix insert-mode surrounds. * Allow buffer-local keymaps to override globally set ones.
1 parent df4cd12 commit 306a928

File tree

2 files changed

+106
-108
lines changed

2 files changed

+106
-108
lines changed

lua/nvim-surround/config.lua

Lines changed: 104 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -99,94 +99,160 @@ end
9999

100100
-- Check if a keymap should be added before setting it.
101101
---@param args table The arguments to set the keymap.
102-
M.add_keymap = function(args)
103-
-- Only set the mapping if it hasn't been disabled
104-
if args.lhs then
105-
vim.keymap.set(args.mode, args.lhs, args.rhs, args.opts)
102+
M.set_keymap = function(args)
103+
-- If the keymap is disabled
104+
if not args.lhs then
105+
-- If the mapping is disabled globally, do nothing
106+
if not M.user_opts.keymaps[args.name] then
107+
return
108+
end
109+
-- Otherwise disable the global keymap
110+
args.lhs = M.user_opts.keymaps[args.name]
111+
args.rhs = "<NOP>"
106112
end
113+
vim.keymap.set(args.mode, args.lhs, args.rhs, args.opts)
107114
end
108115

109-
-- Setup the global user options for all files.
110-
---@param user_opts options? The user-defined options to be merged with default_opts.
111-
M.setup = function(user_opts)
112-
-- Overwrite default options with user-defined options, if they exist
113-
user_opts = user_opts and vim.tbl_deep_extend("force", M.default_opts, user_opts) or M.default_opts
114-
M.user_opts = user_opts
115-
-- Configure user-set defaults for the current buffer in case the plugin is lazy-loaded
116-
M.buffer_setup(user_opts)
117-
118-
-- Setup keymaps for calling plugin behavior
119-
M.add_keymap({
116+
-- Set up user-configured keymaps, globally or for the buffer.
117+
---@param buffer boolean Whether the keymaps should be set for the buffer or not.
118+
M.set_keymaps = function(buffer)
119+
M.set_keymap({
120+
name = "insert",
120121
mode = "i",
121122
lhs = M.get_opts().keymaps.insert,
122123
rhs = require("nvim-surround").insert_surround,
123-
opts = { silent = true },
124+
opts = {
125+
buffer = buffer,
126+
desc = "Add a surrounding pair around the cursor (insert mode).",
127+
silent = true,
128+
},
124129
})
125-
M.add_keymap({
130+
M.set_keymap({
131+
name = "insert_line",
126132
mode = "i",
127133
lhs = M.get_opts().keymaps.insert_line,
128134
rhs = function()
129135
require("nvim-surround").insert_surround(true)
130136
end,
131-
opts = { silent = true },
137+
opts = {
138+
buffer = buffer,
139+
desc = "Add a surrounding pair around the cursor, on new lines (insert mode).",
140+
silent = true,
141+
},
132142
})
133-
M.add_keymap({
143+
M.set_keymap({
144+
name = "normal",
134145
mode = "n",
135146
lhs = M.get_opts().keymaps.normal,
136147
rhs = require("nvim-surround").normal_surround,
137-
opts = { silent = true, expr = true },
148+
opts = {
149+
buffer = buffer,
150+
desc = "Add a surrounding pair around a motion (normal mode).",
151+
expr = true,
152+
silent = true,
153+
},
138154
})
139-
M.add_keymap({
155+
M.set_keymap({
156+
name = "normal_cur",
140157
mode = "n",
141158
lhs = M.get_opts().keymaps.normal_cur,
142159
rhs = function()
143160
return "^" .. tostring(vim.v.count1) .. M.get_opts().keymaps.normal .. "g_"
144161
end,
145-
opts = { silent = true, expr = true, remap = true },
162+
opts = {
163+
buffer = buffer,
164+
desc = "Add a surrounding pair around the current line (normal mode).",
165+
expr = true,
166+
remap = true,
167+
silent = true,
168+
},
146169
})
147-
M.add_keymap({
170+
M.set_keymap({
171+
name = "normal_line",
148172
mode = "n",
149173
lhs = M.get_opts().keymaps.normal_line,
150174
rhs = function()
151175
return require("nvim-surround").normal_surround(nil, true)
152176
end,
153-
opts = { silent = true, expr = true },
177+
opts = {
178+
buffer = buffer,
179+
desc = "Add a surrounding pair around a motion, on new lines (normal mode).",
180+
expr = true,
181+
silent = true,
182+
},
154183
})
155-
M.add_keymap({
184+
M.set_keymap({
185+
name = "normal_cur_line",
156186
mode = "n",
157187
lhs = M.get_opts().keymaps.normal_cur_line,
158188
rhs = function()
159189
return "^" .. tostring(vim.v.count1) .. M.get_opts().keymaps.normal_line .. "g_"
160190
end,
161-
opts = { silent = true, expr = true, remap = true },
191+
opts = {
192+
buffer = buffer,
193+
desc = "Add a surrounding pair around the current line, on new lines (normal mode).",
194+
expr = true,
195+
remap = true,
196+
silent = true,
197+
},
162198
})
163-
M.add_keymap({
199+
M.set_keymap({
200+
name = "visual",
164201
mode = "x",
165202
lhs = M.get_opts().keymaps.visual,
166203
rhs = "<Esc><Cmd>lua require'nvim-surround'.visual_surround()<CR>",
167-
opts = { silent = true },
204+
opts = {
205+
buffer = buffer,
206+
desc = "Add a surrounding pair around a visual selection.",
207+
silent = true,
208+
},
168209
})
169-
M.add_keymap({
210+
M.set_keymap({
211+
name = "visual_line",
170212
mode = "x",
171213
lhs = M.get_opts().keymaps.visual_line,
172214
rhs = "<Esc><Cmd>lua require'nvim-surround'.visual_surround(true)<CR>",
173-
opts = { silent = true },
215+
opts = {
216+
buffer = buffer,
217+
desc = "Add a surrounding pair around a visual selection, on new lines.",
218+
silent = true,
219+
},
174220
})
175-
M.add_keymap({
221+
M.set_keymap({
222+
name = "delete",
176223
mode = "n",
177224
lhs = M.get_opts().keymaps.delete,
178225
rhs = require("nvim-surround").delete_surround,
179-
opts = { silent = true, expr = true },
226+
opts = {
227+
buffer = buffer,
228+
desc = "Delete a surrounding pair.",
229+
expr = true,
230+
silent = true,
231+
},
180232
})
181-
M.add_keymap({
233+
M.set_keymap({
234+
name = "change",
182235
mode = "n",
183236
lhs = M.get_opts().keymaps.change,
184237
rhs = require("nvim-surround").change_surround,
185-
opts = { silent = true, expr = true },
238+
opts = {
239+
buffer = buffer,
240+
desc = "Change a surrounding pair.",
241+
expr = true,
242+
silent = true,
243+
},
186244
})
245+
end
187246

188-
-- Configure highlight group
189-
if user_opts.highlight_motion.duration then
247+
-- Setup the global user options for all files.
248+
---@param user_opts options? The user-defined options to be merged with default_opts.
249+
M.setup = function(user_opts)
250+
-- Overwrite default options with user-defined options, if they exist
251+
M.user_opts = user_opts and vim.tbl_deep_extend("force", M.default_opts, user_opts) or M.default_opts
252+
-- Configure global keymaps
253+
M.set_keymaps(false)
254+
-- Configure highlight group, if necessary
255+
if M.user_opts.highlight_motion.duration then
190256
vim.cmd([[
191257
highlight default link NvimSurroundHighlightTextObject Visual
192258
]])
@@ -198,76 +264,8 @@ end
198264
M.buffer_setup = function(buffer_opts)
199265
-- Merge the given table into the buffer-local options table
200266
M.merge_opts(buffer_opts)
201-
202-
-- Setup buffer-local keymaps for calling plugin behavior
203-
M.add_keymap({
204-
mode = "i",
205-
lhs = M.get_opts().keymaps.insert,
206-
rhs = require("nvim-surround").insert_surround,
207-
opts = { silent = true, buffer = true },
208-
})
209-
M.add_keymap({
210-
mode = "i",
211-
lhs = M.get_opts().keymaps.insert_line,
212-
rhs = function()
213-
require("nvim-surround").insert_surround(true)
214-
end,
215-
opts = { silent = true, buffer = true },
216-
})
217-
M.add_keymap({
218-
mode = "n",
219-
lhs = M.get_opts().keymaps.normal,
220-
rhs = require("nvim-surround").normal_surround,
221-
opts = { silent = true, expr = true, buffer = true },
222-
})
223-
M.add_keymap({
224-
mode = "n",
225-
lhs = M.get_opts().keymaps.normal_cur,
226-
rhs = function()
227-
return "^" .. tostring(vim.v.count1) .. M.get_opts().keymaps.normal .. "g_"
228-
end,
229-
opts = { silent = true, expr = true, buffer = true, remap = true },
230-
})
231-
M.add_keymap({
232-
mode = "n",
233-
lhs = M.get_opts().keymaps.normal_line,
234-
rhs = function()
235-
return require("nvim-surround").normal_surround(nil, true)
236-
end,
237-
opts = { silent = true, expr = true, buffer = true },
238-
})
239-
M.add_keymap({
240-
mode = "n",
241-
lhs = M.get_opts().keymaps.normal_cur_line,
242-
rhs = function()
243-
return "^" .. tostring(vim.v.count1) .. M.get_opts().keymaps.normal_line .. "g_"
244-
end,
245-
opts = { silent = true, expr = true, buffer = true, remap = true },
246-
})
247-
M.add_keymap({
248-
mode = "x",
249-
lhs = M.get_opts().keymaps.visual,
250-
rhs = "<Esc><Cmd>lua require'nvim-surround'.visual_surround()<CR>",
251-
opts = { silent = true, buffer = true },
252-
})
253-
M.add_keymap({
254-
mode = "x",
255-
lhs = M.get_opts().keymaps.visual_line,
256-
rhs = "<Esc><Cmd>lua require'nvim-surround'.visual_surround(true)<CR>",
257-
opts = { silent = true, buffer = true },
258-
})
259-
M.add_keymap({
260-
mode = "n",
261-
lhs = M.get_opts().keymaps.delete,
262-
rhs = require("nvim-surround").delete_surround,
263-
opts = { silent = true, expr = true, buffer = true },
264-
})
265-
M.add_keymap({
266-
mode = "n",
267-
lhs = M.get_opts().keymaps.change,
268-
rhs = require("nvim-surround").change_surround,
269-
opts = { silent = true, expr = true, buffer = true },
270-
})
267+
-- Configure buffer-local keymaps
268+
M.set_keymaps(true)
271269
end
272270

273271
return M

lua/nvim-surround/init.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ M.insert_surround = function(line_mode)
4949
table.insert(delimiters[1], #delimiters[1] + 1, "")
5050
end
5151

52-
buffer.insert_text({ curpos[1], curpos[2] + 1 }, delimiters[2])
53-
buffer.insert_text({ curpos[1], curpos[2] }, delimiters[1])
52+
buffer.insert_text(curpos, delimiters[2])
53+
buffer.insert_text(curpos, delimiters[1])
5454
buffer.format_lines(curpos[1], curpos[1] + #delimiters[1] + #delimiters[2] - 2)
5555
buffer.set_curpos({ curpos[1] + #delimiters[1] - 1, curpos[2] + #delimiters[1][#delimiters[1]] })
5656
-- Indent the cursor to the correct level, if added line-wise

0 commit comments

Comments
 (0)