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