Vim 在“插入”之后从插入模式返回正常模式;执行“正常”;
您可以在Ex模式下通过执行normal以编程方式执行normal模式命令,例如Vim 在“插入”之后从插入模式返回正常模式;执行“正常”;,vim,Vim,您可以在Ex模式下通过执行normal以编程方式执行normal模式命令,例如 :execute "normal" "iNEWTEXT\<Esc>0" 进入插入模式后,转义不再被视为特殊字符,而是按字面理解。像\e这样的替代形式也不起作用。有办法解决这个问题吗 编辑:使用Ingo的答案,我创建了以下函数。基本上,其用途是在文件文本中嵌入一组普通/插入命令,并能够执行它们。更常见的是,类似的东西被用于,但我找不到任何东西可以在正常模式和插入模式下做到这一点 因此,文件中有如下文本:
:execute "normal" "iNEWTEXT\<Esc>0"
进入插入模式后,转义不再被视为特殊字符,而是按字面理解。像\e这样的替代形式也不起作用。有办法解决这个问题吗
编辑:使用Ingo的答案,我创建了以下函数。基本上,其用途是在文件文本中嵌入一组普通/插入命令,并能够执行它们。更常见的是,类似的东西被用于,但我找不到任何东西可以在正常模式和插入模式下做到这一点
因此,文件中有如下文本:
jy10j10jpO\<Esc>jEll
如果您真的需要它(用例是可疑的),您必须执行两次:执行两次:一次将寄存器的内容插入双引号字符串,然后执行一次:normal
,对字符串进行求值
:execute 'execute "normal" "' . @z . '"'
注:请提供更多的背景资料;你的最终目标是什么?当一个问题只涉及一个小的技术步骤时,很难给出一个好的答案。如果你不告诉我们你为什么想要这个,很容易屈服于。我宁愿使用feedkeys()
函数。例如,对于您的样品,这应适用于:
exe ':call feedkeys("'.@".'", "t")'
(如果您将行拖动到未命名寄存器中,否则请相应调整寄存器名称)。注意,引用可能会变得难看
为了了解正在发生的事情,我们要做的是:
exe ':call feedkeys(' - First part of the feedkeys() function call
" - Start of Quote for the first argument
. - String concatenation
@" - content of the unnamed register
. - String concatenation
' - Start of second part of the feedkeys function call
" - End of Quote for the first argument
, "t")' - Second argument of feedkeys() function call
您也可以通过以下两个步骤完成:
exe ':let a="'. @". '"' - Also needs to quote @" correctly.
call feedkeys(a, 't')
这应该更容易理解。exe调用只是将规范化的键符号转换为文字键。您是否尝试过使用^[
?(即
)更改\
序列尝试过这一点,但它也遇到了同样的问题:一切都是按字面意思来理解的。Ingo的双执行功能解决了这个问题。这并不意味着不透明;很难知道包含太多信息的行在哪里。无论如何,我有一个文件可以跨多台计算机共享(通过同步应用程序,即BTSync).我定期对其执行一系列命令,例如复制和粘贴某段文本。将命令保存在宏中(并在会话中还原)可以工作,但需要在每台不同的计算机上完成。我想我应该将命令保存为文件中的文本,然后从那里简单地执行它。我的用例的可疑性是否意味着有更好的方法可以做到这一点?我乐于接受想法。感谢您的解释。您可以将命令作为command.vim
Vimscript文件同步到real file和:source
它们。或者,如果您同步.vimrc
(可能通过其他方式),您可以在那里定义一个命令,甚至可以定义一个自定义文件类型(+带有缓冲区本地命令的插件)。谢谢。这很有效。我不确定这个解决方案是否会出现在我身上。需要了解更多关于双引号等的信息。:source
文件的选项可以工作,但它只是一个命令,所以看起来有点重。命令本身有点不稳定(容易发生小的调整)具体来说,所以我也不认为在.vimrc.中使用它是完美的。现在我的文件中有一行类似于jv10jy10jpO\jEll
,我从那里运行它。在所有情况下使用这样一行都不是非常实用或可能的,但在这里对我来说非常有用,因为我不关心文本,可以在vimrc中同步重新映射。丑陋?我相信这个词是正确的“难以置信”。双引号和单引号我想我可以通过阅读来理解:h expr quote,但未命名寄存器(@)中的句点是什么是吗?它们似乎不是字符串连接运算符,因为我不确定连接的是什么。它基本上是一个feedkeys调用,需要由exe
计算,以便正确翻译键符号。(我将相应地更新答案,以便更容易阅读)
:execute 'execute "normal" "' . @z . '"'
exe ':call feedkeys("'.@".'", "t")'
exe ':call feedkeys(' - First part of the feedkeys() function call
" - Start of Quote for the first argument
. - String concatenation
@" - content of the unnamed register
. - String concatenation
' - Start of second part of the feedkeys function call
" - End of Quote for the first argument
, "t")' - Second argument of feedkeys() function call
exe ':let a="'. @". '"' - Also needs to quote @" correctly.
call feedkeys(a, 't')