8667


outline-mode にてある heading が sibling の中で末の要素であることを確認したいと考えています。

イメージとしては、  
(defun last-sibling-heading-p ()  
......)

が定義されるイメージなのですが、これはどう実装したらよいでしょうか？


CC BY-SA 3.0
2015-04-01T04:35:00.597
8636
2020-05-16T22:58:34.780
2020-05-16T22:58:34.780
19110
754
question
elisp
outline-mode にてある heading が sibling の中で末の要素であることを確認するには？


「outline-mode にてある heading が sibling の中で末の要素であることを確認したい」  
ということだと、

  1. outline-modeのフォーマットのテキストデータをパーズして、その中の「末の要素」だけ抜き出す
  2. Emacsのoutline-mode 中でをカーソルが、ある heading 上にあって、sibling の中では「末の要素」になっているかを確認する関数を作りたい

等の解釈ができるかと思います。

自分は、2の場合で回答したいと思います。  
とりあえず、動作としては、

[code]

    (defun last-sibling-heading-p ()
      (save-excursion
        (let ((start (point))
              prev)
          (ignore-errors (outline-forward-same-level 1))
          (setq prev (point))
          (ignore-errors (outline-forward-same-level 1))
          (and (= prev (point))
               (>= start (point))))))
    
    ;; M-x fooでカーソル位置のsiblingが「末の要素」かを確認する
    (defun foo ()
      (interactive)
      (message (if (last-sibling-heading-p) "last" "butlast")))
    
[/code]

のようなものを想定されているのでしょうか。  
このコマンドの場合

[code]

    * A
    ** a
    ** b
    ** c
    * B
    * C
    
[/code]

のような場合、cの位置にカーソルがあれば、"last"と表示されます。  
もしこの動作が希望ということであれば、上の実装はいい加減なものですので、  
emacs-lispに詳しい方がもっと良い実装を教えてくれるかもしれません。


CC BY-SA 3.0
2015-04-01T21:46:24.717
8667
2015-04-01T21:46:24.717
3510
8636
answer