有什么像
eval("is_recording()")
我可以调用vimscript来确定当前是否正在录制宏?我会以为这可行:
eval("mode(1)")
但这只是回报"n"
。
不知道这是否重要,但是我正在使用neovim,所以如果它是neovim独有的,那就可以了。
有什么像
eval("is_recording()")
我可以调用vimscript来确定当前是否正在录制宏?我会以为这可行:
eval("mode(1)")
但这只是回报"n"
。
不知道这是否重要,但是我正在使用neovim,所以如果它是neovim独有的,那就可以了。
Answers:
首先,我认为您的问题主要是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将无法继续工作。
这是一个非常奇怪的请求,因为没有用于记录宏的“模式”。在浏览了一些文档之后,我发现了以下内容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
未命名的寄存器“”
10个编号为“ 0至” 9的寄存器
小删除寄存器“-
26个命名寄存器“ a到z”或“ A到Z”
三个只读寄存器“:,”。,“%
备用缓冲区寄存器“#
表达式寄存器“ =
选择和删除寄存器“ *,” +和“〜”
黑洞寄存器“ _
最后搜索模式寄存器“ /
假设您现在拥有要使用的寄存器,问题将变成“我如何知道录制何时停止?”。为了解决这个问题,我来看看autocmd-event
for CursorHold
; 帮助文档中的注释看起来很有希望(我试图弄清楚如何区分普通cursorHold与为宏目的写入寄存器时发生的空闲/不存在事件)
光标保持
当用户在'updatetime'指定的时间内未按任何键时。直到用户按下一个键时才重新触发(即,如果您离开Vim来煮咖啡,则不会每隔'updatetime'ms触发一次。:)请参见| CursorHold-example |。用于预览标签。仅在正常模式下触发此事件。在等待键入命令参数或操作员后移动时不会触发该事件。在记录期间,不会触发CursorHold事件。| q |
blackhole register
是,它只是作为提示和一个有趣的vim花絮而提到的,它可能会导致某些事情(在录制宏时,它不会有用;因为@_不能使用。)实际上,您甚至无法尝试保存宏。它..
CursorHold
由于CursorHold
实际发生的延迟,我的预感似乎是不可能实现的梦想(每次观看都会有一个简单的全局增量发生)。不过令人难以置信的兴趣来了一个办法做到这一点,并会继续砸我的脸靠在键,直到我们有一个解决方案..
q
并使其切换变量并开始/停止记录。这里的自动命令并不可靠,因为在按下按键时不会触发autocmd,并且由于Vim的单线程特性,因此无法进行轮询功能。祝您未来的实验