是否有类似

eval("is_recording()")


的东西,我可以在我的vimscript中调用以了解当前是否正在录制宏?我本以为这样可以用:

eval("mode(1)")


但这只是返回"n"。因此,如果它是neovim专有的,那就没关系。

评论

恕我直言,这将是一个坏主意-在这种情况下,“录制”将变成一个虚假名称:)不知道您要做什么,但也许问这个问题可能会提供不同的解决方法。 >
@VanLaser你的假名字是什么意思?

如果Vim动作在录制时有所不同,则表示录制过程本身会影响该动作,此时该动作仅应“存储”以供以后重复。您在运行宏时会发生什么?

#1 楼

首先,我认为您的问题主要是XY问题。您应该给我们更多有关您最终想要做什么的信息,我想我们可以找到另一个解决方案。

现在这是一种解决方法,它可能不是理想的方法,当然也不是很可靠,但是您可以将这些行添加到您的.vimrc中:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction


这样的想法是,当您在正常模式下按q时,“记录模式”将被唯一切换。

基于此,您将创建一个变量g:isRecording,该变量将在您每次开始或停止录制时切换。这样,当您开始记录g:isRecording时,它将被设置为1,而当您停止记录时将被设置为0。然后,您可以通过变量的值访问记录状态。

“缺点”是为了避免递归映射,您必须使用Shit-q来开始和停止记录而不是q 。 (请注意,这不是什么大问题:我一段时间以来一直使用shift-q切换记录模式,因为我不喜欢原始的shift-q行为)

主要问题此解决方案的一个解决方案是,如果您忘记了它并使用q,则不会切换该变量,但不能禁用q(例如,使用nnoremap q <nop>),因为如果执行shift-q,将无法再使用它。

#2 楼

这是一个非常奇怪的请求,因为没有用于记录宏的“模式”。在浏览了一些文档之后,我在usr_10中找到了以下内容:首先移至第一行的第一个字符。接下来
,您将执行以下命令:

qa开始在寄存器a中记录宏。

^移至行首。

i#include“在行的开头插入字符串#include”。

$移至行的末尾。

a “将字符双引号(”)附加到该行的末尾


j转到下一行。

q停止录制宏。


对我来说,最突出的事情是关于“开始在寄存器a中记录宏”这一行:

由于每个宏都将被保存到寄存器中默认情况下,我希望我们能够在:reg列表中看到它。

示例:

在正常模式下:qaisomething<Esc>

:reg内部我们看到该条目!<有了这一知识,您应该能够“窥探”寄存器,以确认正在记录宏(在每个记录上都使用一个命名寄存器[映射q到总是使用相同的寄存器(或类似的寄存器)]

如果遇到问题,请告诉我,我会尽力帮助您(因为该功能对我也是新的:D)

edit
要解决在yank期间使用寄存器的问题,我建议研究一种特殊类型的寄存器,该寄存器只能用于您正在编写的vimL(不要yank曾经使用过寄存器("ay))

有关可用寄存器的:help registers的一些信息


寄存器有十种类型:寄存器E354


未命名的寄存器“”
10个编号的寄存器“ 0至” 9
小删除寄存器“-
26个命名的寄存器” a至“ z或” A至“ Z
三个只读寄存器“:,”。,“%
备用缓冲寄存器”#
表达式寄存器“ =
选择和删除寄存器” *,“ +和”〜
黑洞寄存器“ _
上一个搜索模式寄存器” /



假设您有一个要使用的寄存器,现在问题变为“我怎么知道什么时候记录停止了?”。要解决这个问题,我将看一看autocmd-event对于CursorHold;帮助文档中的注释看起来很有希望(我会尝试弄清楚如何区分正常cursorHold与为宏目的写入寄存器时发生的空闲/不存在事件。


CursorHold

当用户没有在由'updatetime'指定的时间
内不按任何键。重新触发
,直到用户按下某个键(即如果您离开Vim来煮咖啡,不会
每'updatetime'ms触发一次。 :)请参见| CursorHold-example |
以获取预览标签。
仅在普通模式下触发此事件。
在等待键入命令
参数时不会触发此事件。 ,或
运算符之后的移动。
在记录CursorHold事件时不会触发
。 | q |


评论


我真的看不出它是如何解决问题的:当您完成对宏的录制后,字符串将保存在寄存器中,但是当寄存器包含宏或包含来自yank命令的内容时,如何区分。另外,完成录制后,寄存器会保存为一张照片,因此当您看到寄存器的内容已更改时,就不再处于录制模式。

–statox♦
16 Mar 23 '16 at 20:28

我的希望是,您将能够使用黑洞寄存器(一种永远不会被淘汰的寄存器)之类的东西。如果您已锁定该寄存器,则可以在记录模式下签出CursorHold,它具有某些特殊行为(将用更多信息更新我的答案,以查看是否有帮助)

–丹·布拉德伯里(Dan Bradbury)
16 Mar 23 '16 at 20:59

在其他寄存器上添加了一些信息(避免与yank发生冲突的方式),并提示了我们如何能够在宏录制期间CursorHold不处于活动状态的情况下捕获“录制”。如果您在这些说明后仍在与之抗争,请告诉我,我可以在工作结束后尝试实施。需要注意的是,黑洞寄存器只是作为提示和一个有趣的vim花絮而提到的,它可能会导致某些事情(在记录宏时,它不会有用;因为@_无法使用。)实际上,您甚至无法尝试保存宏到它。

–丹·布拉德伯里(Dan Bradbury)
16-3-23在21:08



我昨晚花了一些时间(砸了啤酒键盘后),发现很难准确地确定何时进行录制和结束录制。由于CursorHold实际发生的滞后(每次观看时都会发生一个简单的全局增量),因此我对CursorHold的预感似乎是不可能实现的梦想。仍然对提出一种解决方案的方式非常感兴趣,并将继续在按键上砸我的脸,直到我们找到解决方案为止。

–丹·布拉德伯里(Dan Bradbury)
16 Mar 25 '16 at 0:11

我认为您没有一千种不同的选择:您必须覆盖q的行为,并使其切换变量并开始/停止记录。这里的自动命令并不可靠,因为在按下按键时不会触发autocmd,并且由于Vim的单线程特性,因此无法进行轮询功能。祝您今后的实验工作顺利:-)

–statox♦
16 Mar 25 '16 at 6:41