Have you ever tried to paste something from the clipboard while using neovim and realized this wasn't the text you wanted to paste?
If the answer is yes this plugin might be for you
When starting to use vim/neovim I found the whole copy-pasta process a bit
counter intuitive, coming from systems where there's just one clipboard
managed by <Cmd-c>|<Cmd-v>
getting used to registers and the way the
clipboard
option works took some time.
At first I was mad at neovim for polluting my clipboard every time I deleted
or changed a text (using d
, c
or even s
) so I used the "blackhole"
mappings in order to disable that functionality via:
nnoremap d "_d
But then I realized I actually wanted some of the deleted texts and I was also
"missing out" on the "true way of the vimmer" so I decided to use blackhole
mappings only with the <leader>
key:
nnoremap <leader>d "_d
The above was much better, but this added to my mental overhead of having to think before each delete/change operation if I wanted to use the default operator or my soup'd up leader-prefix version.
In addition I also wanted separation between neovim and the system clipboard
so I started using :set clipboard=""
which introduced yet another
sequence/keybind I needed to press in order to copy the text from the yank
register "0
to the clipboard.
Then came copy-pasting over SSH... that required yet an additional
keybind/workflow of having to yank the text using OSC52 (using the wonderful
ojroques/vim-oscyank
).
I needed a better solution with the following requirements:
- No changes to default neovim key mappings
- Minimum clipboard/register pollution: only copy to clipboard when I
intent on doing so (i.e. do not overwrite my clipboard on neovim's
dd
and similar operations) - Copying over ssh should be seamless, I don't need to care or worry whether I'm local or remote, with or without tmux.
- Easily accessible clipboard history when using neovim
Enter "SmartYank"...
SmartYank is an opinionated (yet customizable) yank, it utilizes the
TextYankPost
event to detect intentional yank operations (by testing
vim.v.operator
) and:
- Highlight yanked text
- Copy yanked text to system clipboard (regardless of
clipboard
setting) - If tmux is available, copy to a tmux clipboard buffer (enables history)
- If ssh session is detected, use OSC52 to copy to the terminal host clipboard
Using vim-plug
Plug 'ibhagwan/smartyank.nvim'
Using packer.nvim
use { 'ibhagwan/smartyank.nvim' }
Notes:
- Requires neovim >
0.7
- Calling
require'smartyank'.setup {}
is optional
Configuring additional options can be done via the setup
function:
require('smartyank').setup {
...
}
or if using a .vim
file:
lua << EOF
require('smartyank').setup{
...
}
EOF
Below is a list of all default options:
require('smartyank').setup {
highlight = {
enabled = true, -- highlight yanked text
higroup = "IncSearch", -- highlight group of yanked text
timeout = 2000, -- timeout for clearing the highlight
},
clipboard = {
enabled = true
},
tmux = {
enabled = true,
-- remove `-w` to disable copy to host client's clipboard
cmd = { 'tmux', 'set-buffer', '-w' }
},
osc52 = {
enabled = true,
-- escseq = 'tmux', -- use tmux escape sequence, only enable if
-- you're using tmux and have issues (see #4)
ssh_only = true, -- false to OSC52 yank also in local sessions
silent = false, -- true to disable the "n chars copied" echo
echo_hl = "Directory", -- highlight group of the OSC52 echo message
},
-- By default copy is only triggered by "intentional yanks" where the
-- user initiated a `y` motion (e.g. `yy`, `yiw`, etc). Set to `false`
-- if you wish to copy indiscriminately:
-- validate_yank = false,
--
-- For advanced customization set to a lua function returning a boolean
-- for example, the default condition is:
-- validate_yank = function() return vim.v.operator == "y" end,
}
One (of the many) advantages of using tmux
is the ability to view the yank history by using <prefix>#
(by default
<C-a>#
).
Using fzf-lua
tmux_buffers
we can
fuzzy find the tmux paste buffers and by pressing <CR>
copy the current
selection into the "unnamed" register for easy pasting with p
or P
(similar
functionality to what is achieved using
nvim-neoclip.lua
):