From 8d4afad4f6a608e10fd6749d08c47e2aa39d57a1 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Sun, 28 May 2023 01:16:15 +0200 Subject: [PATCH] add command to copy current buffer --- mzte-nv/conf/lua/settings.fnl | 6 ++- mzte-nv/src/main.zig | 2 + mzte-nv/src/modules/cpbuf.zig | 70 +++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 mzte-nv/src/modules/cpbuf.zig diff --git a/mzte-nv/conf/lua/settings.fnl b/mzte-nv/conf/lua/settings.fnl index 811e56a..6d22b76 100644 --- a/mzte-nv/conf/lua/settings.fnl +++ b/mzte-nv/conf/lua/settings.fnl @@ -1,7 +1,11 @@ +(local mztenv (require :mzte_nv)) (local cmd vim.cmd) +;; CPBuf command +(vim.api.nvim_create_user_command :CPBuf mztenv.cpbuf.copyBuf {:nargs 0}) + ;; Compile commands -(let [compile-path (. (require :mzte_nv) :compile :compilePath) +(let [compile-path mztenv.compile.compilePath make-cmd vim.api.nvim_create_user_command] (make-cmd :CompileConfig #(compile-path (.. (vim.fn.getenv :HOME) :/.config/nvim)) {:nargs 0}) diff --git a/mzte-nv/src/main.zig b/mzte-nv/src/main.zig index 59e8a00..7190c28 100644 --- a/mzte-nv/src/main.zig +++ b/mzte-nv/src/main.zig @@ -10,6 +10,7 @@ pub const version = "1.2.0"; const modules = struct { const cmp = @import("modules/cmp.zig"); const compile = @import("modules/compile.zig"); + const cpbuf = @import("modules/cpbuf.zig"); const jdtls = @import("modules/jdtls.zig"); const tsn_actions = @import("modules/tsn_actions.zig"); const utils = @import("modules/utils.zig"); @@ -64,6 +65,7 @@ export fn luaopen_mzte_nv(l_: ?*c.lua_State) c_int { .onInit = ffi.luaFunc(lOnInit), .cmp = modules.cmp, .compile = modules.compile, + .cpbuf = modules.cpbuf, .jdtls = modules.jdtls, .tsn_actions = modules.tsn_actions, .utils = modules.utils, diff --git a/mzte-nv/src/modules/cpbuf.zig b/mzte-nv/src/modules/cpbuf.zig new file mode 100644 index 0000000..522af59 --- /dev/null +++ b/mzte-nv/src/modules/cpbuf.zig @@ -0,0 +1,70 @@ +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; + + // close in case of error + errdefer _ = nvim.close_buffer(null, newbuf, 0, false, false); + + // 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; + + // activate buffer + if (nvim.do_buffer( + nvim.DOBUF_GOTO, + nvim.DOBUF_FIRST, + nvim.FORWARD, + newbuf.*.handle, + 0, + ) == nvim.FAIL) + return error.Buffer; + + // 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; +}