如何使用一个键映射在光标下运行多行vimscript命令?

时间:2016-11-24 14:45:02

标签: vim keyboard-shortcuts

概述:1个问题+类似情境的一半问题(在类似用例下)

目标: 我在缓冲区中有一些vimL代码,我想通过按键来运行它们。

描述

gc{motion_or_text_object}类似 - 键入'gcip'来评论整个段落,或 'gc3j'评论4行。 (安装tComment后)

'>i}'缩进块,'4<<'缩进4行。

当前部分解决方案: 目前我使用视觉模式和地图下方:

vnoremap <F2> :<c-u>exec join(getline("'<","'>"),"\n")<CR>

但有时使用操作员挂起模式更自然,有时则更自然 更好地使用线魔术。

  • 我怎样才能使操作员待机模式和/或线魔法工作?

类似用例

此外,我有一个部分解决方案来运行外部命令而不是vimscript命令。

" below nnoremap works for both single line and multiple line, 
" both 'qr' and '5qr' work.  (note the dot before w)
nnoremap qr :.w !bash -euo pipefail<CR>
vnoremap qr :w !bash -euo pipefail<CR>

适用于视觉选择和线条魔术;但目前我不知道如何修改它 它也适用于{motion_or_text_object}。

  • 任何线索?使其适用于操作员待定模式??

3 个答案:

答案 0 :(得分:2)

您需要一个自定义运算符来执行{motion}移动的文本。当Vim将其转换为两个标记时,解决方案类似于您的可视模式映射(只要您只想执行整行)。以下内容基于:help :map-operator

nnoremap <F2> :set opfunc=ExecuteLines<CR>g@
function! ExecuteLines(type)
    exec join(getline("'[","']"),"\n")
endfunction

有了这个,您可以使用<F2>{motion}执行这些行。要处理任意文本(不仅仅是整行),您必须评估a:type参数,并获取确切的文本,可能是通过定义视觉选择并将其放入寄存器。

答案 1 :(得分:1)

  1. Yank那些线。
  2. 执行:@"
  3. 在可视模式映射中:

    xnoremap <key> y:@"<CR>
    

    用法:

    vip<key>
    

    但是,坦率地说,保证映射太容易了。

答案 2 :(得分:-1)

您可能会发现我的vimteractive插件提供了所需的功能,因为它允许您使用组合键Ctrl-S(以及许多其他REPL)将缓冲区中的行发送到bash终端:

https://github.com/williamjameshandley/vimteractive