2011-09-13 50 views
8

假设我有一个这样的文档之前逃脱寄存器的内容,我想搜索的URL的所有出现:创建Vim的命令行的映射,在插入它

Vim resources: [http://example.com/search?q=vim][q] 
... 
[q]: http://example.com/search?q=vim 

我不想完整输入,所以我将光标放在第一个URL上,然后运行"uyi[将其放入'u'寄存器中。现在,搜索它,我想仅仅通过运行粘贴的是注册到搜索领域的内容:

/\V<c-r>u<CR> 

Vim将搜索字符串的“http:” - 因为“/”字符终止搜索字段。

我可以通过运行这个,而不是得到解决该问题:

/\V<c-r>=escape(@u, '\/')<CR><CR> 

但它是一个很大的打字!

如何为Vim的命令行创建映射来简化此工作流?

我理想中的工作流程会去是这样的:

  • /\V带来了搜索提示,使用起来非常nomagic模式
  • 敲Ctrl-X以触发自定义映射(CTRL-X是可用)
  • Vim的监听下一个按键...(按<Esc>将取消)
  • 按下“U”将逃脱的“U”寄存器的内容,然后将命令行上
+0

我目前在可视模式下使用'*'。我有一些基于此脚本的自制插件:http://amix.dk/blog/post/19334 –

+0

@PeterRincker - 是的,我使用[类似的东西](https://github.com/bronson/vim-视觉明星搜索)呢! Vim自己的文档建议[类似映射](http://vimdoc.sourceforge.net/htmldoc/visual.html#visual-search),尽管它有点不完整。 – nelstrom

回答

7

试试这个:

cnoremap <c-x> <c-r>=<SID>PasteEscaped()<cr> 
function! s:PasteEscaped() 
    " show some kind of feedback 
    echo ":".getcmdline()."..." 

    " get a character from the user 
    let char = getchar() 

    if char == "\<esc>" 
    return '' 
    else 
    let register_content = getreg(nr2char(char)) 
    return escape(register_content, '\/') 
    endif 
endfunction 

顺便说一句,这东西可能是需要了解的(如果不这样做的话)是,你可以使用?作为分隔符为:s。这意味着你可以写一个搜索和替换,像这样一个网址:

:s?http://foo.com?http://bar.com?g 
+0

这是一个很好的解决方案,谢谢! – nelstrom

+2

我在原始问题中没有引起注意,但我故意使用了一个包含'/'和'?'的URL。字符。如果搜索目标只包含其中一个,那么您可以使用另一个搜索提示来拨打搜索提示,从而避免需要转义任何内容。 – nelstrom

+0

你说得对,我没有及时注意到问号。 –

7

我已经接受了Andrew Radev's solution,解决困难的部分。但这里的,我已经加入到我的vimrc文件的版本,其中增加了一些增强功能:

cnoremap <c-x> <c-r>=<SID>PasteEscaped()<cr> 
function! s:PasteEscaped() 
    echo "\\".getcmdline()."\"" 
    let char = getchar() 
    if char == "\<esc>" 
    return '' 
    else 
    let register_content = getreg(nr2char(char)) 
    let escaped_register = escape(register_content, '\'.getcmdtype()) 
    return substitute(escaped_register, '\n', '\\n', 'g') 
    endif 
endfunction 

这应该工作:

  • 您是否使用/?(向前搜索,或向后)
  • 并且当粘贴寄存器包括多个行

另外,我改变的提示。在等待注册时,提示会切换到\ - 这看起来像是'PasteEscaped'的合适提示。另外,我附加了一个",它在命令行按<c-r>后模仿Vim的行为。

如果您有任何进一步的改进建议,请留下评论。

2

不同的工作流程如何?例如,创建你自己的操作符来搜索目标文本是:

" https://gist.github.com/1213642 
" Requiement: https://github.com/kana/vim-operator-user 
map YourFavoriteKeySequence <Plug>(operator-search-target-text) 
call operator#user#define('search-target-text', 'OperatorSerachTargetText') 
function! OperatorSerachTargetText(motion_wise) 
    execute 'normal!' '`['.operator#user#visual_command_from_wise_name(a:motion_wise).'`]"xy' 
    let @/ = '\V' . escape(substitute(@x, '[\r\n]$', '', ''), '\') 
    normal! n 
endfunction 
1

我喜欢@ nelstrom的解决方案,并做了小改动,以支持逃逸[和]。

cnoremap <c-x> <c-r>=<SID>PasteEscaped()<cr> 
function! s:PasteEscaped() 
    echo "\\".getcmdline()."\"" 
    let char = getchar() 
    if char == "\<esc>" 
    return '' 
    else 
    let register_content = getreg(nr2char(char)) 
    let escaped_register = escape(register_content, '\'.getcmdtype()) 
    let escaped_register2 = substitute(escaped_register,'[','\\[','g') 
    let escaped_register3 = substitute(escaped_register2,']','\\]','g') 
    return substitute(escaped_register3, '\n', '\\n', 'g') 
    endif 
endfunction