Hatena::Groupvimperator

ヴィンペラートル・オクタウィアヌス RSSフィード

記事一覧 | はてダ

2010-08-16

Google CalendarにQuick Addするプラグインを作ってみた

| 00:25 | Google CalendarにQuick Addするプラグインを作ってみた - ヴィンペラートル・オクタウィアヌス を含むブックマーク はてなブックマーク - Google CalendarにQuick Addするプラグインを作ってみた - ヴィンペラートル・オクタウィアヌス

GoogleCL使ったら負けかなと思ってる

うそです!!

もう既にこういうプラグインはあるかもしれないけど・・・

gcal.js

ソース

http://github.com/voidy21/dotfiles/raw/master/.vimperator/plugin/gcal.js

使い方
  • 今日の17:00から19:00までの図書館に行く予定を登録したい場合
:gcal 17:00-19:00 図書館へ行く
  • 8月20日の14:00からの動物園に行く予定を登録したい場合
:gcal 8/20 14:00 動物園
  • 8月25日から31日までの夏期休暇の予定を登録したい場合
:gcal 8/25-8/31 夏期休暇
注意!!!

カレンダーを指定する場合は-calendarオプションを使うと指定できます(補完を効かせないと使いづらいかも・・・)

おまけ程度にGoogle Calendarを表示するやつもあります

コマンド
:gcal
こんな感じになる

f:id:voidy21:20100817001549p:image

デフォルトでは、今日の予定と2週間後までの予定を表示します

あと、:gcal -date 2010/8/17 とかすると2010/8/17の予定だけを表示します

nokturnalmortumnokturnalmortum2010/08/17 06:30なかなか気になる予定になっていますな!

voidy21voidy212010/08/17 06:49> id:nokturnalmortum
いつかできたらいいなという期待を込めておきました!

2010-05-26

タブのサムネイルを表示する補完を作ろうとしたけど上手くできなかった

| 22:32 | タブのサムネイルを表示する補完を作ろうとしたけど上手くできなかった - ヴィンペラートル・オクタウィアヌス を含むブックマーク はてなブックマーク - タブのサムネイルを表示する補完を作ろうとしたけど上手くできなかった - ヴィンペラートル・オクタウィアヌス

まずは

現在のタブのサムネイルをechoするワンライナっぽいもの
:js commandline.echo(template.commandOutput(<><img src={tabs.getTab().__thumbnail.toDataURL()}/></>),null,commandline.FORCE_SINGLELINE)

_libly.jsが入っていると割と格好よくechoされる

サムネイルを補完させたい

とりあえず作ったスクリーンショット

f:id:voidy21:20100526221957p:image

ソース
commands.addUserCommand(
    ["thumbnail"],
    "View Thumbnails",
    function(args){
        if(args != "") {
            liberator.open(args.string);
        }
    },
    {
        count: false,
        completer: function(context, args) {
            let filter = context.filter;
            context.keys = {title: 'title', thumbnail: 'thumbnail', url: 'url', text:'text'};
            context.process = [templateThumbnail,function(obj){return obj.url}];
            context.title = ['Buffer','URL'];
            context.completions = generateCandidates();
        }
    },
    true
);

function templateThumbnail(obj) {
    return <>
      <img src={obj.thumbnail}/>{obj.title}
    </>;
}

function generateCandidates() {
    let allTabInfo = [];
    let index = 0;
    for each ( [,tab] in tabs.browsers ) {
        let url = tab.currentURI.spec;
        let title = tab.contentTitle;
        let getTab = tabs.getTab(index++);
        let thumbnail = ('__thumbnail' in getTab) ? getTab.__thumbnail.toDataURL() : "";
        let tabInfo = {
            "text": index + ":",
            "url" : url,
            "thumbnail" : thumbnail,
            "title" : title,
        }
        allTabInfo = allTabInfo.concat(tabInfo);
    }
    return allTabInfo;
}
問題点
  • タブ数が増えると非常に残念な補完になる(スクロールされない)
  • サムネイルを作成するタイミングがある(タブ移動時?)ので、開いたばかりのタブとかはサムネイルが出来ていない

caisuicaisui2010/05/27 01:15ワンライナーのほうは、getTab()→getTab(数字) ではないでしょうか?
エラーでたので報告です。

voidy21voidy212010/05/27 07:09> id:caisui
コメントありがとうございます!
>> ワンライナーのほうは、getTab()→getTab(数字) ではないでしょうか?
一応、ソースを見る限り、数字を省略しても大丈夫なはずなんですが・・・
http://code.google.com/p/vimperator-labs/source/browse/common/content/tabs.js?r=7c7331c0ad121902689d067449dd091e45c41f7c#182
おそらくエラーはタブを開いたばかりで__thumbnailが作られていなかったからではないかと思いますが、間違っていたら申し訳ないです

