(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に追加する関数。
なお、VimとPythonの橋渡しとして、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の行や単語単位の細かい修正等、よ〜く考えてスクリプト作った方がいいかもね。 > 自分。^^;