diff options
| author | Ariel D'Alessandro <dalessandro.ariel@gmail.com> | 2022-02-12 21:07:15 +0100 |
|---|---|---|
| committer | Ariel D'Alessandro <dalessandro.ariel@gmail.com> | 2022-02-12 21:07:15 +0100 |
| commit | 535b2236a134a4e36979ae27159c3f46e808ca6c (patch) | |
| tree | 5e26a0ae61525177311acbb6b24e37a1eea3744d | |
| parent | ff4c5962014c0b0c49da786536bba0cd16dfe10a (diff) | |
| download | nvim-conf-535b2236a134a4e36979ae27159c3f46e808ca6c.tar.gz nvim-conf-535b2236a134a4e36979ae27159c3f46e808ca6c.zip | |
improve snippets
| -rw-r--r-- | after/plugin/luasnip.lua | 127 | ||||
| -rw-r--r-- | lua/alpha/snips/ft/go.lua | 3 | ||||
| -rw-r--r-- | lua/alpha/snips/ft/lua.lua | 46 | ||||
| -rw-r--r-- | lua/alpha/snips/ft/php.lua | 110 | ||||
| -rw-r--r-- | plugin/keymaps.vim | 21 |
5 files changed, 297 insertions, 10 deletions
diff --git a/after/plugin/luasnip.lua b/after/plugin/luasnip.lua index 9a1c3db..1d6495a 100644 --- a/after/plugin/luasnip.lua +++ b/after/plugin/luasnip.lua @@ -2,6 +2,133 @@ if vim.g.snippets ~= "luasnip" then return end +local ls = require "luasnip" +local types = require "luasnip.util.types" + +ls.config.set_config { + -- This tells LuaSnip to remember to keep around the last snippet. + -- You can jump back into even if you move outside of the selection + history = true, + + -- This one is cool cause if you have dynamic snippets, it updatesas you type! + updateevent = "TextChanged,TextChangedI", + + -- Autosnippets: + enable_autosnippets = true, + + ext_opts = { + [types.choiceNode] = { + active = { + virt_text = { { "<-", "Error" } }, + }, + }, + }, +} + +-- create snippet +-- s(context, nodes, condition, ...) +local snippet = ls.s + +-- TODO: Write about this. +-- Useful for dynamic nodes and choice nodes +local snippet_from_nodes = ls.sn + +-- This is the simplest node. +-- Creates a new text node. Places cursor after node by default. +-- t { "this will be inserted" } +-- +-- Multiple lines are by passing a table of strings. +-- t { "line 1", "line 2" } +local t = ls.text_node + +-- Insert Node +-- Creates a location for the cursor to jump to. +-- Possible options to jump to are 1 - N +-- If you use 0, that's the final place to jump to. +-- +-- To create placeholder text, pass it as the second argument +-- i(2, "this is placeholder text") +local i = ls.insert_node + +-- Function Node +-- Takes a function that returns text +local f = ls.function_node + +-- This a choice snippet. You can move through with <c-l> (in my config) +-- c(1, { t {"hello"}, t {"world"}, }), +-- +-- The first argument is the jump position +-- The second argument is a table of possible nodes. +-- Note, one thing that's nice is you don't have to include +-- the jump position for nodes that normally require one (can be nil) +local c = ls.choice_node + +local d = ls.dynamic_node + +-- TODO: Document what I've learned about lambda +local l = require("luasnip.extras").lambda + +local events = require "luasnip.util.events" + +local shortcut = function(val) + if type(val) == "string" then + return { t { val }, i(0) } + end + + if type(val) == "table" then + for k, v in ipairs(val) do + if type(v) == "string" then + val[k] = t { v } + end + end + end + + return val +end + +local make = function(tbl) + local result = {} + for k, v in pairs(tbl) do + table.insert(result, (snippet({ trig = k, desc = v.desc }, shortcut(v)))) + end + + return result +end + + + +local snippets = {} + +for _, ft_path in ipairs(vim.api.nvim_get_runtime_file("lua/alpha/snips/ft/*.lua", true)) do + local ft = vim.fn.fnamemodify(ft_path, ":t:r") + snippets[ft] = make(loadfile(ft_path)()) +end + +ls.snippets = snippets + +-- <c-k> is my expansion key +-- this will expand the current item or jump to the next item within the snippet. +vim.keymap.set({ "i", "s" }, "<c-k>", function() + if ls.expand_or_jumpable() then + ls.expand_or_jump() + end +end, { silent = true }) + +-- <c-j> is my jump backwards key. +-- this always moves to the previous item within the snippet +vim.keymap.set({ "i", "s" }, "<c-j>", function() + if ls.jumpable(-1) then + ls.jump(-1) + end +end, { silent = true }) + +-- <c-l> is selecting within a list of options. +-- This is useful for choice nodes (introduced in the forthcoming episode 2) +vim.keymap.set("i", "<c-l>", function() + if ls.choice_active() then + ls.change_choice(1) + end +end) -- shorcut to source my luasnips file again, which will reload my snippets vim.keymap.set("n", "<leader><leader>s", "<cmd>source ~/.config/nvim/after/plugin/luasnip.lua<CR>") diff --git a/lua/alpha/snips/ft/go.lua b/lua/alpha/snips/ft/go.lua new file mode 100644 index 0000000..5044d6f --- /dev/null +++ b/lua/alpha/snips/ft/go.lua @@ -0,0 +1,3 @@ +local M = {} + +return M diff --git a/lua/alpha/snips/ft/lua.lua b/lua/alpha/snips/ft/lua.lua new file mode 100644 index 0000000..539751e --- /dev/null +++ b/lua/alpha/snips/ft/lua.lua @@ -0,0 +1,46 @@ +local ls = require "luasnip" + +-- local snippet = ls.s +local snippet_from_nodes = ls.sn +local c = ls.choice_node +local d = ls.dynamic_node +local i = ls.insert_node +local t = ls.text_node + +local fmt = require("luasnip.extras.fmt").fmt + +local require_var = function(args, _) + local text = args[1][1] or "" + local split = vim.split(text, ".", { plain = true }) + + local options = {} + for len = 0, #split - 1 do + table.insert(options, t(table.concat(vim.list_slice(split, #split - len, #split), "_"))) + end + + return snippet_from_nodes(nil, { + c(1, options), + }) +end + +local newline = function(text) + return t { "", text } +end + +return { + req = fmt([[local {} = require("{}")]], { + d(2, require_var, { 1 }), + i(1), + }), + lf = { + desc = "table function", + "local ", + i(1), + " = function(", + i(2), + ")", + newline " ", + i(0), + newline "end", + }, +} diff --git a/lua/alpha/snips/ft/php.lua b/lua/alpha/snips/ft/php.lua new file mode 100644 index 0000000..c2210a9 --- /dev/null +++ b/lua/alpha/snips/ft/php.lua @@ -0,0 +1,110 @@ +local ls = require("luasnip") + +local snippet_from_nodes = ls.sn +local c = ls.choice_node +local t = ls.text_node +local d = ls.dynamic_node +local f = ls.function_node +local i = ls.insert_node +local fmt = require("luasnip.extras.fmt").fmt + + +function string.starts(String,Start) + return string.sub(String,1,string.len(Start))==Start +end + +local newline = function(text) + return t { "", text } +end + +local visibility = function(_, _, _, inital) + local possibles = {'private', 'public', 'protected'} + + local options = {} + + for _, value in pairs(possibles) do + if value == inital then + table.insert(options, 1, t(value)) + else + table.insert(options, t(value)) + end + end + + return snippet_from_nodes(nil, { + c(1, options) + }) +end + +local promoted_property +promoted_property = function() + return snippet_from_nodes(nil, { + c(1, { + t(""), + snippet_from_nodes(nil, { + newline "\t", + d(1, visibility, {}, "private"), + i(2, '$var'), + t ",", + d(3, promoted_property, {}) + }), + }), + }) +end + +local namespace = function () + local dir = vim.fn.expand('%:h') + local autoloads = vim.call('composer#query', 'autoload.psr-4') + if autoloads == nil then + return (dir:gsub("^%l", string.upper)) + end + + local globalNamespace + for key, value in pairs(autoloads) do + if string.starts(dir, value:sub(1, -2)) then + globalNamespace = key:sub(1, -2); + dir = dir:sub(#key + 1) + break + end + end + dir = dir:gsub("/", "\\") + + return string.format("%s\\%s",globalNamespace, dir ) +end + +local class_name = function () + local filename = vim.fn.expand('%:t:r') + return filename +end +local M = { + v = fmt( +[[ +/** + * @var {} + */ +{} ${}; +]], { + i(1, "type"), + d(2, visibility, { 1 }, "private"), + i(3, "var") + }), + class = fmt( +[[ +<?php + +declare(strict_types=1); + +namespace []; + +class [] +{ + [] +} +]], + { + f(namespace), + f(class_name), + i(0), + }, { delimiters = "[]"}), +} + +return M diff --git a/plugin/keymaps.vim b/plugin/keymaps.vim index b6e94b8..15dd082 100644 --- a/plugin/keymaps.vim +++ b/plugin/keymaps.vim @@ -21,24 +21,25 @@ inoremap > ><c-g>u vnoremap < <gv vnoremap > >gv -nnoremap <c-h> :wincmd h<CR> -nnoremap <c-j> :wincmd j<CR> -nnoremap <c-k> :wincmd k<CR> -nnoremap <c-l> :wincmd l<CR> -nnoremap <c-q> :wincmd q<CR> +nnoremap <leader>wh :wincmd h<CR> +nnoremap <leader>wj :wincmd j<CR> +nnoremap <leader>wk :wincmd k<CR> +nnoremap <leader>wl :wincmd l<CR> +nnoremap <leader>wq :wincmd q<CR> + " Make windows to be basically the same size nnoremap <leader>= <C-w>= -nnoremap <leader>wv :vsp<CR> -nnoremap <leader>wh :sp<CR> +nnoremap <leader>wsv :vsp<CR> +nnoremap <leader>wsh :sp<CR> -nnoremap <C-j> :cnext<CR> -nnoremap <C-k> :cprev<CR> +nnoremap <leader>j :cnext<CR> +nnoremap <leader>k :cprev<CR> nnoremap <leader>i :lnext<CR> nnoremap <leader>o :lprev<CR> -nnoremap <leader>bd :bd<CR> +nnoremap <leader>bd :bd!<CR> nnoremap <expr> <leader>dp ":saveas " . expand('%') |