新着記事

2008年02月05日

エクスプローラーっぽい挙動のアプリを簡単に構築できるvimスクリプトtlibの紹介

ウィンドウを分割して、片方のウィンドウに何かのリストを表示、選択されたら何かの処理を行うという、
ファイルエクスプローラーとかでよくあるUIを、簡単に構築できてしまうvimスクリプト tlibの使い方を突き止めた。
(vimスクリプト組む人以外には、役に立たない情報ですが)

tlib_sample_view.jpg

で、下が最小のサンプル。
:UndoBranchViewerで起動して、<C-p>で選択した行のメッセージを表示する。
動かすには、もちろん、tlibが必要。

tlib#input#List()に表示する文字列のリストと、
どのキーが押されたら、どのファンクションを呼び出すかのマッピングを渡す。
keyがリストの選択に使うキーで、agentがファンクション。

スクリプトの中で使っている tlib#cmd#OutputAsList()は、
コマンドの結果で文字列のリストを作るコマンドです。

" スクリプトが何度も読まれるのを防止するためのおまじない
:if exists('loaded_undobranch_viewer')
    :finish
:endif
:let loaded_undobranch_viewer = 1

" コマンドの定義
" :UndoBranchViewerってすると、s:UndoBranchViewer()が呼び出される。
:command! -nargs=0 UndoBranchViewer :call s:UndoBranchViewer()

:function! s:UndoBranchViewer()
    :let g:undolistHandlers = [
        \ {'key': 16, 'agent': s:SNR().'AgentUndoPreview', 'key_name': '<c-p>', 'help': 'Undo preview'},
        \ {'key': 21, 'agent': s:SNR().'AgentUndoAndClose', 'key_name': '<c-u>', 'help': 'Undo and close'},
        \ {'pick_last_item': 0},
        \ ]
    :let s:undolists = tlib#cmd#OutputAsList('undolist')
    :call tlib#input#List('s', 'UndoBranch', s:undolists, g:undolistHandlers)
:endfunction

" リストから<c-p>で選択されたときに呼び出される。
:function! s:AgentUndoPreview(world, selected)
    :let l:entry = a:selected[0]
    " 選択された文字を表示。
    :echo l:entry
    " 文字を表示できるように、ちょっと待ってもらう。
    :5sleep
    :return a:world
:endfunction

" リストから<c-u>で選択されたときに呼び出される。
" 説明は省略
:function! s:AgentUndoAndClose(world, selected)
    :return a:world
:endfunction

" tlibのリストでどれが選択されたかを特定するための文字を返す
:function! s:SNR()
    :return matchstr(expand('<sfile>'), '<SNR>\d\+_\zeSNR$')
:endfunction
posted by 小見 拓 at 01:17| Comment(0) | TrackBack(0) | 基本 (vimエディタ) | このブログの読者になる | 更新情報をチェックする

2007年09月02日

PloneのRSS全文feedやってみたんだけれど

takanory.netの「更新情報をRSSで提供」のページを参考にして
RSS 1.0、RSS 2.0の記事全文付きfeedやってみました。
(向こうの記事を読んでからこの記事を読むとわかりやすいでしょう)

参考ページ. takanory.net「更新情報をRSSで提供」
http://takanory.net/plone/custom/updaterss

ただし、環境はかなり古いのです。
Ploneは今では3.0までバージョン上がってしまっているらしいけど、
手元の環境は以下の通りです。

Plone 2.1.3,
Zope (Zope 2.7.8-final, python 2.3.5, darwin),
Python 2.3.5 (#1, Jan 18 2006, 11:45:33) [GCC 3.3 20030304 (Apple Computer, Inc. build 1666)],
PIL 1.1.5


作ったテンプレートはこんなものです。
rss10.rdf.txt

RSS 1.0用 (rss10.rdf)

<?xml version="1.0"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:tal="http://xml.zope.org/namespaces/tal">

<tal:dummy tal:define="dummy python:request.RESPONSE.setHeader('Content-Type', 'text/xml;; charset=utf-8')" />

<tal:search>
  <tal:dummy tal:define="global items python:context.portal_catalog.searchResults(
        sort_on='modified',
        sort_order='reverse',
        review_state=['published','visible'],
        path='/Plone/articles',
        portal_type=['Document'])[:15]" />
