• Stars
    star
    366
  • Rank 116,547 (Top 3 %)
  • Language
    Vim Script
  • License
    MIT License
  • Created almost 6 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Vim plugin that maintains a yank history to cycle between when pasting

Yoink.vim

Yoink will automatically maintain a history of yanks that you can choose between when pasting.

It provides very similar functionality to nvim-miniyank, YankRing.vim, vim-yankstack or the yank features in vim-easyclip.

Also see here if you prefer watching a video explanation of this plugin instead of the below text.

Mappings

Note that by default Yoink will not affect the way Vim behaves in any way. You have to add one or more of the following maps or enable one of the optional settings to produce an effect.

For example, if you want to add a key to swap the most recent paste around in the yank history:

nmap <c-n> <plug>(YoinkPostPasteSwapBack)
nmap <c-p> <plug>(YoinkPostPasteSwapForward)

nmap p <plug>(YoinkPaste_p)
nmap P <plug>(YoinkPaste_P)

" Also replace the default gp with yoink paste so we can toggle paste in this case too
nmap gp <plug>(YoinkPaste_gp)
nmap gP <plug>(YoinkPaste_gP)

With these mappings, immediately after performing a paste, you can cycle through the history by hitting <c-n> and <c-p>

We also need to override the p and P keys to notify Yoink that a paste has occurred, so that swapping via the <c-n> and <c-p> keys can be enabled. Otherwise paste functionality should be the same as default.

Note that yoink does not support swapping when doing paste in visual mode and so we do not add an xmap for p here. However, the vim-subversive plugin integrates with Yoink and does provide that functionality.

Note that the swap operations above will only affect the current paste and the history order will be unchanged. However - if you do want to permanently cycle through the history, you can do that too:

nmap [y <plug>(YoinkRotateBack)
nmap ]y <plug>(YoinkRotateForward)

Now when you hit [y/]y the current yank will change and you will see a preview of it in the status bar

You might also want to add a map for toggling whether the current paste is formatted or not:

nmap <c-=> <plug>(YoinkPostPasteToggleFormat)

Now, hitting <c-=> after a paste will toggle between formatted and unformatted (equivalent to using the = key). By default pastes will not be formatted until you toggle it afterwards using <c-=> (however you can also change this with the yoinkAutoFormatPaste setting as described below)

Finally, you can also optionally add the following map:

nmap y <plug>(YoinkYankPreserveCursorPosition)
xmap y <plug>(YoinkYankPreserveCursorPosition)

After adding this map, yank will function exactly the same as previously with the one difference being that the cursor position will not change after performing a yank. This can be more useful especially when yanking a large text object such as a paragraph.

Commands

:Yanks - Display the current yank history

:ClearYanks - Delete history. This will reduce the history down to 1 entry taken from the default register.

Settings

You can optionally override the default behaviour with the following settings:

  • g:yoinkMaxItems - History size. Default: 10.
  • g:yoinkSyncNumberedRegisters - When set to 1, every time the yank history changes the numbered registers 1 - 9 will be updated to sync with the first 9 entries in the yank history. See here for an explanation of why we would want do do this. Default: 0.
  • g:yoinkIncludeDeleteOperations - When set to 1, delete operations such as x or d or s will also be added to the yank history. Default: 0
  • g:yoinkSavePersistently - When set to 1, the yank history will be saved persistently across sessions of Vim. Note: Requires Neovim. See here for details. Default: 0
  • g:yoinkAutoFormatPaste - When set to 1, after a paste occurs it will automatically be formatted (using = key). Default: 0. Note that you can also leave this off and use the toggle key instead for cases where you want to format after the paste.
  • g:yoinkMoveCursorToEndOfPaste - When set to 1, the cursor will always be placed at the end of the paste. Default is 0 which will match normal Vim behaviour and place the cursor at the beginning when pasting multiline yanks. Setting to 1 can be nicer because it makes the post-paste cursor position more consistent between multiline and non-multiline pastes (that is, the cursor will be at the end in both cases). And also causes consecutive multiline pastes to be ordered correctly instead of interleaved together. Will also add to the jumplist if the cursor is moved more than 1 line.
  • g:yoinkSwapClampAtEnds - When set to 1, when we reach the beginning or end of the yank history, the swap will stop there. When set to 0, it will cycle back to the other end of the history so you can swap in the same direction forever. Default: 1
  • g:yoinkIncludeNamedRegisters - When set to 1, all yanks for all registers will be included in the history. When set to 0, only changes to the default register will be recorded. Default: 1
  • g:yoinkSyncSystemClipboardOnFocus - When set to 0, the System Clipboard feature described below will be disabled. Default: 1

Persistent/Shared History

When g:yoinkSavePersistently is set to 1, the yank history will be saved persistently by taking advantage of Neovim's "ShaDa" feature. Note that since ShaDa support only exists in Neovim this feature is not available for Vim.

