Compare commits
4 commits
1c1015d95f
...
2d2d177c51
Author | SHA1 | Date | |
---|---|---|---|
2d2d177c51 | |||
c4be55ae93 | |||
818197d6d6 | |||
fa03eb8f53 |
7 changed files with 118 additions and 62 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal 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
|
|
@ -1,3 +1,4 @@
|
||||||
{
|
{
|
||||||
|
"runtime.version": "Lua 5.1",
|
||||||
"diagnostics.globals": ["vim"]
|
"diagnostics.globals": ["vim"]
|
||||||
}
|
}
|
||||||
|
|
|
@ -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="+"})
|
|
1
vim/pack/git/start/packer.nvim
Submodule
1
vim/pack/git/start/packer.nvim
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit ea0cc3c59f67c440c5ff0bbe4fb9420f4350b9a3
|
|
@ -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
51
vim/plugin/stacc.lua
Normal 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
1
vimrc
|
@ -4,6 +4,7 @@
|
||||||
" Set up the runtime path
|
" Set up the runtime path
|
||||||
set runtimepath=$VIMRUNTIME,$HOME/.config/nvim,$HOME/.vim
|
set runtimepath=$VIMRUNTIME,$HOME/.config/nvim,$HOME/.vim
|
||||||
let &rtp=&rtp.','.expand('<sfile>:p:h').'/vim'
|
let &rtp=&rtp.','.expand('<sfile>:p:h').'/vim'
|
||||||
|
let &rtp=&rtp.','.expand('<sfile>:p:h').'/vim/pack/*/start/*'
|
||||||
|
|
||||||
if has("nvim")
|
if has("nvim")
|
||||||
lua require("pack/setup")
|
lua require("pack/setup")
|
||||||
|
|
Loading…
Reference in a new issue