从命令行打开编辑器并获取输入
Open Editor From Command Line and Fetch Input
我目前正在为 CocoaPods、Ruby gem 开发一项功能。有一个接受多个选项的现有命令。我想添加一个额外的选项,使用户能够通过打开默认文本编辑器输入自定义消息,并且当用户保存并退出编辑器时,该消息被馈送到已执行的命令中。
我想复制的是如何将 -m
添加到 git commit
命令以让您输入提交消息。我没有创建命令行工具的经验,因此非常感谢您的帮助。
目标是执行特定命令 command --message
,打开编辑器,让用户输入自定义消息,然后执行命令,自定义消息是存储在 [=13= 中的参数之一].
常见的工作流程是:
- 调用者应用程序创建一个临时文件;
- 确定默认编辑器(对于基于 Debian 的系统,它将是
/usr/bin/editor
,对于其他 linuces — shell 变量 $EDITOR
等的内容);
- 在带有
Kernel#system
的子 shell 中运行 shell 命令(不带反引号!);
- 等待它退出;
- 判断退出码,不是
0
; 则跳过
- 读取在步骤 1 中创建的临时文件的内容并删除该文件。
在 ruby 中是这样的:
▶ f = Tempfile.new 'cocoapods'
#⇒ #<File:/tmp/am/cocoapods20151120-6901-u2lubx>
-rw------- 1 am am 0 nov 20 15:03 /tmp/am/cocoapods20151120-6901-u2lubx
▶ path = f.path
#⇒ "/tmp/am/cocoapods20151120-6901-u2lubx"
▶ f.puts 'This content is already presented in file'
#⇒ nil
▶ f.close # HERE MUST BE ENSURE BLOCK, BUT FOR THE SAKE OF AN EXAMPLE...
#⇒ nil
▶ system "editor #{path}"
#⇒ Vim: Warning: Output is not to a terminal
如果您在控制台中测试它,只需键入任何内容,然后按 Esc:wq。在现实生活中会打开正常的 vim
(或默认编辑器)。
▶ File.read path
#⇒ "GGGGGGGGGThis content is already presented in file\n"
总计:
#!/usr/bin/env ruby
require 'tempfile'
f = Tempfile.new 'cocoapods'
path = f.path
f.puts 'This content is already presented in file'
f.close # HERE MUST BE ENSURE BLOCK, BUT FOR THE SAKE OF AN EXAMPLE...
system "editor #{path}"
puts File.read path
我目前正在为 CocoaPods、Ruby gem 开发一项功能。有一个接受多个选项的现有命令。我想添加一个额外的选项,使用户能够通过打开默认文本编辑器输入自定义消息,并且当用户保存并退出编辑器时,该消息被馈送到已执行的命令中。
我想复制的是如何将 -m
添加到 git commit
命令以让您输入提交消息。我没有创建命令行工具的经验,因此非常感谢您的帮助。
目标是执行特定命令 command --message
,打开编辑器,让用户输入自定义消息,然后执行命令,自定义消息是存储在 [=13= 中的参数之一].
常见的工作流程是:
- 调用者应用程序创建一个临时文件;
- 确定默认编辑器(对于基于 Debian 的系统,它将是
/usr/bin/editor
,对于其他 linuces — shell 变量$EDITOR
等的内容); - 在带有
Kernel#system
的子 shell 中运行 shell 命令(不带反引号!); - 等待它退出;
- 判断退出码,不是
0
; 则跳过
- 读取在步骤 1 中创建的临时文件的内容并删除该文件。
在 ruby 中是这样的:
▶ f = Tempfile.new 'cocoapods'
#⇒ #<File:/tmp/am/cocoapods20151120-6901-u2lubx>
-rw------- 1 am am 0 nov 20 15:03 /tmp/am/cocoapods20151120-6901-u2lubx
▶ path = f.path
#⇒ "/tmp/am/cocoapods20151120-6901-u2lubx"
▶ f.puts 'This content is already presented in file'
#⇒ nil
▶ f.close # HERE MUST BE ENSURE BLOCK, BUT FOR THE SAKE OF AN EXAMPLE...
#⇒ nil
▶ system "editor #{path}"
#⇒ Vim: Warning: Output is not to a terminal
如果您在控制台中测试它,只需键入任何内容,然后按 Esc:wq。在现实生活中会打开正常的 vim
(或默认编辑器)。
▶ File.read path
#⇒ "GGGGGGGGGThis content is already presented in file\n"
总计:
#!/usr/bin/env ruby
require 'tempfile'
f = Tempfile.new 'cocoapods'
path = f.path
f.puts 'This content is already presented in file'
f.close # HERE MUST BE ENSURE BLOCK, BUT FOR THE SAKE OF AN EXAMPLE...
system "editor #{path}"
puts File.read path