mieki256's diary



2018/11/09(金) [n年前の日記]

#2 [prog] Visual Studio Codeでファイル内のタイムスタンプを書き換えたい

今現在、emacs系のエディタ(xyzzy, NTEmacs)を使っている際は、ファイルの最初のほうにタイムスタンプを書いておいて、保存と同時にタイムスタンプを自動で更新するようにしているのだけど。

_[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系エディタ上で設定していたソレとは違っていて…。

一応、拡張の設定で、タイムスタンプの前後の文字列を正規表現で指定できるのだけど、色々記述を変えて試してみても動いてくれない。何故。

デフォルト設定のまま、デフォルトのタイムスタンプ文字列をファイルの最初のあたりに書き加えてみると動くので、拡張が動いてないというわけではなさそうだけど…。

フィルタを書いた。 :

考えてみたら、sort や uniq のようなフィルタの形で、タイムスタンプを書き換えてくれるフィルタがあれば、多少は違うかなと。幸い、Visual Studio Code の拡張には、外部フィルタを利用可能にしてくれるものがあるようで。

_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 を使えるなら、そちらのほうが嬉しいよなと…。

以上です。

過去ログ表示

Prev - 2018/11 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project