如何通过访问名称中包含空格和路径中包含双引号的 find 命令结果来使 emacs 在 bash 中启动?

如何通过访问名称中包含空格和路径中包含双引号的 find 命令结果来使 emacs 在 bash 中启动?

我面临着逃跑的挑战:

流程:

第 1 步 - 文件检索:在 bash 中,将调用 find 命令。

Find 命令输出是 1 个单个文件,其路径如下:

./vacation/the united states/"best times of our lives"/persona notes.org

笔记:

• 在路径内

  • 出现2 次双引号",将短语括起来 best times of our lives

  • 大多数子目录包含 1 个或多个空白字符

• 在文件名内

  • 此外,还出现 1 个或多个空白字符

步骤 2 - 通过引用相应的 find 命令结果来访问找到的 1 文件,在 bash 中启动 Emacs:

通过仅通过棘手的路径来做到这一点会像这样工作 $ emacs -nw './vacation/the united states/"best times of our lives"/persona notes.org'

emacs 在 bash 中启动,屏幕上显示的内容从 bash 内容切换到包含所述文件的文件内容的 Emacs 缓冲区。

现在的最后一个问题是:如何通过在 bash 中为 emacs 命令提供开头提到的 find 命令输出来准确实现这一点?

一般来说,替代是要走的路:

$ emacs -nw $(find ./vacation/ -mmin -700 -type f -iname *.org)

但正如字面上的替代品是

./vacation/the united states/"best times of our lives"/persona notes.org

结果线

$ emacs -nw ./vacation/the united states/"best times of our lives"/persona notes.org

需要转义空白字符和双引号。

但如何呢?

$ emacs -nw '$(find ./vacation/ -mmin -700 -type f -iname *.org)'

  • 不起作用:Emacs 在 bash 中启动,但设置了一个名为“-mmin -700 -type f -iname *.org) 这样的文件不存在,因此缓冲区为空”的缓冲区

• 用双引号替换单引号也不起作用

  • $ emacs -nw "$(find ./vacation/ -mmin -700 -type f -iname *.org)"
  • 尝试一下……作品我很困惑!它确实有效
  • 嗯,你知道吗?这正是为什么我不再对它进行黑客攻击,而是采取了另一种方法 - 向您提出这个问题,向您解释它以寻求解决建议
  • 因此,将所有这些视为两者,特别是作为某个问题及其解决方案的呈现,并且总体上作为如何解决摆在您面前的问题的灵感,这使您陷入僵局 - 后退一步,尝试不同的方法,其中寻求别人的建议,向别人解释问题,质疑自己,做你一开始就排除的事情是非常有帮助的,是你克服当前局限性的一种方式。
  • 您可能会问自己:“为什么不简单地通过合适的 -exec 选项打开带有相应 find 调用扩展名的找到的文件?”答案是:那么该过程将是 find 调用,而不是 emacs 调用,因此您对 emacs 的访问会更差。例如,您设置的用于恢复之前挂起的当前 emacs 会话的别名将不起作用,因为作业列表仅包含 find 作业(包含 emacs 作业),但别名依赖于独立的 emacs 作业。

答案1

使用findxargs

find ... -print0 | \
    xargs -0 --no-run-if-empty -n 1 \
        emacs -nw

如果您添加(server-start)到您的 Emacs 启动文件,~/.emacs您可以在不同的窗口中启动emacs一次,然后使用它emacsclient来打开您想要的文件,而开销要少得多。

man find xargs emacsclient emacs

相关内容