gpt4 book ai didi

vim - "execute normal"之后从插入模式返回正常模式

转载 作者:行者123 更新时间:2023-12-03 03:26:18 27 4
gpt4 key购买 nike

您可以在 Ex 模式下以编程方式执行正常模式命令,例如通过执行正常

:execute "normal" "iNEWTEXT\<Esc>0"

这会切换到插入模式 (i),写入“NEWTEXT”,转义到正常模式 (\< Esc>),然后移动到行的开头 (0)。

但是,使用非常量字符串(寄存器或变量),行为会有所不同。例如,假设您将上面相同的命令保存在任何文件(不一定是 vimscript 文件)的一行中:

iNEWTEXT\<Esc>0

然后,您可以通过 "zy$ 将文本复制到任何寄存器(此处为 z),并通过 @z 执行寄存器。不过,这一次,输出不同的是:

NEWTEXT\<Esc>0

进入插入模式后,Escape 不再被视为特殊字符,而是按字面意思处理。像\e 这样的替代形式也不起作用。有没有解决的办法?

编辑:使用 Ingo 的答案,我创建了以下函数。基本上,其用途是在文件文本中嵌入一组普通/插入命令,并能够执行它们。更常见的是,类似的东西用于 running Ex commands from a line of text ,但我找不到任何在正常和插入模式下执行此操作的东西。

因此,您的文件中将包含如下所示的文本:

jy10j10jpO\<Esc>jEll

当在该行上时,您可以调用该函数或重新映射,并且将执行命令(在本例中,复制并粘贴 10 行,并将 2 列移动到第一个单词之后)。 Ingo 的替代方案更适合认真使用,即从另一个文件获取命令,将命令放在 .vimrc 中,或者文件类型特定的选项。由 session 保存的宏也同样有效,并且比将命令分散在文件中更实用。就我而言,我正在跨多个设备同步,并且不想有另一个文件或用这个非常具体的命令弄乱我的 vimrc,但不介意弄乱这个特定文件本身。可以将其视为可移植的宏。

" Execute current line as Vim normal mode commands.
nnoremap <A-y> :call EvaluateLineAsNormalModeCmd()<CR>

function! EvaluateLineAsNormalModeCmd()
let g:getCurrentLine = getline(".")
"have to :execute twice: once to get the contents of the
"register inserted into a double-quoted string, and then once for
"the :normal to evaluate the string.
execute 'execute "normal" "' . g:getCurrentLine . '"'
endfunction

EDIT2/3:以下是使用 Christian Brabandt 答案的两个函数。它们的工作原理大致相同,但可以在最后将用户置于插入模式(而根据我的最少信息,其他上下文中的“i”被认为是不完整的命令并且不会执行,并且 :startinsert 不能用于那种情况)。 PS:请不要问我所有这些单引号和双引号是做什么的,因为我无法理解它O_o

function! EvaluateLineAsNormalModeCmd()
normal! 0y$
execute ':call feedkeys("'.@".'", "t")'
endfunction

function! EvaluateLineAsNormalModeCmd()
let g:getCurrentLine = getline(".")
execute ':call feedkeys("'.g:getCurrentLine.'", "t")'
endfunction

最佳答案

如果你确实需要这个(用例是可疑的),你必须 :execute 两次:一次将寄存器的内容插入双引号字符串中,然后一次 for :normal 来评估字符串。

:execute 'execute "normal" "' . @z . '"'

PS:请提供更多背景信息;你的最终目标是什么?当问题仅涉及一个小的技术步骤时,很难提供好的答案。如果您不告诉我们为什么您想要这个,很容易屈服于 XY problem .

关于vim - "execute normal"之后从插入模式返回正常模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26884104/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com