</tal:search>

<channel tal:attributes="rdf:about here/portal_url">
  <title tal:content="context/title">Title of site</title>
  <link tal:content="context/absolute_url">http://plone.org</link>
  <description>「名無しのvim使い」へようこそ。このサイトはUnix系エディタviの後継、vimエディタの基本の基本から、スクリプトでの機能拡張までを扱うvimエディタ専門の情報サイトです。</description>
  <dc:publisher>mail@nanasi.jp (小見 拓)</dc:publisher>
  <dc:creator>mail@nanasi.jp (小見 拓)</dc:creator>
  <image tal:attributes="rdf:resource string:${context/portal_url}/${context/base_properties/logoName}"/>
  <dc:language tal:content="context/portal_properties/site_properties/default_language">en</dc:language>
  <admin:errorReportsTo rdf:resource="mailto:mail@nanasi.jp" />
  <admin:generatorAgent rdf:resource="http://nanasi.jp/" />
  <items>
    <rdf:Seq>
    <tal:block tal:repeat="item items">
      <rdf:li tal:attributes="rdf:resource item/getURL | item/absolute_url" />
    </tal:block>
    </rdf:Seq>
  </items>
</channel>

<image tal:attributes="rdf:about string:${context/portal_url}/${context/base_properties/logoName}">
    <url tal:content="string:${context/portal_url}/${context/base_properties/logoName}">
      http://plone.org/logo.jpg
    </url>
    <title tal:content="context/title">Title of site</title>
    <link tal:content="context/absolute_url">http://plone.org</link>
</image>

<item tal:repeat="item items" tal:attributes="rdf:about item/getURL | item/absolute_url">
  <title tal:content="item/Title">Title of item</title>
  <link tal:content="item/getURL | item/absolute_url">http://plone.org/itemurl</link>
  <description tal:content="item/Description">description</description>
  <dc:subject>名無しのvim使い 記事一覧</dc:subject>
  <dc:creator>mail@nanasi.jp (小見 拓)</dc:creator>
  <dc:date tal:define="date item/modified" tal:content="date/ISO8601">2005-02-16T12:00:00+09:00</dc:date>
  <content:encoded tal:define="item_object item/getObject"><span tal:replace="item_object/CookedBody" /></content:encoded>
</item>

</rdf:RDF>
rss20.xml.txt
RSS 2.0用 (rss20.xml)

<?xml version="1.0"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:tal="http://xml.zope.org/namespaces/tal"
>
<tal:dummy tal:define="dummy python:request.RESPONSE.setHeader('Content-Type', 'text/xml;; charset=utf-8')" />
<channel>
  <title tal:content="context/title">Title of site</title>
  <link tal:content="context/absolute_url">http://plone.org</link>
  <description>「名無しのvim使い」へようこそ。このサイトはUnix系エディタviの後継、vimエディタの基本の基本から、スクリプトでの機能拡張までを扱うvimエディタ専門の情報サイトです。</description>
  <language tal:content="context/portal_properties/site_properties/default_language">en</language>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>名無しのvim使い</generator>
  <managingEditor>mail@nanasi.jp (小見 拓)</managingEditor>
  <webMaster>mail@nanasi.jp</webMaster>
  <image>
    <url tal:content="string:${context/portal_url}/${context/base_properties/logoName}">
      http://plone.org/logo.jpg
    </url>
    <title tal:content="context/title">Title of site</title>
    <link tal:content="context/absolute_url">http://plone.org</link>
    <description>名無しのvim使い</description>
  </image>

<tal:search>
  <tal:dummy tal:define="global items python:context.portal_catalog.searchResults(
        sort_on='modified',
        sort_order='reverse',
        review_state=['published','visible'],
        path='/Plone/articles',
        portal_type=['Document'])[:15]" />
</tal:search>
<item tal:repeat="item items">
  <guid isPermaLink="true" tal:content="item/getURL | item/absolute_url">http://plone.org/itemurl</guid>
  <title tal:content="item/Title">Title of item</title>
  <link tal:content="item/getURL | item/absolute_url">http://plone.org/itemurl</link>
  <description tal:content="item/Description">description</description>
  <author>mail@nanasi.jp (小見 拓)</author>
  <category>名無しのvim使い 記事一覧</category>
  <pubDate tal:define="date item/modified" tal:content="date/rfc822">Wed, 16 Feb 2005 12:00:00 +0900</pubDate>
  <content:encoded tal:define="item_object item/getObject"><span tal:replace="item_object/CookedBody" /></content:encoded>
