如何在 {string} 所在的位置用之前的“*”搜索结果预填充替代命令?

How can I pre-fill a substitute command with the result of the previous `*` search in the position where the {string} goes?

我目前使用以下映射将最后一个搜索模式的结果替换为整个缓冲区中的新词:

nnoremap <Leader>sa :%s///g<left><left>

我想把最后一个搜索模式的结果放在新词所在的地方。

示例:

  1. 假设我的光标停在“你好”这个词上
  2. 然后我按*
  3. 然后我用 <Leader>sa
  4. 调用映射

至此,我的命令行填满了:%s///g。我想要的是 :%s//hello/g.

我尝试了下面的映射,但它添加了我不想要的整个单词分隔符(\<\>)。

nnoremap <Leader>sa :%s///g<left><left><C-r>/

获取光标下的单词,但是必须调用expand发送回车符return

nnoremap <Leader>sa :%s///g<left><left><C-r>=expand("<cword>")<CR>

支持视觉选择和多个单词的一种方法是拉出要替换的文本,然后使用 <C-r>"

进行搜索

nnoremap <Leader>sa :%s///g<left><left><C-r>"

您可以进行视觉选择,按 y,然后按 <leader>sa 进行替换,或按 /<C-r>" 进行搜索。

编辑

阅读上面的说明后,这里有一种不同的方法来做(几乎)同样的事情:

  1. 进行视觉选择
  2. *
  3. 键入 cgn<C-r>"2(例如,将“ThisIsAVeryLongVariable”更改为“ThisIsAVeryLongVariable2”)
  4. 每按一次 . 将重复替换

--- 编辑 ---

经过一些非常需要的澄清,我认为最简单的方法是在替换部分使用 :help s/\&

nnoremap <key> :%s//&/g<left><left>

如果你真的需要更直观的方法,你可以 trim \<\>,像这样:

nnoremap <key> :%s//<C-r>=substitute(@/,'\<\|\>','','g')<CR>/g<left><left>

你应该得到这样的东西:

:%s//hello/g

光标在 hello 之后,准备进一步编辑。

--- 结束编辑 ---

在命令行模式下,:help c_ctrl-r_ctrl-w 在光标下插入单词:

nnoremap <key> :%s///g<left><left><C-r><C-w>