読者です 読者をやめる 読者になる 読者になる

Vim - Pythonなどで使うマジックコメントを1行目に追加する

vim

Pythonではソースコードに日本語を使う場合はファイルの先頭に次のようなマジックコメントが必要です。
# -*- coding: utf-8 -*-

※追記 コメントでosyo_mangaさんに教えて頂きました。 これだけでよかった。

command! -nargs=0 MagicComment call append(0, "# -*- coding: utf-8 -*-")

※追記終わり

これを追加する設定ないかなとググったところ、以下のサイトがヒットしました。
マジックコメントを1行目に挿入するvimスクリプト

しかしこちらのスクリプトでは次の問題がありました。

カーソル列が先頭以外にあると、その列から挿入してしまう

こういう状態から挿入すると

1

こうなってしまいます。

2

これは cursor(1, 0) と2つ目の引数(col)に0を渡しているためです。

:help cursor()

{col}が0の場合は、カレント桁に留まる。

ですのでこれ自体は call cursor(1, 1) と修正すれば直ります。

追加したあとに戻ってくるカーソル位置がずれる

もういちど先ほどの結果を見てみます。

2

最初は # こめんと# にカーソルがあったのですが、ずれています。
これは最初に getpos() で現在のカーソル位置を保持していますが、戻るための setpos() では追加されたマジックコメントの行数が考慮されていないためです。

ということで上記スクリプトを参考にさせていただきつつ、自分好みに修正しました。

" マジックコメントをファイル先頭に挿入する(重複チェックはしない)
function! s:magic_comment()
    let magic_comment = "# -*- coding: utf-8 -*-"
    let current_pos = getpos(".")
    call cursor(1, 1)
    execute ":normal O" . magic_comment
    let back_pos = [
          \ current_pos[0],
          \ current_pos[1] + 1,
          \ current_pos[2],
          \ current_pos[3]
          \ ]
    call setpos(".", back_pos)
endfunction

command! -nargs=0 MagicComment call <SID>magic_comment()

back_pos の定義をもっと簡潔に書けないかな。

なお絶対にファイルの先頭にマジックコメントを入れるのであれば、テンプレートを使うのがよいと思います。
参考:Rubyのエンコード指定マジックコメントを##で挿入できるようにした