ルモーリン

VimでFTPSを使う

投稿:2019-03-15

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

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

let g:netrw_ftp_cmd="perl C:/?????/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サーバーのホスト名)/」と入力します。 ユーザー名とパスワードを聞いてくるので入力します。 するとファイルブラウザが起動するので開くファイルを選択できます。 ついでにファイルのリネームや削除もできるようにしました。 なお、ワイルドカードを使ったファイルの複数指定は未サポートです(多分)。