-- misc stuff implemented in lua local M = {} function M.do_under_cursor(obj, cb) return cb(vim.fn.expand(vim.fn.expand(obj))) end function M.word_under_cursor(cb) return M.do_under_cursor('', cb) end function M.expr_under_cursor(cb) return M.do_under_cursor('', cb) end function M.file_under_cursor(cb) return M.do_under_cursor('', cb) end function M.open_under_cursor(cmd, detect_cmd) return M.file_under_cursor(function(txt) txt = vim.trim(txt) if not cmd and detect_cmd then if vim.regex([[^http.*$]]):match_str(txt) then cmd = 'url-launcher' end if vim.regex([[^(\.\./|[\w\d_/\-])*(\.[\w\d]+)?$]]):match_str(txt) then cmd = ':edit' end vim.notify("open_under_cursor: detected command " .. txt .. " => " .. (cmd or "")) end if not cmd then vim.fn.inputsave() vim.ui.input('open with: ', function(result) cmd = result end) vim.fn.inputrestore() if not cmd then return end end -- detect vim command if cmd:sub(1, 1) == ":" then vim.cmd(cmd:sub(2) .. ' ' .. txt) else local c c = vim.loop.spawn(cmd, { args = {txt} }, function() c:close() end) end end) end function get_visual_selection() pos1 = vim.fn.getpos("'<") ln1, col1 = pos1[2], pos1[3] pos2 = vim.fn.getpos("'>") ln2, col2 = pos2[2], pos2[3] lines = vim.fn.getline(ln1, ln2) if vim.opt.selection:get() == 'inclusive' then lines[#lines] = lines[#lines]:sub(1,col2) else lines[#lines] = lines[#lines]:sub(1,col2-1) end lines[1] = lines[1]:sub(col1) return pos1, pos2, lines end function M.sort_line() local fn = vim.fn pos1, pos2, lines = get_visual_selection() for i=1, #lines do local ln = pos1[2] + (i-1) local line = fn.join(fn.sort(fn.split(lines[i], " "))) line = fn.substitute(fn.getline(ln), lines[i], line, "") vim.fn.setline(ln, line) end end function M.live_grep(dirs) if not dirs then vim.ui.input('Dirs: ', function(result) dirs = result end) end if not dirs then dirs = '%:p:h' end require('telescope.builtin').live_grep { search_dirs=vim.split(dirs, ','), prompt_title='Live Grep: '.. vim.fn.expand(dirs), } end function M.find_files(dirs) if not dirs then vim.ui.input('Dirs: ', function(result) dirs = result end) end if not dirs then dirs = '%:h:p' end require('telescope.builtin').find_files { search_dirs=vim.split(dirs, ','), prompt_title='Find Files: '.. vim.fn.expand(dirs), } end local function render_link_preview(buf, ln, link) local j = require('plenary.job'):new({ command = vim.env.SHELL, args = {'-c', [[ curl -sSfL ]] .. link .. [[ | grep -iPo '(?<=property="og:title" content=")([^\"]+)(?=")' ]]}, enable_recording = true, }) local results, code = j:sync() if not code == 0 or #results == 0 then return end local ns = vim.api.nvim_create_namespace('') vim.api.nvim_buf_set_extmark(buf, ns, ln, 0, { virt_text = {{results[1], 'Error'}}, virt_text_pos = 'eol' }) end function M.link_preview() local link = vim.fn.expand('') if not link then return end local ln = (vim.api.nvim_win_get_cursor(0)[1]) - 1 render_link_preview(0, ln, link) end return M