Compare commits
12 Commits
f79e89d335
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 847c71a194 | |||
|
|
78b8bf177c | ||
|
|
4f8e722f13 | ||
| 1f58b9f136 | |||
|
|
4d3aada204 | ||
|
|
d53821dbf7 | ||
| e89dbcac87 | |||
| 5bf1ec232e | |||
| aded597ffe | |||
|
|
282301e206 | ||
| 9bd219f053 | |||
| 0cce7837f2 |
253
lua/keymap.lua
253
lua/keymap.lua
@@ -27,37 +27,112 @@ vim.keymap.set('v', 'p', '"zdP', { desc = 'Paste over selection without yanking
|
||||
vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })
|
||||
|
||||
vim.keymap.set('n', '<Leader>c', function()
|
||||
local node = require('nvim-treesitter.ts_utils').get_node_at_cursor()
|
||||
if node then
|
||||
print(node:type())
|
||||
vim.treesitter.inspect_tree()
|
||||
end, { desc = 'Treesitter' })
|
||||
|
||||
vim.keymap.set('n', '<C-S-D>', function()
|
||||
local node = vim.treesitter.get_node {}
|
||||
local range = { vim.treesitter.get_node_range(node) }
|
||||
vim.api.nvim_win_set_cursor(0, { range[3] + 1, range[4] - 1 })
|
||||
vim.fn.setpos("'x", { 0, range[1] + 1, range[2] + 1, 0 })
|
||||
vim.cmd.normal 'v`x'
|
||||
end, { desc = 'Select surrounding treesitter node' })
|
||||
|
||||
vim.keymap.set('v', '<C-S-D>', function()
|
||||
local start = vim.api.nvim_win_get_cursor(0)
|
||||
local start_row, start_column
|
||||
if start[2] == 0 then
|
||||
start_row = start[1] - 1
|
||||
start_column = 0
|
||||
else
|
||||
print 'No node found at cursor'
|
||||
start_row = start[1]
|
||||
start_column = start[2] - 1
|
||||
end
|
||||
end, { desc = 'Log node' })
|
||||
vim.api.nvim_win_set_cursor(0, { start_row, start_column })
|
||||
local node = vim.treesitter.get_node {}
|
||||
local range = { vim.treesitter.get_node_range(node) }
|
||||
vim.api.nvim_win_set_cursor(0, { range[3] + 1, range[4] - 1 })
|
||||
vim.fn.setpos("'x", { 0, range[1] + 1, range[2] + 1, 0 })
|
||||
vim.cmd.normal 'i'
|
||||
vim.cmd.normal 'v`x'
|
||||
end, { desc = 'Select surrounding treesitter node' })
|
||||
|
||||
local swappable_nodes = { 'argument', 'array_element_initializer', 'simple_parameter', 'string', 'integer', 'member_call_expression', 'method_declaration' }
|
||||
|
||||
local function closest_swappable_node(node)
|
||||
while node and not vim.list_contains(swappable_nodes, node:type()) and (not node:next_named_sibling() or not node:prev_named_sibling()) do
|
||||
node = node:parent()
|
||||
end
|
||||
return node
|
||||
end
|
||||
|
||||
vim.keymap.set({ 'n' }, '<C-S-h>', function()
|
||||
local node = closest_swappable_node(vim.treesitter.get_node())
|
||||
if not node then
|
||||
return
|
||||
end
|
||||
local prev_node = node:prev_named_sibling()
|
||||
while prev_node and not vim.list_contains(swappable_nodes, prev_node:type()) do
|
||||
prev_node = prev_node:prev_named_sibling()
|
||||
end
|
||||
if prev_node == nil then
|
||||
return
|
||||
end
|
||||
require('nvim-treesitter.ts_utils').swap_nodes(node, prev_node, 0, true)
|
||||
end, { desc = 'Swap with node to the left' })
|
||||
vim.keymap.set({ 'n' }, '<C-S-l>', function()
|
||||
local node = closest_swappable_node(vim.treesitter.get_node())
|
||||
if not node then
|
||||
return
|
||||
end
|
||||
local next_node = node:next_named_sibling()
|
||||
while next_node and not vim.list_contains(swappable_nodes, next_node:type()) do
|
||||
next_node = next_node:next_named_sibling()
|
||||
end
|
||||
if next_node == nil then
|
||||
return
|
||||
end
|
||||
require('nvim-treesitter.ts_utils').swap_nodes(node, next_node, 0, true)
|
||||
end, { desc = 'Swap with node to the right' })
|
||||
vim.keymap.set('n', '<C-S-j>', 'ddp', { desc = 'Move line down' })
|
||||
vim.keymap.set('n', '<C-S-k>', 'ddkP', { desc = 'Move line up' })
|
||||
vim.keymap.set('v', '<C-S-j>', 'do<Esc>p`[v`]', { desc = 'Move selection down' })
|
||||
vim.keymap.set('v', '<C-S-k>', 'dkO<Esc>p`[v`]', { desc = 'Move selection up' })
|
||||
|
||||
-- Keybinds to make split navigation easier.
|
||||
-- Use CTRL+<hjkl> to switch between windows
|
||||
--
|
||||
-- See `:help wincmd` for a list of all window commands
|
||||
local function win_or_treesj(dir_cmd, desc)
|
||||
return function()
|
||||
local cur = vim.api.nvim_get_current_win()
|
||||
vim.cmd('wincmd ' .. dir_cmd)
|
||||
if vim.api.nvim_get_current_win() == cur then
|
||||
local ok, treesj = pcall(require, 'treesj')
|
||||
if ok and type(treesj.toggle) == 'function' then
|
||||
treesj.toggle()
|
||||
end
|
||||
end
|
||||
end, { desc = desc }
|
||||
end
|
||||
|
||||
vim.keymap.set('n', '<C-h>', '<C-w><C-h>', { desc = 'Move focus to the left window' })
|
||||
vim.keymap.set('n', '<C-l>', '<C-w><C-l>', { desc = 'Move focus to the right window' })
|
||||
vim.keymap.set('n', '<C-j>', '<C-w><C-j>', { desc = 'Move focus to the lower window' })
|
||||
vim.keymap.set('n', '<C-k>', '<C-w><C-k>', { desc = 'Move focus to the upper window' })
|
||||
vim.keymap.set('n', '<C-j>', (win_or_treesj)('j', 'Move focus to the lower window or treesj.toggle()'))
|
||||
vim.keymap.set('n', '<C-k>', (win_or_treesj)('k', 'Move focus to the upper window or treesj.toggle()'))
|
||||
|
||||
vim.keymap.set({ 'i' }, '<C-J>', function()
|
||||
local ls = require 'luasnip'
|
||||
print('jj')
|
||||
if ls.choice_active() then
|
||||
ls.change_choice(1)
|
||||
end
|
||||
end, { silent = true })
|
||||
end, { desc = 'Toggle snippet choice', silent = true })
|
||||
vim.keymap.set({ 'i' }, '<C-k>', function()
|
||||
local ls = require 'luasnip'
|
||||
print('kk')
|
||||
if ls.choice_active() then
|
||||
ls.change_choice(-1)
|
||||
end
|
||||
end, { silent = true })
|
||||
end, { desc = 'Toggle snippet choice', silent = true })
|
||||
vim.keymap.set({ 'i', 's' }, '<C-L>', function()
|
||||
local ls = require 'luasnip'
|
||||
if ls.expandable() then
|
||||
@@ -65,18 +140,13 @@ vim.keymap.set({ 'i', 's' }, '<C-L>', function()
|
||||
elseif ls.in_snippet() then
|
||||
ls.jump(1)
|
||||
end
|
||||
end, { silent = true })
|
||||
end, { desc = 'Expand snippet', silent = true })
|
||||
vim.keymap.set({ 'i', 's' }, '<C-H>', function()
|
||||
local ls = require 'luasnip'
|
||||
if ls.in_snippet() then
|
||||
ls.jump(-1)
|
||||
end
|
||||
end, { silent = true })
|
||||
|
||||
vim.keymap.set('n', '<C-S-h>', '<C-w>H', { desc = 'Move window to the left' })
|
||||
vim.keymap.set('n', '<C-S-l>', '<C-w>L', { desc = 'Move window to the right' })
|
||||
vim.keymap.set('n', '<C-S-j>', '<C-w>J', { desc = 'Move window to the lower' })
|
||||
vim.keymap.set('n', '<C-S-k>', '<C-w>K', { desc = 'Move window to the upper' })
|
||||
end, { desc = 'Go back a snippet slot', silent = true })
|
||||
|
||||
vim.keymap.set('n', '<Leader>.', '<Cmd>tabnext<CR>', { desc = 'Next tab' })
|
||||
vim.keymap.set('n', '<Leader>,', '<Cmd>tabprevious<CR>', { desc = 'Previous tab' })
|
||||
@@ -188,84 +258,85 @@ vim.keymap.set('n', '<Leader>]', '<CMD>cnext<CR>', { desc = 'Next item in quickf
|
||||
vim.keymap.set('n', '<Leader>[', '<CMD>cprevious<CR>', { desc = 'Previous item in quickfix list' })
|
||||
vim.keymap.set('n', 'gd', '<CMD>Telescope lsp_definitions<CR>', { desc = 'Go to definition' })
|
||||
|
||||
|
||||
local function open_test()
|
||||
require('neotest').summary.open()
|
||||
require('neotest').output_panel.open()
|
||||
end
|
||||
-- Testing
|
||||
local test_maps = {
|
||||
{
|
||||
keys = { '<F12>', '<Leader>tn' },
|
||||
action = function()
|
||||
require('neotest').run.run()
|
||||
open_test()
|
||||
end,
|
||||
desc = 'Run nearest test',
|
||||
},
|
||||
{
|
||||
keys = { '<F9>', '<Leader>ta' },
|
||||
action = function()
|
||||
require('neotest').run.run { suite = true }
|
||||
open_test()
|
||||
end,
|
||||
desc = 'Run all tests in the project',
|
||||
},
|
||||
{
|
||||
keys = { '<F11>', '<Leader>tp' },
|
||||
action = function()
|
||||
require('neotest').run.run_last()
|
||||
open_test()
|
||||
end,
|
||||
desc = 'Run previous test again',
|
||||
},
|
||||
{
|
||||
keys = { '<F10>', '<Leader>td' },
|
||||
action = function()
|
||||
local dap = require 'dap'
|
||||
if dap.session() == nil then
|
||||
dap.continue()
|
||||
end
|
||||
require('dapui').open()
|
||||
local neotest = require 'neotest'
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
local row = vim.api.nvim_win_get_cursor(0)[1] - 1
|
||||
|
||||
local adapters = neotest.state.adapter_ids()
|
||||
local found = false
|
||||
|
||||
for _, adapter_id in ipairs(adapters) do
|
||||
local tree = neotest.state.positions(adapter_id, { buffer = bufnr })
|
||||
if tree then
|
||||
local nearest = require('neotest.lib.positions').nearest(tree, row)
|
||||
if nearest and nearest:data().type ~= 'file' then
|
||||
neotest.run.run()
|
||||
found = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not found then
|
||||
neotest.run.run_last()
|
||||
end
|
||||
end,
|
||||
desc = 'Run last test with debugger',
|
||||
},
|
||||
}
|
||||
|
||||
for _, map_info in ipairs(test_maps) do
|
||||
for _, key in ipairs(map_info.keys) do
|
||||
vim.keymap.set('n', key, map_info.action, { desc = map_info.desc })
|
||||
end
|
||||
end
|
||||
vim.keymap.set('n', '<Leader>tf', function()
|
||||
require('neotest').run.run(vim.fn.expand '%')
|
||||
open_test()
|
||||
end, { desc = 'Run all tests in the current file' })
|
||||
vim.keymap.set('n', '<Leader>tc', function()
|
||||
require('neotest').summary.close()
|
||||
require('neotest').output_panel.close()
|
||||
end, { desc = 'Close test panels' })
|
||||
-- local test_maps = {
|
||||
-- {
|
||||
-- keys = { '<F12>', '<Leader>tn' },
|
||||
-- action = function()
|
||||
-- require('neotest').run.run()
|
||||
-- open_test()
|
||||
-- end,
|
||||
-- desc = 'Run nearest test',
|
||||
-- },
|
||||
-- {
|
||||
-- keys = { '<F9>', '<Leader>ta' },
|
||||
-- action = function()
|
||||
-- require('neotest').run.run { suite = true }
|
||||
-- open_test()
|
||||
-- end,
|
||||
-- desc = 'Run all tests in the project',
|
||||
-- },
|
||||
-- {
|
||||
-- keys = { '<F11>', '<Leader>tp' },
|
||||
-- action = function()
|
||||
-- require('neotest').run.run_last()
|
||||
-- open_test()
|
||||
-- end,
|
||||
-- desc = 'Run previous test again',
|
||||
-- },
|
||||
-- {
|
||||
-- keys = { '<F10>', '<Leader>td' },
|
||||
-- action = function()
|
||||
-- local dap = require 'dap'
|
||||
-- if dap.session() == nil then
|
||||
-- dap.continue()
|
||||
-- end
|
||||
-- require('dapui').open()
|
||||
-- local neotest = require 'neotest'
|
||||
-- local bufnr = vim.api.nvim_get_current_buf()
|
||||
-- local row = vim.api.nvim_win_get_cursor(0)[1] - 1
|
||||
--
|
||||
-- local adapters = neotest.state.adapter_ids()
|
||||
-- local found = false
|
||||
--
|
||||
-- for _, adapter_id in ipairs(adapters) do
|
||||
-- local tree = neotest.state.positions(adapter_id, { buffer = bufnr })
|
||||
-- if tree then
|
||||
-- local nearest = require('neotest.lib.positions').nearest(tree, row)
|
||||
-- if nearest and nearest:data().type ~= 'file' then
|
||||
-- neotest.run.run()
|
||||
-- found = true
|
||||
-- break
|
||||
-- end
|
||||
-- end
|
||||
-- end
|
||||
--
|
||||
-- if not found then
|
||||
-- neotest.run.run_last()
|
||||
-- end
|
||||
-- end,
|
||||
-- desc = 'Run last test with debugger',
|
||||
-- },
|
||||
-- }
|
||||
--
|
||||
-- for _, map_info in ipairs(test_maps) do
|
||||
-- for _, key in ipairs(map_info.keys) do
|
||||
-- vim.keymap.set('n', key, map_info.action, { desc = map_info.desc })
|
||||
-- end
|
||||
-- end
|
||||
-- vim.keymap.set('n', '<Leader>tf', function()
|
||||
-- require('neotest').run.run(vim.fn.expand '%')
|
||||
-- open_test()
|
||||
-- end, { desc = 'Run all tests in the current file' })
|
||||
-- vim.keymap.set('n', '<Leader>tc', function()
|
||||
-- require('neotest').summary.close()
|
||||
-- require('neotest').output_panel.close()
|
||||
-- end, { desc = 'Close test panels' })
|
||||
|
||||
-- vim.keymap.set('i', '<Tab>', function()
|
||||
-- local copilot = require 'copilot.suggestion'
|
||||
|
||||
@@ -31,7 +31,7 @@ return {
|
||||
require('minuet').setup {
|
||||
virtualtext = {
|
||||
auto_trigger_ft = { '*' },
|
||||
auto_trigger_ignore_ft = { 'help', 'TelescopePrompt', 'codecompanion' },
|
||||
auto_trigger_ignore_ft = { 'help', 'TelescopePrompt', 'codecompanion', 'snacks_input' },
|
||||
keymap = {
|
||||
accept = '<A-A>',
|
||||
accept_line = '<A-a>',
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
return {
|
||||
'ravitemer/mcphub.nvim',
|
||||
dependencies = {
|
||||
'nvim-lua/plenary.nvim', -- Required for Job and HTTP requests
|
||||
},
|
||||
-- uncomment the following line to load hub lazily
|
||||
cmd = 'MCPHub', -- lazy load
|
||||
build = 'npm install -g mcp-hub@latest', -- Installs required mcp-hub npm module
|
||||
-- uncomment this if you don't want mcp-hub to be available globally or can't use -g
|
||||
-- build = "bundled_build.lua", -- Use this and set use_bundled_binary = true in opts (see Advanced configuration)
|
||||
config = function()
|
||||
require('mcphub').setup({
|
||||
auto_approve = true,
|
||||
})
|
||||
end,
|
||||
}
|
||||
@@ -25,16 +25,36 @@ return {
|
||||
|
||||
require('mini.pairs').setup()
|
||||
|
||||
-- require('mini.jump').setup()
|
||||
require('mini.jump').setup {
|
||||
mappings = {
|
||||
repeat_jump = ':',
|
||||
},
|
||||
}
|
||||
|
||||
require('mini.jump2d').setup()
|
||||
local MiniJump2d = require 'mini.jump2d'
|
||||
MiniJump2d.setup {
|
||||
spotter = MiniJump2d.gen_spotter.union(
|
||||
MiniJump2d.gen_spotter.pattern('[([{][^$]', 'end'),
|
||||
MiniJump2d.gen_spotter.pattern('%$.', 'end'),
|
||||
MiniJump2d.gen_spotter.pattern('->.', 'end'),
|
||||
MiniJump2d.gen_spotter.pattern('^%s*%S', 'end')
|
||||
),
|
||||
mappings = {
|
||||
start_jumping = 'S',
|
||||
},
|
||||
allowed_lines = {
|
||||
blank = false,
|
||||
cursor_at = false,
|
||||
fold = false,
|
||||
},
|
||||
}
|
||||
|
||||
require('mini.splitjoin').setup()
|
||||
|
||||
require('mini.map').setup()
|
||||
|
||||
-- Simple and easy statusline.
|
||||
-- You could remove this setup call if you don't like it,
|
||||
-- You could remove this setup call i you don't like it,
|
||||
-- and try some other statusline plugin
|
||||
local statusline = require 'mini.statusline'
|
||||
-- set use_icons to true if you have a Nerd Font
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
-- Neo-tree is a Neovim plugin to browse the file system
|
||||
-- https://github.com/nvim-neo-tree/neo-tree.nvim
|
||||
|
||||
return {
|
||||
-- 'nvim-neo-tree/neo-tree.nvim',
|
||||
-- version = '*',
|
||||
-- dependencies = {
|
||||
-- 'nvim-lua/plenary.nvim',
|
||||
-- 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended
|
||||
-- 'MunifTanjim/nui.nvim',
|
||||
-- },
|
||||
-- cmd = 'Neotree',
|
||||
-- keys = {
|
||||
-- { '\\', ':Neotree reveal<CR>', desc = 'NeoTree reveal', silent = true },
|
||||
-- },
|
||||
--
|
||||
-- build = function()
|
||||
-- if vim.fn.executable 'fd' == 0 then
|
||||
-- local install_cmd
|
||||
-- if vim.fn.has 'mac' == 1 then
|
||||
-- install_cmd = 'brew install fd'
|
||||
-- elseif vim.fn.has 'unix' == 1 then
|
||||
-- if vim.fn.filereadable '/etc/arch-release' == 1 then
|
||||
-- install_cmd = 'sudo pacman -S --noconfirm fd'
|
||||
-- else
|
||||
-- install_cmd = 'sudo apt-get install -y fd-find'
|
||||
-- end
|
||||
-- else
|
||||
-- vim.notify("Please install 'fd' manually for neo-tree.", vim.log.levels.WARN)
|
||||
-- return
|
||||
-- end
|
||||
-- vim.fn.system(install_cmd)
|
||||
-- end
|
||||
-- end,
|
||||
--
|
||||
-- opts = function(_, opts)
|
||||
-- local function on_move(data)
|
||||
-- Snacks.rename.on_rename_file(data.source, data.destination)
|
||||
-- end
|
||||
-- local events = require 'neo-tree.events'
|
||||
-- opts.event_handlers = opts.event_handlers or {}
|
||||
-- vim.list_extend(opts.event_handlers, {
|
||||
-- { event = events.FILE_MOVED, handler = on_move },
|
||||
-- { event = events.FILE_RENAMED, handler = on_move },
|
||||
-- })
|
||||
--
|
||||
-- opts.filesystem = {
|
||||
-- window = {
|
||||
-- mappings = {
|
||||
-- ['\\'] = 'close_window',
|
||||
-- },
|
||||
-- },
|
||||
-- filtered_items = {
|
||||
-- hide_dotfiles = false,
|
||||
-- },
|
||||
-- }
|
||||
-- end,
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
require('helpers').edit_cf('pt', '/lua/plugins/neotest.lua')
|
||||
return {
|
||||
'nvim-neotest/neotest',
|
||||
lazy = true,
|
||||
dependencies = {
|
||||
'nvim-neotest/nvim-nio',
|
||||
'nvim-lua/plenary.nvim',
|
||||
'antoinemadec/FixCursorHold.nvim',
|
||||
'nvim-treesitter/nvim-treesitter',
|
||||
-- Adapters
|
||||
'V13Axel/neotest-pest',
|
||||
-- "olimorris/neotest-phpunit",
|
||||
},
|
||||
config = function()
|
||||
require('neotest').setup {
|
||||
adapters = {
|
||||
require 'neotest-pest' {
|
||||
sail_enabled = function()
|
||||
return false
|
||||
end,
|
||||
parallel = 10,
|
||||
},
|
||||
-- require('neotest-phpunit'),
|
||||
},
|
||||
}
|
||||
end,
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
-- Highlight todo, notes, etc in comments
|
||||
return {
|
||||
"folke/todo-comments.nvim",
|
||||
event = "VimEnter",
|
||||
dependencies = { "nvim-lua/plenary.nvim" },
|
||||
'folke/todo-comments.nvim',
|
||||
event = 'VimEnter',
|
||||
dependencies = { 'nvim-lua/plenary.nvim' },
|
||||
opts = { signs = false },
|
||||
}
|
||||
|
||||
10
lua/plugins/treesj.lua
Normal file
10
lua/plugins/treesj.lua
Normal file
@@ -0,0 +1,10 @@
|
||||
return {
|
||||
'Wansmer/treesj',
|
||||
lazy = true,
|
||||
dependencies = { 'nvim-treesitter/nvim-treesitter' }, -- if you install parsers with `nvim-treesitter`
|
||||
config = function()
|
||||
require('treesj').setup({
|
||||
use_default_keymaps = false,
|
||||
})
|
||||
end,
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
require('helpers').edit_cf('pv', '/lua/plugins/vectorcode.lua')
|
||||
|
||||
return {}
|
||||
-- return {
|
||||
-- 'Davidyz/VectorCode',
|
||||
-- version = '*', -- optional, depending on whether you're on nightly or release
|
||||
-- dependencies = { 'nvim-lua/plenary.nvim' },
|
||||
-- build = 'pipx upgrade vectorcode',
|
||||
-- cmd = 'VectorCode', -- if you're lazy-loading VectorCode
|
||||
-- opts = {
|
||||
-- async_backend = 'lsp',
|
||||
-- },
|
||||
-- }
|
||||
@@ -1,8 +0,0 @@
|
||||
if vim.loop.os_uname().sysname == 'Darwin' then
|
||||
return {
|
||||
'wakatime/vim-wakatime',
|
||||
lazy = false,
|
||||
}
|
||||
else
|
||||
return {}
|
||||
end
|
||||
111
lua/projects.lua
111
lua/projects.lua
@@ -18,6 +18,26 @@ local function command_with_dir(dir, cmd)
|
||||
return '!' .. cmd
|
||||
end
|
||||
|
||||
local function make_laravel_file(dir, cmd)
|
||||
local cwd = vim.fn.getcwd()
|
||||
if dir then
|
||||
vim.fn.chdir(dir)
|
||||
end
|
||||
vim.ui.input({ prompt = 'Make: ' .. cmd }, function(input)
|
||||
if input == nil then
|
||||
vim.fn.chdir(cwd)
|
||||
return
|
||||
end
|
||||
|
||||
local output = vim.system({ 'vendor/bin/sail', 'artisan', 'make:' .. cmd, input }):wait().stdout
|
||||
local new_file = output:match '%[([%w%./]+)%]'
|
||||
if new_file ~= nil then
|
||||
vim.cmd('edit ' .. new_file)
|
||||
end
|
||||
vim.fn.chdir(cwd)
|
||||
end)
|
||||
end
|
||||
|
||||
local function get_scope_from_file(filename)
|
||||
local ext = filename:match '%.(%w+)$'
|
||||
local base_name = filename:match '^(%w+)%.?%w*$'
|
||||
@@ -72,39 +92,39 @@ end
|
||||
|
||||
local function laravel_bookmarks_with_dir(dir)
|
||||
create_bookmark_maps {
|
||||
['e'] = dir .. '/.env',
|
||||
['l'] = dir .. '/storage/logs/laravel.log',
|
||||
['w'] = dir .. '/routes/web.php',
|
||||
['a'] = dir .. '/routes/api.php',
|
||||
['m'] = dir .. '/database/migrations',
|
||||
['e'] = dir .. '.env',
|
||||
['l'] = dir .. 'storage/logs/laravel.log',
|
||||
['w'] = dir .. 'routes/web.php',
|
||||
['a'] = dir .. 'routes/api.php',
|
||||
['m'] = dir .. 'database/migrations',
|
||||
|
||||
['dc'] = dir .. '/app/Core/',
|
||||
['dd'] = dir .. '/app/Data/',
|
||||
['dE'] = dir .. '/app/Enums/',
|
||||
['de'] = dir .. '/app/Events/',
|
||||
['dh'] = dir .. '/app/Http/',
|
||||
['dj'] = dir .. '/app/Jobs/',
|
||||
['dl'] = dir .. '/app/Listeners/',
|
||||
['dM'] = dir .. '/app/Mail/',
|
||||
['dm'] = dir .. '/app/Models/',
|
||||
['dn'] = dir .. '/app/Notifications/',
|
||||
['do'] = dir .. '/app/Observers/',
|
||||
['dp'] = dir .. '/app/Providers/',
|
||||
['dc'] = dir .. 'app/Core/',
|
||||
['dd'] = dir .. 'app/Data/',
|
||||
['dE'] = dir .. 'app/Enums/',
|
||||
['de'] = dir .. 'app/Events/',
|
||||
['dh'] = dir .. 'app/Http/',
|
||||
['dj'] = dir .. 'app/Jobs/',
|
||||
['dl'] = dir .. 'app/Listeners/',
|
||||
['dM'] = dir .. 'app/Mail/',
|
||||
['dm'] = dir .. 'app/Models/',
|
||||
['dn'] = dir .. 'app/Notifications/',
|
||||
['do'] = dir .. 'app/Observers/',
|
||||
['dp'] = dir .. 'app/Providers/',
|
||||
|
||||
['pa'] = dir .. '/app/Providers/AppServiceProvider.php',
|
||||
['pe'] = dir .. '/app/Providers/EventServiceProvider.php',
|
||||
['pa'] = dir .. 'app/Providers/AppServiceProvider.php',
|
||||
['pe'] = dir .. 'app/Providers/EventServiceProvider.php',
|
||||
|
||||
['cA'] = dir .. '/config/app.php',
|
||||
['ca'] = dir .. '/config/auth.php',
|
||||
['cb'] = dir .. '/config/broadcasting.php',
|
||||
['cd'] = dir .. '/config/database.php',
|
||||
['cf'] = dir .. '/config/filesystems.php',
|
||||
['ch'] = dir .. '/config/filesystems.php',
|
||||
['cl'] = dir .. '/config/logging.php',
|
||||
['cm'] = dir .. '/config/mail.php',
|
||||
['cq'] = dir .. '/config/queue.php',
|
||||
['cS'] = dir .. '/config/services.php',
|
||||
['cs'] = dir .. '/config/session.php',
|
||||
['cA'] = dir .. 'config/app.php',
|
||||
['ca'] = dir .. 'config/auth.php',
|
||||
['cb'] = dir .. 'config/broadcasting.php',
|
||||
['cd'] = dir .. 'config/database.php',
|
||||
['cf'] = dir .. 'config/filesystems.php',
|
||||
['ch'] = dir .. 'config/filesystems.php',
|
||||
['cl'] = dir .. 'config/logging.php',
|
||||
['cm'] = dir .. 'config/mail.php',
|
||||
['cq'] = dir .. 'config/queue.php',
|
||||
['cS'] = dir .. 'config/services.php',
|
||||
['cs'] = dir .. 'config/session.php',
|
||||
}
|
||||
end
|
||||
|
||||
@@ -130,6 +150,33 @@ local function laravel_keymaps(dir)
|
||||
laravel_bookmarks_with_dir(dir)
|
||||
end
|
||||
|
||||
local function laravel_makes(dir)
|
||||
for key, name in pairs {
|
||||
c = 'controller',
|
||||
d = 'data',
|
||||
e = 'event',
|
||||
f = 'factory',
|
||||
j = 'job',
|
||||
l = 'listener',
|
||||
ma = 'mail',
|
||||
mi = 'migration',
|
||||
mo = 'model',
|
||||
mw = 'middleware',
|
||||
n = 'notification',
|
||||
o = 'observer',
|
||||
pi = 'model --pivot',
|
||||
po = 'policy',
|
||||
pr = 'provider',
|
||||
t = 'test --pest',
|
||||
v = 'view',
|
||||
x = 'exception',
|
||||
} do
|
||||
map('<Leader>m' .. key, function()
|
||||
make_laravel_file(dir, name)
|
||||
end, { desc = 'Make and navigate to relevant ' .. name })
|
||||
end
|
||||
end
|
||||
|
||||
-- Define per-project configuration here.
|
||||
-- Keys are folder names (last segment of your cwd).
|
||||
local PROJECTS = {
|
||||
@@ -169,7 +216,8 @@ local PROJECTS = {
|
||||
end, { desc = 'Open database manager' })
|
||||
map('s ', '!cd server && ', { desc = 'Run command in server directory' }, 'c')
|
||||
map('c ', '!cd client && ', { desc = 'Run command in client directory' }, 'c')
|
||||
laravel_keymaps 'server'
|
||||
laravel_keymaps 'server/'
|
||||
laravel_makes 'server/'
|
||||
map('yrn ', '!cd client && yarn ', { desc = 'Run yarn script' }, 'c')
|
||||
map('<Leader>pt', ':!cd server && php artisan typescript:transform --format<CR>', { desc = 'Compile typescript' })
|
||||
require('conform').formatters.pint = {
|
||||
@@ -191,6 +239,7 @@ local PROJECTS = {
|
||||
helpers.open_term { cmd = 'lazysql pgsql://homestead:password@localhost:5432/homestead' }
|
||||
end, { desc = 'Open database manager' })
|
||||
laravel_keymaps()
|
||||
laravel_makes()
|
||||
map('yrn ', '!cd frontend && yarn ', { desc = 'Run yarn script' }, 'c')
|
||||
map('<Leader>pm', ':vendor/bin/sail composer migrate<CR>')
|
||||
end,
|
||||
|
||||
@@ -1,45 +1,128 @@
|
||||
local ls = require 'luasnip'
|
||||
local s = ls.snippet
|
||||
local sn = ls.snippet_node
|
||||
local fn = ls.function_node
|
||||
local ms = ls.multi_snippet
|
||||
local t = ls.text_node
|
||||
local c = ls.choice_node
|
||||
local i = ls.insert_node
|
||||
local f = ls.function_node
|
||||
local d = ls.dynamic_node
|
||||
local fmt = require('luasnip.extras.fmt').fmt
|
||||
local rep = require('luasnip.extras').rep
|
||||
local extend_decorator = require 'luasnip.util.extend_decorator'
|
||||
local fmta = extend_decorator.apply(fmt, { delimiters = '#~' })
|
||||
|
||||
local utils = require 'snippets.snip_utils'
|
||||
local tr = utils.tr
|
||||
local etr = utils.etr
|
||||
local atr = utils.atr
|
||||
local ctr = utils.ctr
|
||||
local bs = utils.bs
|
||||
|
||||
return {
|
||||
s('du', { t 'console.log(', i(0), t ');' }),
|
||||
s(etr('du ', 'Dump a variable to the console'), fmta('console.log(#~);', { i(0) })),
|
||||
s(
|
||||
etr('vue', 'Vue Single File Component skeleton'),
|
||||
fmta(
|
||||
[[
|
||||
<template>
|
||||
</template>
|
||||
<script setup>
|
||||
#~
|
||||
</script>
|
||||
<style scoped>
|
||||
</style>
|
||||
]],
|
||||
{ i(0) }
|
||||
)
|
||||
),
|
||||
|
||||
s('vue', {
|
||||
t { '<template>', '' },
|
||||
t { '', '</template>', '', '', '<script setup>', '' },
|
||||
i(0),
|
||||
t { '', '</script>', '', '', '<style scoped>', '', '.o-share-page {', '}', '', '</style>' },
|
||||
bs(atr('t ', 'this'), fmta('this.#~', { i(0) })),
|
||||
|
||||
s(etr('return ', 'Add semicolon after return'), fmta('return #~;', { i(0) })),
|
||||
s(etr('rt ', 'return alias'), fmta('return #~;', { i(0) })),
|
||||
|
||||
s(etr('const', 'const declaration'), {
|
||||
c(1, {
|
||||
sn(nil, fmta('const #~ = #~;', { i(1, 'variableName'), i(2, 'value') })),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
const #~ = (#~) => {
|
||||
#~
|
||||
}
|
||||
]],
|
||||
{ i(1), i(2), i(3) }
|
||||
)
|
||||
),
|
||||
}),
|
||||
}),
|
||||
|
||||
s('fun', {
|
||||
t 'function ',
|
||||
i(1),
|
||||
t '(',
|
||||
i(2),
|
||||
t ') {',
|
||||
t { '', ' ' },
|
||||
i(0),
|
||||
t { '', '}' },
|
||||
s(
|
||||
etr('fn ', 'function block'),
|
||||
fmta(
|
||||
[[
|
||||
function #~(#~) {
|
||||
#~
|
||||
}
|
||||
]],
|
||||
{ i(1), i(2), i(0) }
|
||||
)
|
||||
),
|
||||
|
||||
bs(atr('fn ', 'function block'), {
|
||||
c(1, {
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
(#~) => {
|
||||
#~
|
||||
}
|
||||
]],
|
||||
{ i(1), i(2) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
function (#~) {
|
||||
#~
|
||||
}
|
||||
]],
|
||||
{ i(1), i(2) }
|
||||
)
|
||||
),
|
||||
}),
|
||||
}),
|
||||
|
||||
s('afun', {
|
||||
t 'async function ',
|
||||
i(1),
|
||||
t '(',
|
||||
i(2),
|
||||
t ') {',
|
||||
t { '', ' ' },
|
||||
i(0),
|
||||
t { '', '}' },
|
||||
bs(atr('afn ', 'async function block'), {
|
||||
c(1, {
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
async (#~) => {
|
||||
#~
|
||||
}
|
||||
]],
|
||||
{ i(1), i(2) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
async function (#~) {
|
||||
#~
|
||||
}
|
||||
]],
|
||||
{ i(1), i(2) }
|
||||
)
|
||||
),
|
||||
}),
|
||||
|
||||
s('()', {
|
||||
t '() => {',
|
||||
t { '', ' ' },
|
||||
i(0),
|
||||
t { '', '}' },
|
||||
}),
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ local ls = require 'luasnip'
|
||||
local s = ls.snippet
|
||||
local sn = ls.snippet_node
|
||||
local fn = ls.function_node
|
||||
local ms = ls.multi_snippet
|
||||
local t = ls.text_node
|
||||
local c = ls.choice_node
|
||||
local i = ls.insert_node
|
||||
@@ -9,100 +10,55 @@ local f = ls.function_node
|
||||
local d = ls.dynamic_node
|
||||
local fmt = require('luasnip.extras.fmt').fmt
|
||||
local rep = require('luasnip.extras').rep
|
||||
local line_begin = require('luasnip.extras.conditions').line_begin
|
||||
local extend_decorator = require 'luasnip.util.extend_decorator'
|
||||
local fmta = extend_decorator.apply(fmt, { delimiters = '#~' })
|
||||
|
||||
local function line_begin(line_to_cursor, matched_trigger)
|
||||
-- +1 because `string.sub("abcd", 1, -2)` -> abc
|
||||
return line_to_cursor:sub(1, -(#matched_trigger + 1)):match '^%s*$'
|
||||
end
|
||||
local utils = require 'snippets.snip_utils'
|
||||
local tr = utils.tr
|
||||
local etr = utils.etr
|
||||
local Etr = utils.Etr
|
||||
local atr = utils.atr
|
||||
local ctr = utils.ctr
|
||||
local bs = utils.bs
|
||||
|
||||
local function empty_line(_, matched_trigger)
|
||||
return vim.api.nvim_get_current_line():match('^%s*' .. vim.pesc(matched_trigger) .. '$')
|
||||
end
|
||||
local function psr_namespace()
|
||||
local path = vim.fn.expand '%'
|
||||
-- Get the directory of the path
|
||||
local dir = vim.fs.dirname(path)
|
||||
-- Loop through parent directories to find composer.json
|
||||
while dir ~= '/' and dir ~= nil do
|
||||
local composer_json_path = dir .. '/composer.json'
|
||||
if vim.fn.filereadable(composer_json_path) == 1 then
|
||||
break
|
||||
end
|
||||
dir = vim.fs.dirname(dir)
|
||||
end
|
||||
-- If no composer.json found, return empty string
|
||||
if dir == '/' or dir == nil then
|
||||
return ''
|
||||
end
|
||||
|
||||
local function file_begin(line_to_cursor, matched_trigger)
|
||||
local line_number = vim.fn.line '.'
|
||||
return line_number == 1 and line_begin(line_to_cursor, matched_trigger)
|
||||
end
|
||||
-- Decode composer.json and get PSR-4 autoload mappings
|
||||
local composer = vim.json.decode(vim.iter(vim.fn.readfile(dir .. '/composer.json')):join '')
|
||||
local psr4 = composer['autoload'] and composer['autoload']['psr-4']
|
||||
|
||||
local function in_string()
|
||||
local node_type = vim.treesitter.get_node():type()
|
||||
return node_type == 'string_content' or node_type == 'string'
|
||||
end
|
||||
-- If no PSR-4 mappings, return empty string
|
||||
if not psr4 then
|
||||
return ''
|
||||
end
|
||||
|
||||
local function in_comment()
|
||||
local node_type = vim.treesitter.get_node():type()
|
||||
return node_type == 'comment'
|
||||
end
|
||||
|
||||
local function not_in_string_or_comment()
|
||||
return (not in_string()) and (not in_comment())
|
||||
end
|
||||
|
||||
local function tr(trigger, description, condition)
|
||||
condition = condition or empty_line
|
||||
return {
|
||||
trig = trigger,
|
||||
desc = description,
|
||||
snippetType = 'autosnippet',
|
||||
condition = condition,
|
||||
}
|
||||
end
|
||||
|
||||
local function ctr(trigger, description)
|
||||
return tr(trigger, description, in_comment)
|
||||
end
|
||||
local function atr(trigger, description)
|
||||
return {
|
||||
trig = trigger,
|
||||
desc = description,
|
||||
snippetType = 'autosnippet',
|
||||
regTrig = true,
|
||||
wordTrig = false,
|
||||
condition = not_in_string_or_comment,
|
||||
}
|
||||
end
|
||||
|
||||
local function psr_namespace(_, snip)
|
||||
-- local path = snip.env.TM_FILENAME_FULL or ''
|
||||
-- -- Get the directory of the path
|
||||
-- local dir = vim.fs.dirname(path)
|
||||
-- -- Loop through parent directories to find composer.json
|
||||
-- while dir ~= '/' and dir ~= nil do
|
||||
-- local composer_json_path = dir .. '/composer.json'
|
||||
-- if vim.fn.filereadable(composer_json_path) == 1 then
|
||||
-- break
|
||||
-- end
|
||||
-- dir = vim.fs.dirname(dir)
|
||||
-- end
|
||||
-- -- If no composer.json found, return empty string
|
||||
-- if dir == '/' or dir == nil then
|
||||
-- return ''
|
||||
-- end
|
||||
--
|
||||
-- -- Decode composer.json and get PSR-4 autoload mappings
|
||||
-- local composer = vim.json.decode(vim.iter(vim.fn.readfile(dir .. '/composer.json')):join '')
|
||||
-- local psr4 = composer['autoload'] and composer['autoload']['psr-4']
|
||||
--
|
||||
-- -- If no PSR-4 mappings, return empty string
|
||||
-- if not psr4 then
|
||||
-- return ''
|
||||
-- end
|
||||
--
|
||||
-- -- Get the relative path from the composer.json directory
|
||||
-- local relative_path = path:sub(#dir + 2)
|
||||
-- -- Loop through PSR-4 mappings
|
||||
-- for namespace, map in pairs(psr4) do
|
||||
-- -- Check if the relative path matches the mapping
|
||||
-- if relative_path:match('^' .. map:gsub('/', '%%/')) then
|
||||
-- -- Extract the suffix of the path after the mapping, removing the filename
|
||||
-- local suffix = relative_path:sub(#map + 2):match('^(.*)/[^/]+%.php$') or ''
|
||||
-- local trimmed = namespace:gsub('\\$', '')
|
||||
-- return trimmed .. (suffix ~= '' and ('\\' .. suffix:gsub('/', '\\')) or '')
|
||||
-- end
|
||||
-- end
|
||||
-- Get the relative path from the composer.json directory
|
||||
local relative_path = path:sub(#dir + 2)
|
||||
-- Loop through PSR-4 mappings
|
||||
for namespace, map in pairs(psr4) do
|
||||
-- Check if the relative path matches the mapping
|
||||
if relative_path:match('^' .. map:gsub('/', '%%/')) then
|
||||
-- Extract the suffix of the path after the mapping, removing the filename
|
||||
local suffix = relative_path:sub(#map + 1):match '^(.*)/[^/]+%.php$' or ''
|
||||
local trimmed = namespace:gsub('\\$', '')
|
||||
return trimmed .. (suffix ~= '' and ('\\' .. suffix:gsub('/', '\\')) or '')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function class_name(args, snip)
|
||||
@@ -110,52 +66,17 @@ local function class_name(args, snip)
|
||||
return filename:match '([^%.]+)' or 'ClassName'
|
||||
end
|
||||
|
||||
local function snippet_aliases(triggers, description, snippet)
|
||||
local snips = {}
|
||||
for key, trigger in ipairs(triggers) do
|
||||
snips[key] = s(tr(trigger, description), snippet())
|
||||
end
|
||||
return snips
|
||||
end
|
||||
|
||||
local function fmtc(snipp, nodes)
|
||||
return fmta(
|
||||
'#~' .. snipp,
|
||||
vim.list_extend({ fn(function(args, snip)
|
||||
return snip.captures[1]
|
||||
end) }, nodes)
|
||||
)
|
||||
end
|
||||
|
||||
local function flatten(tbl)
|
||||
local result = {}
|
||||
local index = 1
|
||||
for _, val in ipairs(tbl) do
|
||||
if type(val) == 'table' and vim.tbl_islist(val) then
|
||||
for _, val2 in ipairs(val) do
|
||||
result[index] = val2
|
||||
index = index + 1
|
||||
end
|
||||
else
|
||||
result[index] = val
|
||||
index = index + 1
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
return flatten {
|
||||
return {
|
||||
---------------
|
||||
-- DEBUGGING --
|
||||
---------------
|
||||
s(tr('du ', 'Dump a variable to the dump server'), fmta('dump(#~);', { i(0) })),
|
||||
s(atr('([^%w])du ', 'Dump a variable to the dump server'), fmtc('dump(#~)', { i(0) })),
|
||||
s(tr('r ', 'ray'), fmta('ray(#~);', { i(0) })),
|
||||
s(atr('([^%w])r ', 'ray'), fmtc('ray(#~)', { i(0) })),
|
||||
s(tr('dt ', 'Dump PHPStan type definition'), fmta('\\PhpStan\\dumpType(#~);', { i(0) })),
|
||||
s(etr('du ', 'Dump a variable to the dump server', { priority = 1001 }), fmta('dump(#~);', { i(0) })),
|
||||
bs(etr('du ', 'Dump a variable to the dump server'), fmta('dump(#~)', { i(0) })),
|
||||
s(etr('r ', 'ray', { priority = 1001 }), fmta('ray(#~);', { i(0) })),
|
||||
bs(etr('r ', 'ray'), fmta('ray(#~)', { i(0) })),
|
||||
s(etr('dt ', 'Dump PHPStan type definition'), fmta('\\PhpStan\\dumpType(#~);', { i(0) })),
|
||||
s(
|
||||
tr('ql ', 'Log all queries'),
|
||||
etr('ql ', 'Log all queries'),
|
||||
fmta(
|
||||
[[
|
||||
\Illuminate\Support\Facades\DB::listen(function (\Illuminate\Database\Events\QueryExecuted $e) {
|
||||
@@ -169,7 +90,7 @@ return flatten {
|
||||
--------------
|
||||
-- COMMENTS --
|
||||
--------------
|
||||
s(tr('/**', 'Docblock comment'), {
|
||||
s(etr('/**', 'Docblock comment'), {
|
||||
c(1, {
|
||||
sn(
|
||||
nil,
|
||||
@@ -185,8 +106,9 @@ return flatten {
|
||||
sn(nil, fmta('/** #~ */', { i(1) })),
|
||||
}),
|
||||
}),
|
||||
s(tr('@v', '@var docblock'), fmta('/** @var #~ $#~ */', { i(1), i(0) })),
|
||||
s(etr('@v', '@var docblock'), fmta('/** @var #~ $#~ */', { i(1), i(0) })),
|
||||
s(ctr('@v', '@var docblock'), fmta('@var #~ $#~', { i(1), i(0) })),
|
||||
s(Etr('@pi', '@phpstan-ignore'), fmta('// @phpstan-ignore #~ (#~)', { i(1), i(0) })),
|
||||
s(ctr('* @pr', 'Class property docblock'), fmta('* @property #~ $#~', { i(1), i(0) })),
|
||||
s(ctr('* @pb', 'Class boolean property docblock'), fmta('* @property bool $#~', { i(0) })),
|
||||
s(ctr('* @pi', 'Class int property docblock'), fmta('* @property int $#~', { i(0) })),
|
||||
@@ -194,7 +116,7 @@ return flatten {
|
||||
s(ctr('* @pc', 'Class collection property docblock'), fmta('* @property \\Illuminate\\Database\\Eloquent\\Collection<#~> $#~', { i(1), i(0) })),
|
||||
s(ctr('* @pd', 'Class date property docblock'), fmta('* @property \\Illuminate\\Support\\Carbon $#~', { i(0) })),
|
||||
s(
|
||||
tr('@pm', 'Model magic properties docblock'),
|
||||
etr('@pm', 'Model magic properties docblock'),
|
||||
fmta(
|
||||
[[
|
||||
/**
|
||||
@@ -214,7 +136,7 @@ return flatten {
|
||||
-- SYNTAX --
|
||||
------------
|
||||
s(
|
||||
tr('if ', 'if block'),
|
||||
etr('if ', 'if block'),
|
||||
fmta(
|
||||
[[
|
||||
if (#~) {
|
||||
@@ -225,7 +147,7 @@ return flatten {
|
||||
)
|
||||
),
|
||||
s(
|
||||
tr('fe ', 'foreach block'),
|
||||
etr('fe ', 'foreach block'),
|
||||
fmta(
|
||||
[[
|
||||
foreach (#~ as #~) {
|
||||
@@ -235,9 +157,9 @@ return flatten {
|
||||
{ i(1), i(2), i(0) }
|
||||
)
|
||||
),
|
||||
s(tr('foreach', 'foreach block'), fmta('fe', {})),
|
||||
s(etr('foreach', 'foreach block'), fmta('fe', {})),
|
||||
s(
|
||||
tr('for ', 'for block'),
|
||||
etr('for ', 'for block'),
|
||||
fmta(
|
||||
[[
|
||||
for (#~; #~; #~) {
|
||||
@@ -247,16 +169,15 @@ return flatten {
|
||||
{ i(1, '$i'), i(2), i(3, '$i++'), i(0) }
|
||||
)
|
||||
),
|
||||
s(tr('return ', 'Add semicolon after return'), fmta('return #~;', { i(0) })),
|
||||
s(etr('return ', 'Add semicolon after return'), fmta('return #~;', { i(0) })),
|
||||
s(atr(' use ', 'Add use to function'), fmta(' use (#~)', { i(0) })),
|
||||
s(tr('rt ', 'return alias'), fmta('return #~;', { i(0) })),
|
||||
s(
|
||||
atr('([^%w])fn ', 'Shorthand function block'),
|
||||
c(0, {
|
||||
sn(nil, fmtc('fn (#~) => #~', { i(1), i(2) })),
|
||||
s(etr('rt ', 'return alias'), fmta('return #~;', { i(0) })),
|
||||
bs(atr('fn ', 'Shorthand function block'), {
|
||||
c(1, {
|
||||
sn(nil, fmta('fn (#~) => #~', { i(1), i(2) })),
|
||||
sn(
|
||||
nil,
|
||||
fmtc(
|
||||
fmta(
|
||||
[[
|
||||
function (#~) {
|
||||
#~
|
||||
@@ -265,14 +186,13 @@ return flatten {
|
||||
{ i(1), i(2) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(
|
||||
atr('([^%w])fun ', 'Shorthand function block'),
|
||||
c(0, {
|
||||
}),
|
||||
}),
|
||||
bs(atr('fun ', 'Shorthand function block'), {
|
||||
c(1, {
|
||||
sn(
|
||||
nil,
|
||||
fmtc(
|
||||
fmta(
|
||||
[[
|
||||
function (#~) {
|
||||
#~
|
||||
@@ -283,7 +203,7 @@ return flatten {
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmtc(
|
||||
fmta(
|
||||
[[
|
||||
function (#~) use (#~) {
|
||||
#~
|
||||
@@ -292,51 +212,50 @@ return flatten {
|
||||
{ i(1), i(2), i(3) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(
|
||||
tr('con', 'Constructor function block'),
|
||||
c(0, {
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
public function __construct(#~)
|
||||
{
|
||||
#~
|
||||
}
|
||||
]],
|
||||
{ i(1), i(2) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
public function __construct(
|
||||
#~
|
||||
) {
|
||||
#~
|
||||
}
|
||||
]],
|
||||
{ i(1), i(2) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(atr('([^%w])function', 'Shorthand function block'), fmtc('fun', {})),
|
||||
s(atr('([^%w])s%$', 'string type parameter'), fmtc('string $#~', { i(0, 'var') })),
|
||||
s(atr('([^%w])i%$', 'int type parameter'), fmtc('int $#~', { i(0, 'var') })),
|
||||
s(atr('([^%w])b%$', 'bool type parameter'), fmtc('bool $#~', { i(0, 'var') })),
|
||||
s(atr('([^%w])a%$', 'array type parameter'), fmtc('array $#~', { i(0, 'var') })),
|
||||
}),
|
||||
}),
|
||||
-- s(
|
||||
-- etr('con', 'Constructor function block'),
|
||||
-- c(1, {
|
||||
-- sn(
|
||||
-- nil,
|
||||
-- fmta(
|
||||
-- [[
|
||||
-- public function __construct(#~)
|
||||
-- {
|
||||
-- #~
|
||||
-- }
|
||||
-- ]],
|
||||
-- { i(1), i(2) }
|
||||
-- )
|
||||
-- ),
|
||||
-- sn(
|
||||
-- nil,
|
||||
-- fmta(
|
||||
-- [[
|
||||
-- public function __construct(
|
||||
-- #~
|
||||
-- ) {
|
||||
-- #~
|
||||
-- }
|
||||
-- ]],
|
||||
-- { i(1), i(2) }
|
||||
-- )
|
||||
-- ),
|
||||
-- })
|
||||
-- ),
|
||||
bs(atr('function', 'Shorthand function block'), fmta('fun', {})),
|
||||
bs(atr('s%$', 'string type parameter'), fmta('string $#~', { i(0, 'var') })),
|
||||
bs(atr('i%$', 'int type parameter'), fmta('int $#~', { i(0, 'var') })),
|
||||
bs(atr('b%$', 'bool type parameter'), fmta('bool $#~', { i(0, 'var') })),
|
||||
bs(atr('a%$', 'array type parameter'), fmta('array $#~', { i(0, 'var') })),
|
||||
s(atr('$ ', 'Expand $this->'), fmta('$this->#~', { i(0) })),
|
||||
s(
|
||||
atr('([^%w])am ', 'array_map function'),
|
||||
c(0, {
|
||||
sn(nil, fmtc('array_map(fn (#~) => #~, #~)', { i(2), i(3), i(1) })),
|
||||
bs(etr('am ', 'array_map function'), {
|
||||
c(1, {
|
||||
sn(nil, fmta('array_map(fn (#~) => #~, #~)', { i(2), i(3), i(1) })),
|
||||
sn(
|
||||
nil,
|
||||
fmtc(
|
||||
fmta(
|
||||
[[
|
||||
array_map(function (#~) {
|
||||
#~
|
||||
@@ -345,16 +264,15 @@ return flatten {
|
||||
{ i(2), i(0), i(1) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(atr('([^%w])array_map', 'array_map function'), fmtc('am', {})),
|
||||
s(
|
||||
atr('([^%w])af ', 'array_filter function'),
|
||||
c(0, {
|
||||
sn(nil, fmtc('array_filter(#~, fn (#~) => #~)', { i(1), i(2), i(3) })),
|
||||
}),
|
||||
}),
|
||||
bs(etr('array_map', 'array_map function'), fmta('am', {})),
|
||||
bs(etr('af ', 'array_filter function'), {
|
||||
c(1, {
|
||||
sn(nil, fmta('array_filter(#~, fn (#~) => #~)', { i(1), i(2), i(3) })),
|
||||
sn(
|
||||
nil,
|
||||
fmtc(
|
||||
fmta(
|
||||
[[
|
||||
array_filter(#~, function (#~) {
|
||||
#~
|
||||
@@ -363,18 +281,18 @@ return flatten {
|
||||
{ i(1), i(2), i(0) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(atr('([^%w])array_filter', 'array_filter function'), fmtc('af', {})),
|
||||
}),
|
||||
}),
|
||||
bs(etr('array_filter', 'array_filter function'), fmta('af', {})),
|
||||
s(
|
||||
tr('php', 'php class'),
|
||||
etr('php', 'php class'),
|
||||
fmta(
|
||||
[[
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace #~
|
||||
namespace #~;
|
||||
|
||||
class #~
|
||||
{
|
||||
@@ -388,7 +306,7 @@ return flatten {
|
||||
)
|
||||
),
|
||||
s(
|
||||
tr('met', 'public class method'),
|
||||
etr('met', 'public class method'),
|
||||
fmta(
|
||||
[[
|
||||
public function #~(#~)
|
||||
@@ -400,7 +318,7 @@ return flatten {
|
||||
)
|
||||
),
|
||||
s(
|
||||
tr('pmet', 'protected class method'),
|
||||
etr('pmet', 'protected class method'),
|
||||
fmta(
|
||||
[[
|
||||
protected function #~(#~)
|
||||
@@ -412,7 +330,7 @@ return flatten {
|
||||
)
|
||||
),
|
||||
s(
|
||||
tr('smet', 'public static class method'),
|
||||
etr('smet', 'public static class method'),
|
||||
fmta(
|
||||
[[
|
||||
public static function #~(#~)
|
||||
@@ -424,7 +342,7 @@ return flatten {
|
||||
)
|
||||
),
|
||||
s(
|
||||
tr('spmet', 'protected static class method'),
|
||||
etr('spmet', 'protected static class method'),
|
||||
fmta(
|
||||
[[
|
||||
protected static function #~(#~)
|
||||
@@ -439,22 +357,36 @@ return flatten {
|
||||
-- PROJECT --
|
||||
-------------
|
||||
s(
|
||||
tr('test', 'Create a test function'),
|
||||
etr('test', 'Create a test function'),
|
||||
fmta(
|
||||
[[
|
||||
test(#~ function () {
|
||||
test('#~', function () {
|
||||
#~
|
||||
})
|
||||
});
|
||||
]],
|
||||
{ i(1), i(0) }
|
||||
)
|
||||
),
|
||||
s(tr('nn ', 'Assert not null'), fmta('Assert::notNull(#~)', { i(0) })),
|
||||
s(
|
||||
etr('it ', 'Create a test function'),
|
||||
fmta(
|
||||
[[
|
||||
it('#~', function () {
|
||||
#~
|
||||
});
|
||||
]],
|
||||
{ i(1), i(0) }
|
||||
)
|
||||
),
|
||||
s(etr('nn ', 'Assert not null'), fmta('Assert::notNull(#~)', { i(0) })),
|
||||
-------------
|
||||
-- LARAVEL --
|
||||
-------------
|
||||
s(
|
||||
tr('bt', 'belongsTo Laravel relationship method'),
|
||||
etr('bt', 'belongsTo Laravel relationship method'),
|
||||
c(1, {
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
/**
|
||||
@@ -465,11 +397,31 @@ return flatten {
|
||||
return $this->belongsTo(#~::class);
|
||||
}
|
||||
]],
|
||||
{ rep(1), i(0), i(1) }
|
||||
{ rep(1), i(2), i(1) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
/**
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo<\App\Models\#~, $this>
|
||||
*/
|
||||
public function #~(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(#~::class, #~);
|
||||
}
|
||||
]],
|
||||
{ rep(1), i(2), i(1), i(3) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(
|
||||
tr('hm', 'hasMany Laravel relationship method'),
|
||||
etr('hm', 'hasMany Laravel relationship method'),
|
||||
c(1, {
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
/**
|
||||
@@ -480,11 +432,31 @@ return flatten {
|
||||
return $this->hasOne(#~::class);
|
||||
}
|
||||
]],
|
||||
{ rep(1), i(0), i(1) }
|
||||
{ rep(1), i(2), i(1) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
/**
|
||||
* @return \Illuminate\Database\Eloquent\Relations\HasMany<\App\Models\#~, $this>
|
||||
*/
|
||||
public function #~(): HasMany
|
||||
{
|
||||
return $this->hasOne(#~::class, #~);
|
||||
}
|
||||
]],
|
||||
{ rep(1), i(2), i(1), i(3) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(
|
||||
tr('ho', 'hasOne Laravel relationship method'),
|
||||
etr('ho', 'hasOne Laravel relationship method'),
|
||||
c(1, {
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
/**
|
||||
@@ -495,11 +467,31 @@ return flatten {
|
||||
return $this->hasOne(#~::class);
|
||||
}
|
||||
]],
|
||||
{ rep(1), i(0), i(1) }
|
||||
{ rep(1), i(2), i(1) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
/**
|
||||
* @return \Illuminate\Database\Eloquent\Relations\HasOne<\App\Models\#~, $this>
|
||||
*/
|
||||
public function #~(): HasOne
|
||||
{
|
||||
return $this->hasOne(#~::class, #~);
|
||||
}
|
||||
]],
|
||||
{ rep(1), i(2), i(1), i(3) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(
|
||||
tr('bm', 'belongsToMany Laravel relationship method'),
|
||||
etr('bm', 'belongsToMany Laravel relationship method'),
|
||||
c(1, {
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
/**
|
||||
@@ -510,95 +502,112 @@ return flatten {
|
||||
return $this->belongsToMany(#~::class, #~);
|
||||
}
|
||||
]],
|
||||
{ rep(1), i(2), i(1), i(0) }
|
||||
)
|
||||
),
|
||||
s(
|
||||
atr('->wr', 'Eloquent where method'),
|
||||
c(0, {
|
||||
sn(nil, fmta("->where('#~', #~)", { i(1), i(0) })),
|
||||
sn(nil, fmta('->where(fn ($query) => #~)', { i(0) })),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
->where(function ($query) {
|
||||
#~
|
||||
})
|
||||
]],
|
||||
{ i(0) }
|
||||
{ rep(1), i(2), i(1), i(3) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
->where(function ($query) use (#~) {
|
||||
#~
|
||||
})
|
||||
/**
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany<\App\Models\#~, $this>
|
||||
*/
|
||||
public function #~(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(#~::class, #~, #~);
|
||||
}
|
||||
]],
|
||||
{ i(1), i(0) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(atr('->wi', 'Eloquent where in method'), fmta("->whereIn('#~', #~)", { i(1), i(0) })),
|
||||
s(atr('->wn', 'Eloquent where not in method'), fmta("->whereNotIn('#~', #~)", { i(1), i(0) })),
|
||||
s(
|
||||
atr('->wh', 'Eloquent where has method'),
|
||||
c(0, {
|
||||
sn(nil, fmta("->whereHas('#~')", { i(1) })),
|
||||
sn(nil, fmta("->whereHas('#~', fn ($query) => #~)", { i(1), i(0) })),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
->whereHas('#~', function ($query) {
|
||||
#~
|
||||
})
|
||||
]],
|
||||
{ i(1), i(0) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
->whereHas('#~', function ($query) use (#~) {
|
||||
#~
|
||||
})
|
||||
]],
|
||||
{ i(1), i(2), i(0) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
s(
|
||||
atr('->we', 'Eloquent where exists method'),
|
||||
c(0, {
|
||||
sn(nil, fmta('->whereExists(fn ($query) => #~)', { i(0) })),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
->whereExists(function ($query) {
|
||||
#~
|
||||
})
|
||||
]],
|
||||
{ i(0) }
|
||||
)
|
||||
),
|
||||
sn(
|
||||
nil,
|
||||
fmta(
|
||||
[[
|
||||
->whereExists(function ($query) use (#~) {
|
||||
#~
|
||||
})
|
||||
]],
|
||||
{ i(1), i(0) }
|
||||
{ rep(1), i(2), i(1), i(3), i(4) }
|
||||
)
|
||||
),
|
||||
})
|
||||
),
|
||||
-- s(
|
||||
-- atr('->wr', 'Eloquent where method'),
|
||||
-- c(0, {
|
||||
-- sn(nil, fmta("->where('#~', #~)", { i(1), i(0) })),
|
||||
-- sn(nil, fmta('->where(fn ($query) => #~)', { i(0) })),
|
||||
-- sn(
|
||||
-- nil,
|
||||
-- fmta(
|
||||
-- [[
|
||||
-- ->where(function ($query) {
|
||||
-- #~
|
||||
-- })
|
||||
-- ]],
|
||||
-- { i(0) }
|
||||
-- )
|
||||
-- ),
|
||||
-- sn(
|
||||
-- nil,
|
||||
-- fmta(
|
||||
-- [[
|
||||
-- ->where(function ($query) use (#~) {
|
||||
-- #~
|
||||
-- })
|
||||
-- ]],
|
||||
-- { i(1), i(0) }
|
||||
-- )
|
||||
-- ),
|
||||
-- })
|
||||
-- ),
|
||||
-- s(atr('->wi', 'Eloquent where in method'), fmta("->whereIn('#~', #~)", { i(1), i(0) })),
|
||||
-- s(atr('->wn', 'Eloquent where not in method'), fmta("->whereNotIn('#~', #~)", { i(1), i(0) })),
|
||||
-- s(
|
||||
-- atr('->wha', 'Eloquent where has method'),
|
||||
-- c(0, {
|
||||
-- sn(nil, fmta("->whereHas('#~')", { i(1) })),
|
||||
-- sn(nil, fmta("->whereHas('#~', fn ($query) => #~)", { i(1), i(0) })),
|
||||
-- sn(
|
||||
-- nil,
|
||||
-- fmta(
|
||||
-- [[
|
||||
-- ->whereHas('#~', function ($query) {
|
||||
-- #~
|
||||
-- })
|
||||
-- ]],
|
||||
-- { i(1), i(0) }
|
||||
-- )
|
||||
-- ),
|
||||
-- sn(
|
||||
-- nil,
|
||||
-- fmta(
|
||||
-- [[
|
||||
-- ->whereHas('#~', function ($query) use (#~) {
|
||||
-- #~
|
||||
-- })
|
||||
-- ]],
|
||||
-- { i(1), i(2), i(0) }
|
||||
-- )
|
||||
-- ),
|
||||
-- })
|
||||
-- ),
|
||||
-- s(
|
||||
-- atr('->we', 'Eloquent where exists method'),
|
||||
-- c(0, {
|
||||
-- sn(nil, fmta('->whereExists(fn ($query) => #~)', { i(0) })),
|
||||
-- sn(
|
||||
-- nil,
|
||||
-- fmta(
|
||||
-- [[
|
||||
-- ->whereExists(function ($query) {
|
||||
-- #~
|
||||
-- })
|
||||
-- ]],
|
||||
-- { i(0) }
|
||||
-- )
|
||||
-- ),
|
||||
-- sn(
|
||||
-- nil,
|
||||
-- fmta(
|
||||
-- [[
|
||||
-- ->whereExists(function ($query) use (#~) {
|
||||
-- #~
|
||||
-- })
|
||||
-- ]],
|
||||
-- { i(1), i(0) }
|
||||
-- )
|
||||
-- ),
|
||||
-- })
|
||||
-- ),
|
||||
}
|
||||
|
||||
152
lua/snippets/snip_utils.lua
Normal file
152
lua/snippets/snip_utils.lua
Normal file
@@ -0,0 +1,152 @@
|
||||
local ls = require 'luasnip'
|
||||
local s = ls.snippet
|
||||
local sn = ls.snippet_node
|
||||
local fn = ls.function_node
|
||||
local ms = ls.multi_snippet
|
||||
local t = ls.text_node
|
||||
local c = ls.choice_node
|
||||
local i = ls.insert_node
|
||||
local f = ls.function_node
|
||||
local d = ls.dynamic_node
|
||||
local fmt = require('luasnip.extras.fmt').fmt
|
||||
local rep = require('luasnip.extras').rep
|
||||
local line_begin = require('luasnip.extras.conditions').line_begin
|
||||
local line_end = require('luasnip.extras.conditions').line_end
|
||||
local extend_decorator = require 'luasnip.util.extend_decorator'
|
||||
local fmta = extend_decorator.apply(fmt, { delimiters = '#~' })
|
||||
|
||||
local utils = {}
|
||||
|
||||
--- Check if the trigger is at the beginning of a line
|
||||
---@param line_to_cursor string
|
||||
---@param matched_trigger string
|
||||
---@return boolean
|
||||
utils.line_begin = function(line_to_cursor, matched_trigger)
|
||||
return line_to_cursor:sub(1, -(#matched_trigger + 1)):match '^%s*$'
|
||||
end
|
||||
|
||||
--- Check if the trigger is on an empty line
|
||||
---@param _ string
|
||||
---@param matched_trigger string
|
||||
---@return boolean
|
||||
utils.empty_line = function(_, matched_trigger)
|
||||
return vim.api.nvim_get_current_line():match('^%s*' .. vim.pesc(matched_trigger) .. '$')
|
||||
end
|
||||
|
||||
--- Check if the trigger is at the start of a file
|
||||
---@param line_to_cursor string
|
||||
---@param matched_trigger string
|
||||
---@return boolean
|
||||
utils.file_begin = function(line_to_cursor, matched_trigger)
|
||||
local line_number = vim.fn.line '.'
|
||||
return line_number == 1 and line_begin(line_to_cursor, matched_trigger)
|
||||
end
|
||||
|
||||
--- Check if the trigger is inside a string
|
||||
---@return boolean
|
||||
utils.in_string = function()
|
||||
local node_type = vim.treesitter.get_node():type()
|
||||
return node_type == 'string_content' or node_type == 'string'
|
||||
end
|
||||
|
||||
--- Check if the trigger is inside a comment
|
||||
---@return boolean
|
||||
utils.in_comment = function()
|
||||
local node_type = vim.treesitter.get_node():type()
|
||||
return node_type == 'comment'
|
||||
end
|
||||
|
||||
--- Check if the trigger is not inside a string or a comment
|
||||
---@return boolean
|
||||
utils.not_in_string_or_comment = function()
|
||||
return (not utils.in_string()) and (not utils.in_comment())
|
||||
end
|
||||
|
||||
--- Create a basic auto expand trigger
|
||||
---@param trigger string
|
||||
---@param description? string
|
||||
---@param options? table
|
||||
---@return table
|
||||
utils.tr = function(trigger, description, options)
|
||||
return vim.tbl_extend('force', {
|
||||
trig = trigger,
|
||||
desc = description,
|
||||
snippetType = 'autosnippet',
|
||||
}, options or {})
|
||||
end
|
||||
|
||||
--- Create a trigger for an empty line snippet
|
||||
---@param trigger string
|
||||
---@param description? string
|
||||
---@param options? table
|
||||
---@return table
|
||||
utils.etr = function(trigger, description, options)
|
||||
return utils.tr(trigger, description, vim.tbl_extend('force', { condition = utils.empty_line }, options or {}))
|
||||
end
|
||||
|
||||
--- Create a trigger for a comment trigger
|
||||
---@param trigger string
|
||||
---@param description? string
|
||||
---@param options? table
|
||||
---@return table
|
||||
utils.ctr = function(trigger, description, options)
|
||||
return utils.tr(trigger, description, vim.tbl_extend('force', { condition = utils.in_comment }, options or {}))
|
||||
end
|
||||
|
||||
--- Create a trigger for a snippet to expand anywhere outside a string/comment
|
||||
---@param trigger string
|
||||
---@param description? string
|
||||
---@param options? table
|
||||
---@return table
|
||||
utils.atr = function(trigger, description, options)
|
||||
return utils.tr(
|
||||
trigger,
|
||||
description,
|
||||
vim.tbl_extend('force', {
|
||||
regTrig = true,
|
||||
wordTrig = false,
|
||||
condition = utils.not_in_string_or_comment,
|
||||
}, options or {})
|
||||
)
|
||||
end
|
||||
|
||||
--- Create a trigger for a snippet to expand at the end of a line
|
||||
---@param trigger string
|
||||
---@param description? string
|
||||
---@param options? table
|
||||
---@return table
|
||||
utils.Etr = function(trigger, description, options)
|
||||
return utils.tr(
|
||||
trigger,
|
||||
description,
|
||||
vim.tbl_extend('force', {
|
||||
condition = line_end
|
||||
}, options or {})
|
||||
)
|
||||
end
|
||||
|
||||
--- Create a snippet that will expand anywhere but in the middle of a word
|
||||
---@param trigger any
|
||||
---@param nodes any
|
||||
---@param options? any
|
||||
---@return table
|
||||
utils.bs = function(trigger, nodes, options)
|
||||
local btrigger
|
||||
if type(trigger) == 'string' then
|
||||
btrigger = utils.atr('([^%w_-])' .. trigger)
|
||||
else
|
||||
btrigger = vim.tbl_extend('keep', utils.atr('([^%w_-])' .. trigger.trig), trigger)
|
||||
end
|
||||
return ms(
|
||||
{
|
||||
trigger,
|
||||
btrigger,
|
||||
},
|
||||
vim.list_extend({ fn(function(args, snip)
|
||||
return snip.captures[1] or ''
|
||||
end) }, nodes),
|
||||
options
|
||||
)
|
||||
end
|
||||
|
||||
return utils
|
||||
Reference in New Issue
Block a user