caisuicaisui2010/05/28 01:15問題点の2番目が 問題でした。
何も考えずに、開いたtabで ワンライナー走らせてました。orz
お騒がせしました。

2010-05-24

リンクの文字列をリンク先URLにする

| 20:32 | リンクの文字列をリンク先URLにする - ヴィンペラートル・オクタウィアヌス を含むブックマーク はてなブックマーク - リンクの文字列をリンク先URLにする - ヴィンペラートル・オクタウィアヌス

:js for each(let link in Array.slice(content.document.links)){link.textContent = link.href}

釣りリンクは見抜けるかも?

トグルできたら使いやすくなるのかなー

2010-04-19

コマンドラインモード周辺のキー操作とか

| 22:59 | コマンドラインモード周辺のキー操作とか - ヴィンペラートル・オクタウィアヌス を含むブックマーク はてなブックマーク - コマンドラインモード周辺のキー操作とか - ヴィンペラートル・オクタウィアヌス

vimp常用者にはあまり必要ないかもしれない知識

大体ヘルプ見ればわかると思います!!

コマンドラインモードだけでも結構キー操作が豊富なので自分の為にまとめておこうと思った

そもそもコマンドラインモードにどうやって入るか?

  • : ・・・ 一般的なvimと同じ入り方。一番落ち着くかもしれない。ここから思い思いにコマンドを叩く!
  • o,t ・・・open、tabopenするために使う人は多いはず!!履歴を辿ることが多い
  • O,T ・・・open、tabopenするんだけど、現在のタブのURLが入力されている!現在のタブのURLを少しいじってURL移動したい場合に使う
  • b ・・・バッファ一覧を見るために使う
  • w,W・・・新しいウインドウでURLを開く。そんなに使わない・・・

コマンドラインモードでのキー操作

:help!

大体Ctrlキーと一緒に使うものばかりです。aの隣にctrlが無い人はフリーソフトや設定などでctrlにしましょう!

使い辛いやつもあるので、cmapとかするといいと思います

  • Tab,<S-Tab>・・・言わずと知れた補完候補を辿る機能。ただ、Tabは押しづらいと思ってる
  • <C-w>・・・カーソル上から後ろに1単語消す。これが一番便利じゃないか
  • <C-h>・・・1文字消す。Backspaceより指が近いのでこっちを使おう
  • <C-m>・・・Enter(<CR>)と同じ。Enterキーまで指を運ばなくて済むので必要
  • <C-[>,<C-c>・・・Escと同じ。どれを使おうか!
  • <C-LEFT>,<C-RIGHT>・・・単語ごとにカーソル移動。地味に便利。Ctrl-←,Ctrl-→は押しづらいので何か他にマッピングしたいところ
  • <C-a>,<C-e>・・・最初の文字or最後の文字までカーソル移動。emacs最高や!ちなみにHomeEndでもできる
  • <C-/>・・・全体を選択
  • <S-Insert>・・・貼り付け
  • <C-u>,<C-BS>・・・カーソルより前の文字を全て消去。C-BSの方は押すことはないだろう
  • <C-k>,<C-Del>・・・カーソルより後の文字を全て消去。これを使いこなしたい
  • Up,Down・・・表示されている文字までのコマンドを履歴から辿っていく。割と便利なので別のキーにマッピングするのもあり
  • <C-PageUp>,<C-PageDown>・・・問答無用で前後のタブに移動する。なにこれこわい(追記:これはFirefox標準のショートカットでした)
  • :・・・最初に何回:を入力しても次にコマンドを書くと無視されるらしい。あわてない!!
  • <C-v>・・・次の1回のキーバインドだけFirefox標準の機能を使えるようにする(PASS THROUGH(next))

  例えば、<C-v><C-w>ならそのタブが閉じる

  <C-v><C-x>なら選択中の文字を切り取る

  <C-v><C-z>なら元に戻る

  これはcnoremapして本領を発揮するはず

  • <C-z>・・・常にFirefox標準の機能を使うようにする。PASS THROUGHモード

  コマンドラインモードではInsertモードとか他モードと違ってPASS THROUGHモードとか表示されないのでわかりづらい・・・

  • <Space>,<C-]>・・・vimにもあるけど、略語展開をする。あらかじめabbreviateコマンドで略語登録しておく必要あり
例えば
:abbr r ルーピー鳩山

としておくと、

:tabopen r

のときに<C-]>を押すと

:tabopen ルーピー鳩山

となる!

追記

"'などのクォーテーション文字でも略語展開できます

tyrutyru2010/04/19 23:49分かってると思いますが、
:tabopen r
で<Space>などを押しても展開されますよー。
どんな時に展開されるかなど、詳しくは:help abbreviationsを。

voidy21voidy212010/04/20 06:35>>id:tyru
あああ、<Space>は忘れてました
クォーテーション文字でも出来るのは知らなかったです・・・
ありがとうございました!

