mirror of
https://github.com/nushell/nushell.git
synced 2024-12-25 08:29:07 +01:00
add a cross platform clip
command to the standard library (#8695)
Should close the associated poin in #8311 # Description this PR adds a `clip` command to `std` which - has error support in case the clipboard system command is not installed - removes any ANSI escape sequences from the input to have a clean copied text - can throw desktop notifications on linux in case of a long pipeline which needs to be copied (can be disabled with `--no-notify`) - echoes the copied data to the output of the terminal (can be disabled with --silent) - has examples and dependencies listed - has "charpage" 65001 (a.k.a. utf-8) support for windows ## new additions from9cd3c951f
toad3e8de25b
- better OS context error support - use of the `match` statement for scalability - `match` the value of the `$nu.os-info.name` - add `macOS` with `pbcopy` to the list of supported systems - throw an error when the OS is not supported - ~~add simple tests to make sure `clip` works on all main OSes with the CI~~ had to be removed in6028b98483
(see [the failing test](https://github.com/nushell/nushell/actions/runs/4610091544/jobs/8148126550?pr=8695#step:6:35)) # User-Facing Changes users can now access a `clip` to copy the output of any pipeline to the system clipboard, on any system # Tests + Formatting ``` $nothing ``` # After Submitting ``` $nothing ```
This commit is contained in:
parent
caf1432dc7
commit
22142bd4ae
@ -384,3 +384,112 @@ export def "log debug" [message: string] {
|
||||
|
||||
print --stderr $"(ansi default_dimmed)DBG|(now)|($message)(ansi reset)"
|
||||
}
|
||||
|
||||
# print a command name as dimmed and italic
|
||||
def pretty-command [] {
|
||||
let command = $in
|
||||
return $"(ansi default_dimmed)(ansi default_italic)($command)(ansi reset)"
|
||||
}
|
||||
|
||||
# give a hint error when the clip command is not available on the system
|
||||
def check-clipboard [
|
||||
clipboard: string # the clipboard command name
|
||||
--system: string # some information about the system running, for better error
|
||||
] {
|
||||
if (which $clipboard | is-empty) {
|
||||
error make --unspanned {
|
||||
msg: $"(ansi red)clipboard_not_found(ansi reset):
|
||||
you are running ($system)
|
||||
but
|
||||
the ($clipboard | pretty-command) clipboard command was not found on your system."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# put the end of a pipe into the system clipboard.
|
||||
#
|
||||
# Dependencies:
|
||||
# - xclip on linux x11
|
||||
# - wl-copy on linux wayland
|
||||
# - clip.exe on windows
|
||||
#
|
||||
# Examples:
|
||||
# put a simple string to the clipboard, will be stripped to remove ANSI sequences
|
||||
# >_ "my wonderful string" | clip
|
||||
# my wonderful string
|
||||
# saved to clipboard (stripped)
|
||||
#
|
||||
# put a whole table to the clipboard
|
||||
# >_ ls *.toml | clip
|
||||
# ╭───┬─────────────────────┬──────┬────────┬───────────────╮
|
||||
# │ # │ name │ type │ size │ modified │
|
||||
# ├───┼─────────────────────┼──────┼────────┼───────────────┤
|
||||
# │ 0 │ Cargo.toml │ file │ 5.0 KB │ 3 minutes ago │
|
||||
# │ 1 │ Cross.toml │ file │ 363 B │ 2 weeks ago │
|
||||
# │ 2 │ rust-toolchain.toml │ file │ 1.1 KB │ 2 weeks ago │
|
||||
# ╰───┴─────────────────────┴──────┴────────┴───────────────╯
|
||||
#
|
||||
# saved to clipboard
|
||||
#
|
||||
# put huge structured data in the clipboard, but silently
|
||||
# >_ open Cargo.toml --raw | from toml | clip --silent
|
||||
#
|
||||
# when the clipboard system command is not installed
|
||||
# >_ "mm this is fishy..." | clip
|
||||
# Error:
|
||||
# × clipboard_not_found:
|
||||
# │ you are using xorg on linux
|
||||
# │ but
|
||||
# │ the xclip clipboard command was not found on your system.
|
||||
export def clip [
|
||||
--silent: bool # do not print the content of the clipboard to the standard output
|
||||
--no-notify: bool # do not throw a notification (only on linux)
|
||||
] {
|
||||
let input = $in
|
||||
let input = if ($input | describe) == "string" {
|
||||
$input | ansi strip
|
||||
} else { $input }
|
||||
|
||||
match $nu.os-info.name {
|
||||
"linux" => {
|
||||
if ($env.WAYLAND_DISPLAY? | is-empty) {
|
||||
check-clipboard xclip --system $"('xorg' | pretty-command) on linux"
|
||||
$input | xclip -sel clip
|
||||
} else {
|
||||
check-clipboard wl-copy --system $"('wayland' | pretty-command) on linux"
|
||||
$input | wl-copy
|
||||
}
|
||||
},
|
||||
"windows" => {
|
||||
chcp 65001 # see https://discord.com/channels/601130461678272522/601130461678272524/1085535756237426778
|
||||
check-clipboard clip.exe --system $"('xorg' | pretty-command) on linux"
|
||||
$input | clip.exe
|
||||
},
|
||||
"macos" => {
|
||||
check-clipboard pbcopy --system macOS
|
||||
$input | pbcopy
|
||||
},
|
||||
_ => {
|
||||
error make --unspanned {
|
||||
msg: $"(ansi red)unknown_operating_system(ansi reset):
|
||||
'($nu.os-info.name)' is not supported by the ('clip' | pretty-command) command.
|
||||
|
||||
please open a feature request in the [issue tracker](char lparen)https://github.com/nushell/nushell/issues/new/choose(char rparen) to add your operating system to the standard library."
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
if not $silent {
|
||||
print $input
|
||||
|
||||
print --no-newline $"(ansi white_italic)(ansi white_dimmed)saved to clipboard"
|
||||
if ($input | describe) == "string" {
|
||||
print " (stripped)"
|
||||
}
|
||||
print --no-newline $"(ansi reset)"
|
||||
}
|
||||
|
||||
if (not $no_notify) and ($nu.os-info.name == linux) {
|
||||
notify-send "std clip" "saved to clipboard"
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user