ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Vimのスクリプトをpythonで作る

(2021-06-18 初稿 - 2021-06-19 追記)

最近、pythonに触る機会が多い。頭の容量が少ない筆者は、Vimスクリプトpythonで書けたら、覚えることが少なくていいかなと思った。

調べてみると、Debian Busterのvimは、python3が使えるようだ。

vimのコマンド領域で、以下のとおり入力して"1"が返ってくれば、python3が使える。

:echo has('python3')    # 1

ちなみに、Debian BusterのVimでは、python2系は使えない。

vim --version で調べて、"+"が付いていると使えて、"-"だと使えないとのこと。

このページは、以下のサイトを参考に記述した。とても感謝。m(__)m

なお、ネットを検索して嫌なページを見てしまった。自分が同じことをrubyで考えて作ったページ。進歩がなくて、ほんとに情けない。(T_T)

さて、気を取り直して、まずはワンライナー

:python3 print("Hello Python3")    # Hello Python3
:py3 print("Hello Python3")        # Hello Python3

 python3はpy3と省略できる。

ワンライナーでは、できることが限られるので、pythonを使ったVim関数を作る。ここでは、簡単に日付と時間をvimのbufferに追加する関数。

なお、VimPythonの橋渡しとして、vimモジュールを読み込むと便利らしい。

function! GetDateTime()
py3 <<< EOC
import vim
import datetime

dt_now = datetime.datetime.now()
print(dt_now)
vim.current.buffer.append(str(dt_now))
EOC
endfunction

Vimの関数の中に、「py3 <<< EOC」と「EOC」との間にpythonのコードを書く。

実行方法は以下のとおり。

:source %                   # スクリプトファイルの読み込み
:tabe                       # 新たなバッファを準備
:call GetDateTime()         # GetDateTime()を実行
2021-06-18 20:36:22.859609  # 実行したBufferの最後に追加

なお、vimモジュールを読み込むことによって利用できるコマンドは、以下のサイトを参照してね。

現在のバッファの最後に追加するのは、上記スクリプトのとおりだが、カーソルがある行に追加するのはどうするのだろう… (・・?

で、調べてみると、以下のサイトに答えがあった。多謝。m(__)m

line('.')というVimのコマンドを実行して、evalで評価するようだ。

line = int(vim.eval("line('.')"))

なるほど、vimモジュールに無いコマンドは、vimで実行してからvimモジュールで評価すれば良いのね。目からウロコ。なんか、無限にコマンドが広がった感じ。

それで、現在のカーソル行に日付を挿入するスクリプトは以下のとおり。

なお、line('.')で得られる行番号は1からで、appendは0からなので、-1することと、strftimeで日付の出力を整形したこととに注意。

function! GetDateTime()
py3 <<< EOC
import vim
import datetime

dt_now = datetime.datetime.now()
line = int(vim.eval("line('.')")) - 1 
vim.current.buffer.append(dt_now.strftime("[%Y-%m-%d %H:%M:%S]"), line)
EOC
endfunction

実行すると、以下のように実行時の日付と時刻がカーソル行に挿入されればOK。

[2021-06-18 21:45:04]

この他、変数の受け渡し等、記述することはいっぱいあるのだが、最初に紹介したサイトに例があるので参考に。(超手抜き ^^;)

ちなみに、このページで作成したスクリプトは以下のコマンドと同じ。(^^ゞ

ちなみに、%はvimでは編集中ファイルの意味だから、エスケープしてるよ。

r! date +"[\%Y-\%M-\%D \%H-\%m-\%s]"

dateコマンドのように独立しても使えると、やはり便利だよね。だから、編集中のbufferの行や単語単位の細かい修正等、よ〜く考えてスクリプト作った方がいいかもね。 > 自分。^^;

関連ページ