Coder Social home page Coder Social logo

rti / zsh-system-clipboard Goto Github PK

View Code? Open in Web Editor NEW

This project forked from kutsan/zsh-system-clipboard

0.0 1.0 0.0 114 KB

System clipboard key bindings for Zsh Line Editor with vi mode. It is similar to what `set clipboard=unnamed` does for vim.

License: GNU General Public License v3.0

Shell 100.00%

zsh-system-clipboard's Introduction

zsh-system-clipboard

Zsh plugin that adds key bindings support for ZLE (Zsh Line Editor) clipboard operations for vi emulation keymaps. It works under Linux, macOS and Android (via Termux).

demonstration-gif

By default, ZLE has its own clipboard buffer. So, using keys like y inside ZLE's normal mode for yanking operations will not send that yanked text to system clipboard. It will live inside ZLE and using C-v won't paste that text in another program. This plugin synchronizes your system clipboard with ZLE buffers while it's not overriding anything. You can still use ZLE's " register if you want to.

It also synchronizes tmux clipboard buffers if tmux available and the ZSH_SYSTEM_CLIPBOARD_TMUX_SUPPORT variable is set to 'true'. See Options section for more details.

Installation

Using Plugin Managers

Use your favorite plugin manager, e.g. zplug:

zplug "kutsan/zsh-system-clipboard"

Manually

Clone this repository somewhere,

git clone https://github.com/kutsan/zsh-system-clipboard ~/.zsh/plugins/zsh-system-clipboard

Source the zsh-system-clipboard.zsh file in your ~/.zshrc.

source "$HOME/.zsh/plugins/zsh-system-clipboard/zsh-system-clipboard.zsh"

The script zsh-system-clipboard.zsh parses the output of bindkey -M vicmd, bindkey -M emacs, bindkey -M visual in order to rebind your keys (along with the default ones) the ZLE widgets functions that copy from and paste to the system clipboard. This means that you should put all of your bindings before sourcing zsh-system-clipboard.zsh in your ~/.zshrc.

Note: widget functions that replace builtin functions for the emacs keymap are not yet written (see #12).

Options

  • ZSH_SYSTEM_CLIPBOARD_TMUX_SUPPORT: Set it to 'true' to enable tmux support. That way, if tmux available, every new clipboard content will be also sent to tmux clipboard buffers. Run tmux choose-buffer to view them.
  • ZSH_SYSTEM_CLIPBOARD_SELECTION: Specify which X selection to use for xclip or xsel or wl-copy utilities. Either 'PRIMARY' or 'CLIPBOARD'. Defaults to 'CLIPBOARD'.
  • ZSH_SYSTEM_CLIPBOARD_USE_WL_CLIPBOARD: zsh-system-clipboard doesn't use wl-copy or wl-paste even if they are installed, if you have $DISPLAY set. However, it may be that you use Wayland (and hence you can use these utilities), but $DISPLAY is set in your environment, perhaps because you use an X based terminal emulator on Wayland. In that case, if you don't have xsel or xclip installed and you wish to use wl-copy never the less, you should set this environment variable to true. To summarise, set this variable if:
    • You use Wayland.
    • You have wl-clipboard installed.
    • You don't have xsel or xclip utilities installed.
      • You have $DISPLAY set in your environment (probably due to the X emulator).
      • You would like to use wl-copy and wl-paste utilities because you use Wayland.

For example:

typeset -g ZSH_SYSTEM_CLIPBOARD_TMUX_SUPPORT='true'
typeset -g ZSH_SYSTEM_CLIPBOARD_SELECTION='PRIMARY'

Configuration

If you wish, you can disable the default bindings zsh-system-clipboard uses by setting the following in your environment:

export ZSH_SYSTEM_CLIPBOARD_DISABLE_DEFAULT_MAPS=1

Why would I want to do that?

zsh-system-clipboard modifies your key bindings by reading them in their current state and binds them to their corresponding widgets we implemented which change the system clipboard along the way. This variable enables you to bind the default bindings your way. This is useful if you wish e.g to use the same default bindings but with a certain prefix.

This is the function that's inside zsh-system-clipboard.zsh which actually binds the default keys:

function () {
	local binded_keys i parts key cmd keymap
	for keymap in vicmd visual emacs; do
		binded_keys=(${(f)"$(bindkey -M $keymap)"})
		for (( i = 1; i < ${#binded_keys[@]}; ++i )); do
			parts=("${(z)binded_keys[$i]}")
			key="${parts[1]}"
			cmd="${parts[2]}"
			if (( $+functions[zsh-system-clipboard-$keymap-$cmd] )); then
				eval bindkey -M $keymap $key zsh-system-clipboard-$keymap-$cmd
			fi
		done
	done
}

You can change the line eval bindkey -M $keymap $key zsh-system-clipboard-$keymap-$cmd this way:

				eval bindkey -M $keymap \"\ \"$key zsh-system-clipboard-$keymap-$cmd

And to make this change useful, unbind the single " " with:

bindkey -ar " "

This setup will force you to use space to actually use the system clipboard - whether it's paste or copy.

API

The plugin itself provides a separate cross-platform clipboard API for internal widgets. You can use this API as a standalone function.

To set system clipboard buffer:

_zsh_system_clipboard_set "example text"

To get system clipboard buffer to stdout:

_zsh_system_clipboard_get

It will show pretty-printed errors via stderr or stdout if something went wrong.

Additional mappings

zsh-system-clipboard emulates all of zsh's standard mappings but with system clipboard support. Some default zle commands are not mapped by default both by us and both by ZSH. However we have the binding zsh-system-clipboard-vicmd-vi-yank-eol which emulates vi-yank-eol which copies text from cursor to the end of the line but we don't map it to anything, no matter what is $ZSH_SYSTEM_CLIPBOARD_DISABLE_DEFAULT_MAPS. To use it, add to your ~/.zshrc:

# Bind Y to yank until end of line
bindkey -M vicmd Y zsh-system-clipboard-vicmd-vi-yank-eol

Thanks

Special thanks to Doron Behar (@doronbehar) for their interests, suggestions, time and pull requests.

Similar Projects

License

GPL-3.0

zsh-system-clipboard's People

Contributors

doronbehar avatar kutsan avatar ajholyoake avatar federico-ciuffardi avatar ninrod avatar justinlovinger avatar rti avatar laggardkernel avatar xpmo avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.