【问题标题】:How to replace with ctrl+h in vimvim中如何用ctrl+h替换
【发布时间】:2014-05-26 21:03:23
【问题描述】:

我想映射 以在活动缓冲区中轻松“替换”

现在我有这样的东西:

" <c-h> Replacement
noremap   <c-h>     :%s/<c-R><c-W>//g<left><left>
inoremap  <c-h>     <esc>:%s/<c-R><c-W>//g<left><left>
vnoremap  <c-h>     gv:%s/<c-R><c-W>//g<left><left>   

问题是:

  1. 所选内容未正确转义
  2. 对于可视模式,我不粘贴选择,只粘贴光标下方的单词

有没有办法做类似的事情:

inoremap  <c-h>     <esc>:%s/\=escapechars(<c-R><c-W>)}//g<left><left>

【问题讨论】:

    标签: search vim replace escaping mapping


    【解决方案1】:

    我有这个功能:

    function! GetVisualSelection()
      let old_reg = @v
      normal! gv"vy
      let raw_search = @v
      let @v = old_reg
      return substitute(escape(raw_search, '\/.*$^~[]'), "\n", '\\n', "g")
    endfunction
    

    你可以这样使用:

    xnoremap <c-h> :<C-u>%s/<C-r>=GetVisualSelection()<CR>//g<left><left>
    

    “转义”部分可以提取到自己的函数中:

    function! Escape(stuff)
      return substitute(escape(a:stuff, '\/.*$^~[]'), "\n", '\\n', "g")
    endfunction
    

    你可以这样使用:

    nnoremap <c-h> :<C-u>%s/<C-r>=Escape(expand('<cword>'))<CR>//g<left><left>
    inoremap <c-h> <esc>:%s/<C-r>=Escape(expand('<cword>'))<CR>//g<left><left>
    

    【讨论】:

    • 几乎完美。我不知道我可以用等号调用任何函数,&lt;cWORD&gt; 也很有趣但是,我认为它与 yiw 这样的“单个单词”并不匹配。
    • &lt;cword&gt;iw 含义相同:它涵盖了word&lt;cWORD&gt;iW 含义相同:它涵盖了WORD。您可以根据需要使用其中一种。我将编辑我的答案以使用&lt;cword&gt;:它更符合您的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多