From 15a7c2d8e005391d4aaac919b5776b5fa2822a41 Mon Sep 17 00:00:00 2001
From: Thomas Voss <mail@thomasvoss.com>
Date: Thu, 14 Sep 2023 22:05:28 +0200
Subject: nvim: Preserve registers when transposing chars

---
 .config/nvim/lua/mango/lib.lua   | 16 ++++++++++++++++
 .config/nvim/lua/mango/remap.lua | 16 +++++++++++++---
 2 files changed, 29 insertions(+), 3 deletions(-)

(limited to '.config/nvim/lua/mango')

diff --git a/.config/nvim/lua/mango/lib.lua b/.config/nvim/lua/mango/lib.lua
index 4c38986..9182a06 100644
--- a/.config/nvim/lua/mango/lib.lua
+++ b/.config/nvim/lua/mango/lib.lua
@@ -18,4 +18,20 @@ function M.remap(modes, from, to, opts)
 	vim.keymap.set(ct, from, to, opts)
 end
 
+function M.save_regs(regs, callback)
+	local rs = {}
+	for r in regs:gmatch('.') do
+		rs[r] = {
+			s = vim.fn.getreg(r),
+			t = vim.fn.getregtype(r),
+		}
+	end
+
+	callback()
+
+	for k, v in pairs(rs) do
+		vim.fn.setreg(k, v.s, v.t)
+	end
+end
+
 return M
diff --git a/.config/nvim/lua/mango/remap.lua b/.config/nvim/lua/mango/remap.lua
index a43ba19..0c4f1a9 100644
--- a/.config/nvim/lua/mango/remap.lua
+++ b/.config/nvim/lua/mango/remap.lua
@@ -1,4 +1,5 @@
-local remap = require('mango.lib').remap
+local lib = require('mango.lib')
+local remap = lib.remap
 
 vim.g.mapleader = ' '
 
@@ -46,5 +47,14 @@ remap('n', '<leader>Y', '"+Y')
 remap('nv', "'", '`')
 remap('nv', '`', "'")
 
--- Transpose characters, because ‘xp’ is kinda awkward
-remap('n', '<leader>t', 'xp')
+-- Transpose characters without clobbering registers
+local function transpose_chars(rev)
+	lib.save_regs('a', function()
+		vim.cmd.normal('"a' .. (rev and 'X' or 'x') .. '"ap')
+	end)
+end
+
+remap('n', '<leader>t', transpose_chars)
+remap('n', '<leader>T', function()
+	transpose_chars(true)
+end)
-- 
cgit v1.2.3