如何打开这个文件?
当我编写代码时,我需要打开很多文件。我主要在命令行中,使用 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链接
将完整的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
贡献
如果你想要添加对更多编辑器或其他数据格式的支持,请与我联系,我们将看看能做什么。
另请参阅
标签
反馈
这篇文章有问题?请通过在GitHub上打开问题或拉取请求来帮助我们。