Welcome to the Clipboard Project documentation!

This page is mostly a copy of the readme on GitHub, but available right here for your convenience.

Actions

Copycb [--](copy|cp)[(num)|_(id)] (file) [files] or (something) | cb [[--](copy|cp)][(num)|_(id)]

Copy a file.

$ cb copy FooFile
$ cb --copy FooFile
$ cb cp FooFile 
$ cb --cp FooFile
# These are the same!

Copy a file and a directory.

$ cb copy FooFile BarDir
# These are also the same!

Copy piped in data.

$ echo "Foobar" | cb
$ echo "Foobar" | cb copy 
# The "copy" action is optional here since the only possible action here in the first place is "copy"

Copy text directly.

$ cb copy "Aventura was the best bachata band"

Note: This happens instead of copying a file/directory if there is only one item present and that item doesn't exist as a file/directory.

Copy a file to the clipboard named "4"

$ cb copy4 FooFile

Copy piped in data to the persistent clipboard named "hello"

$ echo "Foobar" | cb copy_hello

Copy text to the clipboard named "hey"

$ cb --clipboard hey copy "Aventura was the best bachata band"
$ cb -c hey copy "Aventura was the best bachata band" 
# These are the same!

Copy a file with spaces and many directories to clipboard "50" using the abbreviated action name.

$ cb cp50 "Aventura/God's Project/04 Un Chi Chi.flac" BarDir BazDir

Cutcb [--](cut|ct)[(num)|_(id)] (file) [files] or (something) | cb [[--](cut|ct)][(num)|_(id)]

Cut a file.

$ cb cut FooFile
$ cb --cut FooFile
$ cb ct FooFile 
$ cb --ct FooFile
# These are the same!

Cut a file and a directory.

$ cb cut FooFile BarDir
# These are also the same!

Cut piped in data.

$ echo "Foobar" | cb cut

Note: Cutting piped in data is the same as copying, except that CB will delete all content after you paste it somewhere.

Cut text directly.

$ cb cut "Hunter2"

Note: This happens instead of cutting a file/directory if there is only one item present and that item doesn't exist as a file/directory.

Cut a file to the clipboard named "4"

$ cb cut4 FooFile

Cut piped in data to the persistent clipboard named "hello"

$ echo "Foobar" | cb cut_hello

Cut text to the clipboard named "hey"

$ cb --clipboard hey cut "Aventura was the best bachata band"
$ cb -c hey cut "Aventura was the best bachata band"
# These are the same!

Cut a file with spaces and many directories to clipboard "50" using the abbreviated action name.

$ cb ct50 "Aventura/God's Project/04 Un Chi Chi.flac" BarDir BazDir

