MongoDB - EDITOR变量 - MongoDB shell - Windows 7 在Windows 7上的MongoDB shell中,如何设置EDITOR变量?

3

在Windows 7上,EDITIOR变量功能真的有效吗?

我正在阅读一篇文章,说只要我们在.mongorc.js中设置EDITOR变量,就可以在shell中直接输入edit var_name,然后var_name将会在编辑器(我的情况是UltraEdit)中加载进行编辑。完成更改后,我们只需保存并退出编辑器;然后变量将被解析并重新加载回shell。加粗斜体部分对我不起作用。

它只是让我保存一些js文件到桌面?!

有什么想法吗?

编辑:

我注意到如果将其设置为记事本(“notepad.exe”),它可以正常工作。但是,如果将其设置为UltraEdit(“uedit32.exe”),它的效果并不像人们期望的那样。

3个回答

4
EDITOR 环境变量在 Windows 上可用,但在 MongoDB 2.4 中似乎有几个影响可用性的因素。当您使用 edit 命令时,mongo shell 会将该变量的内容写入临时 JavaScript 文件,并使用此文件路径启动外部编辑器。然后,shell 会等待编辑器退出并检查返回代码。如果以下情况发生,则无法正常工作:
- 外部编辑器具有多文档界面并且已经打开了其他文档。 - 外部编辑器没有返回预期的 0(无错误)返回代码。
解决方法:
- 限制自己只使用单个文档编辑器来设置 EDITOR。虽然 notepad.exe 可用,但可能有更强大的编辑器包括 JavaScript 语法突出显示。 - 如果您正在开发复杂的 JavaScript 函数,则可能希望将它们放在外部文件中。您可以使用 load("/path/to/file.js") 将最新版本的 JS 文件重新加载到 shell 中。
UltraEdit 的一些额外用户体验细节:
- (运气好的话可行)如果在从 mongo shell 调用 edit 之前没有打开 UltraEdit 并且不打开任何额外的选项卡,则它将作为外部编辑器工作。您应该能够成功地使用 editmongo shell 启动 UltraEdit,编辑变量,并在关闭 UltraEdit 时保存结果。UltraEdit 会提示在相同位置保存更新的 JS 文件。 - (无法正常工作)如果 UltraEdit 已经打开并且有其他文档选项卡,则它具有不同的行为。来自 mongo shell 的 edit 命令将打开一个新选项卡,但是当您关闭此选项卡(以保存更改)时,UltraEdit 会提示 "另存为" 对话框。UltraEdit 会保存 JS 文件,但显然没有返回预期的退出代码,因此 mongo shell 不知道 JS 文件已更新并应重新加载。
编辑:感谢 UltraEdit Expert 的建议,我找到了一个配置设置,可以使 UltraEdit 正常工作。
  • 打开配置设置(高级 > 配置 菜单)
  • 应用程序布局 > 杂项 下,启用 为从外部应用程序打开的每个文件维护单独的进程 设置的复选框
  • 重新启动UltraEdit(该设置似乎要到下次启动才能生效)

启用“单独进程”设置后,您现在应该能够将UltraEdit用作外部EDITOR并在关闭从mongo shell打开的编辑选项卡时看到更改的反映。


我考虑在MongoDB问题跟踪器中提出改进建议,但我不确定是否有更好的方法让外部编辑器通用地指示“我已完成编辑”。这种$EDITOR变量的使用与其他Linux/Unix应用程序一致。如果您需要更高级的功能,您可以考虑使用替代管理界面,看看是否有更适合您工作流程的东西。 - Stennie
我正在使用Notepad++,但它无法保存我的文件。确保编辑器中只打开一个文件可以使其正常工作。如果有多个文件打开,则mongo-opened js文件将无法保存。 - Brettski

2

我的回答是关于Stennie上面已经写的一些内容的补充,因为它太长了无法添加为评论。

看起来 mongo 不是通过观察传递给调用编辑器的文件的文件状态(文件大小、文件日期、文件属性)来确定文件更改,而是通过调用的编辑器应用程序的执行状态。

UltraEdit 默认配置为在同一实例中打开所有文件。因此,每次使用一个或多个文件名的命令行调用 uedit32.exe 都会启动 UltraEdit 的新实例,该实例加载配置设置,检测到应该使用单个实例,并在进程列表中搜索是否有已运行的 UltraEdit 实例。如果已经存在另一个 UltraEdit 实例,则刚刚启动的实例将文件的名称传递给其他 UltraEdit 实例,然后终止自己。

这种行为看起来像在调用 mongo 期间未对文件进行任何更改。

有几种可能的方法可以更改此行为,以便在 mongo 调用要编辑的文件时始终使用 UltraEdit 的一个实例。

首先,有一个命令行选项 /fni,意思是 "force new instance"。如果在编辑器的定义中将此命令行选项作为第一个参数放在 uedit32.exe 之后,那么由 mongo 调用创建的 UltraEdit 新实例永远不会查找已经运行的实例,并在其自己的实例中打开其命令行上的所有文件。

其次,在 高级 菜单下的 配置 中的 应用程序布局 分支的 杂项 设置中,可以打开 允许多个实例 选项,以默认使用多个 UltraEdit 实例。

第三,在未启用 允许多个实例 的情况下,可以勾选设置 维护从外部应用程序打开的每个文件的独立进程,此设置可在 UltraEdit v18.10 版本后可用,以使 UltraEdit 成为 mongo 的编辑器。


很酷,感谢您的建议!我尝试了所有三种方法 :). 将 /fni 添加到 EDITOR 变量中不起作用(它会混淆路径解析,编辑器无法启动)。设置“允许多个实例”有点奏效..但必须关闭 UltraEdit 才能看到更改。最终选项“保持单独进程”是赢家:从 mongo shell 中的 edit 命令打开一个新标签页,并关闭标签页以发送正确的退出代码以重新加载 JavaScript 文件。 - Stennie
将/fni添加到EDITOR变量中并没有起作用...我本来就猜到了,但还是值得一试。设置“允许多个实例”有点起作用...因为设置只在退出uedit32.ini时写入,所以需要退出UltraEdit才能使此设置对于在更改此设置并从同一个uedit32.ini中读取它后启动的其他UltraEdit实例也生效。然而,第三个选项对于这种情况来说是完美的,我很高兴我能帮忙。感谢您测试我提出的所有3个建议。 - Mofi
三个里面有两个不错。至少最后一个选项起作用了。 - Stennie

1
大部分文档自然而然地与Unix变体有关。这在文档本身中会显而易见。
在您的情况下,在mongorc.js中设置变量将提供一个启动编辑命令助手的东西,但结果不会像Unix方式那样返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接