0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

copilot.vim 導入によって打たなくてよくなった文字数をカウントする

Last updated at Posted at 2024-12-17

ストーリー

「はぁ?効果測定?そんなの効果あるに決まってるだろ?」

というわけでまぁ効果があるのか測定しろとのことなので、とりあえず github copilot を導入したことによって打たなくてよくなったキータイプの回数を数えてみることにしました。1

やりたいこと

私は copilot.vim で github copilot を使ってます。
とりあえず tab キーを押して補完を採用したときに copilot が自分の代わりに打ってくれた文字列をファイルに1か月くらいどんどん貯めていけば、後で wc コマンドで文字数カウントできそうですね。

下記の方法は vim-9.0.0749 で動作確認しました。neovim とかは違うのかな。わかんない

copilot.vim を編集

vim ~/.vim/pack/github/start/copilot.vim/autoload/copilot.vim

まずはファイル末尾に下記の function を新規追加します。

" Function to append Copilot completions to a log file
function! Copilot_AppendCompletion(completion)
  let l:logfile = expand("~/.copilot_completions.log")
  call writefile([a:completion], l:logfile, "a")
endfunction

次に、下記の場所に

    " HERE -------------------------------
    call Copilot_AppendCompletion(text)
    " HERE -------------------------------

という行を1行追加します。

function! copilot#Accept(...) abort
  let s = copilot#GetDisplayedSuggestion()
  if !empty(s.text)
    unlet! b:_copilot
    let text = ''
    if a:0 > 1
      let text = substitute(matchstr(s.text, "\n*" . '\%(' . a:2 .'\)'), "\n*$", '', '')
    endif
    if empty(text)
      let text = s.text
    endif

    call copilot#Request('notifyAccepted', {'uuid': s.uuid, 'acceptedLength': copilot#doc#UTF16Width(text)})
    call s:ClearPreview()
    let s:suggestion_text = text

    " HERE -------------------------------
    call Copilot_AppendCompletion(text)
    " HERE -------------------------------

    return repeat("\<Left>\<Del>", s.outdentSize) . repeat("\<Del>", s.deleteSize) .
            \ "\<C-R>\<C-O>=copilot#TextQueuedForInsertion()\<CR>" . (a:0 > 1 ? '' : "\<End>")
  endif
  let default = get(g:, 'copilot_tab_fallback', pumvisible() ? "\<C-N>" : "\t")
  if !a:0
    return default
  elseif type(a:1) == v:t_string
    return a:1
  elseif type(a:1) == v:t_func
    try
      return call(a:1, [])
    catch
      return default
    endtry
  else
    return default
  endif
endfunction

suggestion_text が確定した直後ですね。リンクで言うと、この辺。
https://github.com/github/copilot.vim/blob/release/autoload/copilot.vim#L511

以上です

動作風景

test.c を github copilot で編集してみましょう。

動画の上半分は、 tail -F~/.copilot_completions.log をモニターして、リアルタイムにどんな感じにファイル追記されているのかを見せているだけです。

ちゃんと tab キーを押した瞬間にファイルに追記されていますね。

1か月後とかに

wc ~/.copilot_completions.log

とかで文字数を数えてみましょう

ちなみに、copilot.vim では1回で複数行の補完採用が行われたときには、改行コードはヌル文字 \0 に置換されて1行で表示されます。なので、wc で出てくる行数は補完採用行数ではなく補完採用回数ということになります。

もし補完採用行数が欲しければ、 wc ~/.copilot_completions.log で出てくる行数に

xxd -p ~/.copilot_completions.log | grep -o "00" | wc -l

の結果を足しましょう。

  1. まぁこんなことしなくても組織管理者へはどれだけ補完がなされたかの統計情報が AcceptRate としてレポートされるらしいんですが。組織管理者じゃないし見方わかんないので

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?