5

我正在为个人笔记创建日记应用程序,并在我的Rakefile

task :new do
  entry_name = "Entries/#{Time.now.to_s.gsub(/[-\ :]+/, '.').gsub(/.0500+/,'')}.md"
  `touch #{entry_name}`
  `echo "# $(date)" >> #{entry_name}`
end

我想包括的最后一部分是打开 Vim 文本编辑器,但我无法弄清楚如何打开它,就好像我直接从 bash 终端调用它一样。

我试过了:

vim #{entry_name}

但不幸的是,我认为这两个都将它作为后台进程打开。

我一直在参考“在 Ruby 中运行 Shell 命令的 6 种方法”。

4

2 回答 2

10

正如在您引用的文章中, s 在当前进程的子shell`中运行命令,但真正的问题是它也试图从命令运行中获取输出,这与 Vim 不兼容。

您可以:

  • 用于exec将当前进程替换为新进程(请注意,Ruby/Rake 进程将在您调用 后结束exec,之后将不再运行)。

  • 用于system创建类似`s 的子 shell,但避免了试图抓取 Vim 的标准输出的问题。与 不同exec的是,在 Vim 终止后,Ruby 将继续。

于 2012-06-13T19:23:39.050 回答
0

您需要将 tty 作为退格键等的标准输入传递,以便在 vim 中正常工作:

exec("</dev/tty vim a b")

显然反引号 ( `) 不起作用,但我遇到了脚本system/的问题。exec

首先我得到Vim: Warning: Input is not from a terminal,然后我看到^?我何时使用退格键。

于 2019-05-07T16:59:32.757 回答