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, {})