在vim重映射中,我如何"捕获"并重用"任何"字符?

pjb*_*pjb 3 vim

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

inoremap <leader><leader>; <C-o>mp<C-o>A;<C-o>`p
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做但是对于任何/所有角色?例如,像这样的伪代码:

inoremap <leader><leader><any> <C-o>mp<C-o>A<any><C-o>`p
Run Code Online (Sandbox Code Playgroud)

或者使用正则表达式,像这样的伪代码...

inoremap <leader><leader>(\w) <C-o>mp<C-o>A$1<C-o>`p
Run Code Online (Sandbox Code Playgroud)

是否有可能像这样捕获和重用?

Eve*_*ree 6

我认为这样做你想要的:

inoremap <expr> <leader><leader> "<C-o>mp<C-o>A" . (nr2char(getchar())) . "<C-o>`p"
Run Code Online (Sandbox Code Playgroud)

为了分解,有一个名为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 ';'
Run Code Online (Sandbox Code Playgroud)

阅读以下有关这些主题的更多信息:

:help :map-<expr>
:help getchar()
:help nr2char()
Run Code Online (Sandbox Code Playgroud)

注意: getchar实际上并没有从映射本身获取,它只是提示用户输入一个字符,然后插入它.