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は、私が編集している「subdir/filename」です。
  • LINEは現在の行番号です

私はこれまでに得ました:

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

また、すべてのHOSTNAMEなどにハードコードされた値を使用してURLを置き換えると、ハードコードされたファイル名でブラウザが開き、指定された行番号が強調表示されます。私の問題は、実際のリポジトリやファイル名などをこの行のURLに動的に置き換える方法をvimscriptする方法です。

私はPythonに精通しているので、Vimの組み込みPythonAPIを呼び出すことを含むソリューションは完全に受け入れられます。

編集

もうすぐですが、現在のディレクトリのベース名をvimscript変数「url」に追加するvimコマンドが必要です。これが適切に行われると、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>

そこから、あらゆる種類の安全性チェック、さらにはプラットフォーム固有の良さを追加できます。

endedit

を参照してください:h filename-modifiers

逃亡者:Gbrowseコマンドを試しましたか?

于 2013-02-26T16:01:44.087 に答える
1

私自身の質問に答える:

romainlの答えは私を正しい方向に向かわせました、しかし私はそれにいくつかの修正が必要でした:

  • 文字列連結演算子は「+=」ではなく「。=」です。
  • 「open」(vimでファイルを開く)ではなく「!open」(システムコマンド)コマンドが欲しい
  • 「expand」をそれほど多く呼び出す必要はありません。私はそれらのいくつかを1つの「expand('%')」にまとめることができました。
  • 「行番号」の前に使用されている「#」文字を「\\#」(2つの円記号)としてエスケープする必要があります
  • リポジトリ名を取得するには、プロジェクトのルートであると想定している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これは、同僚にメールやチャットでリンクを送信する場合に便利です。これにより、同僚は現在見ているのと同じソースを見ることができます。イェーイなど

于 2013-02-28T13:54:13.217 に答える