我想写一个映射,使我可以像在正常模式下一样使用宏调用视线模式。所以选择一些并输入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>
,但我不知道如何处理
谢谢你的帮助!
答案 0 :(得分:2)
由于表达式映射,您不需要通过表达式寄存器。相反,您只需返回将在所选行上调用宏的Ex命令,并将查询连接到其中:
:xnoremap <expr> @ ":norm @" . nr2char(getchar()) . "<CR>"
:
命令将自动插入'<,'>
范围。:vmap
适用于视觉和选择模式。可打印字符(如@
左侧)应在选择模式下覆盖。因此,请使用:xmap
。