VIM 自动去除牙套

问题描述 投票:0回答:1

我刚刚发现如何让vim自动创建匹配的大括号:

inoremap { {}<Esc>ha
inoremap ( ()<Esc>ha
inoremap [ []<Esc>ha
inoremap " ""<Esc>ha
inoremap ' ''<Esc>ha
inoremap ` ``<Esc>ha

现在我想知道是否有一种方法可以在删除其中一个时自动删除匹配的大括号 使用 autobrace 插件会很容易,但我不想安装支撑插件 也许有一个可以自动删除的工具,或者有一种方法可以在没有pugins的情况下做到这一点?

期待您的建议

vim autocomplete
1个回答
0
投票

读完你的问题后,我的想法有两个:

  1. 使用自动命令和所有命令来检测删除并采取相应的行动,这听起来非常复杂,
  2. 或者像您已有的那样制作简单的映射。

我将选择第二个选项,但我们可以借此机会简化您当前的映射:

inoremap { {}<Esc>ha

通过删除不必要的模式切换:

inoremap { {}<Left>

那里,干净多了。

现在,以下正常模式映射应该可以让您接近您想要的位置:

nnoremap <key> va}o<C-c>m'gvo<C-c>"_x``"_x
  • 目视选择与
    va}
    ,
  • 配对
  • 使用
    o
    ,
  • 将光标移动到所选内容的另一端
  • 使用
    <C-c>
    ,
  • 退出可视模式
  • 使用
    m'
    ,
  • 创建上下文标记
  • 使用
    gv
    ,
  • 重新选择相同的视觉选择
  • 使用
    o
    ,
  • 将光标移动到所选内容的另一端
  • 使用
    <C-c>
    ,
  • 退出可视模式
  • 使用
    "_x
    ,
  • 将右大括号剪切到黑洞寄存器
  • 使用
    ``
    ,
  • 跳转到之前设置的上下文标记
  • 使用
    "_x
    将开口括号切割至黑洞对准。

请参阅

:help a}
:help 
v_o
, 
:帮助 v_ctrl-c
, 
:帮助 m'
, 
:帮助 gv
, 
:帮助 x
, and 
:帮助寄存器`。

由于

[{()}]
,视觉模式舞蹈对于
:help %
来说并不是绝对必要的,但它绝对是为了
"'`

有一些以

d
开头的可用组合:

dc dm dq dr ds du dx dy dz

所以选择你的毒药。假设您选择

dx
“领导者”,您最终应该得到以下结果:

nnoremap dx{ va}o<C-c>m'gvo<C-c>"_x``"_x
" etc.

请注意,文本对象

a{
作为几个同义词,
a}
aB
,因此您可能也想覆盖它们:

nnoremap dx{ va}o<C-c>m'gvo<C-c>"_x``"_x
nmap     dx} dx{
nmap     dxB dx{
" etc.

这也适用于

a(
。请注意非递归和递归映射的巧妙使用。

由于其中很多内容相当重复,您可能会考虑为重复部分创建一个“插头”映射:

xnoremap <Plug>(RemovePair) o<C-c>m'gvo<C-c>"_x``"_x
nnoremap dx{ va}<Plug>(RemovePair)
nmap     dx} dx{
nmap     dxB dx{

也就是说,使用环绕声

© www.soinside.com 2019 - 2024. All rights reserved.