diff --git a/Cargo.lock b/Cargo.lock index 5dc6c44a..473ae8c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,6 +100,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "clipboard-win" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4ea1881992efc993e4dc50a324cdbd03216e41bdc8385720ff47efc9bd2ca8" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + [[package]] name = "crossbeam-utils" version = "0.8.5" @@ -172,6 +183,16 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "error-code" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5115567ac25674e0043e472be13d14e537f37ea8aa4bdc4aef0c89add1db1ff" +dependencies = [ + "libc", + "str-buf", +] + [[package]] name = "etcetera" version = "0.3.2" @@ -383,6 +404,7 @@ dependencies = [ "anyhow", "bitflags", "chardetng", + "clipboard-win", "crossterm", "encoding_rs", "futures-util", @@ -871,6 +893,12 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "str-buf" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d44a3643b4ff9caf57abcee9c2c621d6c03d9135e0d8b589bd9afb5992cb176a" + [[package]] name = "syn" version = "1.0.73" diff --git a/helix-view/Cargo.toml b/helix-view/Cargo.toml index b4379952..cb2032de 100644 --- a/helix-view/Cargo.toml +++ b/helix-view/Cargo.toml @@ -38,5 +38,8 @@ log = "~0.4" which = "4.1" +[target.'cfg(windows)'.dependencies] +clipboard-win = { version = "4.2", features = ["std"] } + [dev-dependencies] helix-tui = { path = "../helix-tui" } diff --git a/helix-view/src/clipboard.rs b/helix-view/src/clipboard.rs index e32933e3..401c0459 100644 --- a/helix-view/src/clipboard.rs +++ b/helix-view/src/clipboard.rs @@ -77,7 +77,11 @@ pub fn get_clipboard_provider() -> Box { copy => "tmux", "load-buffer", "-"; } } else { - Box::new(provider::NopProvider) + #[cfg(target_os = "windows")] + return Box::new(provider::WindowsProvider); + + #[cfg(not(target_os = "windows"))] + return Box::new(provider::NopProvider); } } @@ -120,6 +124,27 @@ mod provider { } } + #[cfg(target_os = "windows")] + #[derive(Debug)] + pub struct WindowsProvider; + + #[cfg(target_os = "windows")] + impl ClipboardProvider for WindowsProvider { + fn name(&self) -> Cow { + Cow::Borrowed("clipboard-win") + } + + fn get_contents(&self) -> Result { + let contents = clipboard_win::get_clipboard(clipboard_win::formats::Unicode)?; + Ok(contents) + } + + fn set_contents(&self, contents: String) -> Result<()> { + clipboard_win::set_clipboard(clipboard_win::formats::Unicode, contents)?; + Ok(()) + } + } + #[derive(Debug)] pub struct CommandConfig { pub prg: &'static str,