Vim:如何将选定的文本插入到命令行中?

17
如果在可视模式下选择了一些文本,如何将所选的文本插入到命令行中?
例如,如果我想搜索当前选择的文本,我可以使用“y/”...但是有没有不先复制所选文本就能实现的方法呢?
编辑:更好的例子是,在可视模式下搜索会扩展选择范围:如果我选择了文件名的一部分,并且希望添加到该名称中,然后在新编辑器中打开它。

它并没有回答问题,但是:<C-R><C-W>会将光标下方的单词插入到命令行中。 - stackunderflow
6个回答

9

为了解决这个问题,我已经在可视化模式下重新映射了:。通过以下映射,我可以将选定的文本粘贴到命令行并将光标移动到最左边:

vnoremap : y:<C-r>"<C-b>

我发现一个小问题 - 现在按下冒号:会取消选择。

2
  1. 将复制和粘贴的代码放入vimrc配置文件中。
  2. 重新打开vim编辑器。
  3. 选择文本(例如使用v)
  4. 使用:进入命令模式
  5. 使用Ctrl-p将所选文本粘贴到命令行中

所选文本将具有已转义的特殊字符,以便在正则表达式中使用。

致谢:

  1. 基于ierton的想法(在此页面上)
  2. 大部分代码来自bryan kennedy

Vim搜索和替换所选文本

" Escape special characters in a string for exact matching.
" This is useful to copying strings from the file to the search tool
" Based on this - http://peterodding.com/code/vim/profile/autoload/xolox/escape.vim
function! EscapeString (string)
  let string=a:string
  " Escape regex characters
  let string = escape(string, '^$.*\/~[]')
  " Escape the line endings
  let string = substitute(string, '\n', '\\n', 'g')
  return string
endfunction

" Get the current visual block for search and replaces
" This function passed the visual block through a string escape function
" Based on this - https://dev59.com/v3RB5IYBdhLWcg3wQVSV#677918
function! GetVisual() range
  " Save the current register and clipboard
  let reg_save = getreg('"')
  let regtype_save = getregtype('"')
  let cb_save = &clipboard
  set clipboard&

  " Put the current visual selection in the " register
  normal! ""gvy
  let selection = getreg('"')

  " Put the saved registers and clipboards back
  call setreg('"', reg_save, regtype_save)
  let &clipboard = cb_save

  "Escape any special characters in the selection
  let escaped_selection = EscapeString(selection)

  return escaped_selection
endfunction

" Start the find and replace command across the entire file
vmap <leader>z <Esc>:%s/<c-r>=GetVisual()<cr>/

" When in visual mode,
" before command mode is entered by using :
" Put the contents of any selected text into
" the default register
" leave the text highlighted.
" Based on ierton - https://dev59.com/Sm445IYBdhLWcg3wZJiw
vnoremap : "pygv:

"Map ctrl-P to paste escaped contents of default register in command mode
" Based on bryan kennedy - https://dev59.com/v3RB5IYBdhLWcg3wQVSV
cnoremap <C-P> <c-r>=GetVisual()<cr>

2
激活可视模式并选择一些文本后,如果我按下“/”向前搜索,然后按下“*”,则选定的文本将插入到命令行中。另一种方法(至少在Linux中)是按下“”,它将在X11中插入当前选择的内容(例如,在firefox中选择某些内容,您可以在任何其他应用程序中按下“”来复制该选择;同样,至少在Linux中)。请记住,在您在“/”命令之后插入一些文本之后,您的可视选择将扩展为包括它正在搜索的下一个出现。编辑:我假设使用GVim,它将可视选择复制到X11选择缓冲区(有关更多信息,请参见“:help x11-selection”)。如果您在控制台内使用Vim,则我认为(但可能错误)您最好的选择是在按下“Shift”的同时使用鼠标选择要复制的文本,然后使用“”将该文本复制到命令行中。这适用于Linux,可能也适用于OSX;对于Windows,我不知道,抱歉。

很不幸,这仅适用于X11可用的情况(例如,在OSX上或通过SSH不起作用)。然而,您提出了一个好观点,即在搜索的情况下它不会完全做同样的事情。我已经使用更好的示例更新了我的问题。 - David Wolever
David,当我在SSH上工作时,我使用“按住Shift键并用鼠标选择和插入”的技巧 :) .. 当我们考虑它时,Vim唯一的方法(没有任何外部帮助)可以将缓冲区中的内容复制到命令行是通过寄存器。你的问题是如何避免这样做,答案在于你的操作系统或图形环境的设施; shift-insert就是其中之一。 - Jorge Gajon
你说“Vim唯一的方式(不借助任何外部帮助)从缓冲区复制内容到命令行是通过寄存器”,为什么会这样呢? - David Wolever
例如,我可以使用<c-r>=getline()将当前行抓取到命令行中...这似乎与您所说的相矛盾。 - David Wolever
David,你说得对,这不是唯一的方法,但在问题的背景下,当你突然意识到想要搜索你面前的某段文本时,最简单的方法是将其拖动并复制到命令行。输入<c-r>=getline()会很荒谬。我发现用鼠标选择和<S-Insert>更容易。 - Jorge Gajon

2

粘贴到 vim 命令行的步骤:

  • 首先复制所选文本
  • 打开命令行 :
  • 使用 Ctrl-r " 进行粘贴

1

我知道这可能对你有帮助,也可能没有,但是在vim中输入!command..虽然它不是复制和粘贴,但如果你正在使用ssh - 它至少可以让你在键入命令时查看缓冲区。

例如:!make

这完全取决于你所处的环境...

如果你正在使用Windows上的putty,实际上你可以从中选择并复制文本(在putty内也可以进行配置),然后粘贴到另一个putty会话或另一个窗口中(如果使用screen或tmux)。

如果你实际上正在桌面环境中,则复制和粘贴应该相当容易(所以我假设你不处于此位置)。

希望能帮到你,如果不能,请见谅。


抱歉,我不确定那会如何有帮助。我特别关注使用视觉模式选择的文本(通常比使用鼠标更容易)。 - David Wolever

0
我找到了解决办法。当你在可视模式下按“:”键时,会出现“:'<,'>”,而不是正常的“:”。因此,你需要删除它以像往常一样编写命令。 要将选定的文本扩展到<C-r>*,效果非常好。
vnoremap <M-8> :<BS><BS><BS><BS><BS>NGrep <C-r>*<CR>

如果您想在启动命令之前编辑它,只需删除尾随的<CR>。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接