{{tag> project 終了}} ====== dokuwiki-mode.el ====== ===== TODO ===== ===== 日誌 ===== ==== 一応できた ==== propertize実行タイミングの問題だった!!!!!!!!!!!!ははははは。 insert-listの最初にpropertizeを持ってくるようにすると、前のマークが挿入されるようになった。 が、前の状態を維持してしまうのでちょっとおかしい動作。 完全な動作にはhookが必要なんだろう。とりあえず、達成感。 …''ordered-list-item-prefix''だけが出ていたのは、 ==== debug結果 ==== 少なくとも、''dokuwiki--cur-list-item-bounds''(get value from match of regex-search)では-を捕捉できている。 ''dokuwiki-syntax-propertize-list-items''でも。(put-text-propertyって全文に対してマッチするものを探してputする。逐次近いのだけ探すのかと思っていた) ''dokuwiki-cur-list-item-bounds''(get property from 'dokuwiki-list-item)でも。 つまりpropertizeで格納してからcur-list-item-boundsで取り出すと。 現状、propertize実行のタイミングがおかしい。insert-listの最後で実行しているが、それだとboundsが1つ前の状況だ。どこかhookに挟むべきなのでは? ==== 別のリストが出ない2 ==== insert-listをコピペしても、-は捕捉されない。 insert-listだけの問題でないことは明らかだ。 怪しいのは変数関係? 最初にregexpを生成したり、property関連で初期化しないといけないものがある、というのが考えられる。 markdownがそのまま流用できたっておかしくないはずなのだが…。さっぱり。 ==== 別のリストが出ない ==== messageでboundsを表示するところによると、インデントやマークを捕捉できているようだ。 しかし…*だけだ。-はムリ。-だけがあるときは、リストが何もないときの動作をしているよう? リストだと認識してない。regexpの部分だと思う。 (しかし…markdown-modeではOKなのにな。違う理由かもしれぬ) で、regexp-listをいじってみるがどうも変わらず。 ここもちょっとややこしくて、何か見落としがありそうだ。 regex-listだけはちょっと違う形式だ。''dokuwiki-rx''でまとめられている。 いくつかリストの種類と部分があるため、セットになっているよう。…indent,numeral,bullet,checkbox...といろいろある。 (追加) list-markerを変えてテストしてみる。 *を消すと、検知できなくなる。つまりちゃんと機能している。しかし-はあってもなくても同じ動作、検知しない。 たとえば''(any "*+:-")''を''(any "-")''にすると*リストを検知できなくなる。 insert関係ではなく、regexp関連に理由がありそうだが、markdownと動作が違う理由はよくわからない。 リストがないときの''ordered-list-item-prefix''を変更(-に)すると、検索まで変化することがわかった。 捕捉されるマークが-になる。なんで連動してるんだろう? 単に前にリストがないときの動作で、関係ないように見えるが、実際は捕捉する内容に影響を与えている。 今の状況まとめ…''dokuwiki-ordered-list-item-prefix''で指定した表現だけがリストアイテムとして挿入できる。 ==== Property ==== ずっと謎に思っていた部分が、Propertyという機能ということがわかった。 要するに配列だと思うんだが、こうすると後で再利用がしやすい。 よく、シンタックスハイライトとかに使われるヤツ。 順序… property変数を定義する。ここで文法などを指定して、マッチしたものをどうリストに入れるか書く。 で、後で使うときには''(get-property)''の引数にproperty変数を持ってくる。すると文法が定義されているのですぐ検索して、欲しい値(マークとか、インデントの数とか、ちょっとやっかいなもの)を一気に取得できる。 ==== マークの種別 ==== insert-listを持ってきた。 dokuwikiの文法用に書き直す必要がある。 そこで、必要だと思うのは''cur-list-item-bounds()''の部分だ。 ここの''markdown-list-item''を書き直せばいいと思うんだが、これは何だ。変数の宣言がない。 イメージ的に、ここに正規表現的なのがあって、リストを定義していると思った。 ==== 改めてリスト・インデント ==== markdown-modeをよく見てみると、新しい行でalt-enterしたときにインデントが深くなるのは正しい動作のようだ。むしろ、リストの階層のために必要な動作かもしれない。 正しくないのは、インデントがあるときに、既存行でalt+enterしたときだ。単に空白を2個並べてinsertしてるだけなので、インデントが保持されない。 むずい。進まない…。 ==== リストのインデント保持がムズい ==== 取り組む。markdownのソースコードを見るが、よくわからない。かなり長い。 今の動作… リストから改行時にインデントが保持され、そのままAlt-Enterするとインデントが一段深くなる。 また、2段インデント時にリスト上でAlt-Enter(1段め普通だと正しい動作になる)すると一個前のインデントになる。 実現したいこと。 リストを挿入するときに、前行がリストであれば、インデントを測定する。同じインデントを前に挿入したあと、リストアイテムを挿入する。 (skip-chars-backward)でインデントをなくすことには成功したが、複数の階層があるときうまくいかない。 インデントの数を測定しないといけない。 ''Args out of ranges''が起こる。 リストを検索 インデントの数を取得? (setq indent (length (match-string-no-properties 1))) ==== 依存性を解消 ==== markdownからコピペしてきたやつをちょっとずつ書き換えたりまるごと持ってきたりした。 まっさらなEmacsでも動くようにした。 ==== compress-white-spaceを追加 ==== regionに余計な空白スペースがあった場合削除する関数を追加した。 insert系で使う。 ==== insert-baseのわからない部分 ==== markdown-regex-boldがどう動いてるかよくわからない。scratchで動かせない。 一見、regex-boldが突然出る理由は?参考元から引き継いできたのかも? ==== インデント保持 ==== 空白行で''insert-list''してリストを追加するときに不便なので、インデント保持機能もつける。 …面倒だな。そんなに優先度も高くないし、後回しにするか。 ==== 一部テスト ==== 一部だけ再現してみた。そう、少しずつ試して理解していくことが大切なのだ… (defun dokuwiki-insert-list () (interactive) (let (indent) (progn (unless (markdown-cur-line-blank-p) (insert "\n")) (insert markdown-unordered-list-item-prefix)))) 基本的な動作はOK。 あとは、前の行が数字付き(-)か否(*)かを判別して挿入するマークを変える、という動作を追加する。 要するに、 (save-excursion (cond ((re-search-backward "^ *" nil t) (setq mark " * ")) ((re-search-backward "^ #" nil t) (setq mark " # ")))) ... (insert mark)... みたいなことだ。 cur行と前行をサーチする方法がわからない。 前行の最初に行き、limitにcur行の最後を指定して検索を行う。 バグがある。 空白行で生成する場合と、リストから生成する場合で、検索範囲を違わせないといけない。 ==== markdown-cur-list-item-bounds ==== 何やらたくさんパラメータを返しているが、どういう意味かよくわからない。 これが、条件分岐に大きな役割を持っている。 ==== キーバインドが反映されない ==== 最初からあったキーバインドに追加しても、反映されない。なぜ。 アルファベットの一部はいける。markdown-modeと同じ書き方なんだけどな。 変な現象。oとlの間で何かがある。l以下はバインドが機能しているが、それより上が機能していないので、何かある。 キーバインドは最初にロードした分しかできない説。 elpa以下をワーキングファイルからコピーして、再起動したら反映された。何なんだ、いったい。 > 下のものだけ反映されていたのは、前回起動したときに下のものだけしかなかったためだと思う。 ==== insert-listがよくわからなすぎる ==== いろんな機能が1つの関数になっていて、さらにほかの関数も使ってるから、 まとめよう。 ''M-Enter''、''markdown-insert-list''できる動作を真似たい。 何もないところでは->''* ''を追加。 リストの途中だと->改行してインデントを保持して、''* ''を追加。 boundsとは何か。 ==== リスト ==== リストの約物生成に関しては、markdown-modeのAlt+Enterが望む動作。 ''markdown-insert-list-item''か。 100行くらいある大きめの関数で、何してるかよくわからない。 番号付きは、priority-list-itemというらしい。 番号なしかありかの2つの判断と、インデントを保つのにけっこう行数を割いている? もしリスト上だったら、改行したうえで新しいリストを生成する、とかあるね。 ==== insert-hrがあまりにも適当 ==== これだけ前後に入れ込む必要がないタイプのため、簡易的に''insert''を使って書き、それで一応機能するが、さすがにカンタンすぎかもしれない。region選択時にちょっと挙動がほかとちがうので、自分で書いていこう。 ==== markdown-wrap-or-insert ==== dokuwikiに組み込む必要がある重要関数。 仕組みがよくわかる。 region選択中と、非選択時で処理を分けるというのがポイントのようだ。 ==== 相対ヘッダーの挙動 ==== まだ見出しがないときは、レベルを6に設定する! current-levelが0なら、6を代入したい。 ==== 打ち消し線 ==== 打ち消し線のフォーマットはなので異なるタイプを使用する。 ==== 依存 ==== markdown-modeを移動して追加できたと思っていたが、よく考えるとmarkdown-modeを読みこんでいるから動いている気がしてきた。独立してチェックするにはどうしたらいいんだろう。 独立できる形にすることが難しい。 ==== bold ==== markdownのinsertの動作が完全に流用できるので、カンタンそうだと思ったが、markdownの関数が複合していて、辿っていかないといけない。 headerは特殊だが、ほかのマークアップはほとんど同じで、共通化できる。 半角スペースやレベルのないheaderだ。 違うのはリストくらいか。 ==== 他のショートカット ==== 操作はほとんど共通している。 改行が伴わないので、insert-headerをそのまま流用はできないが、参考にはなる。 選択範囲の最初と最後に文字を挿入するだけだ。 選択されていなければその場に表示。 ==== 相対insert-header完了 ===== とりあえずできた。超書きやすい。 ==== interactiveの意味 ==== ''interactive''がないと、キーバインドしても呼び出せない。 どういう意味なんだ? ==== 正規表現を変数に置き換えされない ==== ''defvar''で正規表現を格納した結果と、正規表現直書きで結果が異なる。 何か重要なことを見落としているような。 ==== looking-atの使い方 ==== looking-atでの検索がうまくいっていないため、levelが取得できていないようだ。 ''(looking-at 正規表現)''。いまいち指定方法がよくわからないな。 match-stringを使っている例もある。違いがよくわからない。テストしていたら勝手に値が変わったりする。うーん。 org-outline-levelをdokuwiki用に書き直してみるが、反映しない。 どこが悪いのかテストできない。値が調べられればいいのだが… 正規表現がマッチしない。 正規表現と+1を微妙に書きかえて動くように。なんで動く理解できなくて気持ち悪い。 あとカーソルも動くな。save-excursionで回避するが、なんで同じコードなのに、こう動作が違うんだ?。 ==== 見出しレベルの取得ができない ==== 現在の見出しのレベルが取得できれば、マクロで各関数を呼び出せばいいと思う。 ''(outline-level)''の使い方がわからない。 ソースを読むと、各モードで上書きしているようだ。それによって、見出しと定義する表現を変えているようだ。 ''(org-count-level)''が期待どおりの動作をしている。 ''(org-outline-level)''も期待どおりだ。どうも、モードごとの必要な関数の互換性はある程度あると思っていたがあまり関係ないようだ。 (defun org-outline-level () (org-with-wide-buffer (end-of-line) (if (re-search-backward org-outline-regexp-bol nil t) (1- (- (match-end 0) (match-beginning 0))) ;; 逆に検索して、最初にマッチした見出し識別子のレベルの数を求める。 0))) dokuwiki-modeの既存のoutline-levelはどう機能しているのかわからない。全体として1度しか使われていないので、どう呼び出されるかよくわからない。 ==== マップがよくわからない ==== markdown-modeから直接持ってきた。あまり理解していないので理解して、書き直したい(とりあえず動くが)。 ''C-c C-t 6''などで指定する。3入力で微妙なので、短くしたいが…。 とりあえずglobalで指定しているが、たぶん間違っている。既存のdokuwikiのキーマップが指定されているところに追加してみたが、ダメだった。調べないと。