如何在拉动的逐行视觉选择末尾自动删除换行符?

wil*_*mpa 6 vim

有没有办法在选择的最后一行末尾没有换行符的情况下猛拉逐行视觉选择?更具体地说,我希望能够将一行或多行从 vim 复制到系统剪贴板并将其粘贴到其他地方,而无需执行最后一个命令而没有机会对其进行编辑。

\n\n

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

\n\n
:let @*=substitute(@*,'\\n$','','g')\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是有什么办法可以自动执行该命令吗?我目前正在使用 MacVim,似乎没有办法将额外的命令映射到\xe2\x8c\x98-C,所以如果我找不到另一个解决方案,我必须有另一个映射来记住在复制后执行。

\n

wil*_*mpa 1

我想出了一个适合我的解决方案,灵感来自这里的一个答案:当 vim 进入可视模式时运行命令

没有与假设的 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()
Run Code Online (Sandbox Code Playgroud)

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

另外,我有点困惑为什么这会起作用,因为它应该触发该函数并设置updatetime4000仍处于视觉模式的状态,但显然 的值updatetime直到退出视觉模式后才会改变,这可以解决这里很好。