Compare commits

...

4 Commits

7 changed files with 118 additions and 62 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "vim/pack/git/start/packer.nvim"]
path = vim/pack/git/start/packer.nvim
url = https://github.com/wbthomason/packer.nvim

View File

@ -1,3 +1,4 @@
{
"runtime.version": "Lua 5.1",
"diagnostics.globals": ["vim"]
}

View File

@ -1,61 +0,0 @@
local function nextcol(state)
local from, to = state.str:find(state.pattern, state.last)
if from then
state.last = to+1
return from, to
end
end
local function colmatch(str, pattern)
return nextcol, {str=str,pattern=pattern,last=0}
end
local function findLocations(args)
local files = vim.fs.find(function(file)
if #args>1 then
for _, pattern in ipairs(args), args, 1 do
if vim.fs.basename(file):find(pattern) then
return true
end
end
else
return true
end
return false
end, {
limit=math.huge;
type="file";
})
local locations = {}
for _, file in ipairs(files) do
local lnum = 0
for line in io.lines(file) do
lnum = lnum + 1
for from, to in colmatch(line, args[1]) do
table.insert(locations, {
filename = file;
lnum = lnum;
col = from;
end_col = to;
text = line:sub(from, to)
})
end
end
end
return locations
end
vim.api.nvim_create_user_command("Matcha", function(params)
vim.fn.setqflist(findLocations(params.fargs))
vim.cmd("copen")
vim.cmd("crewind")
end, {nargs="+"})
vim.api.nvim_create_user_command("MatchaLocal", function(params)
vim.fn.setloclist(0, findLocations(params.farts))
vim.cmd("lopen")
vim.cmd("lrewind")
end, {nargs="+"})

@ -0,0 +1 @@
Subproject commit ea0cc3c59f67c440c5ff0bbe4fb9420f4350b9a3

View File

@ -1 +1,61 @@
require 'matcha'
local function nextcol(state)
local from, to = state.str:find(state.pattern, state.last)
if from then
state.last = to+1
return from, to
end
end
local function colmatch(str, pattern)
return nextcol, {str=str,pattern=pattern,last=0}
end
local function findLocations(args)
local files = vim.fs.find(function(file)
if #args>1 then
for _, pattern in ipairs(args), args, 1 do
if vim.fs.basename(file):find(pattern) then
return true
end
end
else
return true
end
return false
end, {
limit=math.huge;
type="file";
})
local locations = {}
for _, file in ipairs(files) do
local lnum = 0
for line in io.lines(file) do
lnum = lnum + 1
for from, to in colmatch(line, args[1]) do
table.insert(locations, {
filename = file;
lnum = lnum;
col = from;
end_col = to;
text = line:sub(from, to)
})
end
end
end
return locations
end
vim.api.nvim_create_user_command("Matcha", function(params)
vim.fn.setqflist(findLocations(params.fargs))
vim.cmd("copen")
vim.cmd("crewind")
end, {nargs="+"})
vim.api.nvim_create_user_command("MatchaLocal", function(params)
vim.fn.setloclist(0, findLocations(params.farts))
vim.cmd("lopen")
vim.cmd("lrewind")
end, {nargs="+"})

51
vim/plugin/stacc.lua Normal file
View File

@ -0,0 +1,51 @@
-- A simple per-session task stack.
-- Allows pushing locations with a note and returning to them later.
local ns = vim.api.nvim_create_namespace("stacc")
local locations = {}
local stacc = {}
--- Pushes a new location to the stack
--- @param description string A message to display when returning to this location
function stacc.push(description)
local bufnr = vim.fn.bufnr()
local line, column = unpack(vim.api.nvim_win_get_cursor(0))
line = line - 1 -- 0-based :help api-indexing
local id = vim.api.nvim_buf_set_extmark(bufnr, ns, line, column, {})
table.insert(locations, {bufnr, id, description, vim.fn.line(".")})
end
--- Pops a given number of items from the task stack
--- Jumps to the last removed item and displays its description
--- @param count number How many items to pop from the stack
--- @return string description The description of the current task
function stacc.pop(count)
if count > #locations then
error("stack only has "..#locations.." elements.")
end
local description
local final = vim.api.nvim_win_get_cursor(0)
for _=1, count do
local bufnr, id
bufnr, id, description = unpack(table.remove(locations))
final = vim.api.nvim_buf_get_extmark_by_id(bufnr, ns, id, {})
vim.api.nvim_buf_del_extmark(bufnr, ns, id)
final[1] = final[1] + 1 -- Make line 1-indexed
final.bufnr = bufnr
end
vim.api.nvim_set_current_buf(final.bufnr or 0)
final.bufnr = nil
vim.api.nvim_win_set_cursor(0, final)
return description
end
vim.api.nvim_create_user_command("StaccPush", function(params)
stacc.push(params.args)
end, {nargs="?"})
vim.api.nvim_create_user_command("StaccPop", function(params)
local message = stacc.pop(tonumber(params.args) or 1)
print(message)
end, {nargs="?"})

1
vimrc
View File

@ -4,6 +4,7 @@
" Set up the runtime path
set runtimepath=$VIMRUNTIME,$HOME/.config/nvim,$HOME/.vim
let &rtp=&rtp.','.expand('<sfile>:p:h').'/vim'
let &rtp=&rtp.','.expand('<sfile>:p:h').'/vim/pack/*/start/*'
if has("nvim")
lua require("pack/setup")