Pastecb [--](paste|p)[(num)|_(id)] [regex] [regexes] or cb [[--](paste|p][(num)|_(id)] | (something) or cb [[--](paste|p)][(num)|_(id)] > (some file)

Start by copying or cutting something.

$ cb copy FooFile WhyAventuraIsTheBest.pdf

Paste in the current working directory.

$ cb paste
$ cb --paste
$ cb p
$ cb --p
# These are the same!

Note: If you paste after cutting, then CB will delete the original files that you cut.

Paste anything containing "Aventura."

$ cb p ".*Aventura.*"

Now, let's copy some raw data.

$ echo "Bananas!" | cb

Paste the raw data file in the current working directory.

$ cb paste
# Also the same

Pipe everything out to some file.

$ cb paste > SomeFile

Pipe everything from clipboard "42" out to some file.

$ cb paste42 > SomeFile
$ cb p42 > SomeFile
$ cb -c 42 > SomeFile 
# These three versions all work great!

Pipe everything out to some program.

$ cb | cat
# These three versions also all work great.
$ cb | Write-Output 
# The version for PowerShell

Pipe everything from persistent clipboard "2" out to some program.

$ cb paste_2 | cat
$ cb p_2 | cat
$ cb -c _2 | cat 
# These three versions also all work great.
$ cb -c _2 | Write-Output 
# The version for PowerShell

Note: If you paste after cutting, then CB will delete the raw data afterwards, effectively only letting you paste once.


Add Contentscb [--](add|ad)[(num)|_(id)] (file|text) [files] or (something) | cb [[--](add|ad)][(num)|_(id)]

Start by copying something.

$ cb copy FooFile

Add a file.

$ cb add SomeOtherFile
$ cb --add SomeOtherFile
$ cb ad SomeOtherFile 
$ cb --ad SomeOtherFile
# CB now holds FooFile and SomeOtherFile

Add a directory.

$ cb add "We Broke The Rules"

Now let's copy some raw data.

$ cb copy "'Let me find that'"

Add raw data to the end of what's stored.

$ cb add " is one of Romeo Santos' catchphrases."
# The content is now: 'Let me find that' is one of Romeo Santos' catchphrases.

Add raw data by piping it in.

$ echo " What's yours?" | cb add 
# The content is now: 'Let me find that' is one of Romeo Santos' catchphrases. What's yours?

Remove Contentscb [--](remove|rm)[(num)|_(id)] (regex) [regexes] or (some regex) | cb [[--](remove|rm)][(num)|_(id)]

Start by copying something.

$ cb copy FooFile BarDir BazDir

Remove everything starting with "B"

$ cb remove "B.*"
$ cb --remove "B.*"
$ cb rm "B.*"
$ cb --rm "B.*"
# CB will match this against "BarDir" and "BazDir" and remove them

Remove everything matching a specific name

$ cb remove "BarDir"
# CB will match this against "BarDir" only and remove it

Now let's copy some raw data.

$ cb copy "A bachatero is someone who makes bachata music."

Remove anything with a space beforehand and that ends with "-ero"

$ cb remove "(?<= ).*ero"
# The content is now: A  is someone who makes bachata music.

Remove anything matching "music" by piping the pattern in.

$ echo "music" | cb remove
# The content is now: A  is someone who makes bachata .

Show Contentscb [--](show|sh)[(num)|_(id)] [regex] [regexes] or cb [--](show|sh)[(num)|_(id)] [regex] [regexes] | (something)

Start by copying something.

$ cb copy FooFile BarDir BazDir

List all the items in the clipboard.

$ cb show
$ cb --show
$ cb sh 
$ cb --sh
# These all work great!

Now let's copy some raw data.

$ cb copy "Those who are tired of bachata are tired of life"

Show the contents of the clipboard.

$ cb show

Show the raw filepaths of everything in the clipboard.

$ cb sh | cat

Show raw filepaths to a program.

$ cb copy "02 I Believe.flac"
$ eval vlc $(cb sh)
# Use the eval command here to process the raw filepath (which in this case looks like "/tmp/Clipboard/0/02 I Believe.flac") as if it were entered in a shell
# Otherwise, you'll likely get errors complaining about being unable to process quote characters.

Clear Clipboardcb [--](clear|clr)[(num)|_(id)]

Start by copying something.

$ cb copy FooFile BarDir BazDir

Clear the clipboard of all data.

$ cb clear
$ cb --clear
$ cb clr 
$ cb --clr
# These all work great!

Edit Clipboard Contentcb [--](edit|ed)[(num)|_(id)] [editor]

Start by copying some text.

$ cb copy "Hello Clipboard! This is just some example content."

Edit the clipboard content.

$ cb edit
$ cb --edit
$ cb ed
$ cb --ed
# These all work great!

Use a custom editor to edit with.

cb edit nano
cb ed vim
cb ed code

Load Contentscb [--](load|ld)[(num)|_(id)] [clipboard] [clipboards]

Start by copying something.

$ cb copy "Yo dawg! I heard you liked bachata music."

Load the contents of the clipboard into other clipboards.

$ cb load 1 2 3 _foo
$ cb --load 1 2 3 _foo
$ cb ld 1 2 3 _foo
$ cb --ld 1 2 3 _foo
# All work great!

Note: If you don't provide a destination clipboard, then the Load action will load the contents into the default clipboard.

Load the contents of some clipboard into the default.

$ cb load_foo

Note: This is useful if you want to load content into GUI clipboard systems, as they only connect to the default clipboard.


Swap Contentscb [--](swap|sw)[(num)|_(id)] [clipboard]

Start by copying something to two clipboards.

$ cb copy "After breaking up from Aventura, Romeo Santos' music just wasn't up to snuff."
$ cb copy2 "I'd just like to interject for a moment. What you're referring to as Linux, is in fact, GNU/Linux, or as I've recently taken to calling it, GNU plus Linux."

Swap the contents of two clipboards.

$ cb swap 2
$ cb --swap 2
$ cb sw 2
$ cb --sw 2
# All work great!

$ cb swap2
$ cb --swap2
$ cb sw2
$ cb --sw2
# Since swapping is commutative, the target can be freely swapped with the destination.

Note: If you don't provide a destination clipboard, then the Swap action will swap the contents into the default clipboard.


Import Clipboardscb [--](import|imp) [source folder]

Start by exporting a clipboard.

$ cb copy "The reason Aventura was so popular was because the music was so well-written as well as the luscious guitar chorus effect."
$ cb export

Import all clipboards from a folder.

$ cb import
$ cb --import
$ cb imp
$ cb --imp
# These all work great!

Note: Currently, CB imports from a folder called Exported_Clipboards.

Choose what folder to import from.

$ cb import MySavedClipboards

Export Clipboardscb [--](export|ex) [clipboard] [clipboards]

Start by copying something.

$ cb copy "Aventura's music is some of the most erotic you'll find anywhere."

Export all clipboards to a folder.

$ cb export
$ cb --export
$ cb ex
$ cb --ex
# These all work great!

Note: Currently, CB exports to a folder called Exported_Clipboards.

Choose what clipboards to export.

$ cb export 1 2 3

Queue Clipboard Historycb [--](history|hs)[(num)|_(id)]

Start by copying several things.

$ cb copy "There are at least two \"Anthony Santos\" who are known for bachata music: the \"regular\" Anthony Santos and Anthony \"Romeo\" Santos."
$ cb copy "blah blah blah"
$ cb copy "Clipboard Project is the best clipboard manager around"

Show the history.

$ cb history
$ cb --history
$ cb hs
$ cb --hs
# These all work great!

Get Older Clipboard Entriescb [--](history|hs)[(num)|_(id)] (clipboard) [clipboards]

Start by copying several things.

$ cb copy "There are at least two \"Anthony Santos\" who are known for bachata music: the \"regular\" Anthony Santos and Anthony \"Romeo\" Santos."
$ cb copy "blah blah blah"
$ cb copy "Clipboard Project is the best clipboard manager around"

Bring an older entry (or entries) to the front.

$ cb history 1
$ cb --history 2
$ cb hs 1
$ cb --hs 1 2
# These all work great!

Set Notecb [--](note|nt)[(num)|_(id)] (text) or (something) | cb [[--](note|nt)][(num)|_(id)]

Add a personal note to a clipboard.

$ cb note "For my Aventura music collection"
$ cb --note "For my Aventura music collection"
$ cb nt "For my Aventura music collection"
$ cb --nt "For my Aventura music collection"
# All work great!

Add a personal note to a clipboard by piping it in.

$ echo "For my Aventura music collection" | cb note

Remove a note from a clipboard.

$ cb note ""

Show Notecb [--](note|nt)[(num)|_(id)]

Start by adding a note to a clipboard.

$ cb note "For my Aventura music collection"

Show the note you added.

$ cb note
$ cb --note
$ cb nt
$ cb --nt

Set Ignore Rulescb [--](ignore|ig)[(num)|_(id)] (regex) [regexes] or (regex) | cb [[--](ignore|ig)][(num)|_(id)]

Set some kinds of content to always ignore.

$ cb ignore "(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])"
$ cb --ignore "(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])"
$ cb ig "(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])"
$ cb --ig "(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])"
# All work great!
# "(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])" is the regex for an AWS SK secret.

Set an ignore regex rule by piping it in.

$ echo "[abc]{10}" | cb ignore

Remove all ignore regex rules from a clipboard.

$ cb ignore ""

Show Ignore Rulescb [--](ignore|ig)[(num)|_(id)]

Start by adding some ignore regex rules to a clipboard.

$ cb ignore "Foo" "Bar" "Baz"

Show the rules you just added.

$ cb ignore
$ cb --ignore
$ cb ig
$ cb --ig

Show Detailed Infocb [--](info|in)[(num)|_(id)] or cb [--](info|in)[(num)|_(id)] | (something)

Show helpful details for a clipboard.

$ cb info
$ cb --info
$ cb in
$ cb --in
# All are the same!

Output these helpful details in JSON format.

$ cb info | cat
$ cb info | jq

Search Clipboard Contentscb [--](search|sr)[(num)|_(id)] (query) [queries]

Start by copying several things.

$ cb copy Foo Bar Baz
$ cb copy "Some example content"
$ cb copy2 "Blah bleh bluh bloh"

Search a clipboard's contents.

$ cb search Foo
$ cb --search Blah
$ cb sr Bar
$ cb --sr Baz
# All are the same!

Show Help Messagecb (-h|[--]help)

Show the help message.

$ cb help
$ cb --help
$ cb -h 
# These three versions all work great!

Check All Clipboards' Statuscb [[--]status|st] or cb [--](status|st) | (something)

Check the status of all clipboards that have content.

$ cb status
$ cb --status
$ cb st
$ cb --st
$ cb 
# These all work great!

Get the status of all clipboards in JSON format.

$ cb status | cat

Check Your Configurationcb [[--]config|cfg]

Check your configuration of CB.

$ cb config
$ cb --config
$ cb cfg
$ cb --cfg
# These all work great!


Action Tips and Tricks

Need to paste a funky symbol somewhere a lot? Copy it to a persistent clipboard.

$ cb cp_theta θ
$ cb -c amog cp ඞ

Paste whatever's in the clipboard straight into your favorite text editor.

# Vim
:r !cb
# Nano
[Ctrl-T] cb
# VSCode
cb | code -

Copy a password securely by deleting it once you've pasted it.

$ cb cut "AVeryStrongPassword!"
$ cb | some-program
# Now gone

On a slow system? Cache certain things so you don't have to do them again.

$ neofetch | cb cp_neo
$ cb | cat

Yank anything sitting in your terminal without ever touching the mouse.

$ env | yank -d = -- cb

Choose a text clipboard entry to instantly copy to the main clipboard using dmenu.

cb st | jq -r '.[]' | dmenu | cb

Need to share or pore over log files? Copy them in one step!

$ journalctl | cb
# For systemd
$ sudo dmesg | cb
# For Linux; note that you're not running "sudo cb" here
$ cb copy logs/latest.log
# For Minecraft servers

Want CB to look different? Change up the color scheme.

# This one looks like The Matrix
$ export CLIPBOARD_THEME=green
$ cb
# This one is for light backgrounds
$ export CLIPBOARD_THEME=light
$ cb
# Check out the other themes too!

Make your own scripts that can fully automate your workflows.

#!/bin/sh
# This script does nothing except serve as an example of automating CB.
link="https://SomeWebsiteWithLotsOfContent"
wget link
cb copy *.jpg *.png
cb remove "AZ.*\.png"
cb | tar -cf foobar.tar
cb -c footar < foobar.tar
cb note "Latest files from website ABCXYZ"


Configuration

Flags

--all, -a   Add this when clearing to clear all clipboards at once.

Start from a blank slate.

$ cb --all clear

WARNING! This will get rid of everything you've stored with CB, so be very careful when clearing with this option.


--clipboard (clipboard), -c (clipboard)   Add this to choose which clipboard you want to use.

Choose a non-default clipboard.

$ cb -c 5 copy Foobar
$ cb --clipboard 10 copy BarBaz

Copy to a temporary clipboard that doesn't start with a number.

$ cb -c SomeCB copy "A really really long sentence, and I mean really realy super DUPER long!"

Note: Although copying to a temporary clipboard that doesn't start with a number is impossible using the conventional method of adding it to the end of the action, this alternative method is completely supported and works great.

Choose a persistent clipboard.

$ cb -c _ copy "Generation Next"/*

--entry (entry), -e (entry)   Add this to choose which history entry you want to use.

Choose a non-default history entry.

$ cb -e 5 copy Foobar
$ cb --entry 10 copy BarBaz

Note: To copy to a non-default entry, that entry must exist already.


--fast-copy, -fc   Add this to use links when copying, cutting, pasting, or loading. If you modify the items that you used with this flag, then the items you paste will have the same changes.

Copy a lot of files in much less time than before.

$ cb --fast-copy copy /usr/bin/*

--mime, -m   Add this to request a specific content MIME type from GUI clipboard systems.

Save GUI clipboard content of a specific MIME type to the main clipboard.

$ cb --mime text/html | cb

--no-confirmation, -nc   Add this to disable confirmation messages from CB.

Reduce distractions after showing some text content.

$ cb -nc sh | cat

--no-progress, -np   Add this to disable progress messages from CB.

Reduce distractions while doing a search that takes a while.

$ fzf | cb -np

--bachata   Add this for something special!

Make your life less boring.

$ cb --bachata


Environment Variables

CI   Set this to "true" or "1" to make CB overwrite existing items without a user prompt when pasting. This variable is intended for Continuous Integration scripts where a live human is not present to make decisions.

Use CB in a CI script.

...
cb cp Temp/*
...
cb p
...

CLIPBOARD_EDITOR   Set this to the editor you want to use for the Edit action.

Set a custom editor to use.

$ export CLIPBOARD_EDITOR=nano

Note: The environment variables EDITOR and VISUAL by default take precedence if CLIPBOARD_EDITOR isn't set.


CLIPBOARD_HISTORY   Set this to the maximum history size you want to keep, like 10000 or 50gb.

CLIPBOARD_HISTORY supports up to 2^32 - 1 as a value. So, go ahead. Crank that b*tch up to a billion.

$ export CLIPBOARD_HISTORY=1000000000
$ cb copy "Oh yeah!"

Only keep a certain amount of data.

$ export CLIPBOARD_HISTORY=100tb
$ cb copy Yo_Mama.tar.gz

Note: You can choose between tb, gb, mb, kb, and b to specify amounts for terabytes, gigabytes, megabytes, kilobytes, and bytes respectively.

Only keep a certain time length.

$ export CLIPBOARD_HISTORY=52w

Note: You can choose between y, m, w, d, and h to specify amounts for years, months, weeks, days, and hours respectively.


CLIPBOARD_LOCALE   Set this to the locale that only CB will use for its commands and output, like en_US.UTF-8 or es_DO.UTF-8.

Change the locale to match what you're more comfortable with.

$ export CLIPBOARD_LOCALE=es_DO.UTF-8
$ cb cp "Amo a Aventura"

> $Env:CLIPBOARD_LOCALE=es_DO.UTF-8
# Powershell version

Override the locale case-by-case.

$ export CLIPBOARD_LOCALE=fr_CA.UTF-8
...
$ CLIPBOARD_LOCALE="" cb cp Foobar

CLIPBOARD_TMPDIR   Set this to the directory that only CB will use to hold the items you cut or copy into a temporary directory.

Choose a special place to put your temporary clipboards this one time.

$ CLIPBOARD_TMPDIR=/home/jackson/SomeDirectory cb copy *

Choose a special place to put your temporary clipboards every time.

$ export CLIPBOARD_TMPDIR=/home/jackson/SomeDirectory
$ cb copy *
> $Env:CLIPBOARD_TMPDIR = /home/jackson/SomeDirectory
# Powershell

Note: By default, CB uses the C++ filesystem library function fs::temp_directory_path() to generate the temporary directory, prioritizing CLIPBOARD_TMPDIR and then XDG_RUNTIME_DIR respectively first if CB can get a value from them.


CLIPBOARD_PERSISTDIR   Set this to the directory that only CB will use to hold the items you cut or copy into a persistent directory.

Choose a special place to put your persistent clipboards this one time.

$ CLIPBOARD_PERSISTDIR=/home/jackson/SomeDirectory cb copy *

Choose a special place to put your persistent clipboards every time.

$ export CLIPBOARD_PERSISTDIR=/home/jackson/SomeDirectory
$ cb copy *
> $Env:CLIPBOARD_PERSISTDIR = /home/jackson/SomeDirectory
# Powershell

Note: By default, CB uses the user's home directory to generate the persistent directory, prioritizing CLIPBOARD_PERSISTDIR and then XDG_STATE_HOME first respectively if CB can get a value from them.


CLIPBOARD_CUSTOMPERSIST   Set this to the clipboards you want to make persistent, using regex.

Make everything you copy persistent.

$ export CLIPBOARD_CUSTOMPERSIST=".*"
$ cb copy Foo Bar Baz
# This puts everything in the persistent directory but still with the clipboard name "0"

Make some clipboards persistent.

$ export CLIPBOARD_CUSTOMPERSIST=5
$ cb copy5 Foo Bar Baz

CLIPBOARD_NOAUDIO   Set this to "true" or "1" to disable audio coming from CB.

Turn off those sound effects.

$ export CLIPBOARD_NOAUDIO=1
$ cb ffksdjfdj 
# No more error sounds after doing a nonexistent command

CLIPBOARD_NOGUI   Set this to "true" or "1" to disable integration with GUI clipboards.

Debug a flaky GUI system by disabling its integration with CB.

$ CLIPBOARD_NOGUI=1 cb show
$ export CLIPBOARD_NOGUI=1
$ cb show

CLIPBOARD_NOPROGRESS   Set this to "true" or "1" to disable only progress messages from CB.

Reduce distractions while doing a search that takes a while.

$ fzf | CLIPBOARD_NOPROGRESS=1 cb

Disable progress messages from CB entirely.

$ export CLIPBOARD_NOPROGRESS=1
$ fzf | cb

CLIPBOARD_NOREMOTE   Set this to "true" or "1" to disable remote clipboard sharing.

Disable all clipboard content transfers through the terminal.

$ export CLIPBOARD_NOREMOTE=1

CLIPBOARD_SILENT   Set this to "true" or "1" to disable progress and confirmation messages from CB.

Rest in peace by seeing nothing that isn't an error.

$ export CLIPBOARD_SILENT=1
$ cb cp "I'm running out of Aventura references"

CLIPBOARD_THEME   Set this to the color theme that CB will use. Choose between light, darkhighcontrast, lighthighcontrast, amber, green, and ansi (the default is dark).

Remind yourself of the terminals of the past.

$ export CLIPBOARD_THEME=green
$ cb cp "I'm in the Matrix now"
$ export CLIPBOARD_THEME=amber
$ cb cp "Yellow terminals feel just like sitting in front of a nice campfire"

Make CB more accessible.

$ export CLIPBOARD_THEME=darkhighcontrast
$ cb show

FORCE_COLOR   Set this to "true" or "1" to make CB always show color regardless of what you set NO_COLOR to.

Override somebody else's choice to disable colors.

$ export NO_COLOR=1
...
$ FORCE_COLOR=1 cb copy "There are almost no bachateros where I live right now"

Note: CB also supports CLICOLOR_FORCE.

Override somebody else's choice to disable colors, but in a different way.

$ export CLICOLOR=0
...
$ CLICOLOR_FORCE=1 cb copy "There are almost no bachateros where I live right now"

NO_COLOR   Set this to anything to make CB not show any colors.

Make CB look boring.

$ export NO_COLOR=1
$ cb cp "From the 1960s until the 1990s, bachata was perceived as boring music for poor Dominicans."

Note: CB also supports CLICOLOR.

Make CB look boring, but in a different way.

$ export CLICOLOR=0
$ cb cp "In the 1990s, though, several innovative musicians reinvigorated bachata by using electric guitars with fancy effects."