neovim

Personal neovim configuration files
git clone git://gtms.dev/neovim
Log | Files | Refs

difftastic.lua (5304B)


      1 local json = [[
      2 {
      3   "language": "JSON",
      4   "path": "test/after.json",
      5   "chunks": [
      6     [
      7       {
      8         "lhs": {
      9           "number": 2,
     10           "changes": [
     11             {
     12               "start": 2,
     13               "end": 7,
     14               "content": "\"bar\"",
     15               "kind": "keyword"
     16             }
     17           ]
     18         },
     19         "rhs": {
     20           "number": 2,
     21           "changes": [
     22             {
     23               "start": 2,
     24               "end": 7,
     25               "content": "\"zab\"",
     26               "kind": "keyword"
     27             },
     28             {
     29               "start": 18,
     30               "end": 19,
     31               "content": ",",
     32               "kind": "normal"
     33             }
     34           ]
     35         }
     36       },
     37       {
     38         "rhs": {
     39           "number": 3,
     40           "changes": [
     41             {
     42               "start": 2,
     43               "end": 7,
     44               "content": "\"woo\"",
     45               "kind": "keyword"
     46             },
     47             {
     48               "start": 7,
     49               "end": 8,
     50               "content": ":",
     51               "kind": "normal"
     52             },
     53             {
     54               "start": 9,
     55               "end": 10,
     56               "content": "[",
     57               "kind": "delimiter"
     58             },
     59             {
     60               "start": 10,
     61               "end": 18,
     62               "content": "\"foobar\"",
     63               "kind": "string"
     64             },
     65             {
     66               "start": 18,
     67               "end": 19,
     68               "content": "]",
     69               "kind": "delimiter"
     70             }
     71           ]
     72         }
     73       },
     74       {
     75         "lhs": {
     76           "number": 1,
     77           "changes": [
     78             {
     79               "start": 10,
     80               "end": 11,
     81               "content": "1",
     82               "kind": "normal"
     83             },
     84             {
     85               "start": 11,
     86               "end": 12,
     87               "content": ",",
     88               "kind": "normal"
     89             }
     90           ]
     91         },
     92         "rhs": {
     93           "number": 1,
     94           "changes": [
     95             {
     96               "start": 17,
     97               "end": 18,
     98               "content": ",",
     99               "kind": "normal"
    100             },
    101             {
    102               "start": 19,
    103               "end": 20,
    104               "content": "5",
    105               "kind": "normal"
    106             }
    107           ]
    108         }
    109       }
    110     ]
    111   ],
    112   "status": "changed"
    113 }
    114 ]]
    115 
    116 local function get_changes()
    117   return vim.fn.json_decode(json)
    118 end
    119 
    120 local function show_diff(lang, lhs_file, rhs_file, chunks)
    121   local width = vim.api.nvim_win_get_width(0)
    122 
    123   local lhs_buf = vim.api.nvim_create_buf(true, true)
    124   local rhs_buf = vim.api.nvim_create_buf(true, true)
    125 
    126   -- TODO(tms) 03.10.22: yes!
    127   -- local oldbuf = vim.fn.bufadd(old_fname)
    128   -- vim.fn.bufload(oldbuf)
    129 
    130   vim.api.nvim_buf_call(lhs_buf, function()
    131     vim.cmd.read { range = { 0 }, args = { lhs_file } }
    132   end)
    133   vim.api.nvim_buf_call(rhs_buf, function()
    134     vim.cmd.read { range = { 0 }, args = { rhs_file } }
    135   end)
    136 
    137   vim.api.nvim_buf_set_name(lhs_buf, lhs_file)
    138   vim.api.nvim_buf_set_name(rhs_buf, rhs_file)
    139 
    140   vim.api.nvim_set_option_value('filetype', lang, { buf = lhs_buf })
    141   vim.api.nvim_set_option_value('filetype', lang, { buf = rhs_buf })
    142 
    143   -- print(vim.api.nvim_buf_is_valid(buf), vim.api.nvim_buf_is_loaded(buf), vim.api.nvim_buf_line_count(buf))
    144   -- do
    145   --   return
    146   -- end
    147 
    148   -- vim.api.nvim_buf_set_lines(buf, 0, 0, true, { 'Test text' })
    149   -- local hl_ns = vim.api.nvim_buf_add_highlight(buf, 0, 'Error', 1, 0, 4)
    150   -- vim.api.nvim_buf_add_highlight(buf, hl_ns, 'Identifier', 0, 5, -1)
    151 
    152   local row = 15
    153 
    154   local lhs_height = vim.api.nvim_buf_line_count(lhs_buf)
    155   local lhs_win = vim.api.nvim_open_win(lhs_buf, true, {
    156     relative = 'win',
    157     width = (width / 2) - 2,
    158     height = lhs_height,
    159     col = 0,
    160     row = row,
    161     border = 'single',
    162     style = 'minimal',
    163   })
    164 
    165   local rhs_height = vim.api.nvim_buf_line_count(rhs_buf)
    166   local rhs_win = vim.api.nvim_open_win(rhs_buf, true, {
    167     relative = 'win',
    168     width = (width / 2) - 2,
    169     height = rhs_height,
    170     col = width / 2,
    171     row = row,
    172     border = 'single',
    173     style = 'minimal',
    174   })
    175   vim.keymap.set('n', 'q', function()
    176     vim.api.nvim_buf_delete(lhs_buf, { force = true })
    177     vim.api.nvim_win_close(lhs_win, true)
    178     vim.api.nvim_win_close(rhs_win, true)
    179   end, { buffer = rhs_buf })
    180   vim.keymap.set('n', 'q', function()
    181     vim.api.nvim_win_close(lhs_win, true)
    182     vim.api.nvim_win_close(rhs_win, true)
    183   end, { buffer = lhs_buf })
    184 
    185   -- local augroup = vim.api.nvim_create_augroup('diffstastic', {})
    186   -- vim.api.nvim_create_autocmd('BufLeave', {
    187   --   buffer = lhs_buf,
    188   --   group = augroup,
    189   --   callback = function()
    190   --     vim.api.nvim_win_close(lhs_win, true)
    191   --     vim.api.nvim_win_close(rhs_win, true)
    192   --   end,
    193   -- })
    194   -- vim.api.nvim_create_autocmd('BufLeave', {
    195   --   buffer = rhs_buf,
    196   --   group = augroup,
    197   --   callback = function()
    198   --     vim.api.nvim_win_close(lhs_win, true)
    199   --     vim.api.nvim_win_close(rhs_win, true)
    200   --   end,
    201   -- })
    202 end
    203 
    204 vim.api.nvim_create_user_command('Diff', function()
    205   local lhs_file = vim.fn.getcwd() .. '/test/before.json'
    206   local rhs_file = vim.fn.getcwd() .. '/test/after.json'
    207 
    208   local changes = get_changes()
    209   if not changes then
    210     return
    211   end
    212   show_diff('json', lhs_file, rhs_file, changes.chunks)
    213 end, {})