在我的 .vimrc 中,我有以下内容,在插入模式下,很好地在行尾添加一个分号并将光标返回到其原始位置:

inoremap <leader><leader>; <C-o>mp<C-o>A;<C-o>`p

除了对任何/所有字符,我怎么能做同样的事情?例如,像这样的伪代码:
inoremap <leader><leader><any> <C-o>mp<C-o>A<any><C-o>`p

或者使用正则表达式,类似于这个伪代码......
inoremap <leader><leader>(\w) <C-o>mp<C-o>A$1<C-o>`p

甚至有可能像这样捕获和重用吗?

最佳答案

我认为这可以满足您的要求:

inoremap <expr> <leader><leader> "<C-o>mp<C-o>A" . (nr2char(getchar())) . "<C-o>`p"

为了分解它,有一个用于 inoremap 的命令,称为 <expr> 。此命令将 inoremap 更改为如下所示: inoremap <expr> {keys} {function} 当您按下 {keys} 部分中定义的键时,它将调用 {function} 部分中的函数并插入该函数的返回值。 {function} 部分中引号中的任何内容都将被插入。所以,这里是功能部分的分割:
"<C-o>mp<C-o>A" . (nr2char(getchar())) . "<C-o>`p"
       ^                   |                 ^
       |-------------------|-----------------|
These just do              |
what the original          |
mapping does               |
                  This just gets a single character
                  from the user and concatenates it to your
                  original mapping, in place of the ';'

阅读这些以获取有关这些主题的更多信息:
:help :map-<expr>
:help getchar()
:help nr2char()

注意: getchar 实际上并不取自映射本身,它只是提示用户输入一个字符,然后插入它。

10-08 16:35