ルモーリン
ホーム 更新 Perl Sample ランドナー サービス 雑談 コースガイド 鉄ゲタ 自転車 Linux リンク 連絡先

VimでFTPSを使う

2019-03-15

背景

Windowsの場合は、VimでFTPは使えるけれどFTPSを使えない。 そこでFTP互換のPerlスクリプトを書いて、その中でFTPSのモジュールを使えば良いと考えました。

ユーザーの_gvimrc

起動時の設定ファイルにFTPコマンドの代替版を入れます。 ?????はスクリプトのあるパスです。

let g:netrw_ftp_cmd="perl C:/?????/vim_ftps.pl"

vim_ftps.pl

こんな感じです。

#!/usr/bin/env perl -w

use utf8;
use strict;
use warnings;

use Encode::Argv;
use Encode::Locale;
use FindBin;
use Net::FTPSSL;

use feature "say";
use open IO => ":utf8";

use constant DEBUG_LOG => 0;

binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

sub say_log($);

$| = 1;

my $log;
open $log, ">>", "$FindBin::Bin/vin_ftps.log" if DEBUG_LOG;

say_log "----------";

for (@ARGV) {
	say_log "option: $_";
	if (/^-i$/) {
	} elsif (/^-n$/) {
	} else {
		say_log "*** unknown option: $_ ***";
	}
}

my $ftps;
while (<STDIN>) {
	chomp;
	if (/^user/) {
		say_log "user <account> <password>";
	} else {
		say_log $_;
	}

	my @param = map {s/^"(.*)"$/$1/r} split / /;
	if ("open" eq $param[0]) {
		$ftps = Net::FTPSSL->new(
			$param[1],
			ReuseSession => 1,
			PreserveTimestamp => 1,
			Debug => (DEBUG_LOG ? 2 : 0),
			DebugLogFile => "$FindBin::Bin/ftpssl.log",
		);
	} elsif ("user" eq $param[0]) {
		$ftps->login($param[1], $param[2]);
	} elsif ("binary" eq $param[0]) {
		$ftps->binary;
	} elsif ("get" eq $param[0]) {
		$ftps->get($param[1], $param[2]);
	} elsif ("put" eq $param[0]) {
		$ftps->put($param[1], $param[2]);
	} elsif ("dir" eq $param[0]) {
		my @list = $ftps->list;
		say_log "-- list --";
		for (@list) {
			chomp;
			say $_;
			say_log $_;
		}
		say_log "----------";
	} elsif ("cd" eq $param[0]) {
		$ftps->cwd($param[1]);
	} elsif ("rename" eq $param[0]) {
		$ftps->rename($param[1], $param[2]);
	} elsif ("delete" eq $param[0]) {
		$ftps->delete($param[1]);
	} else {
		say_log "*** unknown: @param ***";
	}

	say_log $ftps->message;
}

if (defined $ftps) {
	$ftps->quit;
	say_log "*** quit ***";
}

sub say_log($) {
	my ($msg) = @_;

	say $log $msg if DEBUG_LOG;
}

使い方

Vimで「:e ftp://(FTPサーバーのホスト名)/」と入力します。 ユーザー名とパスワードを聞いてくるので入力します。 するとファイルブラウザが起動するので開くファイルを選択できます。 ついでにファイルのリネームや削除もできるようにしました。 なお、ワイルドカードを使ったファイルの複数指定は未サポートです(多分)。