Vim映射访问注册内容

时间:2018-03-28 10:01:07

标签: vim


我想写一个映射,使我可以像在正常模式下一样使用宏调用视线模式。所以选择一些并输入sdata = (('25.2748603820801', '55.327449798584'), ('25.2712', '55.298'), ('25.277031', '55.275226'), ('25.251389', '55.332222'), ('25.275397', '55.328213'), ('25.275397', '55.328213')) b = [{'lat':l1, 'lon':l2} for l1,l2 in sdata] i = 0 for cust in b: tempb = [{'lat':l1, 'lon':l2} for l1,l2 in sdata] tempb.pop(i) print(closest(tempb,cust)) i += 1 #value of b [{'lat': '25.2748603820801', 'lon': '55.327449798584'}, {'lat': '25.2712', 'lon': '55.298'}, {'lat': '25.277031', 'lon': '55.275226'}, {'lat': '25.251389', 'lon': '55.332222'}, {'lat': '25.275397', 'lon': '55.328213'}, {'lat': '25.275397', 'lon': '55.328213'}] 。到目前为止,我将打开命令行并对选择@<register>执行正常命令。因为:'<,'>norm @<resgister>应该是灵活的,我不想为每个寄存器名称定义一个映射(在如此多的视角中是错误的),我目前的方法是使用<register>映射结合{ {1}}函数调用。这就是我目前的草案的样子:

<expr>

我知道getChar()在这里不起作用。在vnoremap <expr> @ "=nr2char(getchar())<cr>:'<,'> norm @=<CR> 寄存器中现在存储了实际寄存器的名称,用户在此映射的@=之后键入。我现在如何使用=,以便在整个选择中执行存储在给定寄存器中的正确宏?
我想我必须使用@<expr>,但我不知道如何处理 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

由于表达式映射,您不需要通过表达式寄存器。相反,您只需返回将在所选行上调用宏的Ex命令,并将查询连接到其中:

:xnoremap <expr> @ ":norm @" . nr2char(getchar()) . "<CR>"
  • 对于可视模式映射,:命令将自动插入'<,'>范围。
  • :vmap适用于视觉和选择模式。可打印字符(如@左侧)应在选择模式下覆盖。因此,请使用:xmap