【问题标题】:vim: insert selected text into command line?vim:将所选文本插入命令行?
【发布时间】:2011-02-02 19:35:57
【问题描述】:

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

例如,如果我想搜索当前选定的文本,我可以使用 y/<c-r>"... 但是有没有什么方法可以在不先拉出选定的文本的情况下做到这一点?

编辑:一个更好的例子,因为在可视模式下搜索会扩大选择范围:如果我选择了文件名的一部分,并且我想附加到该名称,然后在一个新的编辑器。

【问题讨论】:

  • 它不回答问题,但是 : 将光标下方的单词插入命令行

标签: vim


【解决方案1】:

我已在可视模式下重新映射 : 以解决此问题。通过以下映射,我可以将选定的文本粘贴到命令行,然后将光标移动到最左边的位置:

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

我可以看到一个小缺点 - 现在按 : 会取消选择。

【讨论】:

    【解决方案2】:

    激活可视模式并选择一些文本后,如果我点击/ 向前搜索,然后按&lt;C-R&gt;*,我会将选定的文本插入命令行。

    另一种方法(至少在 Linux 中)是按&lt;S-Insert&gt;,它将在 X11 中插入当前选择的内容(例如,在 Firefox 中选择某些内容,您可以在任何其他应用程序中 &lt;S-Insert&gt; 复制该选择;再次,至少在 Linux 中)。

    请记住,在您的具体示例中,在/ 命令之后插入一些文本后,您的视觉选择将扩展为包括下一次出现的搜索内容。

    编辑:我假设是 GVim,它将视觉选择复制到 X11 选择缓冲区(有关更多信息,请参阅 :help x11-selection)。

    如果您在控制台中使用 Vim,那么我认为(但可能是错误的)您最好的选择是在按下 Shift 的同时用鼠标选择您想要的文本,然后使用 &lt;S-Insert&gt; 复制该文本进入命令行。这适用于 Linux,也可能适用于 OSX;我不了解 Windows,抱歉。

    【讨论】:

    • 不幸的是,只有在 X11 可用时才有效(例如,在 OSX 或 SSH 上无效)。但是,您提出了一个很好的观点,即在搜索的情况下它不会做完全相同的事情。我用一个更好的例子更新了我的问题。
    • David,在 SSH 上工作时,我使用“使用 shift-mouse 和 shift-insert 选择”技术 :) .. 当我们考虑它时,唯一的方法是 Vim 单独(没有任何外部帮助)可以通过寄存器将某些内容从缓冲区复制到命令行。您的问题是关于如何避免这样做,答案取决于您的操作系统或图形环境的设施; shift-insert 是一个。
    • 你说“Vim 单独(没有任何外部帮助)可以将某些内容从缓冲区复制到命令行的唯一方法是通过寄存器”——这是为什么呢?
    • 例如,我可以使用&lt;c-r&gt;=getline() 将当前行抓取到命令行中...这似乎与您所说的相矛盾。
    • 大卫,你是对的,这不是唯一的方法,但是在问题的上下文中,当你突然意识到你想搜索你面前的一段文字时,最简单的方法是将其拉出并将其复制到命令行。输入&lt;c-r&gt;=getline() 会很荒谬。我发现用鼠标和&lt;S-Insert&gt; 更容易选择
    【解决方案3】:
    1. 将复制和粘贴代码放入 vimrc 配置文件中。
    2. 重新打开 vim 编辑器。
    3. 选择文本(例如使用 v)
    4. 使用以下命令进入命令模式:
    5. 现在可以使用 Ctrl-p 将所选文本粘贴到命令行

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

    学分:

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

    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>
    

    【讨论】:

      【解决方案4】:

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

      例如:!make

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

      如果您在 windows 中使用 putty,您实际上可以突出显示并从中复制文本(也可在 putty 中配置)并粘贴到另一个 putty 会话或另一个窗口(如果使用 screen 或 tmux)。

      如果你真的在盒子上并且有一个图形环境,复制和粘贴应该相当容易(所以我假设你不在这个位置)。

      希望对你有帮助,如果没有,请见谅。

      【讨论】:

      • 抱歉,我不确定这有什么帮助。我对使用可视模式选择的文本特别感兴趣(我通常使用可视模式比使用鼠标更容易)。
      【解决方案5】:

      vim 命令行上粘贴:

      • 先复制选中的文字
      • 打开命令行:
      • 使用Ctrl-r "进行粘贴

      【讨论】:

        【解决方案6】:

        我找到了解决方案。当您在可视模式下按:而不是正常的“:”时,您会看到“:'”。所以你需要像往常一样擦除这个来写命令。 对于扩展到选定的文本 * 效果很好。

        vnoremap <M-8> :<BS><BS><BS><BS><BS>NGrep <C-r>*<CR>
        

        如果您想在启动前编辑命令,只需删除尾随

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-24
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多