2010-03-09

タブで開いている画像ファイルを全て保存するコマンド

| 17:10 | タブで開いている画像ファイルを全て保存するコマンド - ヴィンペラートル・オクタウィアヌス を含むブックマーク はてなブックマーク - タブで開いている画像ファイルを全て保存するコマンド - ヴィンペラートル・オクタウィアヌス

もう既にそういうのはあったりするかもしれないですが、書いてみる

とりあえず書いてみる

vimperatorrcに書く
" タブ上にある全ての画像を保存するコマンド
" -cオプションでタブを閉じながら保存
let g:imageSaveDirectory = "~/Pictures/"
let g:saveAndClose = "false"

javascript <<EOM
commands.addUserCommand(
    ['saveallimage'],
    'save all image in tabs',
    function(args) {
        let mTabs = document.getElementById("content").mTabs;
        let index = -1;
        let closes = 0;
        function closeTab(i) {
            if( args["-close"] || eval(liberator.globalVariables.saveAndClose) ) {
                 let ts = getBrowser().tabContainer.childNodes;
                 getBrowser().removeTab(ts[i - closes]);
                 ++closes;
            }
        };
        function isTextType(url){
            try{
                const ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
                let ch = ioService.newChannel(url, "UTF-8", null);
                let stream = ch.open();
                return ch.contentType.match(/^text/);
            }catch(e){liberator.echoerr(e)};
            return true;
        };
        function downloadImage(url,file,leafname) {
            if ( !file.exists() || args.bang ){
                //以下の1行でもほぼOKだけど、保存先がどうしても変更できない・・・
                //saveImageURL(url,targetpath,null,true,makeURI(url,getCharsetforSave(null)));

                //URLからダウンロードする
                const dm = Cc["@mozilla.org/download-manager;1"].getService(Ci.nsIDownloadManager);
                let persist = makeWebBrowserPersist();
                try{
                    let to_file = services.create('file');
                    to_file.initWithPath(file.path);
                    let to_uri = makeFileURI(to_file);
                    let from_uri = makeURI(url,null,null);

                    let download = dm.addDownload(0, from_uri, to_uri, leafname,
                                                null, null, null, null, persist);
                    persist.progressListener = download;
                    persist.saveURI(from_uri, null, null, null, null, to_file);
                    liberator.echo("Save : " + file.path);
                }catch(e){liberator.echoerr(e)}
            }else{
                liberator.echoerr("E13: File exists (add ! to override) : " + file.path);
            }
        };
        for each ( [,tab] in tabs.browsers ) {
            ++index;
            let lb = mTabs[index-closes].linkedBrowser;
            let bartabURL = lb.userTypedValue ? lb.userTypedValue : lb.mIconURL;
            let url = bartabURL ? bartabURL : tab.currentURI.spec;
            if( url.match(/\.(jpe?g|gif|png|bmp)$/i) ){
                //URLの拡張子だけで判別すると404とかだったときに困るのでMIME-TYPEからも調べる
                if( isTextType(url) ) {
                    closeTab(index);
                    continue;
                }
                //ファイル名取得
                let leafname = url.split(/\/+/g).pop();
                let targetpath = liberator.globalVariables.imageSaveDirectory + leafname;
                let file = io.File(targetpath);
                downloadImage(url,file,leafname);
                closeTab(index);
            }
        }
    },
    {
        bang: true,
        options: [
           [["-close", "-c"], commands.OPTION_NOARG],
        ]
    }
);
EOM
使い方

:saveallimageで全ての画像を保存(ファイルが既に存在する場合は保存しない)

-closeオプションを付けると画像を保存しつつタブを閉じる(グローバル変数でもセットできる)

グローバル変数でデフォルトの保存先をあらかじめ指定しておく必要がある

:saveallimage!とすると強制的に上書き保存する

もっと短く書くつもりが

こんなに長くなってしまった\(^o^)/

プラグインとして書いた方がよかったかも・・・


参考にさせていただいたもの

画像を保存するヒントモードを作った - vimpめも - vimperatorグループ

#vimperator プラグイン: ZIPでダウンロードするお! - Vimple Star Sprites - vimperatorグループ

ありがとうございました!

追記

Vimperator2.3のみで動作しました

Windowsの場合は let g:imageSaveDirectory = "C:\hoge\"とかすると動くと思います

teramakoteramako2010/03/09 18:03>> //URLの拡張子だけで判別すると404とかだったときに困るのでMIME-TYPEからも調べる
browser.contentDocument.contentType から "image/jpeg" 等を得ることが出来たりしますよー

voidy21voidy212010/03/09 18:09おおお、助言ありがとうございます!!

voidy21voidy212010/03/09 18:41どうもBarTabのlinkedBrowserからは読み込まれていないタブが"text/html"になってしまっているようで、本当のContent-Typeを知ることが出来ない感じでした・・