refactor: `chmodx` and `trashFile` as separate module

remotes/origin/HEAD
Chris Grieser 2024-06-20 20:12:00 +02:00
parent 41463d4eb0
commit a788d44c97
4 changed files with 71 additions and 63 deletions

View File

@ -13,9 +13,9 @@ Lightweight and quick file operations without being a full-blown file manager.
- [Configuration](#configuration) - [Configuration](#configuration)
- [Usage](#usage) - [Usage](#usage)
- [Available Commands](#available-commands) - [Available Commands](#available-commands)
* [File Operation Commands](#file-operation-commands) * [File Operations](#file-operations)
* [Utility Commands](#utility-commands) * [Path Copying](#path-copying)
* [Path Copying Commands](#path-copying-commands) * [Other operations](#other-operations)
* [Disable Ex-Commands](#disable-ex-commands) * [Disable Ex-Commands](#disable-ex-commands)
- [How is this different from `vim.eunuch`?](#how-is-this-different-from-vimeunuch) - [How is this different from `vim.eunuch`?](#how-is-this-different-from-vimeunuch)
- [Why that Name](#why-that-name) - [Why that Name](#why-that-name)
@ -73,7 +73,7 @@ keymap("x", "<leader>x", function() require("genghis").moveSelectionToNewFile()
## Available Commands ## Available Commands
### File Operation Commands ### File Operations
- `.createNewFile` or `:New`: Create a new file. - `.createNewFile` or `:New`: Create a new file.
- `.duplicateFile` or `:Duplicate`: Duplicate the current file. - `.duplicateFile` or `:Duplicate`: Duplicate the current file.
- `.moveSelectionToNewFile` or `:NewFromSelection`: Prompts for a new file name - `.moveSelectionToNewFile` or `:NewFromSelection`: Prompts for a new file name
@ -93,20 +93,7 @@ The following applies to all commands above:
3. All movement and renaming commands update `import` statements to the renamed 3. All movement and renaming commands update `import` statements to the renamed
file (if the LSP supports `workspace/willRenameFiles`). file (if the LSP supports `workspace/willRenameFiles`).
### Utility Commands ### Path Copying
- `.chmodx` or `:Chmodx`: Makes current file executable. Equivalent to `chmod
+x`.
- `.trashFile` or `:Trash`: Move the current file
to the trash location.
* Defaults to `gio trash` on *Linux*, `trash` on *Mac* and *Windows*.
* If [bufdelete.nvim](https://github.com/famiu/bufdelete.nvim) is available,
`require'bufdelete.nvim'.bufwipeout` would be used to keep window layout
intact instead of `vim.cmd.bwipeout`.
> [!NOTE]
> The trash CLIs are usually not available by default, and must be installed.
### Path Copying Commands
- `.copyFilename` or `:CopyFilename`: Copy the file name. - `.copyFilename` or `:CopyFilename`: Copy the file name.
- `.copyFilepath` or `:CopyFilepath`: Copy the absolute file path. - `.copyFilepath` or `:CopyFilepath`: Copy the absolute file path.
- `.copyFilepathWithTilde` or `:CopyFilepathWithTilde`: Copy the absolute file - `.copyFilepathWithTilde` or `:CopyFilepathWithTilde`: Copy the absolute file
@ -119,6 +106,19 @@ to the trash location.
All commands use the system clipboard. All commands use the system clipboard.
### Other operations
- `.chmodx` or `:Chmodx`: Makes current file executable. Equivalent to `chmod
+x`.
- `.trashFile` or `:Trash`: Move the current file
to the trash location.
* Defaults to `gio trash` on *Linux*, `trash` on *Mac* and *Windows*.
* If [bufdelete.nvim](https://github.com/famiu/bufdelete.nvim) is available,
`require'bufdelete.nvim'.bufwipeout` would be used to keep window layout
intact instead of `vim.cmd.bwipeout`.
> [!NOTE]
> The trash CLIs are usually not available by default, and must be installed.
### Disable Ex-Commands ### Disable Ex-Commands
```lua ```lua

View File

@ -7,7 +7,7 @@ end
local M = {} local M = {}
-- redirect to `operations.copy` or `operations.file` -- redirect to to the correct module
setmetatable(M, { setmetatable(M, {
__index = function(_, key) __index = function(_, key)
return function(...) return function(...)
@ -17,6 +17,7 @@ setmetatable(M, {
end end
local module = vim.startswith(key, "copy") and "copy" or "file" local module = vim.startswith(key, "copy") and "copy" or "file"
if key == "chmodx" or key == "trashFile" then module = "other" end
require("genghis.operations." .. module)[key](...) require("genghis.operations." .. module)[key](...)
end end
end, end,

View File

@ -180,50 +180,6 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
---Makes current file executable
function M.chmodx()
local filename = vim.api.nvim_buf_get_name(0)
local perm = vim.fn.getfperm(filename)
perm = perm:gsub("r(.)%-", "r%1x") -- add x to every group that has r
vim.fn.setfperm(filename, perm)
u.notify("Execution Permission granted.")
vim.cmd.edit()
end
function M.trashFile(opts)
---DEPRECATION
if opts then
u.notify("The `trashCmd` option has been moved to the setup call.", "warn")
return
end
-- user-provided trashCmd or os-specific default
local trashCmd = require("genghis.config").config.trashCmd
if not trashCmd then
local system = vim.uv.os_uname().sysname:lower()
local defaultCmd
if system == "darwin" then defaultCmd = "trash" end
if system:find("windows") then defaultCmd = "trash" end
if system:find("linux") then defaultCmd = "gio trash" end
assert(defaultCmd, "Unknown operating system. Please provide a custom `trashCmd`.")
trashCmd = defaultCmd
end
local trashArgs = vim.split(trashCmd, " ")
local oldFilePath = vim.api.nvim_buf_get_name(0)
table.insert(trashArgs, oldFilePath)
vim.cmd("silent! update")
local oldName = vim.fs.basename(oldFilePath)
local result = vim.system(trashArgs):wait()
if result.code == 0 then
u.bwipeout()
u.notify(("%q deleted."):format(oldName))
else
local outmsg = (result.stdout or "") .. (result.stderr or "")
u.notify(("Trashing %q failed: " .. outmsg):format(oldName), "error")
end
end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
return M return M

View File

@ -0,0 +1,51 @@
local M = {}
local u = require("genghis.support.utils")
--------------------------------------------------------------------------------
---Makes current file executable
function M.chmodx()
local filename = vim.api.nvim_buf_get_name(0)
local perm = vim.fn.getfperm(filename)
perm = perm:gsub("r(.)%-", "r%1x") -- add x to every group that has r
vim.fn.setfperm(filename, perm)
u.notify("Execution Permission granted.")
vim.cmd.edit()
end
function M.trashFile(opts)
---DEPRECATION
if opts then
u.notify("The `trashCmd` option has been moved to the setup call.", "warn")
return
end
-- user-provided trashCmd or os-specific default
local trashCmd = require("genghis.config").config.trashCmd
if not trashCmd then
local system = vim.uv.os_uname().sysname:lower()
local defaultCmd
if system == "darwin" then defaultCmd = "trash" end
if system:find("windows") then defaultCmd = "trash" end
if system:find("linux") then defaultCmd = "gio trash" end
assert(defaultCmd, "Unknown operating system. Please provide a custom `trashCmd`.")
trashCmd = defaultCmd
end
local trashArgs = vim.split(trashCmd, " ")
local oldFilePath = vim.api.nvim_buf_get_name(0)
table.insert(trashArgs, oldFilePath)
vim.cmd("silent! update")
local oldName = vim.fs.basename(oldFilePath)
local result = vim.system(trashArgs):wait()
if result.code == 0 then
u.bwipeout()
u.notify(("%q deleted."):format(oldName))
else
local outmsg = (result.stdout or "") .. (result.stderr or "")
u.notify(("Trashing %q failed: " .. outmsg):format(oldName), "error")
end
end
--------------------------------------------------------------------------------
return M