vim:将所选文本插入命令行?

时间:2011-02-02 19:35:58

标签: vim

如果我在可视模式下选择了一些文本,如何将所选文本插入命令行?

例如,如果我想搜索当前选择的文本,我可以使用y/<c-r>" ...但是有没有办法在没有先选择文本的情况下执行此操作?

编辑:一个更好的例子,因为在可视模式下进行搜索会扩展选择:如果我选择了部分文件名,并且我想要附加到该名称,则将其打开一位新编辑。

6 个答案:

答案 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)

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

    所选文本将转义特殊字符,以备在正则表达式中使用。

    致谢:

    1. 基于ierton的想法(在此页面上)
    2. 大部分代码取自bryan kennedy
    3. 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 " 进行粘贴