You can also use this feature to sync the yank history across multiple running instances of Vim by updating Neovim's shada file. For example, if you execute :wshada in the first instance and then :rshada in the second instance, the second instance will be synced with the yank history in the first instance. If this becomes a common operation you might consider using key bindings for this.

Note also that the ! option must be added to Neovims shada setting for this feature to work. For example: set shada=!,'100,<50,s10,h (see :h 'shada' for details)

System Clipboard

Another feature worth mentioning is that if you have &clipboard set to either unnamed or unnamedplus then Yoink will automatically record yanks that occur outside of Vim. It does this by checking if the system clipboard was changed every time Vim gains focus and if so adding the new yank to the history.

Note that you can disable it by setting g:yoinkSyncSystemClipboardOnFocus to 0 then restarting vim

Integration with vim-cutlass

If you also have vim-cutlass installed then I suggest you set g:yoinkIncludeDeleteOperations to 1. Otherwise the 'cut' operator that you use will not be added to the yank history.

FAQ

  • I want the yank history in the autocomplete list

If you're using ncm2 for autocomplete you can use this. If you're using something else please create a github issue and we can look at adding a source for that

  • I want to rotate to a specific number in the :Yanks list. How do I do this?

Just pass a count to the [y command. For example, to rotate to yank #12 as displayed in the :Yanks list, execute 12[y

  • I want to add to the yank history manually from my own vimscript

You can call yoink#manualYank for this. Note that calling this will also set the contents of the default register with the given value. If you just want to add to history without affecting the default register, you can call yoink#addTextToHistory instead

  • I want to use Yoink <c-p> mapping in conjunction with the default ctrlp.vim mapping

Just use the following mappings:

let g:ctrlp_map=''
nmap <expr> <c-p> yoink#canSwap() ? '<plug>(YoinkPostPasteSwapForward)' : '<Plug>(ctrlp)'
  • I want to use the same binding for paste to trigger the swap afterwards

Try adding this to your .vimrc:

nmap <expr> p yoink#canSwap() ? '<plug>(YoinkPostPasteSwapBack)' : '<plug>(YoinkPaste_p)'
nmap <expr> P yoink#canSwap() ? '<plug>(YoinkPostPasteSwapForward)' : '<plug>(YoinkPaste_P)'

More Repositories

1

vim-easyclip

Simplified clipboard functionality for Vim
Vim Script
684
star
2

vimpeccable

Neovim plugin that allows you to easily map keys directly to lua code inside your init.lua
Lua
359
star
3

text-to-colorscheme

Neovim colorschemes generated on the fly with a text prompt using ChatGPT
Lua
295
star
4

vim-subversive

Vim plugin providing operator motions to quickly replace text
Vim Script
286
star
5

vim-macrobatics

Plugin for Vim that makes it easier to record / play / edit macros
Vim Script
81
star
6

nvim-moonmaker

Moonscript plugin support for neovim
Lua
67
star
7

UnityCoroutinesWithoutMonoBehaviours

C#
47
star
8

nvim-teal-maker

Neovim plugin that adds plugin support for teal language
Lua
32
star
9

vim-NotableFt

Vim Script
29
star
10

vim-extended-ft

Vim Script
26
star
11

lusc

Structured Async/Concurrency for Lua
Lua
17
star
12

nvim-marksman

Quick and efficient file finder for neovim
Python
17
star
13

nvim-lusc

Structured Async/Concurrency in Neovim
Lua
13
star
14

tea-leaves

A language server for the Teal language
Lua
12
star
15

logexpert

C#
8
star
16

unifind

Simple generic fuzzy finder for unity editor
C#
8
star
17

lusc_luv

Lua
5
star
18

VimDriver

Python
5
star
19

vimpeccable-lua-vimrc-advanced-example

Lua
4
star
20

vimpeccable-lua-vimrc-example

Lua
4
star
21

nvim-moonmaker-example

Moonscript plugin support example for neovim
MoonScript
3
star
22

CebuGameJam

C#
3
star
23

lua_bazel_rules

Bazel rules to build and run lua scripts
Starlark
2
star
24

vim-quickfixdo

Vim Script
2
star
25

ncm2-yoink

Vim Script
2
star
26

tlcheck

Simple command line tool to type check a given teal file/directory
Lua
2
star
27

HalifaxGameJam2012

C#
1
star
28

GradleCompositeBuildBugExample

Groovy
1
star
29

lastfm_script

Python
1
star
30

buck2_lua_rules

Buck2 rules for Lua and Teal
Starlark
1
star
31

vimpeccable-moonscript-vimrc-example

MoonScript
1
star
32

vimpeccable-moonscript-vimrc-advanced-example

MoonScript
1
star
33

uniscon

A simple implementation of structured concurrency for Unity game engine
C#
1
star
34

svelto-doofus-sample

C#
1
star