1

我想绑定一个密钥以在我们的在线回购托管中的当前文件上打开浏览器(例如实际上是 codebasehq,但想象它就像 github。)

假设我正在 Vim 中编辑一个文件,名为:

/ROOT/repository/subdir/filename

我的当前目录位于“存储库”中,因此我的状态行将文件名显示为:

subdir/filename

我在 OSX 上,所以我用来在浏览器中打开它的系统命令行是:

open https://<REPOHOST>/projects/<USER>/repositories/<REPOSITORY>/blob/master/<SUBDIR>/<FILENAME>#L<LINE>

在哪里:

  • REPOHOST 和 USER 是固定的,我很乐意对它们进行硬编码。
  • REPOSITORY 是我当前工作目录的父目录的基本名称,即目录'repository',没有'ROOT' 前缀。
  • SUBDIR 和 FILENAME 是我正在编辑的“子目录/文件名”。
  • LINE 是当前行号

我已经做到了:

noremap <leader>o :silent !open URL<cr>

当我使用所有HOSTNAME 等的硬编码值替换 URL 时,它会在硬编码文件名上打开浏览器,并突出显示指定的行号。我的问题是如何将我的实际存储库和文件名等动态替换为这一行中的 URL。

我对 Python 非常熟悉,因此涉及调用 Vim 的内置 Python API 的解决方案是完全可以接受的。

编辑

我快到了,但仍然需要一个 vim 命令,它将我当前目录的基本名称附加到 vimscript 变量 'url' 上。有了这个,来自 romain1 的答案(连同我自己的答案中的改进)将完美地做到这一点。

结束编辑

4

2 回答 2

3

像这样的东西应该工作:

let g:repohost = "whatever"
let g:user     = "whatever"
nnoremap <leader>o :execute "open https://".g:repohost."/projects/".g:user."/repositories/".expand('%:h:h:t')."/blob/master/".expand('%:h:t')."/".expand('%:p:t')."#L".line('.')

编辑

为了清晰和可维护性,将 URL 构建包装在一个函数中可能是一个好主意:

let g:repohost = "whatever"
let g:user     = "whatever"
function! OpenBrowser()
    let url  = "https://"
    let url .= g:repohost
    let url .= "/projects/"
    let url .= g:user
    let url .= "/repositories/"
    let url .= expand('%:h:h:t')
    let url .= "/blob/master/"
    let url .= expand('%:h:t')
    let url .= "/"
    let url .= expand('%:p:t')
    let url .= "#L"
    let url .= line('.')
    execute "open " . url
endfunction
nnoremap <leader>o :call OpenBrowser()<CR>

从那里,您可以添加各种安全检查,甚至是平台特定的优点。

结束编辑

:h filename-modifiers

您是否尝试过 Fugitive:Gbrowse命令?

于 2013-02-26T16:01:44.087 回答
1

回答我自己的问题:

romainl 的回答让我朝着正确的方向前进,但我需要对其进行一些修复:

  • 字符串连接运算符是“.=”,而不是“+=”
  • 我想要命令“!open”(系统命令)而不是“open”(在 vim 中打开文件)
  • 我不需要这么多的“扩展”调用。我已经设法将其中几个折叠成一个“expand('%')”。
  • 我需要将“行号”之前使用的“#”字符转义为“\\#”(两个反斜杠)
  • 为了获得我的 repo 名称,我假设它与我的 PWD 同名,我假设它是我项目的根。因此,我想要 PWD 的基本名称。为了在不调用太多其他可执行文件(速度较慢)的情况下实现这一点,我使用system('echo -n ${PWD##*/}')
  • 要获取当前分支名称:从 Bash,可以使用git symbolic-ref -q --short HEAD(但你需要一个最新的 git,--short是最近的。)我需要从这个输出中删除尾随换行符,所以我使用echo -n $(git ... HEAD). 要从 vim 调用它,我使用 system('echo -n $( ... HEAD)')`

这导致以下结果:

function! OpenBrowser()
    let url  = "https://rangespan.codebasehq.com/projects/rangespan/repositories/"
    " assume repo name == basename(pwd)
    " use 'echo -n' to strip trailing \n char from output
    let url .= system('echo -n ${PWD##*/}')

    let url .= "/blob/"

    " branchname
    " use 'echo -n' to strip trailing \n char from output
    let url .= system('echo -n $(git symbolic-ref -q --short HEAD)')

    let url .= "/"

    " filename relative to pwd, which is assumed to be root of repo
    let url .= expand('%')

    " line number
    let url .= "\\#L"
    let url .= line('.')

    execute "!open " . url

endfunction

nnoremap <leader>o :call OpenBrowser()<CR>

现在,在 Vim 中编辑文件时,点击,然后o在上游 repo 中的当前文件上打开一个浏览器窗口,当前行突出显示。这对于在电子邮件或聊天中发送我的同事链接很有用,因此他们可以查看我当前正在查看的同一来源。耶,等等。

于 2013-02-28T13:54:13.217 回答