2023-05-28 01:16:15 +02:00
|
|
|
const std = @import("std");
|
|
|
|
const nvim = @import("nvim");
|
|
|
|
const znvim = @import("znvim");
|
|
|
|
const ffi = @import("../ffi.zig");
|
|
|
|
const ser = @import("../ser.zig");
|
|
|
|
const c = ffi.c;
|
|
|
|
|
|
|
|
pub fn luaPush(l: *c.lua_State) void {
|
|
|
|
ser.luaPushAny(l, .{
|
|
|
|
.copyBuf = ffi.luaFunc(lCopyBuf),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
fn lCopyBuf(l: *c.lua_State) !c_int {
|
|
|
|
_ = l;
|
|
|
|
// create new buffer
|
|
|
|
const newbuf = nvim.buflist_new(null, null, 0, nvim.BLN_LISTED | nvim.BLN_NEW) orelse
|
|
|
|
return error.Buffer;
|
|
|
|
|
|
|
|
// create memline
|
|
|
|
if (nvim.ml_open(newbuf) == nvim.FAIL)
|
|
|
|
return error.Buffer;
|
|
|
|
|
|
|
|
// copy lines
|
|
|
|
var lnum: i32 = 1;
|
|
|
|
while (lnum < nvim.curbuf.*.b_ml.ml_line_count) : (lnum += 1) {
|
|
|
|
const line = nvim.ml_get_buf(nvim.curbuf, lnum, false) orelse return error.Buffer;
|
|
|
|
if (nvim.ml_append_buf(newbuf, lnum - 1, line, 0, false) == nvim.FAIL)
|
|
|
|
return error.Buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get previous filetype
|
|
|
|
var ft_numval: i64 = 0;
|
|
|
|
var ft_stringval: ?[*:0]u8 = null;
|
|
|
|
if (nvim.get_option_value_strict(
|
|
|
|
@constCast("filetype"),
|
|
|
|
&ft_numval,
|
|
|
|
&ft_stringval,
|
|
|
|
nvim.SREQ_BUF,
|
|
|
|
nvim.curbuf,
|
|
|
|
) == nvim.FAIL)
|
|
|
|
return error.Buffer;
|
|
|
|
|
2023-05-30 23:56:44 +02:00
|
|
|
// store previous window layout
|
|
|
|
const cursor_pos = nvim.curwin.*.w_cursor;
|
|
|
|
const topline = nvim.curwin.*.w_topline;
|
|
|
|
|
2023-05-28 01:16:15 +02:00
|
|
|
// activate buffer
|
|
|
|
if (nvim.do_buffer(
|
|
|
|
nvim.DOBUF_GOTO,
|
|
|
|
nvim.DOBUF_FIRST,
|
|
|
|
nvim.FORWARD,
|
|
|
|
newbuf.*.handle,
|
|
|
|
0,
|
|
|
|
) == nvim.FAIL)
|
|
|
|
return error.Buffer;
|
|
|
|
|
2023-05-30 23:56:44 +02:00
|
|
|
// set old window layout
|
|
|
|
nvim.curwin.*.w_cursor = cursor_pos;
|
|
|
|
nvim.curwin.*.w_topline = topline;
|
|
|
|
|
2023-05-28 01:16:15 +02:00
|
|
|
// set new filetype
|
|
|
|
if (nvim.set_option_value("filetype", 0, ft_stringval, nvim.OPT_LOCAL)) |_|
|
|
|
|
return error.Buffer;
|
|
|
|
|
|
|
|
// apply autocmds
|
|
|
|
_ = nvim.apply_autocmds(nvim.EVENT_BUFREADPOST, @constCast("cpbuf"), null, false, nvim.curbuf);
|
|
|
|
_ = nvim.apply_autocmds(nvim.EVENT_BUFWINENTER, @constCast("cpbuf"), null, false, nvim.curbuf);
|
|
|
|
|
|
|
|
// ensure redraw
|
|
|
|
nvim.redraw_curbuf_later(nvim.UPD_NOT_VALID);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|