我想绑定一个密钥,在我们的在线仓库托管中打开当前文件的浏览器(例如实际上是codebasehq,但想象它就像github。)
假设我正在Vim中编辑一个名为:
的文件/ROOT/repository/subdir/filename
我当前的目录位于'repository'中,因此我的状态行显示文件名为:
subdir/filename
我在OSX上,所以我用来在浏览器中打开它的系统命令行是:
open https://<REPOHOST>/projects/<USER>/repositories/<REPOSITORY>/blob/master/<SUBDIR>/<FILENAME>#L<LINE>
其中:
我已经达到了这个目标:
noremap <leader>o :silent !open URL<cr>
当我使用HOSTNAME等的所有的硬编码值替换URL时,它会在硬编码文件名上打开浏览器,并突出显示指定的行号。我的问题是如何将我的实际存储库和文件名等动态替换为此行中的URL。
我对Python非常熟悉,所以涉及调用Vim内置Python API的解决方案是完全可以接受的。
修改
我差不多了,但仍然需要一个vim命令将我当前目录的基名附加到vimscript变量'url'。有了这个,romain1的答案(以及我自己的答案中的改进)将完美地完成。
最终修改
答案 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)
回答我自己的问题:
罗曼尔的回答让我朝着正确的方向前进,但我需要对它进行一些修复:system('echo -n ${PWD##*/}')
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
会打开上游仓库中当前文件的浏览器窗口,并突出显示当前行。这对于在电子邮件或聊天中发送同事链接非常有用,因此他们可以查看我目前正在查看的相同来源。是的,等等。