vis-config

lua scripts to configure vis editor

git clone https://9o.is/git/vis-config.git

search.lua

(3754B)


      1 local session = require('lib/session')
      2 local router = require('lib/router')
      3 local wm = require('lib/x11')
      4 
      5 local M = {
      6 	find = 'ag -g . {path} | fzy',
      7 	dfind = 'find {path} -type d | fzy | xargs -r fe',
      8 	grep = 'ag --vimgrep --smart-case {pattern} {path} | fzy',
      9 	explore = 'fe {path}',
     10 	grep_wrap = '"',
     11 }
     12 
     13 local function split(str, delimiter)
     14 	local result = {}
     15 	for part in string.gmatch(str, string.format('[^%s]+', delimiter)) do
     16 		table.insert(result, part)
     17 	end
     18 	return result
     19 end
     20 
     21 local function dirname(path)
     22 	local dir = path:match('(.*)/')
     23 	if dir == nil then
     24 		return '.'
     25 	else
     26 		return dir:match("^/") and dir or './'..dir
     27 	end
     28 end
     29 
     30 local function exists(path)
     31 	local f = io.open(path, 'r')
     32 	if f then
     33 		f:close()
     34 		return true
     35 	else
     36 		return false
     37 	end
     38 end
     39 
     40 local function getpath(win)
     41 	local fn = win.file.name
     42 	if fn and fn:sub(1,1) == '/' then
     43 		return dirname(fn)
     44 	end
     45 	return win.scope
     46 end
     47 
     48 local function run(command, onsuccess, fullscreen)
     49 	vis.ui:showcursor(true)
     50 
     51 	local file = io.popen(string.format('sh -c "%s" 2>/dev/null', command:gsub('"', '\\"')))
     52     local out = file:read()
     53     local success, msg, status = file:close()
     54 
     55 	if success then
     56 		onsuccess(out)
     57 	end
     58 
     59 	vis.ui:showcursor(false)
     60 	vis:redraw()
     61 	return success
     62 end
     63 
     64 vis:command_register('find', function(argv, _, win)
     65 	local command = M.find:gsub('{path}', getpath(win))
     66 	return run(command, win.navigate)
     67 end, 'Find files')
     68 
     69 vis:command_register('dfind', function(_, _, win)
     70 	local command = M.dfind:gsub('{path}', getpath(win))
     71 	return run(command, win.navigate)
     72 end, 'Find directories')
     73 
     74 vis:command_register('grep', function(argv, _, win)
     75 	local pattern
     76 	if #argv == 0 and win.selection.anchored then
     77 		pattern = content(win)
     78 	elseif not #argv == 0 then
     79 		pattern = table.concat(argv, ' ')
     80 	else
     81 		pattern = '.*.'
     82 	end
     83 	pattern = pattern:gsub(M.grep_wrap, '\\'..M.grep_wrap)
     84 	pattern = string.format('%s%s%s', M.grep_wrap, pattern, M.grep_wrap)
     85 
     86 	local command = M.grep:gsub('{pattern}', pattern):gsub('{path}', getpath(win))
     87 
     88 	return run(command, function(out)
     89 		out = split(out, ':')
     90 		win.navigate(out[1], string.format('normal %sG%sg|', out[2], out[3]))
     91 	end)
     92 end, 'Grep')
     93 
     94 vis:command_register('explore', function(argv, force, win)
     95 	local path
     96 	if not win.file.name then
     97 		path = '.'
     98 	elseif win.file.name:sub(1,1) == '/' then
     99 		path = win.file.name
    100 	else
    101 		path = './' .. win.file.name
    102 	end
    103 
    104 	local command = M.explore:gsub('{path}', path)
    105 	return run(command, win.navigate)
    106 end, 'Explore')
    107 
    108 vis:command_register('mru', function(argv, force, win)
    109 	local cmd = string.format("cat %s | sed 's|^'$(pwd)'/||' | fzy", session.mru_path)
    110 	return run(cmd, win.navigate)
    111 end, 'Most recently used files')
    112 
    113 vis:command_register('tag-search', function(argv, _, win)
    114 	local tagfile = argv[1] or '.tags'
    115 
    116 	if not exists(tagfile) then
    117 		vis:info(string.format('tag-search: tag file %s not found', tagfile))
    118 		return
    119 	end
    120 
    121 	local command = string.format([[
    122 		readtags -t %s -F '(list \$input ":" \$line ": " \$kind " " \$name #t)' -l |
    123 			column -td -C right | fzy]], tagfile)
    124 
    125 	return run(command, function(out)
    126 		out = split(out, ':')
    127 		win.navigate(out[1], string.format('normal %sG', out[2]))
    128 	end)
    129 end, 'Search ctags')
    130 
    131 vis:command_register('scope', function(argv, _, win)
    132 	if win.file.name then
    133 		win.scope = dirname(win.file.name)
    134 	end
    135 
    136 	vis:command(table.concat(argv, ' '))
    137 	vis.win.scope = '.'
    138 end)
    139 
    140 vis:command_register('tab', function(argv, _, win)
    141 	if not wm.running() then
    142 		vis:info('tab: window manager missing')
    143 		return false
    144 	end
    145 
    146 	win.navigate = wm.navigate
    147 	vis:command(table.concat(argv, ' '))
    148 	win.navigate = router.navigate
    149 end)
    150 
    151 vis.events.subscribe(vis.events.WIN_OPEN, function(win)
    152 	win.scope = '.'
    153 	win.navigate = router.navigate
    154 end)
    155 
    156 return M