KazuminEngine

プログラマーの日記

perlをリファクタリング

下記のリポジトリのコードをリファクタリングしてました。(君にぴったりのVimPluginを選んでくれる端末アプリ)

github.com

select.pl

#!/usr/bin/perl -w

use strict;
use Curses::UI;
use 5.01;

my $cui = new Curses::UI( -color_support => 1 );
my %plugin_name;

my $win = $cui->add('window_id', 'Window');

my $label = $win->add(
    'mylabel', 'Label',
    -text      => 'Exit: q',
    -bold      => 1,
);

$label->draw;

$cui->set_binding(sub {exit}, "q");

my $supp = $cui->dialog(
    -message => "補完機能を強化したい?",
    -buttons => ['yes','no'],
    -values  => [1,0],
    -title   => 'Question',
);

if ($supp) {
    $plugin_name{"Shougo/neocomplete"} = "https://github.com/Shougo/neocomplete.vim";
}

my $twi = $cui->dialog(
    -message => "Do you want to Twitter in Vim",
    -buttons => ['yes','no'],
    -values  => [1,0],
    -title   => 'Question',
);

if ($twi) {
    $plugin_name{"Shougo/neocomplete"} = "https://github.com/Shougo/neocomplete.vim";
}

my $template = $cui->dialog(
    -message => "You want to ease templete?",
    -buttons => ['yes','no'],
    -values  => [1,0],
    -title   => 'Question',
);

if ($template) {
    $plugin_name{"Shougo/neocomplete"} = "https://github.com/Shougo/neocomplete.vim";
}

my $gist = $cui->dialog(
    -message => "Do You want to use gist in vim?",
    -buttons => ['yes','no'],
    -values  => [1,0],
    -title   => 'Question',
);

if ($gist) {
    $plugin_name{"Shougo/neocomplete"} = "https://github.com/Shougo/neocomplete.vim";
}

my $exit = $cui->dialog(
    -message =>  "Plugin suit to you is\n" . $plugin_name{"Shougo/neocomplete"},
    -values  => [1],
    -title   => 'Question',
);



$cui->mainloop();

このプログラムのダイアログ出力が、同じような繰り返しなので、下記のようにforeachした。ちなみに、yamlでデータ部分を分けた。

select.pl

#!/usr/bin/perl -w

use strict;
use YAML::Syck ();
use Curses::UI;
use Data::Dumper;
use 5.01;

my $cui = new Curses::UI( -color_support => 1 );
my %you_match_plugin_name;

my $win = $cui->add('window_id', 'Window');

my $label = $win->add(
    'mylabel', 'Label',
    -text      => 'Exit: q',
    -bold      => 1,
);
$label->draw;
$cui->set_binding(sub {exit}, "q");

my $filename = "osusume.yaml";
open(IN, $filename) or die("cannnot open file.");
read(IN, my $input , (-s $filename));
close(IN);

my %ydoc = YAML::Syck::Load($input);


foreach my $data(keys(%ydoc)){
    my $message = $ydoc{$data}[0];
    my $neobundle_name = $ydoc{$data}[1];
    my $url = $ydoc{$data}[2];

    my $template = $cui->dialog(
        -message => $message,
        -buttons => ['yes','no'],
        -values  => [1,0],
        -title   => 'Question',
    );

    if ($template) {
        $you_match_plugin_name{$neobundle_name} = $url;
    }
}



my @plugin_name_value = values(%you_match_plugin_name);

my $exit = $cui->dialog(
    -message =>  "あなたにぴったりのpluginは\n" . Dumper(@plugin_name_value),
    -values  => [1],
    -title   => '結果',
);



$cui->mainloop();

osusume.yaml

Gist:
    - Gistを楽にしたい
    - mattn/gist-vim
    - http://

実行したら下記のように怒られる。

Your screen is currently too small for this application.
Resize the screen and restart the application.
Press  to exit...

小さくしようと思って、サイズを決定するメソッドを調べたらlayout()みたいだ。 しかし、これは自動的に設定してくれるので、いらう必要ないようだ。

一体どうすればいいのだろう。そもそも、挙動もあまりわかってないので、ループ自体ダメなのかな。