はてなキーワード: ^Hとは
.
本記事末尾のローカルなkey mappingを実現するコードを改良してプラグインにしました。
↓
Vimperatorでローカルなkey mappingを実現するプラグイン local_mappings.js を書いた。
http://anond.hatelabo.jp/20080826124641
2008-07-14 - やぬすさんとこの日記
http://d.hatena.ne.jp/janus_wel/20080714
→n秒後/前に移動するkey mappingも忘れずに!
Re: autocmd が分からない - hogehoge
http://d.hatena.ne.jp/teramako/20080731/p1
のコードをいじった。
" --- autocmd --- " nicovideo " cでコメント入力、Cでコマンド入力、sでシーク、lでボリューム調整、 " pで停止/再生、mでミュートのon/off、vでコメの表示トグル、zでズーム。 javascript <<EOM liberator.plugins.nicomap = function(){ // no args var list=[ ["p","nicopause"], ["m","nicomute"], ["v","nicomementvisible"], ["z","nicosize"], ["s","nicoseek"], ]; // has args var list2=[ ["c","nicomment"], ["C","nicommand"], ["l","nicovolume"], ["s","nicoseek"], ]; if(buffer.URL.indexOf("http://www.nicovideo.jp/watch") == 0){ for (var j=0; j<list.length; j++){ let i = j; liberator.mappings.addUserMap([1],[list[i][0]],list[i][1], function(){ liberator.execute(list[i][1]); },{ rhs:":"+list[i][1]+"<CR>" } ); } for (var j=0; j<list2.length; j++){ let i = j; liberator.mappings.addUserMap([1],[list2[i][0]],list2[i][1], function(){ liberator.execute('normal :'+list2[i][1]+'<Space>'); },{ rhs:":"+list2[i][1]+"<Space>" } ); } } else { for (var i=0; i<list.length; i++){ liberator.mappings.remove(1,list[i][0]); } for (var i=0; i<list2.length; i++){ liberator.mappings.remove(1,list2[i][0]); } } }; liberator.autocommands.add('LocationChange','.*','js liberator.plugins.nicomap()'); EOM
http://d.hatena.ne.jp/nokturnalmortum/20080802#1217633913
.
現在のマウスカーソル位置でクリックイベント発生するkey mappingを設定できればより快適なんだが・・・。
(「コメントする」ボタンのDOMノードが取得できれば、dispatchEventでいけそうだけど)
" ************* local key mappings **************** javascript <<EOM (function(){ function setlocalmap(obj){ var list = obj.list; var list2 = obj.list2; var exp = obj.exp; if(list.constructor != Array || list2.constructor != Array){ echr("invalid argument: array argument required");return; } if(exp.constructor != RegExp){ echr("invalid argument: regex argument required");return; } if(exp.test(liberator.buffer.URL)){ for (var j=0; j<list.length; j++){ let i = j; liberator.mappings.addUserMap([1],[list[i][0]],list[i][1], function(){ liberator.execute(list[i][1]); },{ rhs:":"+list[i][1]+"<CR>" } ); } for (var j=0; j<list2.length; j++){ let i = j; liberator.mappings.addUserMap([1],[list2[i][0]],list2[i][1], function(){ liberator.execute('normal :'+list2[i][1]+'<Space>'); },{ rhs:":"+list2[i][1]+"<Space>" } ); } } else { for (var i=0; i<list.length; i++){ liberator.mappings.remove(1,list[i][0]); } for (var i=0; i<list2.length; i++){ liberator.mappings.remove(1,list2[i][0]); } } } /** * Add Key Mappings to Specific Web Pages * @param obj : has following properties * list : commands that take no args * list2 : commands that take args * exp : target page's URL (regex) * @see Re: autocmd が分からない - hogehoge * http://d.hatena.ne.jp/teramako/20080731/p1 */ liberator.plugins.addLocalUserMap = function(obj){ liberator.plugins[obj.name + "MapSetter"] = function(){ setlocalmap(obj); } liberator.autocommands.add( 'LocationChange', '.*', 'js liberator.plugins.' + obj.name + 'MapSetter()' ); }; // nicovideo // cでコメント入力、Cでコマンド入力、sでシーク、lでボリューム調整、 // pで停止/再生、mでミュートのon/off、vでコメの表示トグル、zでズーム。 var nicovideo = { name : 'nico', exp : /^http:\/\/www.nicovideo.jp\/watch/, list : [ ["p","nicopause"], ["m","nicomute"], ["v","nicomementvisible"], ["z","nicosize"], ["s","nicoseek"], ], list2 : [ ["c","nicomment"], ["C","nicommand"], ["l","nicovolume"], ["s","nicoseek"], ], }; liberator.plugins.addLocalUserMap(nicovideo); })(); EOM
実行してみたら出力に変化がなかった。アルェー?
# tree -pugs | perl -e '@line=<>; $max=(sort {$b<=>$a} map {/^(.*?)\[/; length($1)} @line)[0]; map {s/^(.*?)\[/$1 . " "x($max-length($1))."\["/e} @line; print @line'
毎回正規表現考えるのも面倒かなーとかとか。
理想を語ると出力形式指定できれば最強だなーとか妄想してた。
この辺は、ファイルにして ~/bin に放りこんで、自分好みに育て上げる、ってのがエロゲ^H^H^Hギークの楽しみ方かと。
雛型的には↓かなぁ。どうだろ。弾・monger・コーガイ氏が登場したら……滅多切りさるかもw
#!/usr/bin/perl use strict; use warnings; use Getopt::Std; use vars qw($opt_t); # オプション処理 getopts('t'); # $opt_tがセットされていたらタブ処理、ということにする。 # コマンド起動 # 引数処理とかシグナルとか面倒なところは…… open TREE, "tree -pugs ".join(" ",@ARGV,"|") or die; my @line = <TREE>; # 富豪的にいく close TREE; # ここで子プロセスの処理だっけ? # それともwaitするんだっけ? # ツリー表示部分の最大長を求める。 my $max=(sort {$b<=>$a} map {/^(.*?)\[/; length($1)} @line)[0]; # 色々やる時はユーザ名とかグループ名とかファイル名とかの最大長がいるかも foreach (@line) { if ($opt_t) { # タブ(\t)で位置をそろえるとか…… } else { s/^(.*?)\[/$1 . " "x($max-length($1))."\["/e; } print; }
treeへのオプションの与え方とか、それによる出力の変化とか考えると、結構面倒だけど、自分用に決め打ちしとけば何とかなるでしょう。
あと、「[%p<>%u<>%g<>%s]」みたいなのはCPANに転がってたりしそうな気もするので、それを使うとか。
そんなところでなかろうか。
[追記]
http://search.cpan.org/~darren/String-Format-1.14/Format.pm というのがあった。
便利すぐる!とか思ったんだけど、オプション次第では出力がちょっと汚い。
これってうまいこと成形できないかな。かな。
これ。
http://arbolbell.jp/tools/2007/11/linux-tree.html
[root@localhost www]# tree . |-- cgi-bin |-- error | |-- HTTP_BAD_GATEWAY.html.var | |-- HTTP_BAD_REQUEST.html.var | |-- HTTP_FORBIDDEN.html.var | |-- HTTP_GONE.html.var | |-- HTTP_INTERNAL_SERVER_ERROR.html.var | |-- HTTP_LENGTH_REQUIRED.html.var | |-- HTTP_METHOD_NOT_ALLOWED.html.var | |-- HTTP_NOT_FOUND.html.var | |-- HTTP_NOT_IMPLEMENTED.html.var | |-- HTTP_PRECONDITION_FAILED.html.var | |-- HTTP_REQUEST_ENTITY_TOO_LARGE.html.var | |-- HTTP_REQUEST_TIME_OUT.html.var | |-- HTTP_REQUEST_URI_TOO_LARGE.html.var | |-- HTTP_SERVICE_UNAVAILABLE.html.var | |-- HTTP_UNAUTHORIZED.html.var | |-- HTTP_UNSUPPORTED_MEDIA_TYPE.html.var | |-- HTTP_VARIANT_ALSO_VARIES.html.var | |-- README | |-- contact.html.var | |-- include | | |-- bottom.html | | |-- spacer.html | | `-- top.html | `-- noindex.html |-- html (以下略)
こんな感じで出してくれる。超便利。
[root@localhost www]# tree -pugs . |-- [drwxr-xr-x hoge hoge 4096] cgi-bin |-- [drwxr-xr-x hoge hoge 4096] error | |-- [-rw-r--r-- hoge hoge 9108] HTTP_BAD_GATEWAY.html.var | |-- [-rw-r--r-- hoge hoge 6633] HTTP_BAD_REQUEST.html.var | |-- [-rw-r--r-- hoge hoge 11193] HTTP_FORBIDDEN.html.var | |-- [-rw-r--r-- hoge hoge 12700] HTTP_GONE.html.var | |-- [-rw-r--r-- hoge hoge 12846] HTTP_INTERNAL_SERVER_ERROR.html.var | |-- [-rw-r--r-- hoge hoge 7539] HTTP_LENGTH_REQUIRED.html.var | |-- [-rw-r--r-- hoge hoge 6773] HTTP_METHOD_NOT_ALLOWED.html.var | |-- [-rw-r--r-- hoge hoge 13255] HTTP_NOT_FOUND.html.var | |-- [-rw-r--r-- hoge hoge 6336] HTTP_NOT_IMPLEMENTED.html.var | |-- [-rw-r--r-- hoge hoge 6565] HTTP_PRECONDITION_FAILED.html.var | |-- [-rw-r--r-- hoge hoge 7802] HTTP_REQUEST_ENTITY_TOO_LARGE.html.var | |-- [-rw-r--r-- hoge hoge 7099] HTTP_REQUEST_TIME_OUT.html.var | |-- [-rw-r--r-- hoge hoge 7103] HTTP_REQUEST_URI_TOO_LARGE.html.var | |-- [-rw-r--r-- hoge hoge 7822] HTTP_SERVICE_UNAVAILABLE.html.var | |-- [-rw-r--r-- hoge hoge 13035] HTTP_UNAUTHORIZED.html.var | |-- [-rw-r--r-- hoge hoge 6353] HTTP_UNSUPPORTED_MEDIA_TYPE.html.var | |-- [-rw-r--r-- hoge hoge 7009] HTTP_VARIANT_ALSO_VARIES.html.var | |-- [-rw-r--r-- hoge hoge 1979] README | |-- [-rw-r--r-- hoge hoge 4256] contact.html.var | |-- [drwxr-xr-x hoge hoge 4096] include | | |-- [-rw-r--r-- hoge hoge 291] bottom.html | | |-- [-rw-r--r-- hoge hoge 9] spacer.html | | `-- [-rw-r--r-- hoge hoge 969] top.html | `-- [-rw-r--r-- hoge hoge 5043] noindex.html |-- [drwxr-xr-x hoge hoge 4096] html (以下略)
いまいちかっちょわるい。
体裁とか好きなようにいじれたらそのまま書類にできるんだけどなーと。
欲しいものをまとめると
http://anond.hatelabo.jp/20080415182703
てな感じです。
http://anond.hatelabo.jp/20080416071526
雛型をtreetest.plとして保存して動かすとこんな感じになりました。
[root@localhost www]# perl ./treetest.pl . |-- [drwxr-xr-x hoge hoge 4096] cgi-bin |-- [drwxr-xr-x hoge hoge 4096] error | |-- [-rw-r--r-- hoge hoge 9108] HTTP_BAD_GATEWAY.html.var | |-- [-rw-r--r-- hoge hoge 6633] HTTP_BAD_REQUEST.html.var | |-- [-rw-r--r-- hoge hoge 11193] HTTP_FORBIDDEN.html.var | |-- [-rw-r--r-- hoge hoge 12700] HTTP_GONE.html.var | |-- [-rw-r--r-- hoge hoge 12846] HTTP_INTERNAL_SERVER_ERROR.html.var | |-- [-rw-r--r-- hoge hoge 7539] HTTP_LENGTH_REQUIRED.html.var | |-- [-rw-r--r-- hoge hoge 6773] HTTP_METHOD_NOT_ALLOWED.html.var | |-- [-rw-r--r-- hoge hoge 13255] HTTP_NOT_FOUND.html.var | |-- [-rw-r--r-- hoge hoge 6336] HTTP_NOT_IMPLEMENTED.html.var | |-- [-rw-r--r-- hoge hoge 6565] HTTP_PRECONDITION_FAILED.html.var | |-- [-rw-r--r-- hoge hoge 7802] HTTP_REQUEST_ENTITY_TOO_LARGE.html.var | |-- [-rw-r--r-- hoge hoge 7099] HTTP_REQUEST_TIME_OUT.html.var | |-- [-rw-r--r-- hoge hoge 7103] HTTP_REQUEST_URI_TOO_LARGE.html.var | |-- [-rw-r--r-- hoge hoge 7822] HTTP_SERVICE_UNAVAILABLE.html.var | |-- [-rw-r--r-- hoge hoge 13035] HTTP_UNAUTHORIZED.html.var | |-- [-rw-r--r-- hoge hoge 6353] HTTP_UNSUPPORTED_MEDIA_TYPE.html.var | |-- [-rw-r--r-- hoge hoge 7009] HTTP_VARIANT_ALSO_VARIES.html.var | |-- [-rw-r--r-- hoge hoge 1979] README | |-- [-rw-r--r-- hoge hoge 4256] contact.html.var | |-- [drwxr-xr-x hoge hoge 4096] include | | |-- [-rw-r--r-- hoge hoge 291] bottom.html | | |-- [-rw-r--r-- hoge hoge 9] spacer.html | | `-- [-rw-r--r-- hoge hoge 969] top.html | `-- [-rw-r--r-- hoge hoge 5043] noindex.html |-- [drwxr-xr-x hoge hoge 4096] html (以下略)
ステキすぐる。
これを元にいろいろいぢくればcodereposでコミっても怒られないものができそう。
Format.pmもかなり使えそうと言うか僕の要求ずばりですよ。
firefoxでしか確認していないけれど、URL、正規表現、XPathで指定できる様にしてみたよ。
// ==UserScript== // @name filter for Hatena::Bookmark // @namespace http://anond.hatelabo.jp/ // @include http://b.hatena.ne.jp/hotentry* // @include http://b.hatena.ne.jp/entrylist* // origin http://anond.hatelabo.jp/20080302214727 // ==/UserScript== (function(){ var itemxpath = "//div[@class='entry']"; function xpathgenURL(url) {return "//div[@class='entry' and descendant::a[starts-with(@href,'"+url+"')]]"} var filters = [ // start with '//' then xpath // moconico douga // {"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"}, "//div[@class='entry' and descendant::a[contains(@href,'nicovideo.jp')]]", /* // tag of "2ch" {"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum}, {"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum}, ***/ // start with 'http' then url // 2ch blogs // livedoor // {"tag": "div", "name": "entry", // "pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//}, "http://blog.livedoor.jp/insidears/", "http://blog.livedoor.jp/dqnplus/", // {"tag": "div", "name": "entry", // "pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//}, "http://guideline.livedoor.biz/", "http://alfalfa.livedoor.biz/", "http://news4vip.livedoor.biz/", // typeof /regexp/ is function (@firefox) then regexp pattern // fc2 // {"tag": "div", "name": "entry", // "pattern": /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//}, /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//, // tag of "neta" // {"tag": "a", "name": "tag", "pattern": "ネタ", "parentNum": HatebuTagParentNum}, "//div[@class='entry' and descendant::a[@class='tag' and string()='ネタ']]", // {"tag": "a", "name": "tag", "pattern": "*ネタ", "parentNum": HatebuTagParentNum}, "//div[@class='entry' and descendant::a[@class='tag' and string()='*ネタ']]", // hatena anonymouse diary // {"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//} "http://anond.hatelabo.jp/", ]; for (var i=0; i<filters.length; i++) { var filter = filters[i]; var type = typeof filter; var regexp; var xpath; if (type == "function") { xpath = itemxpath; regexp = filter; } else if (type == "string") { if (filter.match(/^http/)) { xpath = xpathgenURL(filter); } else if (filter.match(/^\/\//)) { xpath = filter; } else { next; } } var removeNodes = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var j=0; j<removeNodes.snapshotLength; j++) { var node = removeNodes.snapshotItem(j); if (!regexp || node.innerHTML.match(regexp)) { node.parentNode.removeChild(node); } } } })();
ついでに増田版も作ってみたよ。
// ==UserScript== // @name filter for Hatelabo::AnonymousDiary // @namespace http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/ // @include http://anond.hatelabo.jp/*?page=* // @exclude http://anond.hatelabo.jp/YourID/* // ==/UserScript== // origin http://anond.hatelabo.jp/20080302214727 (function(){ var itemxpath = "//div[@class='section']"; function xpathgenURL(url) {return "//div[@class='section' and descendant::a[starts-with(@href,'"+url+"')]]"} var filters = [ // start with '//' then xpath "//div[@class='section' and child::h3[starts-with(string(),'■はてなの嫌われ者!')]]", // start with 'http' then url "http://anond.hatelabo.jp/", // typeof /regexp/ is function (@firefox) then regexp pattern /釣り/, ]; for (var i=0; i<filters.length; i++) { var filter = filters[i]; var type = typeof filter; var regexp; var xpath; if (type == "function") { xpath = itemxpath; regexp = filter; } else if (type == "string") { if (filter.match(/^http/)) { xpath = xpathgenURL(filter); } else if (filter.match(/^\/\//)) { xpath = filter; } else { next; } } var removeNodes = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); for (var j=0; j<removeNodes.snapshotLength; j++) { var node = removeNodes.snapshotItem(j); if (!regexp || node.innerHTML.match(regexp)) { node.parentNode.removeChild(node); } } } })();
相撲ファンの目を離れて外の目から見れば。
いくら強かろうと巡業サボった朝青龍はクビでよくね? となるし、「かわいがり」で死亡した斉藤某とかなんですぐに司法解剖に持って行かないの? となるし、八百長だって逆に何でブックがあっちゃいけないの? という話になるし、高額売買が指摘される親方株だって別にそんなの要らないっていうか何で引退してからじゃないと指導できないの現役力士でも強ければ道場持てばいいじゃん(昔で言う二枚鑑札)という話になる。
でさ、このへんはもういっそ外の感覚に合わせてしまえばいいと思うんだ。
# その際協会寄付行為で「解散時の財産の帰属は類似の公益団体に」とあるから、一旦は文部省傘下の公益法人が全株を保有し、しかる後に随時民間に売却することになろう。
これで理事会^h^h^h取締役会の「上」に株主総会ができるので親方どもの好き勝手にはできなくなるし、そもそも取締役に力士出身者がつくことも困難になろう。
で、NHKも必ずしも全場所中継しないようにする。逆に言えば、(株)大相撲は放映権に関するフリーハンドを得、従来の不透明な座席手配よりも放映権の売りさばきによる収益をメインにするようになろう。
しかも、株主の目に加えて放映権者の目がある以上、殺人とか暴行なんて決定的なスキャンダルは自粛せられるだろう。暴力団とのスキャンダルで放映権売れなくなって衰亡した某団体を教訓にするならば。
でだ。面白ければ八百長もアリにするのだ。八百長相撲を「自然」に見せるにはそれはそれで高度な技術がいる、ということは彼の「中盆」板井も強調するところであるし、実際八百長云々は関係なしに「千代の富士時代」の相撲は格闘技興行として面白かった。一概に害悪と切って捨てるのは勿体ない。
但し、それは力士間の不透明な売買ではなく、(株)大相撲のブックメーカーが定めた「ブック」「ギミック」に基づくものでなければならない。力士間に「ストーリー」を設定して遣ってもいいし、「ヒール」「ベビーフェイス」を設定してやる。もちろんガチを貫く力士が居るならブックメーカーはそれすら尊重してブックを立てることが望まれる。
もちろん力士はレスラーよろしく、簡単に「脱退」したり「(株)大相撲とは別の組織を結成」したり「復帰」したり「ガチを標榜する新競技を主張」したりするようになるだろう。「プロレス化」するだろう。
で、それで何か「見る側にとって」問題があるの?
http://anond.hatelabo.jp/20070429211930
ファイルにurlコピペしといてそこから読み込むようにしたんだぜ?
頭の"h"を補完するようにしたんだぜ?
例えばhoge.txtとして次のような内容にしておく。
ttp://www.yourfilehost.com/media.php?cat=video&file=hoge_001.wmv ttp://www.yourfilehost.com/media.php?cat=video&file=hoge_002.wmv ttp://www.yourfilehost.com/media.php?cat=video&file=hoge_003.wmv
こっちはbukkonuki.rbとして保存。
require 'rubygems' require 'scrapi' require 'open-uri' def get_yourfilehost_src(uri) yourfilehost_src = Scraper.define do process "embed", :src => "@src" result :src end yourfilehost_match = /vidlink\=(.*?)&/ return yourfilehost_match.match(yourfilehost_src.scrape(URI.parse(uri)))[1] end def completion_uri(arg) if arg =~ /^h/ uri = arg else uri = 'h' + arg end return uri end def expansion_list() $*.each do |files| File::open(files) do |file| file.each {|line| system 'wget', get_yourfilehost_src(completion_uri(line)) } end end end expansion_list() #$*.each do |arg| # system 'wget', get_yourfilehost_src(completion_uri(arg)) #end
使うときは
ruby bukkonuki.rb hoge.txt
って感じで頼むぜ。
OK
C# $10 (T_T) *ist D +ANIMA yes,mama ok -196℃ .book c/w :active ave;new アンリ・カルティエ=ブレッソン ?B @CHaT [TV] ^H _no PE`Z ||リ・_・`川
AirH" AirH" 女子高生 GIRL'S-HIGH 女子高生 GIRL'S-HIGH MÄR MÄR (*゚∀゚)ノ パキャッ (*゚∀゚)ノ パキャッ
文字参照に変換されるため双方上と同様に
P&G
!K7
含むキーワードを見つけられず
% \ { } ~
キーワード関連
というわけで、残るは文字参照関係だけかな。