DeathVim icon indicating copy to clipboard operation
DeathVim copied to clipboard

A quick neovim setup.

💀 A Hackable, Fully Featured, Rice Friendly NeoVim Configuration 💀

Stars Issues Repo Size License

Gallery

Features

  • Install in one line of code (view here for more info).
  • Blazingly fast.
  • Written in 100% Lua.
  • Easily able to install (view here for more info):
    • LSP
    • Debuggers
    • Formatters
    • Linters
    • TreeSitter Parsers
  • Git integration with vim-fugitive and vim-gitgutter.
  • Multiple statuslines.
  • Code snippets powered by UltiSnips.
  • Dynamic homepage with alpha-vim.
  • Distraction free writing with ZenMode and Twilight.
  • Common sense keybindings.
  • Uses Which-Key so you never forget your keybindings.
  • Super configurable (view here for more info).
  • Already comes with dozens of builtin stuff (view here for more info).
  • Comes with a simple, intuitive config file (view here for more info).

Installation

:warning: You need the latest neovim version, which currently is 0.8. If you don't have or don't want to have the latest version, then go here.

Installing the Latest Version

bash <(curl -s https://raw.githubusercontent.com/SingularisArt/Death.NeoVim/master/utils/installer/installer.sh) --nightly

Installing the Latest Stable Version

bash <(curl -s https://raw.githubusercontent.com/SingularisArt/Death.NeoVim/master/utils/installer/installer.sh) --stable

Install Language Support

View here for all the supported:

  • Language Servers.
  • Debuggers.
  • Formatters.
  • Linters.

View here for all the supported TreeSitter Parsers.

  • Run :MasonInstall followed by the language server to install.
  • Run :MasonInstall followed by the debugger to install.
  • Run :MasonInstall followed by the formatter to install.
  • Run :MasonInstall followed by the linter to install.
  • Run :TSInstall followed by the TreeSitter parser to install.

Usage

Keybindings

Basic Key-Bindings

Function Keybind Mode
Leader Key SPACE Normal
Create a new tab Ctrl+t Normal
Remove the current tab Ctrl+w Normal
Toggle QuickFix Right Arrow Normal
Close QuickFix Left Arrow Normal
Previous QuickFix item Up Arrow Normal
Next QuickFix item Down Arrow Normal
Format file Ctrl+s Normal
Correct a misspelled word Ctrl+l Normal
Create a vertical split <Leader>v Normal
Create a horizontal split <Leader>h Normal
Minimize all splits <Leader>ooo Normal
Close all splits <Leader>ooO Normal
Bring back all minimized splits <Leader>oO Normal
Highlight everything Ctrl+a Normal
Move text up J Visual
Move text down K Visual
Move text up <Leader>j Normal
Move text down <Leader>k Normal
Open NvimTree <Leader>e Normal
Toggle easymotion <Leader>y Normal
Toggle SymbolsOutline <Leader>u Normal
Packer

Function Keybind Mode
Clean Plugins <Leader>pc Normal
Compile Plugins <Leader>pC Normal
Install Plugins <Leader>pi Normal
Load Plugins <Leader>pl Normal
Profile Plugins <Leader>pp Normal
Plugins Status <Leader>pt Normal
Sync Plugins <Leader>py Normal
Update Plugins <Leader>pu Normal
Snapshot Plugins <Leader>pss Normal
Delete Snapshot Plugins <Leader>psd Normal
Rollback Snapshot Plugins <Leader>psr Normal
Buffers

Function Keybind Mode
Pick Buffer <Leader>bp Normal
Close all Buffers to the Left <Leader>bcl Normal
Close all Buffers to the Right <Leader>bcr Normal
Move Buffer Next <Leader>bmn Normal
Move Buffer Previous <Leader>bmp Normal
Sort Buffers by Directory <Leader>bsd Normal
Sort Buffers by Extension <Leader>bse Normal
Sort Buffers by Relative Directory <Leader>bsr Normal
Sort Buffers by Tabs <Leader>bst Normal
Markdown

Function Keybind Mode
View Markdown <Leader>mp Normal
Git

Function Keybind Mode
Next Hunk <Leader>gj Normal
Prev Hunk <Leader>gk Normal
Blame <Leader>gl Normal
Preview Hunk <Leader>gp Normal
Reset Hunk <Leader>gr Normal
Reset Buffer <Leader>gR Normal
Stage Hunk <Leader>gs Normal
Undo Stage Hunk <Leader>gu Normal
Open changed file <Leader>go Normal
Checkout branch <Leader>gb Normal
Checkout commit <Leader>gc Normal
Checkout commit(for current file) <Leader>gC Normal
Git Diff <Leader>gd Normal
Translate

Function Keybind Mode
Translate <Leader>Tt Normal
Translate History <Leader>Th Normal
Translate Log <Leader>Tl Normal
Translate <Leader>Tr Normal
Translate and display in a Popup Window <Leader>Tw Normal
Translate and Display in the cmdline <Leader>Tx Normal
LaTeX

Function Keybind Mode
Open Context Menu <Leader>lm Normal
Count Letters <Leader>lu Normal
Count Words <Leader>lw Normal
Open Doc for package <Leader>ld Normal
Look at the errors <Leader>le Normal
Look at the status <Leader>ls Normal
Toggle Main <Leader>la Normal
View pdf <Leader>lv Normal
Vimtex Info <Leader>li Normal
Clean Project <Leader>lll Normal
Clean Cache <Leader>llc Normal
Compile Project <Leader>lcc Normal
Compile Project and Show Output <Leader>lco Normal
Compile project super fast <Leader>lcs Normal
Compile Selected <Leader>lce Normal
Reload <Leader>lrr Normal
Reload State <Leader>lrs Normal
Stop <Leader>lop Normal
Stop All <Leader>loa Normal
Open TOC <Leader>lto Normal
Toggle TOC <Leader>ltt Normal
Table

Function Keybind Mode
Enable/Disable Table Mode <Leader>tt Normal
Get cell info <Leader>tn Normal
Add formula <Leader>tfa Normal
Evaluate formula on current row <Leader>tfe Normal
Delete row <Leader>tdr Normal
Delete column <Leader>tdc Normal
Insert column <Leader>tic Normal
Telescope

Function Keybind Mode
Fuzzy find files <Leader>ff Normal
Fuzzy find old files <Leader>fo Normal
Fuzzy find colorschemes <Leader>fc Normal
Fuzzy find buffers <Leader>fb Normal
Fuzzy find auto commands <Leader>fa Normal
Fuzzy find words <Leader>fl Normal
Fuzzy find marks <Leader>fm Normal
Fuzzy find notifications <Leader>fn Normal
Fuzzy find projects <Leader>fp Normal
Fuzzy find symbols <Leader>fs Normal
Fuzzy find diagnostics <Leader>fd Normal
Fuzzy find vim options <Leader>fv Normal
Fuzzy find man pages <Leader>fM Normal
Fuzzy find keymaps <Leader>fk Normal
Fuzzy find treesitter <Leader>ft Normal
Fuzzy find registers <Leader>fr Normal
Fuzzy find help tags <Leader>fh Normal
Fuzzy find search history <Leader>fS Normal
Fuzzy find commands <Leader>fCc Normal
Fuzzy find commands history <Leader>fCh Normal
Debugging

Function Keybind Mode
Run to Cursor <Leader>dR Normal
Evaluate Input <Leader>dE Normal
Conditional Breakpoint <Leader>dC Normal
Toggle UI <Leader>dU Normal
Step Back <Leader>db Normal
Continue <Leader>dc Normal
Disconnect <Leader>dd Normal
Evaluate <Leader>de Normal
Get Session <Leader>dg Normal
Hover Variables <Leader>dh Normal
Scopes <Leader>dS Normal
Step Into <Leader>di Normal
Step Over <Leader>do Normal
Pause <Leader>dp Normal
Quit <Leader>dq Normal
Toggle Repl <Leader>dr Normal
Start <Leader>ds Normal
Toggle Breakpoint <Leader>dt Normal
Terminate <Leader>dx Normal
Step Out <Leader>du Normal
LSP

Function Keybind Mode
Show Documentation <Leader>sh Normal
Show code actions <Leader>sc Normal
Show line diagnostics <Leader>se Normal
Show QuickFix <Leader>sq Normal
Format <Leader>sf Normal
Rename <Leader>sr Normal
Go to implementation <Leader>si Normal
Go to next diagnostic <Leader>sj Normal
Go to previous diagnostic <Leader>sk Normal
Close all windows <Leader>sC Normal
Toggle LSP Lines <Leader>sl Normal
Go to definition <Leader>sdd Normal
Find references <Leader>sdd Normal
Get type definition <Leader>sdd Normal
View definition in pop-up <Leader>sdd Normal
Add workspace <Leader>swa Normal
Remove workspace <Leader>swr Normal

Config File

This is just a quick setup. For a complete guide on configuring DeathVim, please read the wiki page.

Paste the following content in the ~/.config/dvim/lua/config.lua file.

-- For a quickstart guide, please see:
-- https://github.com/SingularisArt/DeathVim/#config-file for a quickstart
-- For more indepth explanation, please see:
-- https://github.com/SingularisArt/DeathVim/wiki/Modifying-the-config.lua-file

------------------------------------------------------------------------
--                              General                               --
------------------------------------------------------------------------

dvim.colorscheme = "rose-pine"
dvim.format_on_save = false

------------------------------------------------------------------------
--                                Logging                             --
------------------------------------------------------------------------

-- The level of logging.
-- Possible values: "trace", "debug", "info", "warn", "error", "fatal"
dvim.log.level = "trace"
-- The file to log to. Default is ~/.cache/dvim/dvim.log
dvim.log.out_file = get_cache_dir() .. "/dvim.log"

------------------------------------------------------------------------
--                              Builtin                               --
------------------------------------------------------------------------

-----------------------
--  Builtin Plugins  --
-----------------------

-- After changing plugin config exit and reopen DeathVim, then
-- Run :PackerSync to reload the plugins.
dvim.builtin.plugins.alpha.active = true
dvim.builtin.plugins.alpha.mode = "dashboard"
dvim.builtin.plugins.indent_blankline.active = true
dvim.builtin.plugins.symbols_outline.active = true
dvim.builtin.plugins.which_key.active = true
dvim.builtin.plugins.gitsigns.active = true
dvim.builtin.plugins.comment.active = true
dvim.builtin.plugins.todo_comments.active = true
dvim.builtin.plugins.terminal.active = true
dvim.builtin.plugins.dap.active = true
dvim.builtin.plugins.ultisnips.active = true
dvim.builtin.plugins.telescope.active = true
dvim.builtin.plugins.project.active = true
dvim.builtin.plugins.copilot.active = true
dvim.builtin.plugins.cmp.active = true
dvim.builtin.plugins.autopairs.active = true
dvim.builtin.plugins.nvimtree.active = true
dvim.builtin.plugins.lualine.active = true
dvim.builtin.plugins.staline.active = true
dvim.builtin.plugins.bufferline.active = true
dvim.builtin.plugins.notify.active = true
dvim.builtin.plugins.treesitter.active = true
dvim.builtin.plugins.folds.active = true

-------------------------
--  Builtin Filetypes  --
-------------------------

-- This is an important list. If you disable a filetype, DeathVim will disable
-- the following for you:
--  It's LSP
--  It's formatter
--  It's diagnostic
--  It's TreeSitter parser
--  It's plugins
-- So, instead of you going through each of those items and disabling them, you
-- can just disable the filetype.
-- After modifying this list, exit and reopen DeathVim, then run :PackerSync.
dvim.builtin.filetypes.lua.active = true
dvim.builtin.filetypes.vim.active = true
dvim.builtin.filetypes.python.active = true
dvim.builtin.filetypes.cpp.active = true
dvim.builtin.filetypes.cmake.active = true
dvim.builtin.filetypes.c.active = true
dvim.builtin.filetypes.c_sharp.active = true
dvim.builtin.filetypes.sql.active = true
dvim.builtin.filetypes.html.active = true
dvim.builtin.filetypes.css.active = true
dvim.builtin.filetypes.javascript.active = true
dvim.builtin.filetypes.typescript.active = true
dvim.builtin.filetypes.php.active = true
dvim.builtin.filetypes.ruby.active = true
dvim.builtin.filetypes.perl.active = true
dvim.builtin.filetypes.java.active = true
dvim.builtin.filetypes.rust.active = true
dvim.builtin.filetypes.solidity.active = true
dvim.builtin.filetypes.go.active = true
dvim.builtin.filetypes.bash.active = true
dvim.builtin.filetypes.log.active = true
dvim.builtin.filetypes.hugo.active = true
dvim.builtin.filetypes.latex.active = true
dvim.builtin.filetypes.markdown.active = true
dvim.builtin.filetypes.yaml.active = true
dvim.builtin.filetypes.json.active = true
dvim.builtin.filetypes.toml.active = true
dvim.builtin.filetypes.tmux.active = true

-----------------------
--  Builtin Actions  --
-----------------------

dvim.builtin.actions.writing.active = true
dvim.builtin.actions.note_taking.active = true
dvim.builtin.actions.programming.active = true
dvim.builtin.actions.presentation.active = true
dvim.builtin.actions.documentation.active = true

------------------------------------------------------------------------
--                            Keymappings                             --
------------------------------------------------------------------------

-------------
--  Setup  --
-------------

dvim.leader = " "

-----------------------
--  Add Keymappings  --
-----------------------

dvim.keys.normal_mode["<C-s>"] = ":w<cr>"
dvim.keys.normal_mode["<C-f>"] =
":silent exec '!inkscape-figures edit \"'.b:vimtex.root.'/figures/\" > /dev/null 2>&1 &'<CR><CR>:redraw!<CR>"
dvim.keys.insert_mode["<C-f>"] =
"<Esc>:silent exec '.!inkscape-figures create \"'.getline('.').'\" \"'.b:vimtex.root.'/figures/\"'<CR>"

--------------------------
--  Remove Keymappings  --
--------------------------

-- Ctrl+a highlights everything
dvim.keys.normal_mode["<C-a>"] = ""

--------------------------
--  Which Key Bindings  --
--------------------------

-- Ignore this. If you remove this, then a whole ton of shit starts to happen
-- and this is the easiest way to fix it.
dvim.builtin.plugins.which_key.user_vmappings = {}
dvim.builtin.plugins.which_key.user_mappings = {}

dvim.builtin.plugins.which_key.user_vmappings = {}
dvim.builtin.plugins.which_key.user_mappings["r"] = {
  name = "+Trouble",
  r = { "<cmd>Trouble lsp_references<cr>", "References" },
  f = { "<cmd>Trouble lsp_definitions<cr>", "Definitions" },
  d = { "<cmd>Trouble document_diagnostics<cr>", "Diagnostics" },
  q = { "<cmd>Trouble quickfix<cr>", "QuickFix" },
  l = { "<cmd>Trouble loclist<cr>", "LocationList" },
  w = { "<cmd>Trouble workspace_diagnostics<cr>", "Wordspace Diagnostics" },
}

------------------------------------------------------------------------
--                         Modifying Plugins                          --
------------------------------------------------------------------------

------------------
--  Statusline  --
------------------

-- Possible values: "staline", "lualine"
dvim.statusline = "lualine"
-- Possible values: "evil", "normal", "pebble", "simple", "simpler"
dvim.builtin.plugins.staline.mode = "evil"
-- Possible values: "evil", "bubbles", "slanted"
dvim.builtin.plugins.lualine.theme = "pywal" -- https://github.com/nvim-lualine/lualine.nvim/blob/master/THEMES.md
dvim.builtin.plugins.lualine.mode = "evil"

-----------------
--  Telescope  --
-----------------

-- Extensions
dvim.builtin.plugins.telescope.extensions.active = true
dvim.builtin.plugins.telescope.extensions.file_browser.active = true
dvim.builtin.plugins.telescope.extensions.project.active = true
dvim.builtin.plugins.telescope.extensions.notify.active = true
dvim.builtin.plugins.telescope.extensions.media_files.active = true
dvim.builtin.plugins.telescope.extensions.vim_bookmarks.active = true
dvim.builtin.plugins.telescope.extensions.symbols.active = true

-------------------
--  Tree Sitter  --
-------------------

dvim.builtin.plugins.treesitter.ensure_installed = {
  "lua",
  "vim",
  "python",
  "cpp",
  "cmake",
  "c",
  "c_sharp",
  "sql",
  "html",
  "css",
  "javascript",
  "typescript",
  "php",
  "ruby",
  "perl",
  "java",
  "rust",
  "solidity",
  "go",
  "bash",
  "yaml",
  "json",
  "toml",
}
dvim.builtin.plugins.treesitter.ignore_install = {
  "markdown",
  "latex",
}
dvim.builtin.plugins.treesitter.highlight.enable = true
dvim.builtin.plugins.treesitter.highlight.additional_vim_regex_highlighting = false
dvim.builtin.plugins.treesitter.highlight.disable = {
  "markdown",
  "latex",
}
dvim.builtin.plugins.treesitter.autopairs.enable = true
dvim.builtin.plugins.treesitter.autopairs.disable = {
  "markdown",
  "latex",
}
dvim.builtin.plugins.treesitter.context_commentstring.enable = true
dvim.builtin.plugins.treesitter.context_commentstring.enable_autocmd = false
dvim.builtin.plugins.treesitter.indent.enable = true
dvim.builtin.plugins.treesitter.indent.disable = {
  "markdown",
  "latex",
}

dvim.builtin.plugins.treesitter.autotag.enable = true

dvim.builtin.plugins.treesitter.textobjects.swap.enable = true
dvim.builtin.plugins.treesitter.textobjects.select.enable = true
dvim.builtin.plugins.treesitter.textobjects.move.enable = true
dvim.builtin.plugins.treesitter.textobjects.move.set_jumps = true

dvim.builtin.plugins.treesitter.textsubjects.enable = true

dvim.builtin.plugins.treesitter.playground.enable = true
dvim.builtin.plugins.treesitter.playground.disable = {
  "",
}

dvim.builtin.plugins.treesitter.rainbow.enable = true
dvim.builtin.plugins.treesitter.rainbow.extended_mode = true
dvim.builtin.plugins.treesitter.rainbow.max_file_lines = 1000
dvim.builtin.plugins.treesitter.rainbow.disable = {
  "html",
}

-----------------
--  Which Key  --
-----------------

dvim.builtin.plugins.which_key.marks = true
dvim.builtin.plugins.which_key.presets.operators = true
dvim.builtin.plugins.which_key.presets.motions = true
dvim.builtin.plugins.which_key.presets.text_objects = true
dvim.builtin.plugins.which_key.presets.nav = true
dvim.builtin.plugins.which_key.presets.z = true
dvim.builtin.plugins.which_key.presets.g = true
dvim.builtin.plugins.which_key.spelling.enabled = true
dvim.builtin.plugins.which_key.spelling.suggestions = 20

-----------------
--  Git Signs  --
-----------------

-- Show the git commit message on the line
dvim.builtin.plugins.gitsigns.line_blame = true

------------------------------------------------------------------------
--                                LSP                                 --
------------------------------------------------------------------------

-------------
-- General --
-------------

dvim.lsp.active = true

-----------------
--  Lsp Lines  --
-----------------

dvim.lsp.lsp_lines = false

------------------------
--  Language Servers  --
------------------------

-- This list depends on the filetypes list. Don't remove any of the items. Only
-- add new ones and if you want to disable a filetype, set it to false in the
-- filetypes list from above.
dvim.lsp.language_servers = {
  { server = "sumneko_lua", filetype = "lua" },
  { server = "vimls", filetype = "vim" },
  { server = "texlab", filetype = "latex" },
  { server = "pylsp", filetype = "python" },
  { server = "bashls", filetype = "bash" },
  { server = "clangd", filetype = "cpp" },
  { server = "cmake", filetype = "cmake" },
  { server = "html", filetype = "html" },
  { server = "emmet_ls", filetype = "html" },
  { server = "cssls", filetype = "css" },
  { server = "tailwindcss", filetype = "css" },
  { server = "jsonls", filetype = "json" },
  { server = "rust_analyzer", filetype = "rust" },
  { server = "solang", filetype = "solidity" },
  { server = "solc", filetype = "solidity" },
  { server = "golangci_lint_ls", filetype = "go" },
  { server = "tsserver", filetype = "javascript" },
  { server = "jdtls", filetype = "java" },
  { server = "yamlls", filetype = "yaml" },
}

-- If you don't have a server installed for a filetype, DeathVim will try to
-- install it for you, but it isn't perfect. Always check the log file
-- (~/.config/dvim/log.log) to see if it succeded or failed.
dvim.lsp.automatic_servers_installation = true

----------------
-- Formatters --
----------------

-- This list depends on the filetypes list. Don't remove any of the items. Only
-- add new ones and if you want to disable a filetype, set it to false in the
-- filetypes list from above.
dvim.lsp.formatters = {
  {
    formatter = "black",
    extra_args = { "--fast" },
    filetype = "python",
  },
  {
    formatter = "clang_format",
    filetype = "cpp",
  },
  {
    formatter = "latexindent",
    filetype = "latex",
  },
  {
    formatter = "prettier",
    extra_args = { "--single-quote", "--jsx-single-quote" },
    filetype = "javascript",
  },
  {
    formatter = "rustfmt",
    filetype = "rust",
  },
  {
    formatter = "sql_formatter",
    filetype = "sql",
  },
  {
    formatter = "standardrb",
    extra_args = { "--fix", "--format", "quiet", "--stderr", "--stdin", "$FILENAME" },
    filetype = "ruby",
  },
  {
    formatter = "stylua",
    filetype = "lua",
  },
  {
    formatter = "google_java_format",
    filetype = "java",
  },
  {
    formatter = "shellharden",
    filetype = "bash",
  },
}

-- If you don't have a formatter installed for a filetype, DeathVim will try to
-- install it for you, but it isn't perfect. Always check the log file
-- (~/.config/dvim/log.log) to see if it succeded or failed.
dvim.lsp.automatic_formatters_installation = true

-----------------
-- Diagnostics --
-----------------

-- This list depends on the filetypes list. Don't remove any of the items. Only
-- add new ones and if you want to disable a filetype, set it to false in the
-- filetypes list from above.
dvim.lsp.diagnostics = {
  {
    diagnostic = "flake8",
    filetype = "python",
  },
  {
    diagnostic = "cppcheck",
    filetype = "cpp",
  },
  {
    diagnostic = "write_good",
    filetype = "latex",
  },
}

-- If you don't have a diagnostic installed for a filetype, DeathVim will try
-- to install it for you, but it isn't perfect. Always check the log file
-- (~/.config/dvim/log.log) to see if it succeded or failed.
dvim.lsp.automatic_diagnostics_installation = true

-----------
-- Hover --
-----------

dvim.lsp.hovers = {
  { hover = "dictionary" },
}

-----------------
-- Code Action --
-----------------

dvim.lsp.code_actions = {
  { code_action = "gitsigns" },
  { code_action = "gitrebase" },
}

----------------
-- Completion --
----------------

dvim.lsp.completions = {
  { completion = "spell" },
}

------------------------------------------------------------------------
--                    Individual Filetype Settings                    --
------------------------------------------------------------------------

-- Here is where you put each speific settings for each filetype.

dvim.builtin.filetypes.latex.settings = {
  wrap = true,
  spell = true,
}

dvim.builtin.filetypes.markdown.settings = {
  wrap = true,
  spell = true,
}

------------------------------------------------------------------------
--                         Additional Plugins                         --
------------------------------------------------------------------------

-- Add any additional plugins you may want
dvim.plugins = {
  "folke/trouble.nvim",
  "tjdevries/express_line.nvim",
}

------------------------------------------------------------------------
--                           Auto Commands                            --
------------------------------------------------------------------------

-- let treesitter use bash highlight for zsh files as well
vim.api.nvim_create_autocmd("FileType", {
  pattern = "zsh",
  callback = function()
    require("nvim-treesitter.highlight").attach(0, "bash")
  end,
})

------------------------------------------------------------------------
--                            Vim Commands                            --
------------------------------------------------------------------------

dvim.vim_commands = {
  { command = "set rtp+=~/Documents/school-notes/current-course" },
}

Resources

Credit

Huge shoutout to the follwing people and organizations:

  • LunarVim: I used a ton of their code and their project structure. Without them, it would've probebly would've taken me 5 months to start this project.
  • Christian Chiarulli: He inspired me to create this project with his NeoVim from Scratch and Making NeoVim an IDE series.
  • Gideon Wolfe: I also borrowed some of his code and his idea from his vim.reaper project.
  • Wincent: I got many ideas from his Vim/NeoVim configuration setup.
  • Sweet_Ad6090: He's the skilled man who created the logo for me. If you need any logo designing, he's your guy. Send him a message through reddit, and he's be happy to help you out.