</item>

</channel>
</rss>


これらのテンプレートをPageTemplateとして、
Ploneの「portal_skins/custom」ディレクトリに登録すると、

  • ${PloneのURL}/rss10.rdf とか、
  • ${PloneのURL}/rss20.xml
などのURLで、作成したRSSにアクセスして表示できるという寸法です。

動的なPloneのサイトで、この方法を使用すると
  • ${PloneのURL}/news/rss20.xml
  • ${PloneのURL}/events/category/rss20.xml
といったURLでもRSS feedが表示できてしまうけど、
それが困るという人は自分で解決してください。


このテンプレートは思いっきり「名無しのvim使い」用の設定になっているから、
そのまま使うのはかなり問題があります。
凡庸的に使えるようにもなっていません。いろいろやらねばならないことがあるのです。

記事のカテゴリを動的に変えるとか、記事のguidを変えるとか、
記事の検索パスを違うものにするとか、などのカスタマイズも自分でしてください。
私は面倒だから直接設定を書いてしまいまっています。


動的Ploneサイトを公開している場合には、RSS出力のMIMEタイプにも注意が必要です。
(これはほぼ全てのPloneサイトが該当します)

RSS 1.0では、

  • application/rss+xml
  • application/rdf+xml
  • application/xml
RSS 2.0では、
  • application/rss+xml
  • application/xml
をMIMEタイプとして使うのが良いようなのです。

名無しのvim使い」ではPloneの静的コンテンツ出力をしているから .htaccessでコントロールできるけれど、
普通のPloneサイトでは対応が必要なのではないですかね?
(そのままでもRSSリーダーで読めることは多いみたいなので気にしなくてもいいかも。)


で、最後に気づいたことがあるのです。

RSSに「content:encoded」で記事の本文を入れる場合、
画像のパスはホスト名を含むURLにしなければ表示できません。
(そう思っていました。)

  • × /dist/img/logo.jpg
  • ○ http://nanasi.jp/dist/img/logo.jpg

しかし、Google Readerと、WebブラウザSafariの組み込みRSSリーダーでは、
画像PATHがホスト名を含むURLでなく、
/(スラッシュ)から始まる部分的なURLでも、きっちりと画像を表示してくれるのです。 google_reader_image_path.jpg safari_rss_image_path.png

相対URLの場合はトップディレクトリ以外にある記事だと駄目みたいですけど、
それでも、なかなかがんばって解釈してくれています。

完璧なRSSを出力している方や、リンク情報を含まないRSS feedを出力している方は、
この親切(?)な仕様には、なかなか気づかないのではないかな?
(Bloglinesもこの仕様を採用するといいのに)


今日は以上。では。
posted by 小見 拓 at 04:52| Comment(0) | TrackBack(0) | 未分類 | このブログの読者になる | 更新情報をチェックする

2007年02月17日

「なんだか原因が良くわからないがとにかくエラーが出て動かない」、を解決する方法 (vimエディタ)

vimエディタを使っていて、

・ある機能、設定を使用したらエラーが出た
・もしくは、あるプラグインを入れたらエラーが出た
・原因はわからない
・心当たりは無い
・検索エンジンを使用しても解決策がみつからない
・どうしよう

という場合でも、エラーのコードが表示されているなら、
解決策が見つかる可能性があります。






例。



diff_error.jpg
:VDsplitコマンドが失敗した。
詳しい原因は表示されていない。だから、当然原因はわからない。



diff_error_spot.jpg

E97

でも、謎のコードは表示されている。



このコードをvimエディタのヘルプで検索してみます。

:help E97



英語が読める人にとっては、
原因と、解決方法が一目瞭然のヘルプがヒットしました。
help_view.jpg

                                                *E97*
