feat: action for opening entry in an external program (#183)
This commit is contained in:
parent
a9ceb90a63
commit
96a334abeb
5 changed files with 50 additions and 1 deletions
|
|
@ -168,6 +168,49 @@ M.open_terminal = {
|
|||
end,
|
||||
}
|
||||
|
||||
---Copied from vim.ui.open in Neovim 0.10+
|
||||
---@param path string
|
||||
---@return nil|string[] cmd
|
||||
---@return nil|string error
|
||||
local function get_open_cmd(path)
|
||||
if vim.fn.has("mac") == 1 then
|
||||
return { "open", path }
|
||||
elseif vim.fn.has("win32") == 1 then
|
||||
if vim.fn.executable("rundll32") == 1 then
|
||||
return { "rundll32", "url.dll,FileProtocolHandler", path }
|
||||
else
|
||||
return nil, "rundll32 not found"
|
||||
end
|
||||
elseif vim.fn.executable("wslview") == 1 then
|
||||
return { "wslview", path }
|
||||
elseif vim.fn.executable("xdg-open") == 1 then
|
||||
return { "xdg-open", path }
|
||||
else
|
||||
return nil, "no handler found"
|
||||
end
|
||||
end
|
||||
|
||||
M.open_external = {
|
||||
desc = "Open the entry under the cursor in an external program",
|
||||
callback = function()
|
||||
local entry = oil.get_cursor_entry()
|
||||
local dir = oil.get_current_dir()
|
||||
if not entry or not dir then
|
||||
return
|
||||
end
|
||||
local path = dir .. entry.name
|
||||
-- TODO use vim.ui.open once this is resolved
|
||||
-- https://github.com/neovim/neovim/issues/24567
|
||||
local cmd, err = get_open_cmd(path)
|
||||
if not cmd then
|
||||
vim.notify(string.format("Could not open %s: %s", path, err), vim.log.levels.ERROR)
|
||||
return
|
||||
end
|
||||
local jid = vim.fn.jobstart(cmd, { detach = true })
|
||||
assert(jid > 0, "Failed to start job")
|
||||
end,
|
||||
}
|
||||
|
||||
M.refresh = {
|
||||
desc = "Refresh current directory list",
|
||||
callback = function()
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ local default_config = {
|
|||
["`"] = "actions.cd",
|
||||
["~"] = "actions.tcd",
|
||||
["gs"] = "actions.change_sort",
|
||||
["gx"] = "actions.open_external",
|
||||
["g."] = "actions.toggle_hidden",
|
||||
},
|
||||
-- Set to false to disable all of the above keymaps
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ local M = {}
|
|||
---@field is_modifiable fun(bufnr: integer): boolean Return true if this directory is modifiable (allows for directories with read-only permissions).
|
||||
---@field get_column fun(name: string): nil|oil.ColumnDefinition If the adapter has any adapter-specific columns, return them when fetched by name.
|
||||
---@field normalize_url fun(url: string, callback: fun(url: string)) Before oil opens a url it will be normalized. This allows for link following, path normalizing, and converting an oil file url to the actual path of a file.
|
||||
---@field get_entry_path? fun(url: string, entry: oil.Entry, callback: fun(path: nil|string)) Similar to normalize_url, but used when selecting an entry
|
||||
---@field get_entry_path? fun(url: string, entry: oil.Entry, callback: fun(path: string)) Similar to normalize_url, but used when selecting an entry
|
||||
---@field render_action? fun(action: oil.Action): string Render a mutation action for display in the preview window. Only needed if adapter is modifiable.
|
||||
---@field perform_action? fun(action: oil.Action, cb: fun(err: nil|string)) Perform a mutation action. Only needed if adapter is modifiable.
|
||||
---@field read_file? fun(bufnr: integer) Used for adapters that deal with remote/virtual files. Read the contents of the file into a buffer.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue