Ulysses III

Ulysses for Mac の .Ulysses-Group.plist がイカン構造をしている件

Ulyssesのファイルはプレーンテキストだから

さんざんウダウダ言った挙句、Scrivenerを捨ててUlyssesで原稿を書いている現状。

最大の理由は、やはりUlyssesが(外部フォルダにおいて)プレーンテキストファイルを扱えることです。

私は原稿執筆時に青空文庫フォーマットを利用しており、プレースホルダを置いておいて後で置換したりします。

{hoge}hoge[#「hoge」に傍点]に置換したり。最初から青空文庫フォーマットにすると、リッチテキストほどではないにせよ編集が大変)

元データがプレーンテキストであれば、このような処理をスクリプトで自動化することができます。それ以外にも、ファイル名を連番化したり、分割されたファイルを統合したり。

Ulysses自体にもフォーマット変換して出力する機能はありますが、青空文庫フォーマットには対応していないので、自前のスクリプトで処理する必要があるとも言えます。

外部フォルダの文書構造はどこに保存されているのか?

Ulyssesはシート(個々の文書)を任意に並べ替える機能を持ちます。この際、順序情報はどこに保存されているのでしょうか。

Ulyssesに連携したフォルダには、「.UlyssesRoot」「.Ulysses-Group.plist」というファイルが自動生成されます。ここに、フォルダごとのコンフィグ情報や、シートの順序等の情報が格納されています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>childOrder</key>
<array>
<string>オープニング</string>
<string>紹介</string>
</array>
<key>createMarkedFile</key>
<false/>
<key>sheetClusters</key>
<array>
<array>
<string>序文.txt</string>
</array>
<array>
<string>書誌情報.txt</string>
</array>
</array>
</dict>
</plist>

<key>childOrder</key>下にある<array>はサブフォルダの順序、<key>sheetClusters</key>下にある<array>には直下のシートの順序を、それぞれ子要素として持ちます。

例えばファイル名の連番化をするには、.Ulysses-Group.plistの書き換えとファイルのリネームを同時に行えばよいわけです。

XML構造上の問題

問題は、これが完全なツリー構造ではない点にあります。

<key>childOrder</key>下にある<array>と、<key>sheetClusters</key>下にある<array>を、データ的に区別することは困難です。例えば、XPathで表現すれば、どちらも//plist/dict/arrayとなります。

実用上は、

  • 取得したいのは<string>要素の値と順序のみである
  • childOrdersheetClustersでは階層数が異なる

ということから、例えばxmlstarletでいずれかを選択的に取得することは可能です。

1
2
3
4
5
6
7
8
9
$ xml sel -I -t -v //plist/dict/array/string .Ulysses-Group.plist
Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd
オープニング
紹介
$ xml sel -I -t -v //plist/dict/array/array/string .Ulysses-Group.plist
Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd
序文.txt
書誌情報.txt

なかなかに気持ち悪い。sedで処理することも考えましたが、結局のところ暗黙的な記述ルールに依存したバッドプラクティス臭いスクリプトにならざるを得ません。

plistのルールセットはよく知りませんが、XML的には<key><array>の子要素にすれば済む話でしょう。それか、<array type="childOrder">とかでもいいよ。

なんとかしてほしいのですが、受けが狭すぎて改善要望として投げるのもどうか、ともにょっている次第。

Ulysses III/Marked 2が提起した「Textbundle」ってなんぞ?

なんかリリースが出てたのだが。

とりあえず原文をどうにか訳してみる

異なるMarkdownアプリケーションの間で作業を行う際、いくらかの厄介事が起こりえます。よりよい未来のため、私たちはMarkedの製作者であるBrett Terpstraとの連携し、TextBundleを開発しました。

これは、「サンドボックス化」されたアプリケーション同士でMarkdownテキストをやり取りするための、新たなファイル・フォーマットです。
「サンドボックス」は、MacおよびiOSのApp Storeで利用可能な全てのアプリケーションに要求されており、これらのアプリケーションは、ユーザーに対し極めて限定されたファイルへのアクセスしか提供することができません。

この手続きは、より高度なデータセキュリティを目指したものですが、不便さをもたらすものでもあります。例えば、Markdownファイルが外部画像ファイルへの参照を含む場合、このようなファイルをMarkdownエディタからプレビューワへ送る際、ユーザは個々の画像ファイル毎に、明確なアクセス許可を与える必要があります。

TextBundleは、サンドボックス化されたアプリケーションのための、新たなデータ互換フォーマットです。それはMarkdownテキストと、全ての参照された画像を、ひとつのファイル内に同梱します。現在、TextBundleは最新バージョンのUlysses (1.2.2)およびMarked (2.3.4)でのみサポートされています。しかし、各種のMarkdownアプリケーションのユーザは、互換的な可搬性から利益を得られると考えます――そのため、私たちは他の開発者が、彼らのアプリケーションでTextBundleをサポートしてくれることを期待しています! 仕様書と詳細は、以下の専用ページで参照できます。 textbundle.org

なるほど。要するに、Markdown文書から画像(を含む外部ファイル)を参照するためのフォーマットということらしい。端々から林檎てめぇ調子こいて開発者イビってんじゃねぇぞという恨み節が聞こえる気もするが、それはとりあえず措く。

  • Announcing the Textbundle format (and Ulysses 3 giveaway) - BrettTerpstra.com

    私はUlyssesの作者であるSoulmenと共同で、アプリケーション間でプレーンテキストを運搬するための新たな標準作りに取り組んでいました。それはTextBundleと呼ばれ、私はその可能性に非常に興奮しています。私は、多くの開発者が参加してくれることを期待しています。

    TextBundleフォーマットは非常にシンプルです。プレーンテキストファイル、JSONデータファイル、そしてアセットサブフォルダを含むフォルダです。Ulyssesようなアプリは、TextBundleを書き出し、Markedに渡すことができ、全ての必要なコンポーネントが自動的にインクルードされます。画像、追加テキストファイル、そしてこれらが必要とする各種のメタデータが、サンドボックス化の制限を満たした上で。

    サンドボックス化は、第一の動機であり、TextBundleはMarkdownにおける外部ファイル参照に関する主要な問題を解消します。

    Ulysses IIIとMarked 2の間でやり取りされるバンドルは、JSONデータにおいて「一時的に」ラベリングされます。これは、Ulyssesがファイル上書きに関して自由であり、そしてMarkedが、データがいつでも書き換えられ得ることを知っていることを意味します。一時的でないファイルは、その非一時性にもかかわらず、複数の筆記アプリケーション間で仕様され得ます。これは、ファイルに保存される変更履歴、書き込み状態、そしてあらゆる種類の予期し得ないデータが、フォルダ、マシン全体、またはプラットフォーム間で移動され得ることを意味します。

    PCユーザがTextBundleを開く際には、オリジナルのMarkdownファイルに関する完全なアクセス権を持ちます。ユーザはそれを編集し、フォルダへ送り返し、再びMacにおいて単一の「TextBundle」ファイルとして表示させることができます。

    これらは将来において、多くの、非常に多くのエキサイティングな可能性を持っています。TextBundleへのサポートを実装する全てのアプリは、それらに対して役立つ情報を書き込むために、データファイル内に名前空間のセクションを持つことができます。その他のアプリもまた、これらの情報にアクセスし、また適切に行動することができます。

こっちはだいぶブロークンで訳しづらい……。しかし、TextBundleフォーマットが、ユーザが意図的に保存するというより、アプリケーション連携によって自動生成されるっぽいというのは優位な情報だろうか。

実際どうなん?

Web公開を前提とする文書の作成に際しては、これはそれほど重要ではないと思う。

一方で、公開を前提としない個人的な文書、具体的には小説のキャラ設定とかを書くに当たっては、かなり有効なものになるかもしれない。

しかしね、君らね、その今あるフォーマットがイケてないから独自フォーマット作りますフォローミーって姿勢はどうなの。前から思ってたけど、Markdownフォーマットすら守る気ないのはさすがにどうかと思うよ。リンクは[]()形式にしようや、なあ。

Ulyssese 3での基本的な画像ファイルの挿入方法

まず、Ulyssesではライブラリ外部ソースが区別される。

ライブラリにおいては、全てのシート(文書)は統合され、各々にファイルとして扱われることはない。ライブラリは、「このMac」「iCloud(他のMacと同期)」「Daedalus Touch(iOSアプリと同期)」に分かれる。

外部ソースとは、要するにローカルストレージ内のファイル・フォルダを指す。Dropbox等の同期フォルダを指定することもできる。

外部ソースのシートにイメージを挿入する場合、それはURLをソースとする。つまり、Web公開された画像しか挿入することができない。画像ファイルをドラッグアンドドロップした場合、ファイルパスがテキストとして記述されるが、イメージとして参照されることはない。

一方、ライブラリにおいては、ドラッグアンドドロップでローカルの画像を挿入することができる。これは、Ulyssesでのプレビュー時に表示される。しかし、ファイルをリネームなどして参照不可能にすると表示されない。

また、ライブラリのみ、シートへの添付ファイルとして画像を与えることもできる。この場合、添付ファイルボタンをクリックすることで画像がプレビューされ、シートにドラッグアンドドロップすることで挿入することができる。この場合、ファイルはライブラリに統合され、元ファイルが参照不可能になった場合も閲覧できる。

TextBundleファイルの作成方法

たぶん、画像ファイル付きのシートをMarkedでプレビューする際に自動生成されるのではないだろうか?

Marked持ってないので検証終了。買ったら追記する。

(追記)Marked 2買ったので追加検証するかも。

Ulysses IIIのファイル名記法と、新規シート作成時に即ファイル名入力できない件について(解消済み)

Scrivenerのリッチテキスト編集がいよいよ堪え難く、一度Ulysses IIIを諦める宣言をしておきながらまた試しております。ブログ原稿もUlysses IIIで管理してたり。

メニューバー項目にショートカット割り振ってやるとかなりいい感じになるのですが、そもそもシーと並べ替えがメニューにないので割り振れないのがつらい。あと、タイプライタースクロールが中央固定にできないの。変数とかいらない……。

とまれ。また使い始めたら、改めておやっと思うことがありまして。

外部ソースとファイル名記法

Ulysses IIIはシングルライブラリなので、基本的にファイル名という概念がありません。シートリストでは、「内容」のプレビューが表示されるのみです。

例外は外部ソースを追加した場合です。ここでいう外部ソースとは単にローカルフォルダであり、外部ソースにおける個々のシートはテキストファイルですから、当然ファイル名が存在します。にもかかわらず、Ulysses IIIにはファイル名フィールド自体が存在しません。

じゃあどうするのかというと、1行目にこのようなファイル名記法を入力します。

@: ファイル名

外部ソース・グループにおいて新規シートを作成した場合、当然1行目にこの記法が自動挿入されるのですが、この際、「ファイル名」の部分が選択されません。こんな具合です。

新規シート作成時のファイル名入力

したがって、ファイル名を入力するには、カーソルを移動する必要があります。そんなばかな。

問い合わせてみた

問い合わせ

外部ソース・グループで新規シートを作成する際、ファイル名の入力をすぐに始められないのが煩わしいです。

ファイル名が選択された状態にしていただけないでしょうか。

返信(強調は引用者による)

Hello,

thanks for the heads-up! This is a bug that we’ll try to fix in the next minor release. Sorry for the inconvenience.

All the best,

Lucas

バグでしたーーーー

次回リリースで修正予定だそうです。ひとあんしん。

2014-08-28: 解消確認

スクリーンショット

2014/8/16 リリースのバージョン1.2.2で無事修正されたようです。

私のラブコールに応えるUlysses IIIのアップデートにときめきエスカレートしたけど、このままではマダマダだった件

(はてなブログからの移行記事です。正常に表示されていない場合、ご連絡いただけると助かります。)


ver. 1.2.2 - ¥4,500( 仕事効率化 )
The Soulmen GbR

手のひら返しレビューを……強いられているんだ!←自業自得

本当にどういう風の吹き回しなんでしょうか。DISり記事を書いた数日後にツバメ返しを喰らって連日更新を強いられるシリーズ、今回はUlysses IIIです。

綺麗に返されたレビューはこちら。:ScrivenerからUlysses3に浮気したけど離婚に至らなかった件 - 豆腐メンタルは崩れない

というか、バージョン1.2リリース当日だこれ……。

誤情報を撒き散らすわけにもいかないので、羞恥で顔真っ赤になりつつ、バージョン1.2における修正点をまとめます。

シート間移動ショートカット実装!

f:id:catfist:20140502213512p:plain

Option+Command+↑ および Option+Command+↓ でグループ内を移動。シートを切り替えつつ、シームレスに編集できます。待ってたよ!

ただし、Scrivenerと同じノリで考えていると戸惑うポイントがいくつかありますので、列挙しましょう。

  • グループをまたがる移動はできない
    • Command+Return でシートパネルにフォーカス→ または Shift+Tab でグループパネルにフォーカスでグループ切り替えは可能
  • 移動後のカーソル位置は、上移動の場合はシート末尾、下移動の場合はシート先頭で固定
    • シートパネルにフォーカスした状態で または 移動した場合はカーソル位置が保存される

つまり、シートパネルでの矢印キーではなく、オーバースクロールによるシート切り替えのショートカットとして定義されているわけですね。スマートっちゃあスマートですが、利用実態には即していない気がしますねえ。

シート分割実装!!!

f:id:catfist:20140502213519p:plain

ついにScrivenerの専売特許ではなくなってしまいましたねえ……。なお、コンテクストメニューからも実行できます。こっちのほうが使用頻度が高そう。

ただし、スクリーンショットをご覧いただいておわかりのように、ショートカットキーはありません。まあ、コンテクストメニューにあるし、メニューバーに存在してくれさえすれば色々やりようはあります。

以下は、分割後の挙動についての補足。

  • Ulysses IIIの仕様上、「下側」のシートの先頭行がタイトルとして扱われる
  • 分割後の2シートは自動的にまとめる状態になり、自動連結表示される
    • Command+Jシートを別々にすることにより、連結表示を解除できる

これでいいなんて思っているでしょ:キーボードによるシートの「並べ替え」は不可!

画竜点睛を欠くとはこのこと! 相変わらず、シートを並べ替える方法はドラッグアンドドロップのみとなっています。

いや、筋は通っているんですよ。ここまで紹介した仕様を見ても、開発者は、シート分割を単にシートの区切りを追加する機能であり、抜本的な再構成に繋がるものではないと定義しているようですから。

付け加えるなら、シートペインのソートルールに、従来のタイトルに加えて日付が利用できるようになっているんですよね。つまり、Ulysses IIIは多数のシート/グループから成る長文よりも、個々のシートを単位とするドキュメント群の管理を志向していると考えられます。

これは、統合ライブラリというUlysses IIIの設計思想とも合致するものです。プロジェクトファイルという単位を持ち、プロジェクトごとにひとつの「完成品」をアウトプットしようとするScrivenerとは綺麗に棲み分けが成立しています。リプレイスではなく、使い分けを考えるのが正解といえそうです。

とはいえ、小説執筆するときの関連ドキュメントを管理する用途で考えると高いし重いしライブラリ太り過ぎだし、そもそも、本文をプレーンテキストで書きたいんですよ、私は……。

今回も離婚+再婚は成立せず


ver. 2.5 - ¥4,500( 仕事効率化 )
Literature & Latte

ただいま

Ulysses IIIが優れたソリューションであることは疑いないと思われます。検索機能は強力ですし、小説ではなく論文等の執筆に利用するなら、Scrivenerより優れている点も
多いでしょう。しかし、私はそろそろUlysses IIIを諦めたほうがいいようです。

Scrivenerがリッチテキストを捨てるか、Ulysses IIIがドキュメントツリー+フルキーボードオペレーションを実装してくれれば私にとって理想的な環境が実現するのですが、両者の設計思想からすると難しそうです……。

なお、Scrivenerは半額セールを継続中です! みんなでScrivenerを使ってリッチテキスト死ねの想いを開発者に届けよう!

関連:半額セール緊急特集!長文書く人がScrivener買うべきである3つの長所! - 豆腐メンタルは崩れない

ScrivenerからUlysses3に浮気したけど離婚に至らなかった件

(はてなブログからの移行記事です。正常に表示されていない場合、ご連絡いただけると助かります。)

本来ならScrivenerの使い方の記事から書きたいところですが、まあそれはすでに色々あるので以下などご参照ください。

なぜ私はScrivenerに不満を抱いたのか

Scrivenerが物書きにとって優れたソリューションであることは疑いなく、そもそも¥3,900(当時)も払ったわけで、私だってずっとあなたと一緒にいたかった。でも私たち、もうだめかもしれない。ていうかリッチテキスト死ね!

という話は先日書きましたね、ええ。

小説執筆するときの関連ドキュメントをMarkdownで書くと捗るぞ - 豆腐メンタルは崩れない

というわけで実家に帰らせていただいた私は、本文と関連ドキュメントをまとめてMarkdownで管理できるアプリを探し始めた――というか、前々から目を付けていたのです。

それこそが、Ulysses3。生まれ変わったもう一つの統合執筆環境。

Ulysses3(愛人)のセクシーな点と、Scrivener(本妻)の許しがたい点


ver. 1.2.2 - ¥4,500( 仕事効率化 )
The Soulmen GbR

デモ版は公式サイトのトップからダウンロードできます。

Ulysses III

Markdownエディタ!

そう、3になって生まれ変わったUlyssesは、立派なMarkdownエディタになっていたのです。Markdownのメリットについては先日の記事をご参照のほど。

実際やってみると、Markdownによるシンプルな文書管理は予想以上に快適でした。キャラ設定の書きやすいことといったら。リストを書いてたら、当然のように - +スペースを改行時に補完してくれて泣いた。

一方、本文については、注釈とかコメントとかできんのかいな?と心配だったのですが、見事杞憂に終わりました。Ulysses3の、やたらファンキーな導入テキストを引用しましょう。

メモを追加するもう一つの方法は、{注釈}またはインラインコメントを作成することです。++ 注釈の注釈をクリックしてください。 ++コメントは段落全体にまたがることもできます。

%% 段落。
%% 全体に。
%% またがる。

これらのUlysses3特有の記法によって、注釈やコメントがサポートされていました。テキストを{}で囲むと注釈文入力フィールドがポップオーバーします。入力後、注釈部分をクリックすると注釈文がポップオーバーで表示されます。行中の ++ で囲った部分、または %% で始まる行はコメントとして扱われ、薄い色で表示されます。 || で囲んで打ち消し線も嬉しい。また、これらの記法でマークアップされたテキストは、エクスポート時に無視されます

まともなテキストエディタ!

Scrivenerで一行あたりの文字数を任意の値にするために、ウィンドウ幅や文字サイズを調整した記憶は、私の密かなトラウマになっていました。いや、バカすぎでしょそれ。

Ulysses3では、そんなバカなことはありません。一行あたりの文字数は指定できます。投稿先のフォーマットに合わせるのも、設定値をちょちょいといじるだけ! 文字数より重要度は落ちますが、「行の高さ」「段落の間隔」なども指定できました。

また、プレーンテキストエディタなので、設定でフォントを変えたら全体に反映されます。さらに、見出しなどのマークアップに対する装飾も、一括設定一括反映。これこそマークアップ文書。意味と装飾を分離するメリットです。Scrivenerの場合、文書ごとに変更しなきゃならないし、文字装飾を変えたいときなんか完全に悪夢でした。

さらに、ちょっと気の利いたテキストエディタならよくある、しかし欧米産のアプリでは言語の違いゆえに無視されがちな、行数の計測機能もあります。行数、小説書き的には重要なのに、意外と出てこないんだよねえ……単語数とか要らないから、日本語はスペース区切りじゃないから。

Dropbox連携もできる!あと自動同期!

これはちょっと迷いましたが、左パネル下部の + をクリックして 外部ソースを追加 すればOK。Dropbox内フォルダを指定することで、既存文書も簡単に取り込めます。

これはScrivenerでもできるのですが、いちいち手動同期が必要なのがネックでした。Ulysses3は、設定さえしてしまえば、勝手に同期してくれます。泣いた。付け加えると、Scrivenerでプレーンテキスト同期した時の、フォルダがテキストファイルとして生成されるという気の狂った仕様はUlysses3にはありません。

本来はDaedalus TouchとのiCloud同期の話をすべきなんでしょうが、残念ながらデモ版では使えないようです。まあ、iPhoneのアプリを縛られたくないし、どうもグループの階層化ができないようなのでどうせ使いませんが。


ver. 1.7.1 - ¥100( 仕事効率化 )
The Soulmen GbR

Scrivenerより色々スマート!

インターフェースの見栄えとか色々あるけれど、特にタイプライタースクロールの差が大きかったです。

文章を書くのに集中できるタイプライタースクロールモードができるエディタ教えて下さい

Scrivenerのそれは、文末に任意のマージンを付与するだけです。まあそれでも随分役立つのですが、 Ulysses3の場合、上中央下の三段階+可変(マウススクロールに従う)遥かに快適でした。
(追記:そんなわけないでしょ!Scrivenerにもちゃんと同等機能あります!可変はありませんが、下マージン付与もできるので、単純な下位互換ではありません。)

複数のシートを選択してつなげて表示できるのは安心しました。シーンごとにバラけたシートを、まとめて読むのも簡単です。それどころか、下スクロールし続けると次のシートに飛べるのは驚きましたね。なんて読みやすいのか。

一緒に暮らして見えてきた、Ulysses3(愛人)の許しがたい点

もう乗り換えるしかねえ!と愛人宅でいそいそ原稿を書き始めた私。これで終われば記事的にもまとまりがいいんですが、培ってきた夫婦の絆がそれを許しませんでした。

Scrivenerにはあって、Ulysses3にはない、いくつかの決定的な機能が存在したのです。

ファイルブラウザがツリー表示じゃない!

まあ、統合ライブラリの件(参考:Notes Inegales obsolete: Ulysses III)はよしとしましょう。どうせデータはDropboxにあるのだから、終わった作品はリンクを切ればいい。

しかし、グループを多層化したときに、ツリー表示できないのはつらい。Ulysses3は最大3つのパネルを表示するのですが、左がグループ、中央がシートで、どうやってもScrivenerのようなツリー表示にはなりません。まあ関連ドキュメントについてはそれでいいし、なんなら見やすいくらいですが、グッチャグチャに階層化して並べ替えたりする本文がそれでは困るのですよ。

キーボードで文書間移動/文書移動できない!

これはひどい。スクロールで文書間移動とか褒めてる場合じゃなかった。

そりゃシートパネルで上下キーくらいは利きますが、まずシートパネルにフォーカスするショートカットがないじゃないですか。アホか。文書の並べ替えに至っては、全部ポインティングデバイス操作です。こちとらMacBook Airなので、ものすっごい作業効率が落ちました。

付け加えると、パネル分割して複数文書表示もできないので、ファイルブラウザ仕様との合わせ技で、シーン間を行ったり来たりするのが絶望的にめんどくさいです。まあ、複数ウィンドウ開けばいいっちゃあそうですが……。

文書の分割ができない!

これが致命傷

Scrivenerに特有の機能として、文書の分割/結合があります。これは非常に強力で、再検討を要する部分を別文書に切り離したり、シーンの並べ替えなども簡単にできます。しかも、それらの処理が全て、キーボードショートカットで実行できます

Ulysses3でも結合はできるのですが、どうせバラけたままでもつなげて表示できるので、そっちはわりとどうでもいいんですよね。分割ができないことによって、書いたテキストはシート内に閉じ込められます。小説という〝生き物〟を扱う上で、この差はあまりにも大きなものでした。

ていうかけっこう不安定なんだけど……

メモリ2GBのLate2010使ってる私も悪いんですが、動作もScrivenerに比べるとだいぶ重いです。

ただいま、Scrivener。


ver. 2.5 - ¥4,500( 仕事効率化 )
Literature & Latte

まとめるとこういうこと。

とっとと離婚+再婚したいのでアップデートがんばってThe Soulmen GbR!!!

アップデート:「来ちゃった……」

はえーよ!

続き:私のラブコールに応えるUlysses IIIのアップデートにときめきエスカレートしたけど、このままではマダマダだった件 - 豆腐メンタルは崩れない