如何在抽取线条视觉选择结束时自动删除换行符?

时间:2013-12-23 01:32:13

标签: vim

是否有任何方法可以在选择的最后一行末尾没有换行的情况下抽取线性视觉选择?更具体地说,我希望能够将一行或多行从vim复制到系统剪贴板并将其粘贴到其他地方而不执行最后一个命令,而无法编辑它。

我可以通过在yanking之后对相关寄存器执行此命令来获得所需的效果:

:let @*=substitute(@*,'\n$','','g')

但有没有办法自动执行该命令?我目前正在使用MacVim并且似乎没有办法将额外的命令映射到⌘-C ,所以我必须有另一个映射来记住在复制之后执行如果我找不到另一种解决方案。

2 个答案:

答案 0 :(得分:1)

我想出了一个适合我的解决方案,受到以下答案之一的启发:Run command when vim enters visual mode

没有真正等效的假设VisualEnter或VisualLeave,但CursorHold事件以及更改updatetime将在退出可视模式后触发。我还添加了gv地图,以便在复制上一个选择时使其正常工作。

" Remove last newline after copying visual selection to clipboard
function! RemoveClipboardNewline()
    if &updatetime==1
        let @*=substitute(@*,'\n$','','g')
        set updatetime=4000
    endif
endfunction
function! VisualEnter()
    set updatetime=1
endfunction
vnoremap <expr> <SID>VisualEnter VisualEnter()
nnoremap <script> V V<SID>VisualEnter
nnoremap <script> gv gv<SID>VisualEnter
autocmd CursorHold * call RemoveClipboardNewline()

我不喜欢每0毫秒写一个交换文件的想法,但是我在Windows和OS X中测试了它,它可以工作并且不会引起明显的性能问题。除非有更改,否则它似乎不会写交换文件。

另外,我对它为什么会起作用感到困惑,因为它应该触发函数并将updatetime设置回4000,同时仍处于可视模式,但显然是值updatetime直到退出视觉模式后才会改变,这在这里很好用。

答案 1 :(得分:1)

我对自己的原始答案一直运作良好,我几乎忘了它,但现在我决定set clipboard=unnamed总是猛拉到系统剪贴板。副作用是对剪贴板的yanking也会影响未命名的寄存器,我不希望从中删除尾部换行符。

新的(以及更多Vim-ish)答案是一个映射,用于在将其划分之前将线性视觉选择转换为字符:

vnoremap <C-c> <Esc>'<0v'>g_y

如果我打算在任何其他时间粘贴命令行或<C-c>,我现在用y复制。用户Explosion Pills建议使用的东西,但有些添加的内容包括第一行的第一个字符和最后一行的最后一行。

相关问题