Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 在“插入”之后从插入模式返回正常模式;执行“正常”;_Vim - Fatal编程技术网

Vim 在“插入”之后从插入模式返回正常模式;执行“正常”;

Vim 在“插入”之后从插入模式返回正常模式;执行“正常”;,vim,Vim,您可以在Ex模式下通过执行normal以编程方式执行normal模式命令,例如 :execute "normal" "iNEWTEXT\<Esc>0" 进入插入模式后,转义不再被视为特殊字符,而是按字面理解。像\e这样的替代形式也不起作用。有办法解决这个问题吗 编辑:使用Ingo的答案,我创建了以下函数。基本上,其用途是在文件文本中嵌入一组普通/插入命令,并能够执行它们。更常见的是,类似的东西被用于,但我找不到任何东西可以在正常模式和插入模式下做到这一点 因此,文件中有如下文本:

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

: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')