mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-21 23:01:05 +00:00
feat: use a global clipboard
This commit is contained in:
parent
d6ca524c53
commit
df42ca799e
9 changed files with 35 additions and 28 deletions
3
Cargo.lock
generated
3
Cargo.lock
generated
|
|
@ -2611,7 +2611,9 @@ name = "yazi-core"
|
|||
version = "0.1.5"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"base64",
|
||||
"bitflags 2.4.1",
|
||||
"clipboard-win",
|
||||
"crossterm",
|
||||
"futures",
|
||||
"indexmap",
|
||||
|
|
@ -2686,7 +2688,6 @@ dependencies = [
|
|||
"anyhow",
|
||||
"async-channel",
|
||||
"base64",
|
||||
"clipboard-win",
|
||||
"crossterm",
|
||||
"futures",
|
||||
"libc",
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ yazi-shared = { path = "../yazi-shared", version = "0.1.5" }
|
|||
|
||||
# External dependencies
|
||||
anyhow = "^1"
|
||||
base64 = "^0"
|
||||
bitflags = "^2"
|
||||
crossterm = "^0"
|
||||
futures = "^0"
|
||||
|
|
@ -34,3 +35,6 @@ yazi-prebuild = "^0"
|
|||
|
||||
# Logging
|
||||
tracing = { version = "^0", features = [ "max_level_debug", "release_max_level_warn" ] }
|
||||
|
||||
[target."cfg(windows)".dependencies]
|
||||
clipboard-win = "^4"
|
||||
|
|
|
|||
|
|
@ -1,8 +1,13 @@
|
|||
use std::ffi::OsString;
|
||||
|
||||
use parking_lot::Mutex;
|
||||
use yazi_shared::RoCell;
|
||||
|
||||
pub static CLIPBOARD: RoCell<Clipboard> = RoCell::new();
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct Clipboard {
|
||||
content: OsString,
|
||||
content: Mutex<OsString>,
|
||||
}
|
||||
|
||||
impl Clipboard {
|
||||
|
|
@ -14,7 +19,7 @@ impl Clipboard {
|
|||
use yazi_shared::in_ssh_connection;
|
||||
|
||||
if in_ssh_connection() {
|
||||
return self.content.clone();
|
||||
return self.content.lock().clone();
|
||||
}
|
||||
|
||||
let all = [
|
||||
|
|
@ -32,7 +37,7 @@ impl Clipboard {
|
|||
return OsString::from_vec(output.stdout);
|
||||
}
|
||||
}
|
||||
self.content.clone()
|
||||
self.content.lock().clone()
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
|
|
@ -44,20 +49,20 @@ impl Clipboard {
|
|||
return s.into();
|
||||
}
|
||||
|
||||
self.content.clone()
|
||||
self.content.lock().clone()
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
pub async fn set(&mut self, s: impl AsRef<std::ffi::OsStr>) {
|
||||
pub async fn set(&self, s: impl AsRef<std::ffi::OsStr>) {
|
||||
use std::{io::stdout, process::Stdio};
|
||||
|
||||
use crossterm::execute;
|
||||
use tokio::{io::AsyncWriteExt, process::Command};
|
||||
use yazi_shared::in_ssh_connection;
|
||||
|
||||
self.content = s.as_ref().to_owned();
|
||||
*self.content.lock() = s.as_ref().to_owned();
|
||||
if in_ssh_connection() {
|
||||
execute!(stdout(), osc52::SetClipboard::new(&self.content)).ok();
|
||||
execute!(stdout(), osc52::SetClipboard::new(s.as_ref())).ok();
|
||||
}
|
||||
|
||||
let all = [
|
||||
|
|
@ -93,12 +98,12 @@ impl Clipboard {
|
|||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
pub async fn set(&mut self, s: impl AsRef<std::ffi::OsStr>) {
|
||||
pub async fn set(&self, s: impl AsRef<std::ffi::OsStr>) {
|
||||
use clipboard_win::{formats, set_clipboard};
|
||||
|
||||
self.content = s.as_ref().to_owned();
|
||||
|
||||
let s = s.as_ref().to_owned();
|
||||
*self.content.lock() = s.clone();
|
||||
|
||||
tokio::task::spawn_blocking(move || set_clipboard(formats::Unicode, s.to_string_lossy()))
|
||||
.await
|
||||
.ok();
|
||||
|
|
@ -110,7 +115,6 @@ mod osc52 {
|
|||
use std::ffi::OsStr;
|
||||
|
||||
use base64::{engine::general_purpose, Engine};
|
||||
use crossterm;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct SetClipboard {
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
use yazi_shared::event::Exec;
|
||||
|
||||
use crate::input::{op::InputOp, Input};
|
||||
use crate::{input::{op::InputOp, Input}, CLIPBOARD};
|
||||
|
||||
pub struct Opt {
|
||||
before: bool,
|
||||
|
|
@ -17,7 +17,7 @@ impl Input {
|
|||
self.handle_op(self.snap().cursor, true);
|
||||
}
|
||||
|
||||
let s = futures::executor::block_on(self.clipboard.get());
|
||||
let s = futures::executor::block_on(CLIPBOARD.get());
|
||||
if s.is_empty() {
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@ use std::ops::Range;
|
|||
use tokio::sync::mpsc::UnboundedSender;
|
||||
use unicode_width::UnicodeWidthStr;
|
||||
use yazi_config::{popup::Position, INPUT};
|
||||
use yazi_scheduler::external::Clipboard;
|
||||
use yazi_shared::InputError;
|
||||
|
||||
use super::{mode::InputMode, op::InputOp, InputSnap, InputSnaps};
|
||||
use crate::CLIPBOARD;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct Input {
|
||||
|
|
@ -24,8 +24,6 @@ pub struct Input {
|
|||
|
||||
// Shell
|
||||
pub(super) highlight: bool,
|
||||
|
||||
pub(super) clipboard: Clipboard,
|
||||
}
|
||||
|
||||
impl Input {
|
||||
|
|
@ -61,7 +59,7 @@ impl Input {
|
|||
|
||||
let drain = snap.value.drain(start.unwrap()..end.unwrap()).collect::<String>();
|
||||
if cut {
|
||||
futures::executor::block_on(self.clipboard.set(&drain));
|
||||
futures::executor::block_on(CLIPBOARD.set(&drain));
|
||||
}
|
||||
|
||||
snap.op = InputOp::None;
|
||||
|
|
@ -74,7 +72,7 @@ impl Input {
|
|||
let yanked = &snap.value[start.unwrap()..end.unwrap()];
|
||||
|
||||
snap.op = InputOp::None;
|
||||
futures::executor::block_on(self.clipboard.set(yanked));
|
||||
futures::executor::block_on(CLIPBOARD.set(yanked));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
clippy::unit_arg
|
||||
)]
|
||||
|
||||
mod clipboard;
|
||||
pub mod completion;
|
||||
mod context;
|
||||
pub mod files;
|
||||
|
|
@ -20,8 +21,13 @@ pub mod tab;
|
|||
pub mod tasks;
|
||||
pub mod which;
|
||||
|
||||
pub use clipboard::*;
|
||||
pub use context::*;
|
||||
pub use highlighter::*;
|
||||
pub use step::*;
|
||||
|
||||
pub fn init() { yazi_scheduler::init(); }
|
||||
pub fn init() {
|
||||
CLIPBOARD.with(Default::default);
|
||||
|
||||
yazi_scheduler::init();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
use std::ffi::{OsStr, OsString};
|
||||
|
||||
use yazi_scheduler::external::Clipboard;
|
||||
use yazi_shared::event::Exec;
|
||||
|
||||
use crate::tab::Tab;
|
||||
use crate::{tab::Tab, CLIPBOARD};
|
||||
|
||||
pub struct Opt<'a> {
|
||||
type_: &'a str,
|
||||
|
|
@ -32,7 +31,7 @@ impl Tab {
|
|||
}
|
||||
}
|
||||
|
||||
futures::executor::block_on(Clipboard::default().set(s));
|
||||
futures::executor::block_on(CLIPBOARD.set(s));
|
||||
false
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,3 @@ trash = "^3"
|
|||
|
||||
# Logging
|
||||
tracing = { version = "^0", features = [ "max_level_debug", "release_max_level_warn" ] }
|
||||
|
||||
[target."cfg(windows)".dependencies]
|
||||
clipboard-win = "^4"
|
||||
|
|
|
|||
2
yazi-scheduler/src/external/mod.rs
vendored
2
yazi-scheduler/src/external/mod.rs
vendored
|
|
@ -1,4 +1,3 @@
|
|||
mod clipboard;
|
||||
mod fd;
|
||||
mod ffmpegthumbnailer;
|
||||
mod file;
|
||||
|
|
@ -11,7 +10,6 @@ mod shell;
|
|||
mod unar;
|
||||
mod zoxide;
|
||||
|
||||
pub use clipboard::*;
|
||||
pub use fd::*;
|
||||
pub use ffmpegthumbnailer::*;
|
||||
pub use file::*;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue