A Neovim plugin enabling you to solve LeetCode problems.
feat: customize keys
11 files changed, +40 -30
+2-10lua/leetcode-ui/group/tag/init.lua
| @@ -49,16 +49,8 @@ function Tag.normalize(text) | ||
| 49 | 49 | "\n*<p><strong[^>]*>(Constraints:?)%s*</strong></p>\n*", |
| 50 | 50 | "\n\n<constraints> %1</constraints>\n\n" |
| 51 | 51 | ) |
| 52 | - -- :gsub("\n*<(img[^>]*)/>\n*", "\n\n<%1>img</img>\n\n") | |
| 53 | - :gsub( | |
| 54 | - "\n*(<img[^>]*/?>)\n*", | |
| 55 | - "\n\n%1\n\n" | |
| 56 | - ) | |
| 57 | - -- :gsub("<pre>\n*(.-)\n*</pre>", "<pre>\n%1</pre>") | |
| 58 | - :gsub( | |
| 59 | - "\n*<p> </p>\n*", | |
| 60 | - "&lcpad;" | |
| 61 | - ) | |
| 52 | + :gsub("\n*(<img[^>]*/?>)\n*", "\n\n%1\n\n") | |
| 53 | + :gsub("\n*<p> </p>\n*", "&lcpad;") | |
| 62 | 54 | :gsub("\n", "&lcnl;") |
| 63 | 55 | :gsub("\t", "&lctab;") |
| 64 | 56 | :gsub("%s", " ") |
+5-4lua/leetcode-ui/layout/console.lua
| @@ -5,6 +5,7 @@ local Layout = require("leetcode-ui.layout") | ||
| 5 | 5 | local Popup = require("leetcode-ui.popup") |
| 6 | 6 | |
| 7 | 7 | local config = require("leetcode.config") |
| 8 | +local keys = config.user.keys | |
| 8 | 9 | local Runner = require("leetcode.runner") |
| 9 | 10 | local log = require("leetcode.logger") |
| 10 | 11 | |
| @@ -43,10 +44,10 @@ function ConsoleLayout:mount() | ||
| 43 | 44 | ConsoleLayout.super.mount(self) |
| 44 | 45 | |
| 45 | 46 | self:set_keymaps({ |
| 46 | - ["r"] = function() self.testcase:reset() end, | |
| 47 | - ["U"] = function() self:use_testcase() end, | |
| 48 | - ["H"] = function() self.testcase:focus() end, | |
| 49 | - ["L"] = function() self.result:focus() end, | |
| 47 | + [keys.reset_testcases] = function() self.testcase:reset() end, | |
| 48 | + [keys.use_testcase] = function() self:use_testcase() end, | |
| 49 | + [keys.focus_testcases] = function() self.testcase:focus() end, | |
| 50 | + [keys.focus_result] = function() self.result:focus() end, | |
| 50 | 51 | }) |
| 51 | 52 | end |
| 52 | 53 |
+4-2lua/leetcode-ui/popup/console/result.lua
| @@ -34,12 +34,14 @@ end | ||
| 34 | 34 | |
| 35 | 35 | ---@param parent lc.ui.Console |
| 36 | 36 | function ResultPopup:init(parent) |
| 37 | + local keys = require("leetcode.config").user.keys | |
| 38 | + | |
| 37 | 39 | ResultPopup.super.init(self, parent, { |
| 38 | 40 | border = { |
| 39 | 41 | text = { |
| 40 | - top = (" (L) %s "):format(t("Result")), | |
| 42 | + top = (" (%s) %s "):format(keys.focus_result, t("Result")), | |
| 41 | 43 | top_align = "center", |
| 42 | - bottom = (" (U) %s "):format(t("Use Testcase")), | |
| 44 | + bottom = (" (%s) %s "):format(keys.use_testcase, t("Use Testcase")), | |
| 43 | 45 | bottom_align = "center", |
| 44 | 46 | }, |
| 45 | 47 | }, |
+4-2lua/leetcode-ui/popup/console/testcase.lua
| @@ -151,13 +151,15 @@ end | ||
| 151 | 151 | |
| 152 | 152 | ---@param parent lc.ui.Console |
| 153 | 153 | function Testcase:init(parent) |
| 154 | + local keys = require("leetcode.config").user.keys | |
| 155 | + | |
| 154 | 156 | Testcase.super.init(self, parent, { |
| 155 | 157 | enter = true, |
| 156 | 158 | border = { |
| 157 | 159 | text = { |
| 158 | - top = (" (H) %s "):format(t("Testcases")), | |
| 160 | + top = (" (%s) %s "):format(keys.focus_testcases, t("Testcases")), | |
| 159 | 161 | top_align = "center", |
| 160 | - bottom = (" (r) %s "):format(t("Reset")), | |
| 162 | + bottom = (" (%s) %s "):format(keys.reset_testcases, t("Reset")), | |
| 161 | 163 | bottom_align = "center", |
| 162 | 164 | }, |
| 163 | 165 | }, |
+2-1lua/leetcode-ui/popup/info.lua
| @@ -7,6 +7,7 @@ local SimilarQuestions = require("leetcode-ui.group.similar-questions") | ||
| 7 | 7 | local Parser = require("leetcode.parser") |
| 8 | 8 | |
| 9 | 9 | local config = require("leetcode.config") |
| 10 | +local keys = config.user.keys | |
| 10 | 11 | local utils = require("leetcode.utils") |
| 11 | 12 | local log = require("leetcode.logger") |
| 12 | 13 | |
| @@ -103,7 +104,7 @@ function Info:populate() | ||
| 103 | 104 | |
| 104 | 105 | tree:render() |
| 105 | 106 | |
| 106 | - self:map("n", { "<Tab>", "<CR>" }, function() | |
| 107 | + self:map("n", keys.confirm, function() | |
| 107 | 108 | local node = tree:get_node() |
| 108 | 109 | if not node then return end |
| 109 | 110 |
+2-1lua/leetcode-ui/popup/init.lua
| @@ -1,6 +1,7 @@ | ||
| 1 | 1 | local NuiPopup = require("nui.popup") |
| 2 | 2 | local Renderer = require("leetcode-ui.renderer") |
| 3 | 3 | local config = require("leetcode.config") |
| 4 | +local keys = config.user.keys | |
| 4 | 5 | |
| 5 | 6 | local log = require("leetcode.logger") |
| 6 | 7 | |
| @@ -63,7 +64,7 @@ function Popup:mount() | ||
| 63 | 64 | self.visible = true |
| 64 | 65 | |
| 65 | 66 | self:on({ "BufLeave", "WinLeave" }, function() self:handle_leave() end) |
| 66 | - self:map("n", { "q", "<Esc>" }, function() self:hide() end) | |
| 67 | + self:map("n", keys.toggle, function() self:hide() end) | |
| 67 | 68 | end |
| 68 | 69 | |
| 69 | 70 | function Popup:hide() |
+2-4lua/leetcode-ui/question.lua
| @@ -56,10 +56,6 @@ function Question:handle_mount() | ||
| 56 | 56 | self:create_file() |
| 57 | 57 | vim.cmd("$tabe " .. self.file:absolute()) |
| 58 | 58 | |
| 59 | - utils.exec_hooks("LeetQuestionNew", { | |
| 60 | - lang = self.lang, | |
| 61 | - }) | |
| 62 | - | |
| 63 | 59 | -- https://github.com/kawre/leetcode.nvim/issues/14 |
| 64 | 60 | if self.lang == "rust" then pcall(require("rust-tools.standalone").start_standalone_client) end |
| 65 | 61 | |
| @@ -76,6 +72,8 @@ function Question:handle_mount() | ||
| 76 | 72 | self.console = Console(self) |
| 77 | 73 | self.info = Info(self) |
| 78 | 74 | |
| 75 | + utils.exec_hooks("LeetQuestionNew", self) | |
| 76 | + | |
| 79 | 77 | return self |
| 80 | 78 | end |
| 81 | 79 |
+3-3lua/leetcode-ui/renderer/init.lua
| @@ -1,6 +1,6 @@ | ||
| 1 | -local Padding = require("leetcode-ui.lines.padding") | |
| 2 | -local Opts = require("leetcode-ui.opts") | |
| 3 | 1 | local Group = require("leetcode-ui.group") |
| 2 | +local config = require("leetcode.config") | |
| 3 | +local keys = config.user.keys | |
| 4 | 4 | |
| 5 | 5 | local log = require("leetcode.logger") |
| 6 | 6 | |
| @@ -24,7 +24,7 @@ function Renderer:draw(component) | ||
| 24 | 24 | self.bufnr = component.bufnr |
| 25 | 25 | self.winid = component.winid |
| 26 | 26 | |
| 27 | - self:map("n", "<CR>", function() self:handle_press() end) | |
| 27 | + self:map("n", keys.confirm, function() self:handle_press() end) | |
| 28 | 28 | |
| 29 | 29 | self:clear_keymaps() |
| 30 | 30 | self._.buttons = {} |
+3-1lua/leetcode-ui/split/init.lua
| @@ -1,5 +1,7 @@ | ||
| 1 | 1 | local Renderer = require("leetcode-ui.renderer") |
| 2 | 2 | local NuiSplit = require("nui.split") |
| 3 | +local config = require("leetcode.config") | |
| 4 | +local keys = config.user.keys | |
| 3 | 5 | |
| 4 | 6 | local log = require("leetcode.logger") |
| 5 | 7 | |
| @@ -58,7 +60,7 @@ function Split:mount() | ||
| 58 | 60 | |
| 59 | 61 | self.visible = true |
| 60 | 62 | |
| 61 | - self:map("n", { "q", "<Esc>" }, function() self:toggle() end) | |
| 63 | + self:map("n", keys.toggle, function() self:toggle() end) | |
| 62 | 64 | end |
| 63 | 65 | |
| 64 | 66 | function Split:map(...) self.renderer:map(...) end |
+2-1lua/leetcode/command/init.lua
| @@ -2,6 +2,7 @@ local log = require("leetcode.logger") | ||
| 2 | 2 | local arguments = require("leetcode.command.arguments") |
| 3 | 3 | local config = require("leetcode.config") |
| 4 | 4 | local event = require("nui.utils.autocmd").event |
| 5 | +local keys = config.user.keys | |
| 5 | 6 | |
| 6 | 7 | local t = require("leetcode.translator") |
| 7 | 8 | |
| @@ -70,7 +71,7 @@ function cmd.cookie_prompt(cb) | ||
| 70 | 71 | |
| 71 | 72 | input:mount() |
| 72 | 73 | |
| 73 | - input:map("n", { "<Esc>", "q" }, function() input:unmount() end) | |
| 74 | + input:map("n", keys.toggle, function() input:unmount() end) | |
| 74 | 75 | input:on(event.BufLeave, function() input:unmount() end) |
| 75 | 76 | end |
| 76 | 77 |
+11-1lua/leetcode/config/template.lua
| @@ -94,12 +94,22 @@ local M = { | ||
| 94 | 94 | ---@type fun()[] |
| 95 | 95 | LeetEnter = {}, |
| 96 | 96 | |
| 97 | - ---@type fun(question: { lang: string })[] | |
| 97 | + ---@type fun(question: lc.ui.Question)[] | |
| 98 | 98 | LeetQuestionNew = {}, |
| 99 | 99 | }, |
| 100 | 100 | |
| 101 | 101 | ---@type boolean |
| 102 | 102 | image_support = false, -- setting this to `true` will disable question description wrap |
| 103 | + | |
| 104 | + keys = { | |
| 105 | + toggle = { "q", "<Esc>" }, ---@type string|string[] | |
| 106 | + confirm = { "<CR>" }, ---@type string|string[] | |
| 107 | + | |
| 108 | + reset_testcases = "r", ---@type string | |
| 109 | + use_testcase = "U", ---@type string | |
| 110 | + focus_testcases = "H", ---@type string | |
| 111 | + focus_result = "L", ---@type string | |
| 112 | + }, | |
| 103 | 113 | } |
| 104 | 114 | |
| 105 | 115 | return M |