如何在vim中用ctrl + h替换

时间:2014-05-26 21:03:24

标签: search vim replace escaping mapping

我想将< c-h> 映射到活动缓冲区中轻松“替换”

现在我有这样的事情:

" <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. 对于可视模式,我不粘贴选择,将光标下方的字词
  3. 无论如何都要做类似的事情:

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

1 个答案:

答案 0 :(得分:2)

我有这个功能:

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>

&#34;逃避&#34;部分可以被提取到它自己的函数中:

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>