如何使用一个键映射在光标下运行多行vimscript命令?
概述:1个问题+类似上下文的半个问题(在类似用例下) 目标: 我在缓冲区中有一些vimL代码,我想通过按键运行它们 说明: 类似于如何使用一个键映射在光标下运行多行vimscript命令?,vim,keyboard-shortcuts,Vim,Keyboard Shortcuts,概述:1个问题+类似上下文的半个问题(在类似用例下) 目标: 我在缓冲区中有一些vimL代码,我想通过按键运行它们 说明: 类似于gc{motion\u或\u text\u object}--键入'gcip'注释整个段落,或 'gc3j'注释4行。(安装tComment后) 或'>i}'缩进块,'4 拔掉那些线 执行:@“ 在视觉模式映射中: xnoremap <key> y:@"<CR> xnoremap y:@” 用法: vip<key> vip
gc{motion\u或\u text\u object}
--键入'gcip'
注释整个段落,或
'gc3j'
注释4行。(安装tComment后)
或'>i}'
缩进块,'4
拔掉那些线
执行:@“
在视觉模式映射中:
xnoremap <key> y:@"<CR>
xnoremap y:@”
用法:
vip<key>
vip
但是,坦率地说,保证映射太容易了。您需要一个自定义操作符来执行{motion}
移动的文本。当Vim将其转换为两个标记时,解决方案类似于可视化模式映射(只要您只想执行整行)。以下内容基于:help:map operator
:
nnoremap <F2> :set opfunc=ExecuteLines<CR>g@
function! ExecuteLines(type)
exec join(getline("'[","']"),"\n")
endfunction
nnoremap:set opfunc=ExecuteLinesg@
功能!执行线(类型)
exec join(getline(“[”,“]”),“\n”)
端功能
这样,您可以使用{motion}
执行这些行。要处理任意文本(而不仅仅是整行),您必须计算a:type
参数,并获取准确的文本,可能需要定义一个可视选择并将其拖动到寄存器中。您可能会发现我的vimteractive插件提供了您想要的功能,因为它允许您使用组合键Ctrl-S(以及许多其他REPL)将行从缓冲区发送到bash终端:
这绝对不是我想要的。请注意,在我对问题的描述中,我当前的解决方案“视觉选择”然后“按下”比您当前提出的解决方案更有效。我要问的是一种比这更有效的方法.“使用运算符挂起模式”对您意味着什么?还有“线魔法”?如果你想定义一个操作符,你不能简单地要求它(在阅读相应的帮助页面并尝试一些东西之后)?操作符挂起(带动作):“qr5j”运行当前行和下面的5行。运算符挂起(使用文本对象):“qrip”运行当前代码段。行魔术,6qr运行6行代码。请参见:h operator
,:h operator pending
和:h text object
我知道什么是“operator pending mode”,谢谢。但是“线魔法”在Vim中毫无意义。你想要的是一个“接线员”。。。您是否阅读了:help:map operator
?否,您当前的解决方案并不比我建议的解决方案更有效。operator-pending(带动作):“qr5j”运行当前行和下面的5行。运算符挂起(使用文本对象):“qrip”运行当前代码段。行魔术,6qr运行6行代码。请参阅:h ip
,:h operator
,:h operator pending
,:h text object
,以及类似的选项,--以防有人怀疑。对于可能想尝试上述keymap的人。注意:我已禁用宏映射q
,并使用q作为另一个引线键。此外,我还将“让mapleader=”“
作为我的主要领导密钥”。
vip<key>
nnoremap <F2> :set opfunc=ExecuteLines<CR>g@
function! ExecuteLines(type)
exec join(getline("'[","']"),"\n")
endfunction