如果我在可视模式下选择了一些文本,如何将所选文本插入命令行?
例如,如果我想搜索当前选择的文本,我可以使用y/<c-r>"
...但是有没有办法在没有先选择文本的情况下执行此操作?
编辑:一个更好的例子,因为在可视模式下进行搜索会扩展选择:如果我选择了部分文件名,并且我想要附加到该名称,则将其打开一位新编辑。
答案 0 :(得分:7)
我已在视觉模式下重新映射:
以解决此问题。通过以下映射,我可以将选定的文本粘贴到命令行,然后b - onus - 将光标移动到最左边的位置:
vnoremap : y:<C-r>"<C-b>
我可以看到一个小缺点 - 按:
现在取消选择。
答案 1 :(得分:2)
激活可视模式并选择一些文本后,如果我按/
向前搜索然后按<C-R>*
,我会将所选文本插入命令行。
另一种方式(至少在Linux中)是按<S-Insert>
,它将在X11中插入当前选择的内容(例如在firefox中选择一些内容,你可以在任何其他应用程序中<S-Insert>
复制该选择;再次,至少在Linux中)。
请注意,根据您的具体示例,在/
命令后插入一些文字后,您的视觉选择将展开以包括下一次搜索的内容。
编辑:我假设是GVim,它将视觉选择复制到X11选择缓冲区(有关详情,请参阅:help x11-selection
)。
如果您在控制台中使用Vim,那么我认为(但可能是错误的)您最好的选择是在按下Shift
的同时用鼠标选择所需的文本,然后使用{{1将该文本复制到命令行。这适用于Linux,也可能适用于OSX;我不知道Windows,抱歉。
答案 2 :(得分:2)
所选文本将转义特殊字符,以备在正则表达式中使用。
致谢:
Vim search and replace selected text
" 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://stackoverflow.com/questions/676600/vim-replace-selected-text/677918#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://stackoverflow.com/questions/4878980/vim-insert-selected-text-into-command-line
vnoremap : "pygv:
"Map ctrl-P to paste escaped contents of default register in command mode
" Based on bryan kennedy - https://stackoverflow.com/questions/676600/vim-search-and-replace-selected-text
cnoremap <C-P> <c-r>=GetVisual()<cr>
答案 3 :(得分:1)
我知道这可能会有所帮助,也可能不会帮助你,但是从vim中键入!命令..它不是复制和粘贴,但是如果你使用ssh - 它至少会让你在你看到你的缓冲区时'输入你的命令。
ex:!make
这完全取决于你所处的环境......
如果您正在使用窗口中的putty,您实际上可以突出显示并复制文本(也可以在putty中配置)并粘贴到另一个putty会话或另一个窗口(如果使用screen或tmux)。
如果你真的在盒子上并拥有图形环境,请复制&amp;粘贴应该相当容易(所以我假设你不在这个位置)。
希望它有所帮助,对不起,如果没有。
答案 4 :(得分:0)
我找到了解决方案。当你按下:在视觉模式而不是正常模式&#34; :&#34;你有&#34; :&#39;&lt;,&#39;&gt; &#34;。所以你需要像往常一样擦除它来写命令。 为了扩展到所选文本&lt; C-r&gt; *效果很好。
vnoremap <M-8> :<BS><BS><BS><BS><BS>NGrep <C-r>*<CR>
如果要在启动之前编辑命令,只需删除尾随&lt; CR&gt;。
答案 5 :(得分:0)
用于在 vim 命令行上粘贴:
:
Ctrl-r "
进行粘贴