aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/nvim/init.lua63
-rw-r--r--configs/nvim/lua/crupest/nvim.lua120
-rw-r--r--configs/nvim/lua/crupest/system/fs.lua58
-rw-r--r--configs/nvim/lua/crupest/table.lua2
4 files changed, 232 insertions, 11 deletions
diff --git a/configs/nvim/init.lua b/configs/nvim/init.lua
index 51b4808..ee44e30 100644
--- a/configs/nvim/init.lua
+++ b/configs/nvim/init.lua
@@ -230,15 +230,6 @@ lspconfig.tsserver.setup{
-- setup trouble
require("trouble").setup()
--- setup keymap for telescope
-local builtin = require('telescope.builtin')
-vim.keymap.set('n', '<leader>f', builtin.find_files, {})
-vim.keymap.set('n', '<leader>g', builtin.live_grep, {})
-vim.keymap.set('n', '<leader>b', builtin.buffers, {})
-vim.keymap.set('n', '<leader>h', builtin.help_tags, {})
-
--- setup keymap fnamemodifyfor lsp
-
-- Use LspAttach autocommand to only map the following keys
-- after the language server attaches to the current buffer
vim.api.nvim_create_autocmd('LspAttach', {
@@ -277,6 +268,15 @@ require("catppuccin").setup{
vim.cmd.colorscheme "catppuccin"
-- custom keymaps
+--
+-- setup keymap for telescope
+local builtin = require('telescope.builtin')
+vim.keymap.set('n', '<leader>f', builtin.find_files, {})
+vim.keymap.set('n', '<leader>g', builtin.live_grep, {})
+vim.keymap.set('n', '<leader>b', builtin.buffers, {})
+vim.keymap.set('n', '<leader>h', builtin.help_tags, {})
+
+-- setup ketmap for tree
vim.keymap.set('n', '<leader>tt', nvim_tree_api.tree.toggle, {})
vim.keymap.set('n', '<leader>tr', '<cmd>NvimTreeRefresh<cr>')
@@ -294,3 +294,48 @@ vim.keymap.set("n", "<s-tab>", "<c-o>")
vim.keymap.set("n", "<c-q>", require("crupest.nvim").win_close_buf)
vim.keymap.set("n", "<esc>", require("crupest.nvim").close_float)
+vim.api.nvim_create_user_command("Mv", function(opts)
+ require("crupest.nvim").mv_buf_file(vim.api.nvim_get_current_buf(), opts.fargs[1])
+end, {
+ nargs = 1,
+ complete = "file"
+})
+
+vim.api.nvim_create_user_command("MvFile", function(opts)
+ if (#opts.fargs ~= 2) then
+ vim.notify("MvFile accepts exactly two arguments, old file and new file.")
+ end
+ require("crupest.nvim").mv_file(opts.fargs[1], opts.fargs[2])
+end, {
+ nargs = "+",
+ complete = "file"
+})
+
+vim.api.nvim_create_user_command("MvDir", function(opts)
+ if (#opts.fargs ~= 2) then
+ vim.notify("MvDir accepts exactly two arguments, old dir and new dir.")
+ end
+ require("crupest.nvim").mv_dir(opts.fargs[1], opts.fargs[2])
+end, {
+ nargs = "+",
+ complete = "file"
+})
+
+
+vim.api.nvim_create_user_command("Rename", function(opts)
+ require("crupest.nvim").rename_buf_file(vim.api.nvim_get_current_buf(), opts.fargs[1])
+end, {
+ nargs = 1,
+ complete = "file"
+})
+
+vim.api.nvim_create_user_command("RenameFile", function(opts)
+ if (#opts.fargs ~= 2) then
+ vim.notify("RenameFile accepts exactly two arguments, old file and new file.")
+ end
+ require("crupest.nvim").rename_file(opts.fargs[1], opts.fargs[2])
+end, {
+ nargs = "+",
+ complete = "file"
+})
+
diff --git a/configs/nvim/lua/crupest/nvim.lua b/configs/nvim/lua/crupest/nvim.lua
index 67bb3b0..44c9b5f 100644
--- a/configs/nvim/lua/crupest/nvim.lua
+++ b/configs/nvim/lua/crupest/nvim.lua
@@ -1,3 +1,5 @@
+local fs = require("crupest.system.fs")
+
local function list_listed_bufs()
local bufs = vim.api.nvim_list_bufs()
local result = {}
@@ -49,13 +51,17 @@ local function list_wins_editing_buf(buf)
return result
end
+local function buf_is_normal(buf)
+ return vim.fn.bufexists(buf) ~= 0 and vim.fn.buflisted(buf) ~= 0
+end
+
-- Delete current buffer and jump back.
-- If no previous jump, switch to previous buffer.
-- If no previous buffer (no other buffers), create a unnamed one. (So the window does not quit.)
local function win_close_buf()
local buf = vim.api.nvim_get_current_buf()
- if vim.fn.bufexists(buf) == 0 or vim.fn.buflisted(buf) == 0 then
+ if not buf_is_normal(buf) then
return
end
@@ -99,11 +105,123 @@ local function close_float()
end
end
+local function full_path(name)
+ return vim.fn.fnamemodify(name, ":p:gs?\\?/?")
+end
+
+local function coerce_path_for_dir(old, new)
+ if fs.isdir(new) then
+ return new .. "/" .. vim.fn.fnamemodify(old, ":t")
+ end
+ return new
+end
+
+local function do_mv_file(old, new, overwrite)
+ new = coerce_path_for_dir(old, new)
+
+ if full_path(old) == full_path(new) then
+ vim.notify("Paths are identical. Do nothing.", vim.log.levels.WARN)
+ return false
+ end
+
+ if not fs.isfile(old) then
+ vim.notify("Not exists or not a file. Can't move.", vim.log.levels.ERROR)
+ return false
+ end
+
+ if not overwrite and fs.exist(new) then
+ vim.notify("Target path exists.", vim.log.levels.ERROR)
+ return false
+ end
+
+ fs.move(old, new)
+ vim.notify("File moved.")
+
+ return new
+end
+
+local function mv_file(old, new, overwrite)
+ new = do_mv_file(old, new, overwrite)
+ if not new then return end
+
+ local bufs = list_listed_bufs()
+ for _, b in ipairs(bufs) do
+ if full_path(vim.api.nvim_buf_get_name(b)) == full_path(old) then
+ vim.api.nvim_buf_set_name(b, new)
+ end
+ end
+end
+
+local function mv_buf_file(buf, new, overwrite)
+ if not buf_is_normal(buf) then
+ vim.notify("Buf is not a normal buffer, can't move it.", vim.log.levels.ERROR)
+ return
+ end
+
+ local name = vim.api.nvim_buf_get_name(buf)
+
+ new = do_mv_file(name, new, overwrite)
+ if not new then return end
+
+ vim.api.nvim_buf_set_name(buf, new)
+end
+
+local function mv_dir(old_dir, new_dir, overwrite)
+ new_dir = coerce_path_for_dir(old_dir, new_dir)
+
+ if full_path(old_dir) == full_path(new_dir) then
+ vim.notify("Paths are identical. Do nothing.", vim.log.levels.WARN)
+ return
+ end
+
+ if not fs.isdir(old_dir) then
+ vim.notify("Not exist or not a dir. Can't move.", vim.log.levels.ERROR)
+ end
+
+ if not overwrite and fs.exist(new_dir) then
+ vim.notify("Target path exists.", vim.log.levels.ERROR)
+ return
+ end
+
+ if fs.isdir(old_dir) then
+ fs.move(old_dir, new_dir)
+ vim.notify("Dir moved.")
+ end
+
+ local bufs = list_listed_bufs()
+
+ for _, buf in ipairs(bufs) do
+ local name = vim.api.nvim_buf_get_name(buf)
+ local full_name = full_path(name)
+ local old_dir_full = full_path(old_dir)
+ if string.find(full_name, old_dir_full, 1, true) == 1 then
+ local new_name = new_dir .. string.sub(full_name, #old_dir_full + 1)
+ vim.api.nvim_buf_set_name(buf, new_name)
+ end
+ end
+end
+
+local function rename_file(old, new, overwrite)
+ local dir = vim.fn.fnamemodify(old, ":h")
+ mv_file(old, dir .. "/" .. new, overwrite)
+end
+
+local function rename_buf_file(buf, new_name, overwrite)
+ local old_path = vim.api.nvim_buf_get_name(buf)
+ local dir = vim.fn.fnamemodify(old_path, ":h")
+ mv_buf_file(buf, dir .. "/" .. new_name, overwrite)
+end
+
return {
list_listed_bufs = list_listed_bufs,
get_previous_buffer = get_previous_buffer,
list_wins_editing_buf = list_wins_editing_buf,
win_close_buf = win_close_buf,
close_float = close_float,
+ mv_file = mv_file,
+ mv_buf_file = mv_buf_file,
+ mv_dir = mv_dir,
+ rename_file = rename_file,
+ rename_buf_file = rename_buf_file
}
diff --git a/configs/nvim/lua/crupest/system/fs.lua b/configs/nvim/lua/crupest/system/fs.lua
new file mode 100644
index 0000000..25ce02c
--- /dev/null
+++ b/configs/nvim/lua/crupest/system/fs.lua
@@ -0,0 +1,58 @@
+local function exist(path)
+ return vim.uv.fs_stat(path)
+end
+
+local function isfile(path)
+ local s = vim.uv.fs_stat(path)
+ if not s then return false end
+ return s.type == "file"
+end
+
+local function isdir(path)
+ local s = vim.uv.fs_stat(path)
+ if not s then return false end
+ return s.type == "directory"
+end
+
+local function mkdir(dir)
+ local parents = {}
+ require("crupest/system").walk_up(dir, function(p)
+ table.insert(parents, 1, p)
+ end)
+
+ for _, v in ipairs(parents) do
+ if exist(v) and not isdir(v) then
+ vim.notify(v.." is not a dir. Can't make dir "..dir, vim.log.levels.ERROR)
+ return
+ end
+ if not exist(v) then
+ vim.notify("Creating dir "..v)
+ assert(vim.uv.fs_mkdir(v, 504)) -- mode = 0770
+ end
+ end
+end
+
+local function copy(old, new)
+ mkdir(vim.fn.fnamemodify(new, ":p:h"))
+ assert(vim.uv.fs_copyfile(old, new))
+end
+
+local function remove(path)
+ assert(vim.uv.fs_unlink(path))
+end
+
+local function move(old, new)
+ mkdir(vim.fn.fnamemodify(new, ":p:h"))
+ assert(vim.uv.fs_rename(old, new))
+end
+
+return {
+ exist = exist,
+ isfile = isfile,
+ isdir = isdir,
+ mkdir = mkdir,
+ copy = copy,
+ remove = remove,
+ move = move
+}
+
diff --git a/configs/nvim/lua/crupest/table.lua b/configs/nvim/lua/crupest/table.lua
index 6807151..ab069ce 100644
--- a/configs/nvim/lua/crupest/table.lua
+++ b/configs/nvim/lua/crupest/table.lua
@@ -25,6 +25,6 @@ end
return {
remove_element = remove_element,
- element_at = element_at
+ element_at = element_at,
}