在 vim 重映射中,如何 "capture" 和重用 "any" 字符?
In vim remapping, how do I "capture" and reuse "any" character?
在我的 .vimrc 中,我有以下内容,在插入模式下,很好地在行尾添加了一个分号,returns 将光标移到了它的原始位置:
inoremap <leader><leader>; <C-o>mp<C-o>A;<C-o>`p
除了 ANY/ALL 个字符,我该如何做同样的事情?例如,像这样的伪代码:
inoremap <leader><leader><any> <C-o>mp<C-o>A<any><C-o>`p
或者使用正则表达式,类似这样的伪代码...
inoremap <leader><leader>(\w) <C-o>mp<C-o>A<C-o>`p
甚至可以像这样捕获和重复使用吗?
我认为这符合您的要求:
inoremap <expr> <leader><leader> "<C-o>mp<C-o>A" . (nr2char(getchar())) . "<C-o>`p"
为了分解它,有一个名为 <expr>
的 inoremap 命令。此命令将 inoremap 更改为如下所示: inoremap <expr> {keys} {function}
当您按下 {keys}
部分中定义的键时,它将调用 {function}
部分中的函数并插入 return该函数的值。 {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
实际上并没有从映射本身获取,它只是提示用户输入一个字符,然后插入它。
在我的 .vimrc 中,我有以下内容,在插入模式下,很好地在行尾添加了一个分号,returns 将光标移到了它的原始位置:
inoremap <leader><leader>; <C-o>mp<C-o>A;<C-o>`p
除了 ANY/ALL 个字符,我该如何做同样的事情?例如,像这样的伪代码:
inoremap <leader><leader><any> <C-o>mp<C-o>A<any><C-o>`p
或者使用正则表达式,类似这样的伪代码...
inoremap <leader><leader>(\w) <C-o>mp<C-o>A<C-o>`p
甚至可以像这样捕获和重复使用吗?
我认为这符合您的要求:
inoremap <expr> <leader><leader> "<C-o>mp<C-o>A" . (nr2char(getchar())) . "<C-o>`p"
为了分解它,有一个名为 <expr>
的 inoremap 命令。此命令将 inoremap 更改为如下所示: inoremap <expr> {keys} {function}
当您按下 {keys}
部分中定义的键时,它将调用 {function}
部分中的函数并插入 return该函数的值。 {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
实际上并没有从映射本身获取,它只是提示用户输入一个字符,然后插入它。