有没有一种方法可以检测我是否正在录制Vimscript?


11

有什么像

eval("is_recording()")

我可以调用vimscript来确定当前是否正在录制宏?我会以为这可行:

eval("mode(1)")

但这只是回报"n"

不知道这是否重要,但是我正在使用neovim,所以如果它是neovim独有的,那就可以了。


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

@VanLaser你的假名字是什么意思?
詹姆斯

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

Answers:


4

首先,我认为您的问题主要是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将设置为10停止录制时的方式。然后,您可以通过变量的值访问记录状态。

“缺点”是为了避免递归映射,您必须使用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我们看到了条目!

"a   isomething^[

有了这些知识,您应该能够“监视”寄存器以确认正在记录宏(在每个记录上使用命名寄存器[映射q以始终使用相同的寄存器(或类似的东西)])

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

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

这是来自:help registers可用寄存器的一些信息

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

  1. 未命名的寄存器“”

  2. 10个编号为“ 0至” 9的寄存器

  3. 小删除寄存器“-

  4. 26个命名寄存器“ a到z”或“ A到Z”

  5. 三个只读寄存器“:,”。,“%

  6. 备用缓冲区寄存器“#

  7. 表达式寄存器“ =

  8. 选择和删除寄存器“ *,” +和“〜”

  9. 黑洞寄存器“ _

  10. 最后搜索模式寄存器“ /

假设您现在拥有要使用的寄存器,问题将变成“我如何知道录制何时停止?”。为了解决这个问题,我来看看autocmd-eventfor CursorHold; 帮助文档中的注释看起来很有希望(我试图弄清楚如何区分普通cursorHold与为宏目的写入寄存器时发生的空闲/不存在事件)

光标保持

当用户在'updatetime'指定的时间内未按任何键时。直到用户按下一个键时才重新触发(即,如果您离开Vim来煮咖啡,则不会每隔'updatetime'ms触发一次。:)请参见| CursorHold-example |。用于预览标签。仅在正常模式下触发此事件。在等待键入命令参数或操作员后移动时不会触发该事件。在记录期间,不会触发CursorHold事件。| q |


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

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

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

我昨晚花了一些时间(砸了啤酒键盘后),发现很难准确地确定何时进行录制和结束录制。CursorHold由于CursorHold 实际发生的延迟,我的预感似乎是不可能实现的梦想(每次观看都会有一个简单的全局增量发生)。不过令人难以置信的兴趣来了一个办法做到这一点,并会继续砸我的脸靠在键,直到我们有一个解决方案..
丹·布拉德伯里

我认为您没有一千种不同的选择:您必须覆盖的行为,q并使其切换变量并开始/停止记录。这里的自动命令并不可靠,因为在按下按键时不会触发autocmd,并且由于Vim的单线程特性,因此无法进行轮询功能。祝您未来的实验
一切顺利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.