diff --git a/nvim/lua/plugins.lua b/nvim/lua/plugins.lua index d7e3aa3..e785101 100644 --- a/nvim/lua/plugins.lua +++ b/nvim/lua/plugins.lua @@ -28,18 +28,57 @@ return require("packer").startup(function(use) -- Snippets engine. -- A must have for me. - -- TODO: Port some of my personal snippets. use { "L3MON4D3/LuaSnip", requires = { "rafamadriz/friendly-snippets", - "molleweide/LuaSnip-snippets.nvim", }, config = function () require("luasnip.loaders.from_vscode").lazy_load() require("luasnip.loaders.from_lua").lazy_load() + + local ls = require("luasnip") + local types = require("luasnip.util.types") + ls.config.set_config { + history = true, + update_events = "TextChanged,TextChangedI", + ext_opts = { + [types.choiceNode] = { + active = { + virt_text = { {"<- Current choice", "Comment"} }, + }, + }, + + [types.insertNode] = { + active = { + virt_text = { {"<>", "Comment"} }, + }, + }, + }, + } + + vim.keymap.set({ "i", "s" }, "", function() + if ls.jumpable(1) then + ls.jump(1) + end + end) + + vim.keymap.set({ "i", "s" }, "", function() + if ls.jumpable(-1) then + ls.jump(-1) + end + end) + + vim.keymap.set({ "i", "s" }, "", function() + if ls.expand_or_jumpable() then + ls.expand_or_jump() + end + end) + + vim.keymap.set({ "i", "s" }, "", function() + require("luasnip.extras.select_choice")() + end) end, - event = "InsertEnter", } -- Fuzzy finder of lists diff --git a/nvim/luasnippets/all.lua b/nvim/luasnippets/all.lua new file mode 100644 index 0000000..627a46d --- /dev/null +++ b/nvim/luasnippets/all.lua @@ -0,0 +1,34 @@ +return { + s( + "today", + f(function () + return os.date "%F" + end) + ), + + s( + "retrieve", + f(function () + return string.format("(retrieved %s)", os.date("%F")) + end) + ), + + s( + { trig = "reldate (-?%d+) \"(.+)\"", regTrig = true }, + f(function(_, snip) + -- The point is in number of days. + local point = 60 * 60 * 24 * snip.captures[1] + + local now = os.time() + return os.date(snip.captures[2], now + point) + end) + ), + + s( + "#!", + fmt("#!{}", i(1, "/usr/bin/env bash")) + ), + + parse("ie", "(i.e., $1)"), + parse("eg", "(e.g., $1)"), +} diff --git a/nvim/luasnippets/asciidoc.lua b/nvim/luasnippets/asciidoc.lua new file mode 100644 index 0000000..0bffcd2 --- /dev/null +++ b/nvim/luasnippets/asciidoc.lua @@ -0,0 +1,117 @@ +function max_asciidoc_header(level) + return math.min(level, 6) +end + +return { + parse("bf", "**$1**"), + parse("it", "__$1__"), + parse("tt", "\\$1\\"), + parse("sp", "^$1^"), + parse("sb", "~$1~"), + + parse("foot", "footnote:[$1]"), + parse("a", "link:$1[$2]"), + parse("var", ":$1: $2"), + + parse("audio", "audio::$1[$2]"), + parse("video", "video::$1[$2]"), + + s("fmt", + fmt("{}{}{}", { + c(1, { + t "**", + t "__", + t "`", + }), + i(2), + rep(1), + })), + + s("dt", + fmt([[ + {}:: + {} + ]], { + i(1, "TERM"), + i(2, "DEFINITION"), + })), + + s("src", + fmt([[ + [source, {}] + ---- + {} + ---- + {} + ]], { + i(1, "LANGUAGE"), + i(2, "CODE"), + i(0), + })), + + s( + { trig = "h(%d)", regTrig = true }, + fmt([[ + {} {} + {} + {} + ]], { + f(function(_, snip) + local level = max_asciidoc_header(snip.captures[1]) + return string.rep("=", level) + end), + i(1, "CHAPTER"), + d(2, function(_, snip) + local nodes = {} + table.insert(nodes, t "") + + local level = max_asciidoc_header(snip.captures[1]) + + if level == 1 then + table.insert(nodes, t ":toc:") + end + + local parent = c(1, nodes) + if level > 1 then + parent = t "" + end + + return sn(nil, parent) + end, {}), + i(0), + }) + ), + + s( + "admon", + fmt("{}: {}", { + c(1, { + t "NOTE", + t "TIP", + t "IMPORTANT", + t "CAUTION", + t "WARNING", + }), + i(0), + })), + + s( + "admonB", + fmt([[ + [{}] + ==== + {} + ==== + {} + ]], { + c(1, { + t "NOTE", + t "TIP", + t "IMPORTANT", + t "CAUTION", + t "WARNING", + }), + i(2, "BODY"), + i(0), + })), +} diff --git a/nvim/own-snippets/nix.snippets b/nvim/own-snippets/nix.snippets deleted file mode 100644 index 596a1d7..0000000 --- a/nvim/own-snippets/nix.snippets +++ /dev/null @@ -1,19 +0,0 @@ -snippet shell "Nix shell template" b -{ pkgs ? import {} }: - -with pkgs; - -mkShell { - buildInputs = [ - ${1} - ]; -} -endsnippet - -snippet mkDerivation "Shorthand for stdenv.mkDerivation" b -{ stdenv, lib, $1 }: - -stdenv.mkDerivation rec { - $2 -} -endsnippet diff --git a/nvim/own-snippets/all.snippets b/nvim/ultisnips/all.snippets similarity index 95% rename from nvim/own-snippets/all.snippets rename to nvim/ultisnips/all.snippets index 4877b71..10dac72 100755 --- a/nvim/own-snippets/all.snippets +++ b/nvim/ultisnips/all.snippets @@ -8,7 +8,7 @@ def relative_date(days = 0): return calculated_date endglobal -snippet "reldate (\d+)( ".+")?" "Prints out the relative date in ISO format." ri +snippet "reldate (-?\d+)( .+)?" "Prints out the relative date in ISO format." ri `!p reldate = relative_date(match.group(1)) date_format = match.group(2).strip(" \"") if match.group(2) is not None else "%F" @@ -90,11 +90,10 @@ snippet #! "Quick snippet for a shebang." bi endsnippet # This is only useful for decorative comment boxes and all of the jazz. -snippet "boxen '(.*)'" "Create a box of stuff" ir +snippet "boxen (.*)" "Create a box of stuff" ir `!p snip.rv = (match.group(1) * (len(t[1]) + 4)).strip()[0:(len(t[1]) + 4)]` `!p snip.rv = match.group(1)[0]` $1 `!p snip.rv = match.group(1)[0]` `!p snip.rv = (match.group(1) * (len(t[1]) + 4)).strip()[0:(len(t[1]) + 4)]` -$0 endsnippet # Also stolen from Gilles Castel's post at https://castel.dev/post/lecture-notes-1/. @@ -102,6 +101,5 @@ snippet box "More box (that looks more like a box)." `!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'` │ $1 │ `!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'` -$0 endsnippet diff --git a/nvim/own-snippets/asciidoc.snippets b/nvim/ultisnips/asciidoc.snippets similarity index 100% rename from nvim/own-snippets/asciidoc.snippets rename to nvim/ultisnips/asciidoc.snippets diff --git a/nvim/own-snippets/dhall.snippets b/nvim/ultisnips/dhall.snippets similarity index 100% rename from nvim/own-snippets/dhall.snippets rename to nvim/ultisnips/dhall.snippets diff --git a/nvim/own-snippets/markdown.snippets b/nvim/ultisnips/markdown.snippets similarity index 100% rename from nvim/own-snippets/markdown.snippets rename to nvim/ultisnips/markdown.snippets diff --git a/nvim/ultisnips/nix.snippets b/nvim/ultisnips/nix.snippets new file mode 100644 index 0000000..a56b314 --- /dev/null +++ b/nvim/ultisnips/nix.snippets @@ -0,0 +1,56 @@ +snippet shell "Nix shell template" b +{ pkgs ? import {} }: + +with pkgs; + +mkShell { + buildInputs = [ + ${1} + ]; +} +endsnippet + +snippet mkDerivation "Shorthand for stdenv.mkDerivation" b +{ stdenv, lib, $1 }: + +stdenv.mkDerivation rec { + $2 +} +endsnippet + +snippet buildGoModule "Shorthand for building Go modules" b +{ stdenv, lib, buildGoModule, $1 }: + +buildGoModule rec { + pname = $1; + version = $2; + + vendorSha256 = ""; +} +endsnippet + +snippet homeManagerModule "A file template for " +{ config, options, lib, pkgs, ... }: + +let + cfg = config.$1; +in { + options.$1 = { + enable = lib.mkEnableOption "$2"; + }; + + config = lib.mkIf cfg.enable { + }; +} +endsnippet + +snippet mkOption "lib.mkOption from nixpkgs" i +lib.mkOption { + type = $1; + description = $2; + default = $3; + example = $4; + $5 +} +endsnippet + diff --git a/nvim/own-snippets/nroff.snippets b/nvim/ultisnips/nroff.snippets similarity index 100% rename from nvim/own-snippets/nroff.snippets rename to nvim/ultisnips/nroff.snippets diff --git a/nvim/own-snippets/python.snippets b/nvim/ultisnips/python.snippets similarity index 100% rename from nvim/own-snippets/python.snippets rename to nvim/ultisnips/python.snippets diff --git a/nvim/own-snippets/sh.snippets b/nvim/ultisnips/sh.snippets similarity index 100% rename from nvim/own-snippets/sh.snippets rename to nvim/ultisnips/sh.snippets diff --git a/nvim/own-snippets/snippets.snippets b/nvim/ultisnips/snippets.snippets similarity index 100% rename from nvim/own-snippets/snippets.snippets rename to nvim/ultisnips/snippets.snippets diff --git a/nvim/own-snippets/tex.snippets b/nvim/ultisnips/tex.snippets similarity index 100% rename from nvim/own-snippets/tex.snippets rename to nvim/ultisnips/tex.snippets