demo.mp4
-
π an intuitive dashboard for effortless navigation within leetcode.nvim
-
π question description formatting for a better readability
-
π support for daily and random questions
-
πΎ caching for optimized performance
-
Neovim >= 0.9.0
-
tree-sitter-html (optional, but highly recommended) used for formatting the question description. Can be installed with nvim-treesitter.
-
Nerd Font & nvim-web-devicons (optional)
{
"kawre/leetcode.nvim",
build = ":TSUpdate html", -- if you have `nvim-treesitter` installed
dependencies = {
-- include a picker of your choice, see picker section for more details
"nvim-lua/plenary.nvim",
"MunifTanjim/nui.nvim",
},
opts = {
-- configuration goes here
},
}
To see full configuration types see template.lua
{
---@type string
arg = "leetcode.nvim",
---@type lc.lang
lang = "cpp",
cn = { -- leetcode.cn
enabled = false, ---@type boolean
translator = true, ---@type boolean
translate_problems = true, ---@type boolean
},
---@type lc.storage
storage = {
home = vim.fn.stdpath("data") .. "/leetcode",
cache = vim.fn.stdpath("cache") .. "/leetcode",
},
---@type table<string, boolean>
plugins = {
non_standalone = false,
},
---@type boolean
logging = true,
injector = {}, ---@type table<lc.lang, lc.inject>
cache = {
update_interval = 60 * 60 * 24 * 7, ---@type integer 7 days
},
editor = {
reset_previous_code = true, ---@type boolean
fold_imports = true, ---@type boolean
},
console = {
open_on_runcode = true, ---@type boolean
dir = "row", ---@type lc.direction
size = { ---@type lc.size
width = "90%",
height = "75%",
},
result = {
size = "60%", ---@type lc.size
},
testcase = {
virt_text = true, ---@type boolean
size = "40%", ---@type lc.size
},
},
description = {
position = "left", ---@type lc.position
width = "40%", ---@type lc.size
show_stats = true, ---@type boolean
},
---@type lc.picker
picker = { provider = nil },
hooks = {
---@type fun()[]
["enter"] = {},
---@type fun(question: lc.ui.Question)[]
["question_enter"] = {},
---@type fun()[]
["leave"] = {},
},
keys = {
toggle = { "q" }, ---@type string|string[]
confirm = { "<CR>" }, ---@type string|string[]
reset_testcases = "r", ---@type string
use_testcase = "U", ---@type string
focus_testcases = "H", ---@type string
focus_result = "L", ---@type string
},
---@type lc.highlights
theme = {},
---@type boolean
image_support = false,
}
Argument for Neovim
---@type string
arg = "leetcode.nvim"
See usage for more info
Language to start your session with
---@type lc.lang
lang = "cpp"
available languages
Language | lang |
---|---|
C++ | cpp |
Java | java |
Python | python |
Python3 | python3 |
C | c |
C# | csharp |
JavaScript | javascript |
TypeScript | typescript |
PHP | php |
Swift | swift |
Kotlin | kotlin |
Dart | dart |
Go | golang |
Ruby | ruby |
Scala | scala |
Rust | rust |
Racket | racket |
Erlang | erlang |
Elixir | elixir |
Bash | bash |
Use leetcode.cn instead of leetcode.com
cn = { -- leetcode.cn
enabled = false, ---@type boolean
translator = true, ---@type boolean
translate_problems = true, ---@type boolean
},
storage directories
---@type lc.storage
storage = {
home = vim.fn.stdpath("data") .. "/leetcode",
cache = vim.fn.stdpath("cache") .. "/leetcode",
},
---@type table<string, boolean>
plugins = {
non_standalone = false,
},
Whether to log leetcode.nvim status notifications
---@type boolean
logging = true
Inject code before or after your solution, injected code won't be submitted or run.
Imports will be injected at the top of the buffer, automatically folded by default.
injector = { ---@type table<lc.lang, lc.inject>
["python3"] = {
imports = function(default_imports)
vim.list_extend(default_imports, { "from .leetcode import *" })
return default_imports
end,
after = { "def test():", " print('test')" },
},
["cpp"] = {
imports = function()
-- return a different list to omit default imports
return { "#include <bits/stdc++.h>", "using namespace std;" }
end,
after = "int main() {}",
},
},
Supported picker providers are:
If provider
is nil
, leetcode.nvim will try to resolve the first
available one in the order above.
---@type lc.picker
picker = { provider = nil },
List of functions that get executed on specified event
hooks = {
---@type fun()[]
["enter"] = {},
---@type fun(question: lc.ui.Question)[]
["question_enter"] = {},
---@type fun()[]
["leave"] = {},
},
Override the default theme.
Each value is the same type as val parameter in :help nvim_set_hl
---@type lc.highlights
theme = {
["alt"] = {
bg = "#FFFFFF",
},
["normal"] = {
fg = "#EA4AAA",
},
},
Whether to render question description images using image.nvim
Warning
Enabling this will disable question description wrap, because of 3rd/image.nvim#62 (comment)
---@type boolean
image_support = false,
-
menu
same asLeet
-
exit
close leetcode.nvim -
console
opens console pop-up for currently opened question -
info
opens a pop-up containing information about the currently opened question -
tabs
opens a picker with all currently opened question tabs -
yank
yanks the code section -
lang
opens a picker to change the language of the current question -
run
run currently opened question -
test
same asLeet run
-
submit
submit currently opened question -
random
opens a random question -
daily
opens the question of today problem -
list
opens a picker with all available leetcode problems -
open
opens the current question in a default browser -
restore
try to restore default question layout -
last_submit
tries to replace the editor code section with the latest submitted code -
reset
resets editor code section to the default snippet -
inject
re-injects editor code, keeping the code section intact -
fold
applies folding to the current question imports section
-
desc
toggle question description-
toggle
same asLeet desc
-
stats
toggle description stats visibility
-
-
cookie
-
update
opens a prompt to enter a new cookie -
delete
deletes stored cookie and logs out of leetcode.nvim
-
-
cache
update
fetches all available problems and updates the local cache of leetcode.nvim
-
Leet list
Leet list status=<status> difficulty=<difficulty>
-
Leet random
Leet random status=<status> difficulty=<difficulty> tags=<tags>
This plugin can be initiated in two ways:
-
To start leetcode.nvim, simply pass
arg
as the first and only Neovim argumentnvim leetcode.nvim
-
Use
:Leet
command to open leetcode.nvim within your preferred dashboard plugin. The only requirement is that Neovim must not have any listed buffers open. To bypass this requirement usenon_standalone
plugin.
To switch between test cases, press the number of the test case
1
for Case (1), 2
for Case (2), etc
To switch between questions, use Leet tabs
Warning
Be sure to copy the Cookie
from request headers, not the set-cookie
from
response headers.
signin.mp4
π€ lazy loading with lazy.nvim
Warning
opting for either option makes the alternative launch method unavailable due to lazy loading
-
with
arg
local leet_arg = "leetcode.nvim"
{ "kawre/leetcode.nvim", lazy = leet_arg ~= vim.fn.argv(0, -1), opts = { arg = leet_arg }, }
-
with
:Leet
{ "kawre/leetcode.nvim", cmd = "Leet", }
If you are using Windows, it is recommended to use Cygwin for a more consistent and Unix-like experience.
To run leetcode.nvim in a non-standalone mode (i.e. not with argument or an empty Neovim session),
enable the non_standalone
plugin in your config:
plugins = {
non_standalone = true,
}
You can then exit leetcode.nvim using :Leet exit
command