Vim will do a test if the diff output looks alright. If it doesn't, you will
get an error message. Possible causes:
- The "diff" program cannot be executed.
- The "diff" program doesn't produce normal "ed" style diffs (see above).
- The 'shell' and associated options are not set correctly. Try if filtering
works with a command like ":!sort".
- You are using 'diffexpr' and it doesn't work.
If it's not clear what the problem is set the 'verbose' option to one or more
to see more messages.

The self-installing Vim includes a diff program. If you don't have it you
might want to download a diff.exe. For example from
http://jlb.twu.net/code/unixkit.php.

今回の問題はdiffコマンドがうまく実行できなかったため起きたようです。
解決するには、diffコマンドをダウンロードしてインストールしろ、とヘルプに言われました。



diff_success.jpg
diffコマンドをインストールすると、
:VDsplitコマンドは、ばっちり成功。



ということがあるので、エラーのコードが表示された場合は、
駄目で元々の気分で
:help エラーのコード

を実行してみると良いです。
vimエディタがエラーの原因を教えてくれるかも?

(最初から原因が分かるようなメッセージを出せ、という意見はもちろんあるでしょう。)



今日は以上です。
では。

posted by 小見 拓 at 03:28| Comment(0) | TrackBack(0) | 基本 (vimエディタ) | このブログの読者になる | 更新情報をチェックする
記事検索
 
カテゴリ
最近のコメント
QKCのインストール [3-4/18]
 ⇒ kova (05/23)
calendar.vimには日記をつける機能があったらしい。
 ⇒ とまと (03/07)
最近よく見るようになったvimスクリプトのコメントの書き方
 ⇒ 小見 拓 (02/13)
 ⇒ kana (02/11)
vimエディタ ヘルプのgrep
 ⇒ みかん (07/15)
指定したカラム位置にテキストを流し込む (vimエディタ)
 ⇒ こみ (03/20)
 ⇒ とおりすがり (03/19)
 ⇒ こみ (03/18)
 ⇒ takayama (03/18)
tempfile -- Generate temporary files (Mac OSX)
 ⇒ take3 (01/20)
 ⇒ こみ (01/19)
 ⇒ take3 (01/18)
 ⇒ こみ (01/17)
 ⇒ take3 (01/14)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#2
 ⇒ (06/30)
 ⇒ Tetsuya Kuramochi (06/29)
 ⇒ Tetsuya Kuramochi (06/29)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#1
 ⇒ (06/03)
 ⇒ Tetsuya Kuramochi (06/02)
最近のトラックバック
vimエディタで「文字コード、改行コードを変更して保存する。」
 ⇒ window.closed (04/25)
 ⇒ himesuke’s STEP-log (03/18)
 ⇒ PukiWiki/TrackBack 0.2 (05/07)
vimエディタの折りたたみ機能の話。その2 (foldmethod=syntax)
 ⇒ 俺の基地 (PukiWiki/TrackBack 0.3) (04/20)
ログファイルを監視して、特定のキーワードが見つかったら、何らかのコマンドを実行する。
 ⇒ Apple Fan (10/16)
ファイル保存ダイアログの初期ディレクトリについての話 (vimエディタ話)
 ⇒ ナレッジエース (07/23)
:e <C-x> (編集中のファイルと同じディレクトリにあるファイルを開く。)
 ⇒ ボクノス (02/07)
Opening many files using wildcards.
 ⇒ PukiWiki Plus! (PukiWiki/TrackBack 0.4) (10/28)
 ⇒ 川o・-・)<2nd life (07/18)
vimエディタで印刷自由自在 その8 -エディタからの直接の印刷の代わりに、2html.vimスクリプトを使用する-
 ⇒ Knoppix Temporary Directory (PukiWiki/TrackBack 0.3) (02/19)
検索でマッチした対象に対して、置換を行う。(vimエディタ話)
 ⇒ 123net :: 開発日記 (12/31)
ごみ箱にファイルを叩き込むスクリプト。(vimエディタ)
 ⇒ "OSX" .app's :Macのアプリを便利、感動、面白をベースにほぼ日刊で紹介。 (11/26)
パーセント、%、percent でのカーソル移動 (vimエディタ話)
 ⇒ プログラミング言語 (10/11)
過去ログ
Profile
小見 拓
mail@nanasi.jp
小見と申します。
神奈川でデベロッパーやってます。
名無しのVIM使い

RSS 1.0


広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。