2018/11/09(金) [n年前の日記]
#2 [prog] Visual Studio Codeでファイル内のタイムスタンプを書き換えたい
今現在、emacs系のエディタ(xyzzy, NTEmacs)を使っている際は、ファイルの最初のほうにタイムスタンプを書いておいて、保存と同時にタイムスタンプを自動で更新するようにしているのだけど。
_[Home] Time Stamp
_xyzzyはすごいぜ
_auto-time-stamp.l
例えば、ファイルの最初のほうに、以下のような記述をしておくと…。
保存した際、以下のように書き換わる、みたいな。
これを、Visual Studio Code でやりたいわけですよ。
_[Home] Time Stamp
_xyzzyはすごいぜ
_auto-time-stamp.l
例えば、ファイルの最初のほうに、以下のような記述をしておくと…。
#!/usr/bin/perl -w # -*- mode: perl; Encoding: sjis; coding: sjis -*- # Last updated: <> #
保存した際、以下のように書き換わる、みたいな。
#!/usr/bin/perl -w # -*- mode: perl; Encoding: sjis; coding: sjis -*- # Last updated: <2018/11/09 19:27:04 +0900> #
これを、Visual Studio Code でやりたいわけですよ。
◎ それらしい拡張に遭遇。 :
検索してみたら、似たような処理をしてくれる拡張は存在しているようで。
_Auto Time Stamp - Visual Studio Marketplace
ただ、タイムスタンプのフォーマットが、今までemacs系エディタ上で設定していたソレとは違っていて…。
一応、拡張の設定で、タイムスタンプの前後の文字列を正規表現で指定できるのだけど、色々記述を変えて試してみても動いてくれない。何故。
デフォルト設定のまま、デフォルトのタイムスタンプ文字列をファイルの最初のあたりに書き加えてみると動くので、拡張が動いてないというわけではなさそうだけど…。
_Auto Time Stamp - Visual Studio Marketplace
ただ、タイムスタンプのフォーマットが、今までemacs系エディタ上で設定していたソレとは違っていて…。
一応、拡張の設定で、タイムスタンプの前後の文字列を正規表現で指定できるのだけど、色々記述を変えて試してみても動いてくれない。何故。
デフォルト設定のまま、デフォルトのタイムスタンプ文字列をファイルの最初のあたりに書き加えてみると動くので、拡張が動いてないというわけではなさそうだけど…。
◎ フィルタを書いた。 :
考えてみたら、sort や uniq のようなフィルタの形で、タイムスタンプを書き換えてくれるフィルタがあれば、多少は違うかなと。幸い、Visual Studio Code の拡張には、外部フィルタを利用可能にしてくれるものがあるようで。
_Filter Text - Visual Studio Marketplace
選択範囲を作って、Ctrl + K, Ctrl + F を押すと、入力欄が開くので、フィルタ名を打ち込んでやれば、選択範囲に対して処理をしてくれる。
後はフィルタがあれば…。試しにフィルタを Perl で書いてみた。
_timestamp.pl
動作確認用に、以下のテキストファイルを書いて…。
_test.txt
変換できるか実験。
ちなみに自分の環境は Windows10 だけど cat.exe も入れてある。デフォルト状態なら、type test.txt で同じことができるのかな。たぶん。
更に、自分の環境では ActivePerl を使っているので、plファイルをbatファイルに変換してみる。
これをパスの通ったところに置いておいて…。Visual Studio Code 上で、タイムスタンプのある行を選択して、Ctrl + K, Ctrl + F → timestamp を入力。該当行が書き換わってくれた。
自動で書き換えてくれるわけではないから不便だけど、それでも手打ちで修正するよりはまだマシだろう…。
_Filter Text - Visual Studio Marketplace
選択範囲を作って、Ctrl + K, Ctrl + F を押すと、入力欄が開くので、フィルタ名を打ち込んでやれば、選択範囲に対して処理をしてくれる。
後はフィルタがあれば…。試しにフィルタを Perl で書いてみた。
_timestamp.pl
# replace time stamp filter use strict; use warnings; my $patstart = "Last updated: <"; my $patend = ">"; my $chklines = 8; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $cnt = 0; while(<>) { chomp $_; if ($cnt <= $chklines && $_ =~ /(.+)$patstart.*$patend$/) { my $tmstr = sprintf("%04d/%02d/%02d %02d:%02d:%02d +0900", $year, $mon, $mday, $hour, $min, $sec); print "$1$patstart$tmstr$patend\n"; } else { print "$_\n"; } $cnt++; }
動作確認用に、以下のテキストファイルを書いて…。
_test.txt
#!/usr/bin/perl -w # -*- mode: perl; Encoding: sjis; coding: sjis -*- # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> #
変換できるか実験。
> cat test.txt | perl timestamp.pl #!/usr/bin/perl -w # -*- mode: perl; Encoding: sjis; coding: sjis -*- # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <2018/11/09 20:33:27 +0900> # Last updated: <> # Last updated: <> # Last updated: <> # Last updated: <> #書き換わった。
ちなみに自分の環境は Windows10 だけど cat.exe も入れてある。デフォルト状態なら、type test.txt で同じことができるのかな。たぶん。
更に、自分の環境では ActivePerl を使っているので、plファイルをbatファイルに変換してみる。
pl2bat timestamp.pl_timestamp.bat が出来上がった。
これをパスの通ったところに置いておいて…。Visual Studio Code 上で、タイムスタンプのある行を選択して、Ctrl + K, Ctrl + F → timestamp を入力。該当行が書き換わってくれた。
自動で書き換えてくれるわけではないから不便だけど、それでも手打ちで修正するよりはまだマシだろう…。
◎ 余談。 :
Atomエディタも、ファイルを保存する際に自動でタイムスタンプを書き換えてくれる拡張が存在していて。コレなら、設定次第で、emacs系エディタと同じフォーマットが使える。とメモ。
_atom-timestamp
ただ、Atomエディタ自体が、鬼のように重いわけで…。起動に数分かかるし、時々強制終了するし…。なので、Visual Studio Code を使えるなら、そちらのほうが嬉しいよなと…。
_atom-timestamp
ただ、Atomエディタ自体が、鬼のように重いわけで…。起動に数分かかるし、時々強制終了するし…。なので、Visual Studio Code を使えるなら、そちらのほうが嬉しいよなと…。
[ ツッコむ ]
以上です。