如何打开这个文件?

当我编写代码时,我需要打开很多文件。我主要在命令行中,使用 vim 编辑器工作。在任何给定的一天,我可能需要将以下内容转换为 vim 可以理解的文件路径:

  • 堆栈跟踪
  • Perl 模块名称
  • 后缀为子程序名称的 Perl 模块名称
  • git-grep 结果
  • GitHub 网址

弄清楚这些内容通常并不困难,但它可能会让你的日子比需要的更长,因此我写了 ot:由 Open::This 提供的命令行工具。

以下示例我将使用 vim,但 ot 也支持 nvim、emacs、nano 和 pico,默认为你在 $ENV{EDITOR} 中设置的任何编辑器。

跟随操作

我将从一个位于 https://github.com/oalders/git-helpers 的存储库中进行操作。如果你想跟上来

$ git clone https://github.com/oalders/git-helpers.git
$ cd git-helpers

使用 Perl 模块名称

我们现在处于 git-helpers Git 存储库的根目录。假设我们想打开 Git::Helpers 模块。将 Perl 模块名称转换为文件路径并不困难。给定像 Git::Helpers 这样的名称,我知道我可能(但不一定)在寻找一个名为 Git/Helpers.pm 的文件。这个文件可能位于 lib、t/lib 或某个自定义目录中。如果我知道确切的位置,我可以直接调用 vim

$ vim lib/Git/Helpers.pm

然而,如果我不确定,或者我只是偷懒,这个方法会带我去同一个地方

ot Git::Helpers

这是因为,默认情况下,ot 会搜索你的 lib 和 t/lib 目录以查找本地文件。你可以通过 $ENV{OPEN_THIS_LIBS} 变量覆盖此行为。它接受以逗号分隔的库列表。

如果文件在标准库位置中找不到,ot 会尝试在系统上查找已安装的文件。因此,如果我们不在 git-helpers 存储库的根目录中,但我们之前已从 CPAN 安装了 Git::Helpers

$ ot Git::Helpers

可能打开以下文件:~/.plenv/versions/5.26.1/lib/perl5/site_perl/5.26.1/Git/Helpers.pm

在子程序声明处打开 Perl 模块

让我们更进一步。如果我们想打开一个模块的文件,但同时又想直接进入正确的子程序声明,例如 Git::Helpers::is_inside_work_tree(),怎么办?我们可能可以制作一个花哨的一行命令来做这件事,但今天我们很懒。

$ ot "Git::Helpers::is_inside_work_tree()"

就是这样。这将会做正确的事。(注意在这种情况下,我们必须引用 ot 的参数。你的 shell 可能也需要这样做。)

我们可以为已安装的模块做完全相同的事情。尝试以下命令

$ ot "Test::More::subtest()"

在我的情况下,它会在第 807 行打开 /.plenv/versions/5.26.1/lib/perl5/site_perl/5.26.1/Test/More.pm,这是 sub subtest {

使用行号打开文件

堆栈跟踪

在任何给定的一天,我都会看到很多堆栈跟踪。堆栈跟踪的一个相关片段可能看起来像:Died at lib/Git/Helpers.pm line 50.

手动做这件事时,我可能会复制文件路径并在命令行中输入以下内容

$ vim lib/Git/Helpers.pm

如果我觉得很酷,我可能会将行号转换为 vim 可以理解的东西

$ vim +50 lib/Git/Helpers.pm

或者,我只需复制文件位置和行号,并将其提供给 ot

$ ot lib/Git/Helpers.pm line 50

这将做正确的事,并在 vim 中打开 lib/Git/Helpers.pm 在第 50 行。

git-grep

某些搜索的结果,如 git grep,可能包含行号以及文件名。在 git 中配置此行为,请使用以下命令

$ git config --global grep.lineNumber true

如果你不想直接在 git 中配置此行为,也可以通过 git grep --line-number foo 进行搜索。

现在我们已经在git grep的输出中有了行号,我们可以使用它的输出为ot提供提示。

$ git grep 'sub _build_latest_release' .
lib/Git/Helpers/CPAN.pm:70:sub _build_latest_release {

运行上述搜索后,我们可以将结果复制粘贴到ot中。

$ ot lib/Git/Helpers/CPAN.pm:70

这将现在打开lib/Git/Helpers/CPAN.pm的第70行。

在任意行和列打开文件

如上所述,ot可以打开正确的行号的文件。让我们更加懒惰,让ot打开正确的行和列。

如果你使用--vimgrep选项与ripgrep,那么你将看到列号和行号,以及搜索结果。例如

$ rg --vimgrep '_build_latest_release' .
./lib/Git/Helpers/CPAN.pm:20:17:    builder => '_build_latest_release',
./lib/Git/Helpers/CPAN.pm:70:5:sub _build_latest_release {

要打开lib/Git/Helpers/CPAN.pm的第20行和第17列,只需复制/粘贴rg输出并将其传递给ot

$ ot ./lib/Git/Helpers/CPAN.pm:20:17

将完整的GitHub URL https://github.com/oalders/git-helpers/blob/master/lib/Git/Helpers.pm#L50传递给ot,如果该文件存在于你的相对文件路径中,你将能够本地打开该文件。

$ ot https://github.com/oalders/git-helpers/blob/master/lib/Git/Helpers.pm#L50

在我的机器上打开lib/Git/Helpers.pm的第50行。

如果路径部分存在于本地,传递截断的URL路径也是有效的

$ ot lib/Git/Helpers.pm#L50

在GitHub上打开本地签出的文件

使用-b标志将允许你打开GitHub上的本地文件。

以下任何命令都可以启动浏览器,其中包含包含你想要文件的GitHub URL(希望如此)

$ ot -b Git::Helpers
$ ot -b "Git::Helpers::is_inside_work_tree()"
$ ot -b Git::Helpers:75
$ ot -b Git::Helpers line 75

例如,从git-helpers存储库的顶层

$ ot -b Git::Helpers:75

打开https://github.com/oalders/git-helpers/blob/master/lib/Git/Helpers.pm#L75

在您的$ENV{PATH}中打开文件

ot也可以用作查看位于您的$ENV{PATH}中的文件的快捷方式。

例如

$ ot perldoc

在我的机器上打开~/.plenv/versions/5.26.1/bin/perldoc。你可以把它看作是

$ which perldoc | xargs -o vim

贡献

如果你想要添加对更多编辑器或其他数据格式的支持,请与我联系,我们将看看能做什么。

另请参阅

对于查找和打开文件的其他解决方案,我强烈推荐fzffpp

标签

Olaf Alders

父亲,Perl黑客,吉他手和游泳者。Olaf是MetaCPAN项目的创始人。

浏览他们的文章

反馈

这篇文章有问题?请通过在GitHub上打开问题或拉取请求来帮助我们。