<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:lang="ja">
  <channel>
    <title>hail2u.net - Weblog</title>
    <link>http://hail2u.net/blog/</link>
    <description>移り気な管理人が、気になっていることをアトランダムにいろいろ書き連ねてみるblogです。</description>
    <language>ja</language>
    <copyright>Copyright (c) 2002-2009, Kyo Nagashima</copyright>
    <managingEditor>kyo@hail2u.net (Kyo Nagashima)</managingEditor>
    <webMaster>kyo@hail2u.net (Kyo Nagashima)</webMaster>
    <lastBuildDate>Sun, 22 Nov 2009 04:20:51 +0900</lastBuildDate>
    <generator>blosxom v2.0</generator>
    <atom:link href="http://feeds.feedburner.com/hail2u/blog" rel="self" type="application/rss+xml" />
    <creativeCommons:license>http://creativecommons.org/licenses/by-nc/2.1/jp/</creativeCommons:license>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Firefox 3.6以降でＭＳ Ｐゴシックを無効にする</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/pdK8TsBs34c/kill-ms-pgothic-in-fx36-or-later.html</link>
      <description>CSSの@font-faceではユーザーがインストールしていないフォントをウェブ上に用意してやりそれをダウンロードさせてページ上で利用することを主眼としているが、ローカルのフォントを置換、つまりＭＳ Ｐゴシックをメイリオに置換するなどということもできる。Firefoxでは3.6から可能になった(Beta版でももちろん可能)。ユーザー・スタイルシートでの利用が中心になると思う。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Software</category>
      <guid isPermaLink="false">http://hail2u.net/blog/software/kill-ms-pgothic-in-fx36-or-later.html</guid>
      <pubDate>Sun, 22 Nov 2009 04:20:48 +0900</pubDate>
      <content:encoded><![CDATA[
<p>CSSの<code>@font-face</code>ではユーザーがインストールしていないフォントをウェブ上に用意してやりそれをダウンロードさせてページ上で利用することを主眼としているが、ローカルのフォントを置換、つまりＭＳ Ｐゴシックをメイリオに置換するなどということもできる。Firefoxでは3.6から可能になった(Beta版でももちろん可能)。ユーザー・スタイルシートでの利用が中心になると思う。</p>

<p>ＭＳ Ｐゴシックをメイリオに置換する場合は以下のようにuserContent.cssに記述する(userChrome.cssではない)。</p>

<pre>
@font-face {
  font-family: &quot;ＭＳ Ｐゴシック&quot;;
  src: local(&quot;メイリオ&quot;), local(&quot;Meiryo&quot;), local(&quot;ＭＳ Ｐゴシック&quot;);
}

@font-face {
  font-family: &quot;MS PGothic&quot;;
  src: local(&quot;メイリオ&quot;), local(&quot;Meiryo&quot;), local(&quot;ＭＳ Ｐゴシック&quot;);
}
</pre>

<p>日本語で書く必要があるので、userContent.cssの先頭に<code>@charset &quot;UTF-8&quot;;</code>と書かれていることとuserContent.cssの文字コードがUTF-8であることは確認しておく。それぞれの<code>src</code>プロパティの最後に<code>local(&quot;ＭＳ Ｐゴシック&quot;)</code>も書いてあるのは一応念のため。これであらゆるウェブページでＭＳ Ｐゴシックがメイリオで表示されるようになる。</p>

<p><code>src</code>で指定するフォントは複数のフォントを混ぜ合わせることもできる。例えば、</p>

<pre>
@font-face {
  font-family: &quot;ＭＳ Ｐゴシック&quot;;
  src: local(&quot;Calibri&quot;), local(&quot;メイリオ&quot;), local(&quot;Meiryo&quot;), local(&quot;ＭＳ Ｐゴシック&quot;);
}
</pre>

<p>とするとＭＳ Ｐゴシックが英字部分は<a href="http://en.wikipedia.org/wiki/Calibri">Calibri</a>で日本語部分はメイリオで表示されるようになる(ちょっと正確ではないけど)。</p>

<p>ＭＳ ゴシックには良い代替フォントはあまりないが、やるなら<a href="http://www.geocities.jp/ep3797/modified_fonts_01.html">UmePlusやUmePlus CL</a>とかが良いと思う。</p>

<pre>
@font-face {
  font-family: &quot;ＭＳ ゴシック&quot;;
  src: local(&quot;UmePlus Gothic&quot;), local(&quot;ＭＳ ゴシック&quot;);
}

@font-face {
  font-family: &quot;MS Gothic&quot;;
  src: local(&quot;UmePlus Gothic&quot;), local(&quot;ＭＳ ゴシック&quot;);
}
</pre>

<p>また、Windows 7(や<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a1314285-3185-49e7-b5a2-fbe08809877e&amp;DisplayLang=ja">メイリオのアップデータ</a>をインストールしたWindows Vista)では、</p>

<pre>
@font-face {
  font-family: &quot;MS UI Gothic&quot;;
  src: local(&quot;Meiryo UI&quot;), local(&quot;MS UI Gothic&quot;);
}
</pre>

<p>こんな風に書いておくとMS UI GothicがMeiryo UIに置換される。ClearType大好きっ子にオススメ。</p>

<hr>

<p>ローカル・フォントの置換の欠点は置換するフォントをまったく利用することができなくなることとそれらのフォントを前提にデザインされたウェブページでデザインやレイアウト崩れてしまうかもしれないこと。特にＭＳ Ｐゴシックをメイリオに置換する場合は、フォントの横幅がかなり広くなってしまうのでよくレイアウトが崩れることになると思う。</p>

<p>デメリットは少なからずあるが、解像度の向上した現在ではClearType(やアンチエイリアス)の効いた大きめのフォントでウェブページを閲覧する方が快適と感じる人が多いと思うので、設定して損はないと思う。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/software/kill-ms-pgothic-in-fx36-or-later.html</feedburner:origLink></item>
    <item>
      <title>SimpldR: livedoor Readerをシンプルに</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/9dt_2mwyfOA/simpldr.html</link>
      <description>しばらく前からユーザー・スタイルシートとユーザー・スクリプトのコンビネーションでlivedoor Readerをシンプルにして使うようにしていて中々快適なのでまとめてエントリにしてみる。キーボードでサクサク操作できて快適ウハウハとかじゃなくてシンプルな画面でマウス・ホイールを使ってひゅいんひゅいん読む感じ。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Coding</category>
      <guid isPermaLink="false">http://hail2u.net/blog/coding/simpldr.html</guid>
      <pubDate>Fri, 20 Nov 2009 09:38:08 +0900</pubDate>
      <content:encoded><![CDATA[
<p>しばらく前からユーザー・スタイルシートとユーザー・スクリプトのコンビネーションで<a href="http://reader.livedoor.com/">livedoor Reader</a>をシンプルにして使うようにしていて中々快適なのでまとめてエントリにしてみる。キーボードでサクサク操作できて快適ウハウハとかじゃなくてシンプルな画面でマウス・ホイールを使ってひゅいんひゅいん読む感じ。</p>

<p class="image"><img src="http://hail2u.net/blog/images/simpldr-preview.png" alt="SimpldRのプレビュー(Firefox)" width="800" height="600"></p>

<h2>ユーザー・スタイルシート</h2>

<p>ヘッダの色などを排除するのがメイン。userContent.cssに以下のCSSを追加する。</p>

<pre>
/* livedoor Reader
----------------------------- */
@-moz-document domain(&quot;reader.livedoor.com&quot;) {
  * {
    font-family: &quot;Lucida Grande&quot;, &quot;Trebuchet MS&quot;, sans-serif !important;
  }

  pre, code, kbd, samp, var {
    font-family: &quot;Monaco&quot;, &quot;Andale Mono&quot;, monospace !important;
  } 

  .body img {
    max-width: 100% !important;
  }

  .channel {
    background-color: #ffffff !important;
  }

  .channel a {
    color: #000000 !important;
  }

  .title {
    font-size: 30px !important;
  }

  .channel_toolbar {
    padding-bottom: 1em !important;
    border-bottom: 1px solid #000000 !important;
    background-color: #ffffff !important;
  }

  .item {
    border-bottom: 1px solid #000000 !important;
  }

  .even {
    background-color: #ffffff !important;
  }

  .hilight {
    background-color: #ffffff !important;
  }

  .item_title {
    font-size: 18px !important;
  }

  .adsWrapper {
    margin: 0 !important;
  }
}
</pre>

<p>ldR側の設定で「本文の文字サイズ」を15pxにしておくとバランスが良い。<code>display: none;</code>とかはしていないので他のなんかと衝突して困るとかは無いと思う。広告消しとかは自分でどうぞ。あとフォント指定も好きに変えると良いと思う。</p>

<h2>ユーザー・スクリプト</h2>

<dl>
<dt><a href="http://userscripts.org/scripts/show/62381">ldR: Auto fullscreen</a></dt>
<dd>livedoor Readerを自動的にフルスクリーンにする</dd>
<dt><a href="http://userscripts.org/scripts/show/62383">ldR: Show first feed</a></dt>
<dd>livedoor Readerにアクセスした時に最初のフィードを自動的に開く </dd>
<dt><a href="http://userscripts.org/scripts/show/62382">ldR: Go prev/next feed with wheel</a></dt>
<dd>livedoor Readerでホイール・スクロールし切ると自動的に前後のフィードに移動する</dd>
</dl>

<p>一つ目のユーザー・スクリプトで自動的にフルスクリーン、つまり記事表示部分のみにする。他の二つは操作系のものなので、自分好みにカスタマイズしている人は入れる必要は無い。このままだと設定とかにアクセスできないが、ldRにはショートカットキーがあるので、必要な時は<code>z</code>でサイドバー、<code>Shift+z</code>でトップのナビゲーションを表示できる。</p>

<hr>

<p>以上でFirefoxではいける。<a href="http://prism.mozilla.com/">Prism</a>と<a href="http://teramako.github.com/greasemonkey-for-prism/">Greasemonkey for Prism</a>を組み合わせればアプリケーション化も可能。だがスタンドアローン版のPrismの場合は起動に時間がかかり実用的ではなく、<a href="https://addons.mozilla.org/ja/firefox/addon/6665">Firefoxの拡張版のPrism</a>の場合はブラウザを起動済みなら起動速度に問題はなくなるが、それならタブで開けば良い話。</p>

<p>そこで<a href="http://www.google.com/chrome/">Google Chrome</a>に頑張ってもらう。2009-11-20現在の最新安定版のChromeではユーザー・スクリプトをサポートしているので、<a href="http://gist.github.com/201011">Chrome向けにカスタマイズしたユーザー・スクリプト</a>をインストールし、以下のようなショートカットを作成すればさくっと起動するSimpldRの出来上がり。ユーザー・スクリプトのインストールは<a href="http://gihyo.jp/dev/serial/01/chrome-extensions/0002">続・先取り！ Google Chrome Extensions：第2回　User ScriptsとContent Scripts</a>の「導入」が一番わかりやすい。</p>

<p class="image"><img src="http://hail2u.net/blog/images/simpldr-on-google-chrome.png" alt="SimpldR on Google Chrome" width="800" height="600"></p>

<p>今のChromeでは残念ながらユーザー・スタイルシートはサポートされていない感じ(僕が知らないだけかも)なので、ユーザー・スクリプト内で強引にスタイルを設定してやっている(あって良かった<code>GM_addStyle()</code>)。スクリーンショットはChrome 3でのものだがChrome 4 betaでも動作する。</p>

<p>アプリケーションのショートカットの作成は、とりあえず普通にChromeでldRを開いてページ メニューからアプリケーションのショートカットを作成を実行し、デスクトップ等に作られたショートカットのプロパティを開き、スクリーンショットのように</p>

<pre>
...\chrome.exe&quot; <em>--enable-user-scripts</em> --app=http://reader.livedoor.com/reader/
</pre>

<p>と<code>--enable-user-scripts</code>を追加してやれば良い。Chromiumとかの話はよく知らないけど似たような感じでできるらしい。</p>

<hr>

<p>Chromeのユーザー・スクリプトは書き方わかりづらい……。古い情報と新しい情報が混ざってるので混乱する。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/coding/simpldr.html</feedburner:origLink></item>
    <item>
      <title>git commitで既に起動しているgVimの新しいタブを開く</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/BKI8qIOCGJc/open-new-tab-in-existing-gvim-for-git-commit.html</link>
      <description>すぐ忘れる。というかついさっき忘れて1時間近くGoogleと格闘して見つからなかった……。Undeleteで2ヶ月くらい前の.gitcomfigを発掘してどうやれば良いのかわかったので、次忘れたときのためにメモ。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Software</category>
      <guid isPermaLink="false">http://hail2u.net/blog/software/open-new-tab-in-existing-gvim-for-git-commit.html</guid>
      <pubDate>Wed, 18 Nov 2009 06:25:31 +0900</pubDate>
      <content:encoded><![CDATA[
<p>すぐ忘れる。というかついさっき忘れて1時間近くGoogleと格闘して見つからなかった……。Undeleteで2ヶ月くらい前の<code>.gitcomfig</code>を発掘してどうやれば良いのかわかったので、次忘れたときのためにメモ。</p>

<p>単にgVimでコミット・メッセージを書くファイルを開くだけなら以下のように書けば良い(gvimはパスの通ったところにあるとする)。</p>

<pre>
git config --global core.editor gvim
</pre>

<p>これを元に既に起動しているgVimの新しいタブで開こうと以下のようなオプションを指定してもうまくいかない。</p>

<pre>
git config --global core.editor &quot;gvim --remote-tab-silent&quot;
</pre>

<p>コミット・メッセージを書くファイルをタブで開くこと自体は行えるが、その編集を待ってくれない(すぐに<code>Aborting commit due to empty message.</code>と怒られる)ので意味が無い。</p>

<pre>
git config --global core.editor &quot;gvim --remote-tab<em>-wait</em>-silent&quot;
</pre>

<p>これが正解。</p>

<p>なんかどっかに書いたような気がしてきた……。Twitterかなぁ……。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/software/open-new-tab-in-existing-gvim-for-git-commit.html</feedburner:origLink></item>
    <item>
      <title>CSSのプロパティをソートするPerlスクリプト</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/cd39_qiX1-o/perl-sort-css-properties.html</link>
      <description>CSSを書く時に「セレクタ内でCSS仕様書でのプロパティの出現順序に従ってソートする」という個人的なルールを守っている。何かコーディングにおいて便利な理由があるからというわけではなく、第三者に説明する時に「仕様書の出現順で書いてます！」とかで済ませられるから。今まではファイル全体を処理するオレオレPerlスクリプトで適当にやっていたのだけど、Vimで選択範囲だけをソートとかやりたくなったので、普通に標準入力を読んで結果を標準出力に吐くように書き直した。ついでにCSS3のプロパティとFirefox (Mozilla)やSafari (WebKit)、Opera (Presto)、Internet Explorer (Trident)の独自拡張などへも対応させたりとか。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Coding</category>
      <guid isPermaLink="false">http://hail2u.net/blog/coding/perl-sort-css-properties.html</guid>
      <pubDate>Sat, 14 Nov 2009 14:11:51 +0900</pubDate>
      <content:encoded><![CDATA[
<p>CSSを書く時に「セレクタ内でCSS仕様書でのプロパティの出現順序に従ってソートする」という個人的なルールを守っている。何かコーディングにおいて便利な理由があるからというわけではなく、第三者に説明する時に「仕様書の出現順で書いてます！」とかで済ませられるから。今まではファイル全体を処理するオレオレPerlスクリプトで適当にやっていたのだけど、Vimで選択範囲だけをソートとかやりたくなったので、普通に標準入力を読んで結果を標準出力に吐くように書き直した。ついでにCSS3のプロパティとFirefox (Mozilla)やSafari (WebKit)、Opera (Presto)、Internet Explorer (Trident)の独自拡張などへも対応させたりとか。</p>

<pre>
#!/usr/bin/perl

# Author:   Kyo Nagashima <kyo@hail2u.net>, http://hail2u.net/
#           xaicron, http://blog.livedoor.jp/xaicron/
# License:  MIT license (http://opensource.org/licenses/mit-license.php)
# Modified: 2009-11-17T23:09:27+09:00

use strict;
use warnings;

# CSS2.1
my @property_order = qw(
margin
margin-top
margin-right
margin-bottom
margin-left
padding
padding-top
padding-right
padding-bottom
padding-left
border
border-top
border-bottom
border-right
border-left
border-width
border-top-width
border-right-width
border-bottom-width
border-left-width
border-color
border-top-color
border-right-color
border-bottom-color
border-left-color
border-style
border-top-style
border-right-style
border-bottom-style
border-left-style
display
position
top
right
bottom
left
float
clear
z-index
direction
unicode-bidi
width
min-width
max-width
height
min-height
max-height
line-height
vertical-align
overflow
clip
visibility
content
quotes
counter-reset
counter-increment
list-style
list-style-type
list-style-image
list-style-position
page-break-before
page-break-after
page-break-inside
orphans
widows
color
background
background-color
background-image
background-repeat
background-attachment
background-position
font
font-family
font-style
font-variant
font-weight
font-size
text-indent
text-align
text-decoration
text-shadow
letter-spacing
word-spacing
text-transform
white-space
caption-side
table-layout
border-collapse
border-spacing
empty-cells
cursor
outline
outline-width
outline-style
outline-color
volume
speak
pause-before
pause-after
pause
cue-before
cue-after
cue
play-during
azimuth
elevation
speech-rate
voice-family
pitch
pitch-range
stress
richness
speak-punctuation
speak-numeral
speak-header
);

# CSS3 and vendor extension for CSS3 
push @property_order, qw(
background-clip
-moz-background-clip
-webkit-background-clip
background-origin
-moz-background-origin
-webkit-background-origin
background-size
-moz-background-size
-webkit-background-size
-o-background-size
border-radius
-moz-border-radius
-webkit-border-radius
border-top-right-radius
-moz-border-radius-topright
-moz-border-top-right-radius
border-bottom-right-radius
-moz-border-radius-bottomright
-moz-border-bottom-right-radius
border-bottom-left-radius
-moz-border-radius-bottomleft
-webkit-border-bottom-left-radius
border-top-left-radius
-moz-border-radius-topleft
-moz-border-top-left-radius
border-image
-moz-border-image
-webkit-border-image
border-image-source
border-image-slice
border-image-width
border-image-outset
border-image-repeat
box-break
box-shadow
-moz-box-shadow
-webkit-box-shadow
appearance
-moz-appearance
-webkit-appearance
icon
box-sizing
-moz-box-sizing
-webkit-box-sizing
outline-offset
resize
nav-index
overflow-x
-ms-overflow-x
overflow-y
-ms-overflow-y
overflow-style
-webkit-marquee
marquee-style
-webkit-marquee-style
marquee-loop
marquee-direction
-webkit-marquee-direction
marquee-speed
-webkit-marquee-speed
rotation
rotation-point
opacity
font-stretch
font-size-adjust
src
unicode-range
string-set
border-length
hyphens
hyphenate-resource
hyphenate-before
hyphenate-after
hyphenate-lines
hyphenate-character
text-replace
image-resolution
float-offset
marks
bookmark-level
bookmark-label
bookmark-target
target
target-name
target-new
target-position
text-height
line-stacking
line-stacking-strategy
line-stacking-ruby
line-stacking-shift
dominate-baseline
alignment-baseline
alignment-adjust
baseline-shift
inline-box-align
drop-initial-value
drop-initial-size
drop-initial-after-align
drop-initial-after-adjust
drop-initial-before-align
drop-initial-before-adjust
columns
-webkit-columns
column-width
-moz-column-width
-webkit-column-width
column-count
-moz-column-count
-webkit-column-count
column-gap
-moz-column-gap
-webkit-column-gap
column-rule
-moz-column-rule
-webkit-column-rule
column-rule-color
-moz-column-rule-color
-webkit-column-rule-color
column-rule-style
-moz-column-rule-style
-webkit-column-rule-style
column-rule-width
-moz-column-rule-width
-webkit-column-rule-width
column-span
column-fill
size
page
image-orientation
fit
fit-position
presentation-level
ruby-position
ruby-align
ruby-overhang
ruby-span
grid-columns
grid-rows
voice-volume
voice-balance
rest
rest-before
rest-after
mark
mark-before
mark-after
voice-rate
voice-pitch
voice-pitch-range
voice-stress
voice-duration
phonemes
white-space-collapse
word-break
-ms-word-break
text-wrap
word-wrap
-ms-word-wrap
text-align-last
-ms-text-align-last
text-justify
-ms-text-justify
punctuation-trim
text-emphasis
text-shadow
text-outline
text-indent
hanging-punctuation
box-orient
-moz-box-orient
-webkit-box-orient
box-direction
-moz-box-direction
-webkit-box-direction
box-original-group
-moz-box-ordinal-group
-webkit-box-ordinal-group
box-align
-moz-box-align
-webkit-box-align
box-flex
-moz-box-flex
-webkit-box-flex
box-flex-group
-moz-box-flexgroup
-webkit-box-flex-group
box-pack
-moz-box-pack
-webkit-box-pack
box-lines
-webkit-box-lines
transform
-moz-transform
-webkit-transform
transform-origin
-moz-transform-origin
-webkit-transform-origin
transform-style
-webkit-transform-style
perspective
-webkit-perspective
perspective-origin
-webkit-perspective-origin
backface-visibility
-webkit-backface-visibility
transition
-webkit-transition
transition-property
-webkit-transition-property
transition-duration
-webkit-transition-duration
transition-timing-function
-webkit-transition-timing-function
transition-delay
-webkit-transition-delay
animation
-webkit-animation
animation-name
-webkit-animation-name
animation-duration
-webkit-animation-duration
animation-timing-function
-webkit-animation-timing-function
animation-iteration-count
-webkit-animation-iteration-count
animation-direction
-webkit-animation-direction
animation-play-state
-webkit-animation-play-state
animation-delay
-webkit-animation-delay
);

# Vendor extension
push @property_order, qw(
-moz-background-inline-policy
-moz-binding
-moz-border-bottom-colors
-moz-border-left-colors
-moz-border-right-colors
-moz-border-top-colors
-moz-border-end
-moz-border-end-color
-moz-border-end-style
-moz-border-end-width
-moz-border-start
-moz-border-start-color
-moz-border-start-style
-moz-border-start-width
-moz-float-edge
-moz-force-broken-image-icon
-moz-image-region
-moz-margin-end
-moz-margin-start
-webkit-margin-start
-moz-outline-radius
-moz-outline-radius-bottomleft
-moz-outline-radius-bottomright
-moz-outline-radius-topleft
-moz-outline-radius-topright
-moz-padding-end
-moz-padding-start
-webkit-padding-start
-moz-stack-sizing
-moz-user-focus
-moz-user-input
-moz-user-modify
-webkit-user-modify
-moz-user-select
-webkit-user-select
-moz-window-shadow
-webkit-background-composite
-webkit-border-horizontal-spacing
-webkit-border-vertical-spacing
-webkit-box-reflect
-webkit-column-break-after
-webkit-column-break-before
-webkit-column-break-inside
-webkit-dashboard-region
-webkit-line-break
-webkit-margin-bottom-collapse
-webkit-margin-collapse
-webkit-margin-top-collapse
-webkit-marquee-increment
-webkit-marquee-repetition
-webkit-mask
-webkit-mask-attachment
-webkit-mask-box-image
-webkit-mask-clip
-webkit-mask-composite
-webkit-mask-image
-webkit-mask-origin
-webkit-mask-position
-webkit-mask-position-x
-webkit-mask-position-y
-webkit-mask-repeat
-webkit-mask-size
-webkit-nbsp-mode
-webkit-rtl-ordering
-webkit-tap-highlight-color
-webkit-text-fill-color
-webkit-text-security
-webkit-text-size-adjust
-webkit-text-stroke
-webkit-text-stroke-color
-webkit-text-stroke-width
-webkit-touch-callout
-webkit-transform-origin-x
-webkit-transform-origin-y
-webkit-transform-origin-z
-webkit-user-drag
-o-table-baseline
-ms-background-position-x
-ms-background-position-y
-ms-filter
-ms-ime-mode
-ms-layout-flow
-ms-layout-grid
-ms-layout-grid-char
-ms-layout-grid-line
-ms-layout-grid-mode
-ms-layout-grid-type
-ms-text-autospace
-ms-text-kashida-space
-ms-text-overflow
-ms-text-underline-position
-ms-writing-mode
-ms-interpolation-mode
-ms-scrollbar-3dlight-color
-ms-scrollbar-arrow-color
-ms-scrollbar-base-color
-ms-scrollbar-darkshadow-color
-ms-scrollbar-face-color
-ms-scrollbar-highlight-color
-ms-scrollbar-shadow-color
-ms-zoom
);

# Other CSS extensions (without vendor prefix)
push @property_order, qw(
image-rendering
ime-mode
pointer-events
text-rendering
);

# Create hash: key => property, value => index
# See also: http://blog.livedoor.jp/xaicron/archives/50913074.html
my %property = do {
  my $i = 0;
  map { $_ => $i++ } @property_order;
};

my $css = join "", <STDIN>;
$css =~ s/{(.*?)}/"{".sort_properties($1)."}"/imgse;

print $css;

sub sort_properties {
  # Remove leading line-breaks
  (my $rules = shift) =~ s/^\n+//;

  # Orcish Maneuver
  # my %temp;
  # my @sorted_rules = sort {
  #   ($temp{$a} ||= check_order($a)) <=> ($temp{$b} ||= check_order($b))
  # } split "\n", $rules;

  # Schwartzian Transform
  # See also: http://gist.github.com/236860
  my @sorted_rules
    = map  { $_->[0] }
      sort { $a->[1] <=> $b->[1] }
      map  { [ $_, check_order($_) ] }
      split "\n", $rules;

  return "\n" . join("\n", @sorted_rules) . "\n";
}

sub check_order {
  my $line = shift;
  my $order = 10000;

  if ($line =~ /^\s*(.+?)\s*:/) {
    if (defined $property{$1}) {
      $order = $property{$1};
    }
  # } else {
  #   warn "Unknown property: $1";
  }

  return $order;
}
</pre>

<p>安定のCSS2.1のプロパティが優先的に上になる。それに続いてCSS3の草案にあるプロパティが<a href="http://www.w3.org/Style/CSS/current-work#CSS3">CSS Modules</a>の順に並ぶ。各ブラウザの独自拡張でCSS3の草案にそれに対応するものがある場合(<code>border-radius</code>と<code>-moz-border-radius</code>や<code>-webkit-border-radius</code>など)はその対応するものに続けて並べるようにした。それらに続いてプリフィックスのある各ブラウザの独自拡張プロパティ。一番下に来るのはプリフィックスの無い独自拡張プロパティで<code>ime-mode</code>等がこれに当る。</p>

<p>まとめると「CSS2.1 &gt; CSS3 &gt; 独自拡張 &gt; プリフィックスの無い独自拡張」という順序で並ぶことになり、具体的には以下のように並ぶ。</p>

<pre>
div#header ul#navigation li a {
  /* CSS2.1 */
  margin-left: 6px;
  padding: 0 6px;
  display: block;
  width: auto;
  height: 24px;
  line-height: 24px;
  color: #c9c6c0;
  background-image: url(&quot;../images/bg-navigation.png&quot;);
  background-repeat: repeat-x;
  /* CSS3 */
  border-radius: 3px;
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  /* Vendor extension */
  -moz-margin-start: 6px;
  /* Vendor extension (without prefix) */
  ime-mode: auto;
}
</pre>

<p>スクリプトではそれぞれを分けて順に<code>push</code>しているので新規追加や修正はそれほど大変でもない(と思う)。</p>

<p>CSSのプロパティについては以下を参考にした。</p>

<ul>
<li>Web標準
<ul>
<li><a href="http://www.w3.org/TR/CSS2/">Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification</a></li>
<li><a href="http://www.w3.org/Style/CSS/current-work#CSS3">CSS Modules</a>から辿ることのできる各モジュールごとのページ</li>
</ul>
</li>
<li>Firefox (Mozilla)
<ul>
<li><a href="https://developer.mozilla.org/ja/CSS_Reference/Mozilla_Extensions">Mozilla CSS 拡張仕様 - MDC</a> (廃止マークが付いているものは除外)</li>
</ul>
</li>
<li>Safari (WebKit)
<ul>
<li><a href="http://trac.webkit.org/browser/trunk/WebCore/css/CSSPropertyNames.in">/trunk/WebCore/css/CSSPropertyNames.in – WebKit</a></li>
<li><a href="http://developer.apple.com/mac/library/documentation/AppleApplications/Reference/SafariCSSRef/Articles/StandardCSSProperties.html#//apple_ref/doc/uid/TP30001266">Mac Dev Center: Safari CSS Reference: Supported CSS Properties</a></li>
</ul>
</li>
<li>Opera (Presto)
<ul>
<li><a href="http://www.opera.com/docs/specs/presto23/css/properties/">Opera: CSS Properties support in Opera Presto 2.3</a></li>
</ul>
</li>
<li>Internet Explorer (Trident)
<ul>
<li><a href="http://msdn.microsoft.com/ja-jp/library/ms531207(en-us,VS.85,lightweight).aspx">CSS Attributes: Index</a></li>
</ul>
</ul>

<p>「プロパティの位置がおかしい！」とか「プロパティに抜けがある！」とか「プロパティがかぶっている！」とかは<a href="http://hail2u.wufoo.com/forms/feedback/">報告してくれるとありがたい</a>。</p>

<hr>

<p>Vimでこのスクリプトを利用する場合は、パスの通ったところにsortcss.plという名前で保存し、セレクタ全体もしくはファイル全体を選択して、</p>

<pre>
!sortcss.pl
</pre>

<p>とすれば良い。セレクタ全体を選択(正確には中括弧の間を中括弧を含めて選択)するにはビジュアル・モードでの<kbd>a}</kbd>を使えば良いので、以下のようなキーバインドとコマンドを用意しておくと便利。</p>

<pre>
nmap gso va}:SortCSS&lt;CR&gt;
vmap gso a}:SortCSS&lt;CR&gt;

&quot; Sort CSS properties
&quot; :SortCSS
command! -range=% SortCSS :&lt;line1&gt;,&lt;line2&gt;!perl -S sortcss.pl
</pre>

<p>これで<kbd>gso</kbd>でソートできる他、<code>:SortCSS</code>でもソートできる(<code>-range=%</code>なので選択していない場合はファイル全体を処理する)。CSSファイル以外ではアクティブにする必要が無いので、<code>$MYVIMRC</code>ではなく<code>$HOME/.vim/ftplugin/css.vim</code> (Windowsなら<code>$HOME\vimfiles\ftplugin\css.vim</code>)とかに書いた方が良い<a href="http://subtech.g.hatena.ne.jp/secondlife/20060831/1157012844">かも</a>。</p>

<hr>

<p>プロパティの羅列部分だけを切り出せばCSS用の辞書に早変わり！</p>

<h2>追記@2009-11-16T15:31:03+09:00</h2>

<p><a href="http://blog.livedoor.jp/xaicron/">xaicronさん</a>に<a href="http://blog.livedoor.jp/xaicron/archives/50913074.html">添削してもらった</a>。なるほどなーということでコピペして更新。</p>

<h2>追記@2009-11-16T18:28:19+09:00</h2>

<p>重複していた<code>speak-header</code>の削除(<a href="http://b.hatena.ne.jp/kits/20091116#bookmark-17336010">kitsさんのはてブコメント</a>より)と<code>empty-cells</code>と<code>cursor</code>の位置が逆だったのを修正した。</p>

<h2>追記@2009-11-17T23:15:06+09:00</h2>

<p>xaicronさんから<code>defined</code>抜けの修正(<code>margin</code>で場合によってはおかしくなることがあった)とシュワルツ変換を噛ませて高速化したものを<a href="http://gist.github.com/236860">フィードバックしてもらった</a>ので、手元で加えていた未知のプロパティを最後に回す修正とマージして変数名をちょっと変え更新。<code>warn</code>での未知のプロパティの警告はあったほうが良いのだけど、Vimと一部のシェルの組み合わせでは標準エラー出力もリダイレクトするように(デフォルトでは)なっているのでコメントアウトしておいた。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/coding/perl-sort-css-properties.html</feedburner:origLink></item>
    <item>
      <title>CSS color previewをrgb()に対応させた</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/ZMzW4_Zn5gc/add-support-for-rgb-func-syntax-to-css-color-preview.html</link>
      <description>VimでCSSを編集中に色をインライン・プレビューしてくれるCSS color previewというスクリプトをrgb()に対応させてみた。一応rgba()にも対応しているような感じで、透明度を無視してプレビューされる。hsl()とかも対応しようと思ったのだけどRGBからHSLへの変換が面倒になってすぐに諦めた。hsl()とか使わねーよ。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Software</category>
      <guid isPermaLink="false">http://hail2u.net/blog/software/add-support-for-rgb-func-syntax-to-css-color-preview.html</guid>
      <pubDate>Tue, 10 Nov 2009 09:38:31 +0900</pubDate>
      <content:encoded><![CDATA[
<p><a href="http://www.vim.org/">Vim</a>でCSSを編集中に色をインライン・プレビューしてくれる<a href="http://vim.sourceforge.net/scripts/script.php?script_id=2150">CSS color preview</a>というスクリプトを<code>rgb()</code>に対応させてみた。一応<code>rgba()</code>にも対応しているような感じで、透明度を無視してプレビューされる。<code>hsl()</code>とかも対応しようと思ったのだけどRGBからHSLへの変換が面倒になってすぐに諦めた。<code>hsl()</code>とか使わねーよ。</p>

<p>Download: <a href="http://gist.github.com/228147">rgb()/rgba()に対応したCSS color preview</a></p>

<p>インストールは$HOME/.vim/after/ftplugin(Windowsでは$HOME/vimfiles/after/ftplugin)にcss.vimとしてコピーするだけ。インストールしてCSSファイルを開くと、</p>

<p class="image"><img src="http://hail2u.net/blog/images/css-color-preview-mod.png" alt="rgb()/rgba()に対応したCSS color previewのプレビュー画像" width="400" height="266"></p>

<p>というように背景色でインライン・プレビューされる。プレビューの通り<code>rgba()</code>の透明度は反映されない。<code>matchlist()</code>で書こうとしたのだけどよくわからなかったので<code>eval()</code>で書いた……。</p>

<p>元のスクリプトで<code>set ut=100</code>とかなっていたところがちょっと気になったので削除して、<code>autocmd InsertLeave</code>で更新するようにした。改行の時とか;を入力した時にも更新できるともっと良いような気もするけど書き方わからない……。ついでに<code>autocmd</code>もグルーピングして*.cssに対してのみ行うようにした。<code>rgb()</code>対応以外の変更点はこれだけ。カーソル行の強調表示が有効な時に場合によっては文字が見づらくなる不具合も直したかったのだけど、うまい方法を思いつかなかった。</p>

<hr>

<p>最近、</p>

<pre>
set guifont=DejaVu_Sans_Mono:h12:w6
</pre>

<p>でgVimを使っているのだけどなかなか良い。上のプレビュー画像もこれ。デフォルトでは幅広すぎてちょっとかっこ悪い感じだけど<code>w6</code>にするとスマート。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/software/add-support-for-rgb-func-syntax-to-css-color-preview.html</feedburner:origLink></item>
    <item>
      <title>Vimで"gf"をスラッシュで始まる相対URLに対応させる</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/dPslthbTgtg/support-slash-started-relative-url-in-vim-gf.html</link>
      <description>Vimではファイル名らしき箇所でgfを押すと、見つけることができればそのファイルを開いてくれる。この機能はとても便利なのだが、HTMLファイルにスラッシュで始まる相対URLでCSSファイルやJavaScriptファイルのURLを書いた場合は、そこでgfを押してもうまく開くことができない。これを解決するためにvimでHTMLとかを編集するときに絶対パスのファイルを開くで公開されているプラグインをちょっと使っていたのだけど、どうやらpathオプションとincludeexprオプションを設定することでも対応できるようだ。Vimすげー。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Software</category>
      <guid isPermaLink="false">http://hail2u.net/blog/software/support-slash-started-relative-url-in-vim-gf.html</guid>
      <pubDate>Sat, 07 Nov 2009 04:02:30 +0900</pubDate>
      <content:encoded><![CDATA[
<p><a href="http://www.vim.org/">Vim</a>ではファイル名らしき箇所で<kbd>gf</kbd>を押すと、見つけることができればそのファイルを開いてくれる。この機能はとても便利なのだが、HTMLファイルにスラッシュで始まる相対URLでCSSファイルやJavaScriptファイルのURLを書いた場合は、そこで<kbd>gf</kbd>を押してもうまく開くことができない。これを解決するために<a href="http://webtech-walker.com/archive/2009/10/02230656.html">vimでHTMLとかを編集するときに絶対パスのファイルを開く</a>で公開されているプラグインをちょっと使っていたのだけど、どうやら<code>path</code>オプションと<code>includeexpr</code>オプションを設定することでも対応できるようだ。Vimすげー。</p>

<p>とりあえず設定から。</p>

<pre>
autocmd FileType html :setlocal path+=W:/www/test,W:/www/hail2u.net,W:/www/blosxom.info
autocmd FileType html :setlocal includeexpr=substitute(v:fname,&#39;^\\/&#39;,&#39;&#39;,&#39;&#39;)
</pre>

<p><code>W:/www/test</code>等のパスはカンマ区切りで自分の環境に合わせて必要なだけカンマで区切って書く。追加するパスはサイトのトップページのあるディレクトリ(フォルダ)のパス。ややこしく言うならウェブサイトのドキュメント・ルートに対応するローカル(またはリモート)のファイルシステム上のパス。</p>

<hr>

<p>デフォルトでは以下のように書くと<code>gf</code>で開くことができない。</p>

<pre>
&lt;script type=&quot;text/javascript&quot; src=&quot;<em>/scripts/twitter/speech-bubble.js</em>&quot;&gt;&lt;/script&gt;
</pre>

<p>ファイルシステム上のルートとドキュメント・ルートが一致しないため<em>/scripts/twitter/speech-bubble.js</em>の上で<kbd>gf</kbd>を押しても「ファイルがありません」と怒られるだけ。<code>:help gf</code>によると<kbd>gf</kbd>は以下のようにしてファイルを探しているようだ。</p>

<ol>
<li><code>isfname</code>オプションに従ってカーソルの前後からファイル名を抜き出す</li>
<li><code>path</code>オプションに従ってファイルを探す</li>
<li>見つからなかったら<code>suffixesadd</code>オプションに従って接尾語を付けファイルを探す</li>
<li>見つからなかったら<code>includeexpr</code>オプションに従ってファイル名を変更しファイルを探す</li>
</ol>

<p>ポイントになるのは2と4で、この二つのオプションをうまく設定してやると開くことができるようになる。まず<code>path</code>にドキュメント・ルートに対応するファイルシステム上のパスを追加してやり、ドキュメント・ルートからの相対パスをなんとなく解釈できそうな感じに準備する。このままではまだスラッシュ始まりに対応できないので、今度は<code>includeexpr</code>で頭のスラッシュを削除してやる。というわけで上記のような設定になる。after/html.vimとかの使い方をいまだにちゃんと覚えていないので<code>autocmd</code>ばっか使ってる……。</p>

<h2>追記@2009-11-10T12:48:31+09:00</h2>

<p>上位ディレクトリの参照は<a href="http://vimdoc.sourceforge.net/htmldoc/editing.html#file-searching">セミコロンを使えばできる</a>ということを教えてもらった。なので<code>path</code>オプションの設定は、</p>

<pre>
autocmd FileType html :setlocal path+=;/
</pre>

<p>というシンプルなものでもいける。こっちの方が誤爆も無さそうだし良さそう。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/software/support-slash-started-relative-url-in-vim-gf.html</feedburner:origLink></item>
    <item>
      <title>Pure CSSな吹き出し</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/4GK08JEjeO0/pure-css-speech-bubble.html</link>
      <description>Twitterで「CSSで吹き出し作るのブクマし忘れててどこにあったか忘れた……」とかつぶやいたらe_luckさんがImage-free CSS Tooltip Pointers - A Use for Polygonal CSS?を探してきてくれた。このエントリでは枠線をつけるために入れ子になっていたりちょっとわかりづらかったので、ものすごく単純化して解説してみようとかなんとか。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Web Design</category>
      <guid isPermaLink="false">http://hail2u.net/blog/webdesign/pure-css-speech-bubble.html</guid>
      <pubDate>Wed, 04 Nov 2009 00:46:12 +0900</pubDate>
      <content:encoded><![CDATA[
<p class="image_fr"><img src="http://hail2u.net/blog/images/pure-css-speech-bubble.png" alt="Pure CSSな吹き出し" width="360" height="102"></p>

<p>Twitterで「CSSで吹き出し作るのブクマし忘れててどこにあったか忘れた……」とかつぶやいたら<a href="http://www.lucky-bag.com/">e_luck</a>さんが<a href="http://www.filamentgroup.com/lab/image_free_css_tooltip_pointers_a_use_for_polygonal_css/">Image-free CSS Tooltip Pointers - A Use for Polygonal CSS?</a>を探してきてくれた。このエントリでは枠線をつけるために入れ子になっていたりちょっとわかりづらかったので、ものすごく単純化して解説してみようとかなんとか。</p>

<ul>
<li>Pure CSSな吹き出しのサンプル: <a href="http://hail2u.net/pub/test/119.html">Speech Bubbles</a></li>
</ul>

<p>とりあえず、吹き出しの尻尾を左下に出すもの(サンプル内では4つめのサンプル)を例にして説明していく。HTMLコードは以下のようなもので、<code>bubble</code>というクラス名を振った<code>div</code>要素がコンテナ、<code>body</code>というクラス名を振った<code>p</code>要素が吹き出しのベース、<code>tail</code>というクラス名を振った空の<code>div</code>要素が尻尾になる。</p>

<pre>
&lt;div class=&quot;<em>bubble</em>&quot;&gt;
  &lt;p class=&quot;<em>body</em>&quot;&gt;Cras ultricies ultricies justo a blandit.
  Quisque a tristique urna.
  Nam lobortis, metus a posuere ornare, arcu lacus sodales justo, non auctor felis nunc non nisi.
  Vestibulum risus dolor, ornare id lobortis pretium, rhoncus ac augue.&lt;/p&gt;
  &lt;div class=&quot;<em>tail</em>&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
</pre>

<p>そして基本になるCSSコードは以下のようなものになる。</p>

<pre>
.bubble {
  position: relative;
  width: 360px;
}

.bubble .body {
  color: #ffffff;
  background-color: #66aa11;
}

.bubble .tail {
  border-top: 18px solid #66aa11;
  border-right: 24px solid transparent; 
  position: absolute;
  bottom: -18px;
  left: 36px;
  width: 0; 
  height: 0; 
}
</pre>

<p>まずコンテナである<code>.bubble</code>の<code>position</code>プロパティで<code>relative</code>を指定する。これにより尻尾になる子要素<code>.tail</code>を<code>body</code>要素ではなくコンテナである<code>.bubble</code>を基準にして絶対配置できるようになる。<code>.body</code>では吹き出しの前景色と背景色を指定する。ここでは前景色を<code>#ffffff</code>、背景色を<code>#66aa11</code>にした。そして<code>.tail</code>へのスタイル指定で尻尾を作成する。</p>

<p>尻尾の形と色は<code>border</code>プロパティで決める。高さと色は<code>border-top</code>プロパティで調節でき、尻尾の三角の傾斜は<code>border-right-size</code>プロパティで調節できる。<code>border-right-color</code>プロパティで<code>transparent</code>を指定することによって、本来は四角になってしまうところを三角に削ってやるという話なので、<code>border-right-size</code>プロパティを増やすと傾斜はゆるくなり、逆に減らすと傾斜がきつくなる。</p>

<p>位置は<code>position</code>プロパティで<code>absolute</code>を指定した上で、<code>bottom</code>プロパティと<code>left</code>プロパティで決める。コンテナが<code>relative</code>なので、<code>left: 36px;</code>だと<em>コンテナの左端から36px右の位置</em>になる。同じように<code>bottom: -18px;</code>だと<em>コンテナの下端から18px下の位置</em>になるので、コンテナの左下に飛び出た形できれいに配置することができる。<code>bottom</code>プロパティに指定する負の数値は、尻尾の高さ分、つまり<code>border-top-size</code>プロパティの値、を負の数値にしたもの。合わせて<code>width</code>プロパティと<code>height</code>プロパティに<code>0</code>を指定しておけば尻尾の位置がずれることはないだろう。</p>

<p>これで左下に尻尾を出す吹き出しは作成できる。他の位置に尻尾を出す場合も<code>border-top</code>プロパティや<code>top</code>プロパティ・<code>right</code>プロパティなども適切に利用してやるだけで可能で、HTMLコードを変更する必要はない。例えば中央上に尻尾を出す場合は以下のようなコードになる。</p>

<pre>
.bubble .tail {
  margin-left: -12px;
  border-right: 12px solid transparent; 
  border-bottom: 18px solid #66aa11;
  border-left: 12px solid transparent; 
  position: absolute;
  top: -18px;
  left: 50%;
  width: 0; 
  height: 0; 
}
</pre>

<p>上向きに三角を作る場合は<code>border-bottom</code>プロパティで高さと色を指定する。中央に配置する場合は<code>border-right</code>プロパティと<code>border-left</code>プロパティを指定することによって二等辺三角形を作成することができるので、それを利用した方がバランスが良いだろう。左右の位置はとりあえず<code>50%</code>で真ん中に寄せて、<code>margin-left</code>で負の値を指定することによって<code>border-left-size</code>プロパティの値分左に戻してやるのが手っ取り早い。</p>

<p>ここまでが理解できたなら、その他の位置に尻尾を配置する方法はサンプルのソースを参照すれば大体わかると思う。</p>

<p>最後になったが、サンプルページの最後に載っているように<code>:after</code>(<code>:before</code>)擬似要素を利用すれば、空の<code>div</code>要素を用意しないでも尻尾を作成することができる。</p>

<pre>
.bubble .body<em>:after</em> {
  <em>content: &quot;&quot;;</em>
  border-top: 18px solid #66aa11;
  border-right: 24px solid transparent; 
  position: absolute;
  bottom: -18px;
  left: 36px;
  width: 0; 
  height: 0; 
}
</pre>

<p><code>content</code>プロパティに空の値を指定するだけで、特に難しいことはない。Firefox 3やSafari 4、Opera 9、Internet Explorer 8なら問題なく動く。</p>

<hr>

<p>この吹き出し作成テクニックを利用して、ヘッダのTwitterのアイコンにカーソルを合わせると最新のつぶやきが吹き出しでポップアップするようにした。<code>rgba()</code>カワイイ(関係ない)。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/webdesign/pure-css-speech-bubble.html</feedburner:origLink></item>
    <item>
      <title>Vimのstatuslineを最適化する</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/GUH7BOYvhks/optimize-vim-statusline.html</link>
      <description>FuzzyFinderのbufferモードやmrufileモードの補完メニューでパスの真ん中が省略されているのがわかりやすかったので、statuslineにも導入してよりわかりやすくしようという試み。インストール済みのGreasemonkeyスクリプトをちょっと編集する時など、ものすごく長いパスのファイルを編集する時のみ便利。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Software</category>
      <guid isPermaLink="false">http://hail2u.net/blog/software/optimize-vim-statusline.html</guid>
      <pubDate>Mon, 02 Nov 2009 09:49:50 +0900</pubDate>
      <content:encoded><![CDATA[
<p><a href="http://www.vim.org/scripts/script.php?script_id=1984">FuzzyFinder</a>のbufferモードやmrufileモードの補完メニューでパスの真ん中が省略されているのがわかりやすかったので、<code>statusline</code>にも導入してよりわかりやすくしようという試み。インストール済みのGreasemonkeyスクリプトをちょっと編集する時など、ものすごく長いパスのファイルを編集する時のみ便利。</p>

<p>Vimのデフォルトの<code>statusline</code>は以下のようなもの。</p>

<p class="image"><img src="http://hail2u.net/blog/images/optimize-vim-statusline-default.png" alt="デフォルトのstatuslineのスクリーンショット" width="868" height="30"></p>

<p>これにファイルの種類や文字コード・改行コードなどあると便利な情報を追加した上で、ファイル名を先頭に持ってきて、残りのパスを<code>%&lt;</code>を利用して省略させるようにすると、</p>

<p class="image"><img src="http://hail2u.net/blog/images/optimize-vim-statusline-customized.png" alt="ビルトインの省略機能を利用したカスタマイズ済みのstatuslineのスクリーンショット" width="868" height="30"></p>

<p>こんな感じになる。この<code>statusline</code>のコードは、</p>

<pre>
set statusline=%{expand(&#39;%:p:t&#39;)}\ %&lt;\(%{expand(&#39;%:p:h&#39;)}\)%=\ %m%r%y%w%{&#39;[&#39;.(&amp;fenc!=&#39;&#39;?&amp;fenc:&amp;enc).&#39;][&#39;.&amp;ff.&#39;]&#39;}[%3l,%3c]
</pre>

<p>というもので、しばらくこれを使っていた。悪くはないが、パスの先頭を省略するような書き方なのでドライブレターが見えなくなってしまいWindowsだとちょっとアレ。これをベースにFuzzyFinderから長いパスの中間を省略する関数をパクって最適化すると、</p>

<p class="image"><img src="http://hail2u.net/blog/images/optimize-vim-statusline-optimized.png" alt="最適化されたstatuslineのスクリーンショット" width="868" height="30"></p>

<p>こうなる。ドライブレターも見えるし、ファイルのあるフォルダ名も大体見えるのでわかりやすい！</p>

<pre>
set statusline=%{expand(&#39;%:p:t&#39;)}\ %&lt;\(<em>%{SnipMid(expand(&#39;%:p:h&#39;),80-len(expand(&#39;%:p:t&#39;)),&#39;...&#39;)}</em>\)%=\ %m%r%y%w%{&#39;[&#39;.(&amp;fenc!=&#39;&#39;?&amp;fenc:&amp;enc).&#39;][&#39;.&amp;ff.&#39;]&#39;}[%3l,%3c]

function! SnipMid(str, len, mask)
  if a:len &gt;= len(a:str)
    return a:str
  elseif a:len &lt;= len(a:mask)
    return a:mask
  endif

  let len_head = (a:len - len(a:mask)) / 2
  let len_tail = a:len - len(a:mask) - len_head

  return (len_head &gt; 0 ? a:str[: len_head - 1] : &#39;&#39;) . a:mask . (len_tail &gt; 0 ? a:str[-len_tail :] : &#39;&#39;)
endfunction
</pre>

<p><code>SnipMid()</code>はFuzzyFinderからコピペしただけ(<a href="http://bitbucket.org/ns9tks/vim-fuzzyfinder/src/tip/autoload/fuf.vim#cl-505">autoload/fuf.vimの505行目</a>あたりにある)。切り詰める長さは<code>SnipMid()</code>の第二引数で指定する。ここでは、</p>

<pre>
80-len(expand(&quot;%:p:h&quot;))
</pre>

<p>と80からファイル名を引いた数で切り詰めているが、ターミナルの横幅や<code>columns</code>にあわせて要調節。<code>set columns=120</code>な環境だとこれくらいが丁度良かった。頑張れば環境に合わせてフレキシブルに切り詰める長さを調節できそうだけど面倒なので……。</p>

<p><code>titlestring</code>に使っても良い。</p>

<pre>
set titlestring=%{expand(&#39;%:p:t&#39;)}%(\ %m%r%w%)\ %&lt;\(%{SnipMid(expand(&#39;%:p:h&#39;),80-len(expand(&#39;%:p:t&#39;)),&#39;...&#39;)}\)\ -\ Vim
</pre>

<hr>

<p>Vimはどうにかしようと思うと大抵はどうにかできて幸せ……。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/software/optimize-vim-statusline.html</feedburner:origLink></item>
    <item>
      <title>Web開発周りのVimの設定</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/cIpZoTbfyAE/vim-settings-for-web-development.html</link>
      <description>HTML/CSS/JavaScriptを書くために行ったVimの設定やインストールしたスクリプト等をざっとまとめてみた。「VimでWeb開発を100倍効率的にする方法」といったような生産性を上げるための設定の類ではない。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Software</category>
      <guid isPermaLink="false">http://hail2u.net/blog/software/vim-settings-for-web-development.html</guid>
      <pubDate>Sat, 31 Oct 2009 10:58:36 +0900</pubDate>
      <content:encoded><![CDATA[
<p>HTML/CSS/JavaScriptを書くために行ったVimの設定やインストールしたスクリプト等をざっとまとめてみた。「VimでWeb開発を100倍効率的にする方法」といったような生産性を上げるための設定の類ではない。</p>

<h2>HTMLファイルを<code>:make</code>で文法チェック</h2>

<p>tidy.vimが用意されているので、<a href="http://tidy.sourceforge.net/">HTML Tidy</a>をインストールし、.vimrcに以下のように書くだけで良い。</p>

<pre>
autocmd FileType html :compiler tidy
autocmd FileType html :setlocal makeprg=tidy\ -raw\ -quiet\ -errors\ --gnu-emacs\ yes\ \&quot;%\&quot;
</pre>

<p>tidy.vimの<code>makeprg</code>では日本語が化けるので<code>-raw</code>を追加する。</p>

<h2>HTMLファイルのインデントをやり直す</h2>

<pre>
<kbd>gg=G</kbd>
</pre>

<p>ノーマルモードでは<kbd>gg</kbd>でファイルの先頭に移動して<kbd>=G</kbd>でファイル全体をインデントし直すことができる。選択範囲のみをインデントし直す場合は、適当にビジュアルモードで選択した状態で<kbd>=</kbd>を押すだけ。1000行とかあるHTMLファイルだと結構時間がかかる。デフォルトではJavaScriptファイルでやると残念な結果に……。</p>

<h2>HTMLファイルをブラウザで開く(Windows)</h2>

<p>FirefoxやSafari、Chromeは普通にインストールするとApp Pathsに登録されるので、</p>

<pre>
:! start chrome.exe %
:! start firefox.exe %
:! start IEXPLORE.EXE %
:! start Safari.exe %
</pre>

<p>でブラウザで開くことができる。<code>! start</code>と間に半角スペースがあることに注意。</p>

<p>OperaのインストーラはApp Pathsに登録しないので、</p>

<pre>
REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\opera.exe]
@=&quot;C:\\Program Files\\Opera\\opera.exe&quot;
&quot;Path&quot;=&quot;C:\\Program Files\\Opera&quot;
</pre>

<p>といったレジストリファイルをインポートして登録してやると<code>:! start opera.exe %</code>で開くことができるようになる。</p>

<h2>選択範囲を文字参照に変換</h2>

<p>以下のPerlスクリプトをパスの通った場所に置いておく。</p>

<pre>
#!/usr/bin/perl

use strict;
use warnings;

use HTML::Entities;

print encode_entities(join(&#39;&#39;, &lt;STDIN&gt;), &#39;&amp;&lt;&gt;&quot;\&#39;&#39;);
</pre>

<p>その上でコマンドを作成。</p>

<pre>
command! -range EncodeEntities :&#39;&lt;,&#39;&gt;!perl -S encode-entities.pl
</pre>

<h2>W3CDTFで日付と時刻の挿入</h2>

<pre>
command! InsertDateTime :execute &quot;normal! i&quot;.strftime(&quot;%Y-%m-%dT%H:%M:%S+09:00&quot;)
</pre>

<p>必要な人は少ないだろうけど。</p>

<h2>CSSファイルを<code>:make</code>で文法チェック</h2>

<p><a href="http://www.vim.org/scripts/script.php?script_id=1577">css.vim</a>をダウンロードしてインストールする。</p>

<pre>
autocmd FileType css :compiler css
</pre>

<p>同梱のPerlスクリプト(validate_css)はパスの通ったディレクトリにコピーする必要がある。</p>

<h2>JavaScriptファイルを<code>:make</code>で文法チェック</h2>

<p><a href="http://www.javascriptlint.com/">JavaScript Lint</a>をインストールし、javascriptlint.vimとして以下のファイルを<em>$HOME/.vim/compiler</em> (Windowsでは<em>$HOME/vimfiles/compiler</em>)以下に作成する。</p>

<pre>
if exists(&quot;current_compiler&quot;)
  finish
endif

let current_compiler = &quot;javascriptlint&quot;

if exists(&quot;:CompilerSet&quot;) != 2
  command -nargs=* CompilerSet setlocal &lt;args&gt;
endif

let s:cpo_save = &amp;cpo
set cpo-=C

CompilerSet makeprg=jsl\ -nologo\ -nofilelisting\ -nosummary\ -nocontext\ -process\ %

CompilerSet errorformat=%f(%l):\ %m

let &amp;cpo = s:cpo_save
unlet s:cpo_save
</pre>

<p>そして.vimrcに以下のように書く。</p>

<pre>
autocmd FileType javascript :compiler javascriptlint
</pre>

<h2>JavaScriptファイルのインデントの改善</h2>

<p>デフォルトのインデント・スクリプトは<a href="http://jquery.com/">jQuery</a>を利用してJavaScriptを書いているとかなり酷いことになる。</p>

<ul>
<li><code>foo(function () {</code>の次の行のインデント</li>
<li><code>foo({</code>の次の行のインデント</li>
<li><code>})</code>でのアンインデント</li>
</ul>

<p>あたりがメジャーなインデントがおかしくなる箇所で、「コード書くよりインデントの修正の方が大変！」というくらい(おおげさ)。</p>

<p><a href="http://www.vim.org/scripts/script.php?script_id=1936">あれ</a>や<a href="http://www.vim.org/scripts/script.php?script_id=1840">これ</a>やJavaScriptのインデント・スクリプトは見つかるが、<a href="http://www.vim.org/scripts/script.php?script_id=2765">Better Javascript Indentation</a>が一番良かった。普通にインストールするだけで特に設定等は必要ない。</p>

<p>インストールすると以下のような典型的なPowered by jQueryのJavaScriptファイルがすんなりインデントされるようになる。気持ち良い！</p>

<pre>
$(function () {
  var num = 32;

  $(&quot;#monthly_archives &gt; li&quot;).each(function (i, li) {
    if (i === num) {
      $(li).before($(&quot;&lt;li/&gt;&quot;).append($(&quot;&lt;a/&gt;&quot;).attr({
        href: &quot;#archives-by-month&quot;
      }).append(&quot;» more&quot;).click(function () {
        $(this).hide();
        $(&quot;#monthly_archives .folded&quot;).show();
      }))).addClass(&quot;folded&quot;).hide();
    } else if (i &gt; num) {
      $(li).addClass(&quot;folded&quot;).hide();
    }
  });
});
</pre>

<p>気付いた範囲では、</p>

<pre>
var foo = {
  bar:
    function () {
</pre>

<p>と書いた時に、</p>

<ul>
<li>次の行がインデントされない</li>
<li>その後<code>}</code>で2段階アンインデントされてしまう</li>
</ul>

<p>といったラベル絡みでの不具合があった。<code>function</code>の前で改行しない場合は問題ないと思う(そう書けという意味ではない)。</p>

<p>また、これをインストールすると<code>gg=G</code>によるインデントのやり直しも改善される(当たり前だけど)。ただし複数行コメント内の行頭の空白が消えてしまうので、</p>

<pre>
/*!
 * foobar
 * hogehoge
 */
</pre>

<p>といった<a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a>向けなコメントなどは、</p>

<pre>
/*!
* foobar
* hogehoge
*/
</pre>

<p>となってしまうので注意が必要。</p>

<hr>

<p>他にはMarkdownやTextileなどでHTMLに変換するコマンドを作っておいていたりするくらい。あとはひたすら<a href="http://www.vim.org/scripts/script.php?script_id=1879">AutoComplPop</a>でOmni補完！</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/software/vim-settings-for-web-development.html</feedburner:origLink></item>
    <item>
      <title>リデザインとborder-radiusとtext-shadow</title>
      <link>http://feedproxy.google.com/~r/hail2u/blog/~3/lZrwH-xifrA/redesign-and-border-radius-and-text-shadow.html</link>
      <description>でっかいロゴに飽きてきてヘッダをコンパクトにしたくなったので、少し前からサイトのスタイルを色々いじっていた。ナビと検索フォームとロゴを一段に並べるのはかなり難しかったので、ロゴをアイコンにして無理やり詰め込むことにした。border-radiusまくり。緑の流行はまだまだ続くらしいので色はこのままで。次はオレンジだな(適当)。</description>
      <author>kyo@hail2u.net (Kyo Nagashima)</author>
      <category domain="http://hail2u.net/blog">Web Design</category>
      <guid isPermaLink="false">http://hail2u.net/blog/webdesign/redesign-and-border-radius-and-text-shadow.html</guid>
      <pubDate>Fri, 30 Oct 2009 11:54:38 +0900</pubDate>
      <content:encoded><![CDATA[
<p>でっかいロゴに飽きてきてヘッダをコンパクトにしたくなったので、少し前からサイトのスタイルを色々いじっていた。ナビと検索フォームとロゴを一段に並べるのはかなり難しかったので、ロゴをアイコンにして無理やり詰め込むことにした。<code>border-radius</code>まくり。緑の流行はまだまだ続くらしいので色はこのままで。次はオレンジだな(適当)。</p>

<h2>ヘッダ</h2>

<p class="image"><img src="http://hail2u.net/blog/images/site-header-091030.png" alt="サイトのヘッダ (2009/10/30)" width="800" height="72"></p>

<p>ロゴ・アイコンとナビを<code>float: left;</code>、検索フォームとTwitterとフィードのアイコンを<code>float: right;</code>。それぞれに<code>border-radius</code>を使って少し丸みをつけて、丸いロゴ・アイコンと並べてもあまり違和感が無いようにした。アクティブなナビは<code>text-shadow</code>でエンボスっぽくしてみたんだけど、背景色の明るさがアレでうまくへこんでいるように見えない……。</p>

<p>最初、<code>display: table-cell;</code>で検索フォームの横幅をうまいこと可変にして、キレイにびっちり並べてやろうと思ったんだけど、頭がおかしくなりそうだったのでやめた。できないことは無いような気がするんだけどなぁ……。</p>

<p>ブラウザの横幅が狭い場合は検索フォームやTwitterやフィードのアイコンが適当に折り返されて下に落ちるので、大抵の環境で問題なく収まるような気がする。</p>

<h2>フッタ</h2>

<p class="image"><img src="http://hail2u.net/blog/images/site-footer-091030.png" alt="サイトのフッタ (2009/10/30)" width="800" height="665"></p>

<p>今まではCSS的にフッタの各カラムに一つづつしか並べられなかったのだけど、書き直して複数入れることもできるようにした。で、トップのフッタの内容や量を見直してこんな感じにした。Weblogのフッタは中身がちょっと違い、Weblogの過去ログのリストとかが入る。各カラムのヘッダに馬鹿の一つ覚えのように<code>text-shadow</code>を使ったりもしている。</p>

<p>Weblogのフッタでの月ごとアーカイブのリストが長すぎる(無意味に2002年のとかもあるので)ので、最初は折りたたんでおいて後で開くことができるようにした。jQueryだと簡単ですね！！１開けてもあんまり意味無い気もするのでカットしちゃっても良いかもなぁ。</p>

<p>ウェブサービスのアイコン付きリストはJavaScriptでゴニョゴニョして生成するようにした。faviconの取得は<a href="http://getfavicon.appspot.com/">getFavicon</a>を利用させてもらった。なかなか軽いし、https越えもできるみたいで良い感じ。</p>

<hr>

<h2>メモ</h2>

<p><code>border-radius</code>と<code>text-shadow</code>のメモ。</p>

<h3><code>border-size: 1px;</code>で<code>border-radius</code>を適用</h3>

<p>ブラウザによって見た目が結構変わる。過度のところが極度に薄くなったりとか。<code>border</code>と<code>border-radius</code>の組み合わせる場合は2px以上にした方が良い気がする。</p>

<h3><code>border-size</code> * 2 = <code>border-radius</code></h3>

<p><code>border-size</code>の倍のサイズを<code>border-radius</code>に指定すると、キレイな角丸枠線になる気がする。</p>

<h3><code>text-shadow</code>の文法</h3>

<pre>
text-shadow: length length length color;
text-shadow: color length length length;
</pre>

<p>のどっちでも良い。lengthの順序は左右・上下・ぼかしで固定。</p>

<h3><code>text-shadow</code>でのエンボス</h3>

<p>Appleが多用するアレ。</p>

<pre>
/* 暗い文字用 */
text-shadow: 0 1px 0 #ffffff;

/* 明るい文字 */
text-shadow: 0 -1px 0 #000000;
</pre>

<p>上下にのみ1pxずらすだけ。背景色(画像)によってはあまりエンボスっぽく見えない。太字にこれを適用すると間抜けになること多々……。「<code>text-emboss</code>を作ってください！！１」とか言うと本当に作られそうな気がするので止めておく。</p>

<hr>

<p>Firefox 3.6のRCでもでたら<a href="https://developer.mozilla.org/ja/CSS/-moz-linear-gradient">CSS gradients</a>を使って書き直そうと思う。</p>]]></content:encoded>
    <feedburner:origLink>http://hail2u.net/blog/webdesign/redesign-and-border-radius-and-text-shadow.html</feedburner:origLink></item>
  </channel>
</rss>
