file_pairs.lua (1981B)
1 local ft_letter = { html = 't', scss = 's', dart = 'd', css = 'c' } 2 3 local letter_set = {} 4 5 local set_mark = function(letter, path, buffer) 6 path = path or vim.fn.expand('%') 7 if buffer == nil then buffer = true end 8 vim.keymap.set('n', '<leader>m' .. letter, '<cmd>edit ' .. path .. '<cr>', { buffer = buffer }) 9 vim.keymap.set('n', '<leader>mv' .. letter, '<cmd>vsplit ' .. path .. '<cr>', { buffer = buffer }) 10 vim.keymap.set('n', '<leader>mx' .. letter, '<cmd>split ' .. path .. '<cr>', { buffer = buffer }) 11 end 12 13 local unset_marks = function() 14 local leader = vim.g.mapleader 15 for _, map in ipairs(vim.api.nvim_buf_get_keymap(0, 'n')) do 16 for _, letter in pairs(ft_letter) do 17 if map.lhs == leader .. 'm' .. letter then vim.api.nvim_buf_del_keymap(0, 'n', '<leader>m' .. letter) end 18 if map.lhs == leader .. 'mv' .. letter then vim.api.nvim_buf_del_keymap(0, 'n', '<leader>mv' .. letter) end 19 if map.lhs == leader .. 'mx' .. letter then vim.api.nvim_buf_del_keymap(0, 'n', '<leader>mx' .. letter) end 20 end 21 end 22 end 23 24 local configure = function() 25 -- TODO(tms) 19.11.21: 26 unset_marks() 27 local filename = vim.fn.expand('%:t:r') 28 local dir = vim.fn.expand('%:h') 29 local files = {} 30 local on_event = function(_, data, event) 31 if event == 'stderr' then print(data) end 32 if event == 'stdout' then 33 if #data > 1 then 34 for _, file in ipairs(data) do 35 local _, _, ext = file:match('(.-)([^\\/]-%.?([^%.\\/]*))$') 36 files[ext] = file 37 end 38 end 39 end 40 if event == 'exit' then 41 for ext, file in pairs(files) do 42 local letter = ft_letter[ext] 43 if letter then 44 set_mark(letter, file, true) 45 table.insert(letter_set, letter) 46 end 47 end 48 files = {} 49 end 50 end 51 52 vim.fn.jobstart(string.format('fd -t f "^%s\\." "%s"', filename, dir), { on_stdout = on_event, on_exit = on_event }) 53 end 54 55 vim.api.nvim_create_autocmd('BufEnter', { callback = configure })