在OSX上获取Vim以打开显示存储库主机上当前文件的URL的浏览器

时间:2013-02-26 13:33:14

标签: macos vim

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

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

的文件
/ROOT/repository/subdir/filename

我当前的目录位于'repository'中,因此我的状态行显示文件名为:

subdir/filename

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

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

其中:

  • REPOHOST和USER已修复,我很乐意对它们进行硬编码。
  • REPOSITORY是我当前工作目录的父目录的基本名称,即目录'repository',没有'ROOT'前缀。
  • SUBDIR和FILENAME是我正在编辑的'subdir / filename'。
  • LINE是当前行号

我已经达到了这个目标:

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

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

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

修改

我差不多了,但仍然需要一个vim命令将我当前目录的基名附加到vimscript变量'url'。有了这个,romain1的答案(以及我自己的答案中的改进)将完美地完成。

最终修改

2 个答案:

答案 0 :(得分: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>

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

EndEdit中

请参阅:h filename-modifiers

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

答案 1 :(得分:1)

回答我自己的问题:

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

  • 字符串concat运算符是“。=”,而不是“+ =”
  • 我想要命令“!open”(系统命令)不“打开”(在vim中打开文件)
  • 我不需要那么多的“扩展”调用。我已经设法将其中的几个崩溃为一个“expand('%')”。
  • 我需要转义“行号”之前使用的'#'字符,如“\\#”(两个反斜杠)
  • 要获得我的回购名称,我认为它与我的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会打开上游仓库中当前文件的浏览器窗口,并突出显示当前行。这对于在电子邮件或聊天中发送同事链接非常有用,因此他们可以查看我目前正在查看的相同来源。是的,等等。