Add Omarchy integration: theme catalog hot-reload + OSC52 clipboard
Intrepid now installs Omarchy's full colorscheme catalog and hot-reloads by reading the theme spec omarchy-theme-set writes to ~/.local/state/omarchy/current/theme/neovim.lua, watched via vim.uv (no lazy.nvim here, so this replicates its file-watch + reload behavior directly). Other hosts are unaffected. Also ports Omarchy's OSC52 remote-clipboard module so yanks still reach the local Wayland clipboard/tmux/SSH client, matching the default Omarchy nvim config's behavior in those sessions.
This commit is contained in:
100
lua/remote_clipboard.lua
Normal file
100
lua/remote_clipboard.lua
Normal file
@@ -0,0 +1,100 @@
|
||||
-- Clipboard for sessions whose yanks may need to reach another machine:
|
||||
-- every copy is emitted as OSC 52 (inside tmux this becomes a tmux buffer,
|
||||
-- rebroadcast to every attached client, local or SSH). Paste prefers the
|
||||
-- local Wayland clipboard when one is available, so content copied in other
|
||||
-- apps remains pasteable; without a display, paste is an OSC 52 query that
|
||||
-- tmux (or the terminal) answers.
|
||||
--
|
||||
-- Ported from Omarchy's default nvim config (config/remote_clipboard.lua) so
|
||||
-- this config keeps working over SSH/tmux the same way Omarchy's does.
|
||||
local M = {}
|
||||
|
||||
local function proc_lines(pid, file)
|
||||
local ok, lines = pcall(vim.fn.readfile, "/proc/" .. pid .. "/" .. file)
|
||||
return ok and lines or {}
|
||||
end
|
||||
|
||||
local function proc_ppid(pid)
|
||||
for _, line in ipairs(proc_lines(pid, "status")) do
|
||||
local ppid = line:match("^PPid:%s+(%d+)")
|
||||
if ppid then
|
||||
return tonumber(ppid)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function ancestor_process_named(name)
|
||||
local pid = vim.fn.getpid()
|
||||
|
||||
for _ = 1, 16 do
|
||||
local ppid = proc_ppid(pid)
|
||||
if not ppid or ppid <= 1 then
|
||||
return false
|
||||
end
|
||||
|
||||
local comm = proc_lines(ppid, "comm")[1] or ""
|
||||
if comm:find(name, 1, true) then
|
||||
return true
|
||||
end
|
||||
|
||||
pid = ppid
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function M.setup()
|
||||
local in_tmux = vim.env.TMUX ~= nil
|
||||
local in_ssh = vim.env.SSH_TTY ~= nil or vim.env.SSH_CONNECTION ~= nil
|
||||
local in_herdr = vim.env.HERDR_PANE_ID ~= nil or ancestor_process_named("herdr")
|
||||
|
||||
if not (in_tmux or in_ssh or in_herdr) then
|
||||
return
|
||||
end
|
||||
|
||||
local osc52 = require("vim.ui.clipboard.osc52")
|
||||
local has_wayland = vim.env.WAYLAND_DISPLAY ~= nil
|
||||
and vim.fn.executable("wl-copy") == 1
|
||||
and vim.fn.executable("wl-paste") == 1
|
||||
|
||||
local function copy(register)
|
||||
local emit = osc52.copy(register)
|
||||
|
||||
return function(lines)
|
||||
if has_wayland then
|
||||
local cmd = { "wl-copy", "--sensitive", "--type", "text/plain" }
|
||||
if register == "*" then
|
||||
cmd[#cmd + 1] = "--primary"
|
||||
end
|
||||
vim.fn.system(cmd, lines)
|
||||
end
|
||||
|
||||
emit(lines)
|
||||
end
|
||||
end
|
||||
|
||||
local function paste(register)
|
||||
if not has_wayland then
|
||||
return osc52.paste(register)
|
||||
end
|
||||
|
||||
return function()
|
||||
local cmd = { "wl-paste", "--no-newline" }
|
||||
if register == "*" then
|
||||
cmd[#cmd + 1] = "--primary"
|
||||
end
|
||||
|
||||
local lines = vim.fn.systemlist(cmd, "", 1)
|
||||
return vim.v.shell_error == 0 and lines or {}
|
||||
end
|
||||
end
|
||||
|
||||
vim.g.clipboard = {
|
||||
name = "RemoteClipboard",
|
||||
copy = { ["+"] = copy("+"), ["*"] = copy("*") },
|
||||
paste = { ["+"] = paste("+"), ["*"] = paste("*") },
|
||||
cache_enabled = 0,
|
||||
}
|
||||
end
|
||||
|
||||
return M
|
||||
Reference in New Issue
Block a user