我正在尝试定义一个vi'map'命令序列,它将当前单词包装在HTML标记内,例如B(粗体)标签。地图定义如下:
:map K ebi<B><esc>ea</B><esc>
地图以动画“eb”开头,移动到所选单词的开头, 假设最可能的光标位置是单词或的开头 在中间。问题是,如果光标在最后一个上,它就不起作用 这个词的字符 - 然后将包裹下面的单词。
是否有一个技巧可以让这个地图可靠地用于任何带有单词的光标位置?
答案 0 :(得分:5)
如果这是一张一张地图,那很好,但是如果你想做更多,或者更频繁地做,那么使用surround.vim
的文字对象要好得多如果您使用该脚本,则可以(在正常模式下)
ysiwtb>
你必须按字面意思输入。 ys
是告诉surround.vim听取文本动作。 iw
会选择您当前所在的字词。 t
告诉您要使用标记进行环绕。 b>
告诉您要使用哪个标记。
即使您不想使用surround.vim,也可以考虑在地图中使用文本对象(:help text-objects
)。 iw
或inner-word
文本对象就是你想要的,但我还不知道如何在地图中包装它。
:map K viwO<Esc>i<b><Esc>lviw<Esc>a</b><Esc>
这会将光标留在结束标记的结束>
上。它应该在光标最初的任何地方都能正常工作。
但正如我所说,surround.vim更可取。
答案 1 :(得分:2)
另一种方法: 删除内部字(diw),插入标签,找到最后一个&lt;,插入删除。
:map K diwi<b></b><Esc>F<P
closetag.vim : Functions and mappings to close open HTML/XML tags 可能有意义。
答案 2 :(得分:1)
如果您想要更全面的解决方案,可以尝试XPTemplate它可以为您提供周边环境。只需选择您的文字,输入选择好的片段(我认为)并输入您的标签名称,但如果您愿意,可以添加一个特殊模板。
此外,使用各种语言是一个非常好的工具,正如您在video
中看到的那样答案 3 :(得分:0)
改用lb。
移动到当前的结尾,或者如您所见,移动到下一个单词。 b如果你在第一个字符上,则移动到当前单词或前一个单词的开头。为了防止搬到 在第一个角色的情况下,前一个单词,移动 右边一个字符。即使你在这个词的最后一个字母上, b会带你到正确的位置。
所以你的整行将是:
:map K lbi<B><esc>ea</B><esc>