challenge クリップボードへの転送

クリップボード(や同等の機能)へテキストを転送するプログラムをお願いします。 また可能でしたらクリップボードのデータを取り出すプログラムもお願いします。

システムに依存する内容ですが、応用範囲が広いと思いましたので出題させてもらいました。

Posted feedbacks - Other

サクラエディタはJScriptやVBScriptで書いたマクロを使えるんだぜ、というアピール。
"hoge.js" などの名前で保存し、「ツール」の「キーマクロの読み込み」でキーマクロに設定したのち、Ctrl + Shift + L で実行します。
1
2
3
4
5
6
Editor.SelectAll();
Editor.Copy();
for (var i=0; i<3; i++) {
  Editor.GoFileEnd();
  Editor.Paste();
}

Mac OS Xには pbcopy, pbpasteの名前でシェルから クリップポードを操作するコマンドが 存在します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env ruby -wKU

if (ARGV.length != 1)
  print "Usage: handle_pb [-show] text\n"
end

if ARGV.include?('-show') 
  
  print %x{ pbpaste }
else
  ENV['PB_COPY_TEXT'] = ARGV[0]
  
  # デフォルトではpbcopyは日本語の場合Shift-JISしか扱えない
  %x{ echo $PB_COPY_TEXT | nkf -s | pbcopy } 
end

ファイル入出力のテスト。

Infernoの場合は/chan/snarfに対してread/writeすると
コピーバッファ(snarfと呼ばれている)に
アクセスしていることになる。

インターフェースはxcutに倣った。
引数なしで実行するとstdinからのデータを
コピーバッファに格納する。
-pをつけて実行するとコピーバッファの内容をstdoutに出力する。
 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# usage: d188 [-p]
#        -p   : paste to stdout
#        none : copy from stdin to clipboard

implement d188;

include "sys.m";
include "draw.m";

d188: module{
    sys: Sys;
    init: fn(ctx: ref Draw->Context, argv: list of string);
    cut: fn();
    paste: fn();
};

cut()
{
    stdin: ref Sys->FD;
    snarf: ref Sys->FD;
    buf:= array[256] of byte;

    stdin = sys->fildes(0);
    snarf = sys->open("/chan/snarf", sys->OWRITE);
    if(snarf == nil){
         return;
    }

    for(;;){
        n:= sys->read(stdin, buf, len buf);
        if(n <= 0) break;

        sys->write(snarf, buf, n);
    }
}

paste()
{
    snarf: ref sys->FD;
    buf:= array[256] of byte;

    snarf = sys->open("/chan/snarf", sys->OREAD);
    if(snarf == nil){
         return;
    }

    for(;;){
        n := sys->read(snarf, buf, len buf);
        if(n <= 0) break;

        sys->print("%s", string buf[0: n]);
    }
}

init(ctx: ref Draw->Context, argv: list of string)
{
    is_p := 0;
    sys = load Sys Sys->PATH;

    argv = tl argv;
    while(argv != nil){
        if(hd argv == "-p"){
              is_p = 1;
        }
        argv = tl argv;
    }

    if(is_p){
        paste();
    }else{
        cut();
    }
}

Index

Feed

Other

Link

Pathtraq

loading...