Skip to content

Commit 4cdf093

Browse files
committed
Fix README
1 parent e4bf7e2 commit 4cdf093

File tree

3 files changed

+552
-37
lines changed

3 files changed

+552
-37
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
*~
22
*.elc
3+
README.html
4+
README-ja.html

README-ja.org

+306
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,306 @@
1+
#+TITLE: Emacs org-mode のためのコンテキストメニュー
2+
#+SUBTITLE: 現在の構文要素に応じた操作メニューを表示する
3+
4+
* 目的
5+
6+
このEmacs Lispコード(org-cmenu)は、現在のポイントが指しているorg-modeの構文要素に応じたキー操作メニューを表示する仕組みを提供する。
7+
8+
構文要素のタイプは org-element.el によって解析・判別され、そのタイプに応じたメニューは[[https://github.com/magit/transient/blob/master/lisp/transient.el][transient.el]]によって表示される。org-cmenuはその間に立ち、次の役割を担う。
9+
10+
- どの[[*構文要素タイプ][構文要素タイプ]]にどのようなメニューを表示するか管理する。(org-cmenu.el)
11+
- org-elementやtransientと連携して実際にメニューを表示し、必要に応じて呼び出し先のコマンドとの調整を行う。(org-cmenu.el)
12+
- メニューから使うためのorg-mode標準に欠けているコマンドを提供する。(org-cmenu-tools.el)
13+
14+
* スクリーンショット
15+
16+
画像リンクに対して、キャプションとHTML属性を設定し、コメントアウトし、再びコメント化解除をする例:
17+
18+
#+CAPTION: Set CAPTION, ATTR_HTML, comment, and uncomment for image links.
19+
#+ATTR_HTML: :width 400
20+
[[file:./screenshot/org-cmenu-image-link.gif]]
21+
22+
Examples of manipulating tables:
23+
24+
#+CAPTION: Cut and paste or move part of the table.
25+
#+ATTR_HTML: :width 580
26+
[[file:./screenshot/org-cmenu-table.gif]]
27+
28+
* デフォルトのメニューで実装している機能
29+
30+
現在の所、デフォルトのメニュー(org-cmenu-setup.elで定義)で実装している機能は次の通り。
31+
32+
- 要素に対する
33+
- 範囲選択
34+
- カット
35+
- コピー
36+
- org-modeマニュアルを開く
37+
- コメント化/コメント解除
38+
- 要素の内容に対する
39+
- 範囲選択
40+
- カット
41+
- コピー
42+
- 中身をむき出しにする(囲っている部分を削除)
43+
- Affiliated Keywords (#+ATTR_HTMLや#+CAPTION、#+NAME等、要素の前にくっつくキーワード)
44+
- 属性の追加(#+ATTR_ORG, ATTR_HTML, ATTR_LATEX)
45+
- 名前の追加(#+NAME)
46+
- 表題の追加(#+CAPTION)
47+
- 見出しに対するorg-speed-command的な操作
48+
- カーソル移動
49+
- 可視性制御
50+
- サブツリー移動
51+
- サブツリークローン
52+
- ソート
53+
- アーカイブ
54+
- TODO、優先度、タグ、プロパティ変更
55+
- クロック操作
56+
- ソースブロック関連(#+CALL、#+BEGIN_SRC、call_、src_)に対する
57+
- 実行
58+
- 結果の削除
59+
- その他 Babel speed keys(C-c C-v prefix) メニュー
60+
- リスト全体やリスト項目に対する
61+
- S式コピー
62+
- 見出し化
63+
- 整形
64+
- チェックボックスON/OFF
65+
- チェックボックス作成/削除
66+
- プロパティドロワーに対する
67+
- プロパティの設定
68+
- 表に対する
69+
- セル単位の上下左右移動
70+
- 矩形リージョンに対するカット、コピーとそのペースト
71+
- セル、行、列の移動
72+
- セル、行、列の範囲選択(マーク)
73+
- 転置
74+
- TAB、S-TABによる幅の縮小と展開
75+
- 整形
76+
- S式コピー
77+
- 行、列の追加、削除
78+
- 水平線の追加
79+
- 式の編集等
80+
- 行、列、表全体の総和計算
81+
- 下付き・上付き文字に対する
82+
- インライン表示のON/OFF
83+
- 文字エンティティに対する
84+
- インライン表示のON/OFF
85+
- リスト表示
86+
- リンクに対する
87+
- パスと説明の編集
88+
- 開く(デフォルト、システム優先、Emacs優先)
89+
- パスのコピー
90+
- ファイル情報の表示
91+
- Statistics Cookie ([1/3]みたいなやつ)
92+
- 更新
93+
- 段落、テーブルセル、リストアイテム、各種ブロック等に対する各種追加
94+
- 太字、下線、イタリック、逐語、コード、取消線
95+
- 上付き、下付き文字
96+
- インラインCALL、インラインSRC
97+
- 文字エンティティの追加(候補選択、逆引き可能)
98+
- リンク
99+
- ターゲット(<< >>)
100+
- ラジオターゲット(<<< >>>)
101+
- マクロ
102+
- エクスポートスニペット
103+
- 強制改行
104+
105+
* 設定例
106+
107+
#+begin_src elisp
108+
(autoload 'org-cmenu "org-cmenu")
109+
(add-hook 'org-mode-hook
110+
(lambda ()
111+
;; メニューを開くキーを設定する
112+
(define-key org-mode-map (kbd "C-^") #'org-cmenu))) ;;キー設定はお好みで。例えば "C-c m" (Menuのm)とか "S-<f10>" (Windowsのコンテキストメニューのキー)とか
113+
114+
(with-eval-after-load "org-cmenu"
115+
;; メニューの内容を定義する
116+
(require 'org-cmenu-setup) ;; or your setup file
117+
118+
;; ---------------------------------
119+
;; 【カスタムコマンドを追加する例】
120+
121+
;; HTMLのdata属性を追加する二つのコマンドを追加する例
122+
(org-cmenu-add-commands
123+
'(:basic "Affiliated Keyword")
124+
'(("ad1" "My Data 1"
125+
(lambda (datum)
126+
(org-cmenu-add-affiliated-keyword "ATTR_HTML" datum)
127+
(insert ":data-my-important1 Very Important Data 1!")))
128+
("ad2" "My Data 2"
129+
(lambda (datum)
130+
(org-cmenu-add-affiliated-keyword "ATTR_HTML" datum)
131+
(insert ":data-my-important2 Very Important Data 2!"))))
132+
'(aff-elements ;; affiliated keywordを持つことが出来る要素が対象
133+
:exclude (table) ;;ただしtableは除く
134+
:pred org-cmenu-element-or-first-link-p) ;;elementか段落内の最初のリンクのみ有効
135+
'with-datum) ;; 構文要素情報を第一引数に渡す
136+
137+
;; コマンドを削除する例
138+
(org-cmenu-remove-command
139+
'all
140+
'(:basic "Affiliated Keyword") "al") ;; attr_latex
141+
142+
;; グループを削除する例
143+
;; (org-cmenu-remove-group
144+
;; 'all
145+
;; '(:basic "Affiliated Keyword"))
146+
)
147+
#+end_src
148+
149+
* カスタマイズ
150+
151+
メニューの内容は org-cmenu-setup.el によって定義されている。このファイルがメニューを定義した後に項目を追加・削除してカスタマイズできる。
152+
153+
また、メニューの内容が大幅に変わる場合は org-cmenu-setup.el をコピーして自分専用のsetupファイルを作成することもできる。その際は、setupファイルの中で次のことを行うと良い。
154+
155+
- (require 'org-cmenu)
156+
- (org-cmenu-reset) ;;必要に応じて
157+
- org-cmenu-add-groupを呼び出してグループを追加する (必須では無い。グループに特別なプロパティを設定する必要がある場合のみ明示的に呼び出す)
158+
- org-cmenu-add-commandsを呼び出して構文タイプとグループの組み合わせに対してコマンドを追加する
159+
160+
** 設定のリセット
161+
162+
(org-cmenu-reset) を評価するとメニューの内容が全てクリアされる。メニューの内容を確実に保証したい場合や、最初から設定をやり直したくなったときに使用すると良い。
163+
164+
** コマンド(関数)の追加方法
165+
166+
メニューにコマンドを追加するには、次の要素を指定する必要がある。
167+
168+
- 追加先の[[*構文要素タイプ][構文要素タイプ]]
169+
- 追加先のグループ
170+
- 追加するコマンド、割り当てキー、表示タイトル
171+
- コマンドの呼び出し方
172+
173+
*** 追加先の[[*構文要素タイプ][構文要素タイプ]]を指定する
174+
175+
org-cmenuは構文要素のタイプ毎にメニューの定義を作成する。例えばlink用のメニュー、paragraph用のメニュー、table-cell用のメニュー、等々。
176+
177+
コマンドを追加するタイプ(メニュー)は /target-spec/ で指定する。
178+
179+
/target-spec/ はつぎのいずれかである。
180+
181+
- /type/ : 一つの[[*構文要素タイプ][構文要素タイプ]](symbol)を指定する
182+
- ( /type/... /:key/ /value/ /:key/ /value/ ....) : 一つ以上の[[*構文要素タイプ][構文要素タイプ]](symbol)を指定し、残りで追加の情報を指定する。
183+
184+
具体的な例:
185+
186+
- 'all :: 全ての[[*構文要素タイプ][構文要素タイプ]]
187+
- 'elements :: 全ての非行内要素
188+
- 'objects :: 全ての行内要素
189+
- 'paragraph :: 段落要素のみ
190+
- '(paragraph table-cell) :: 段落とテーブルセル
191+
- '(all :exclude (table table-row table-cell)) :: テーブル類を除いた全て
192+
193+
*** 追加先のグループを指定する
194+
195+
メニューの内容はグループの入れ子(ツリー)によって表現されている。このグループはtransientのグループに対応している。
196+
197+
第一レベルのグループは上から下へ配置される。第二レベルのグループは左から右へ配置される(transientによって)。
198+
199+
グループは識別子を持っている。識別子はequal関数で比較できればどんな型の値でも良い。ただし、文字列の場合はグループのタイトルとして表示に使用される。その他、シンボルなどの場合は識別のみに使用され表示には使用されない。
200+
201+
グループは階層を持っているので、どのグループへ追加するかは group-path (グループ識別子のリスト)で指定する必要がある。
202+
203+
具体的な例:
204+
- '("Common")
205+
- '("Table" "Navigation")
206+
- '(:table "Table Navi") ;; :table は文字列ではないので識別には使われるがタイトルには使われない
207+
208+
コマンドを追加する際、存在しないグループはその都度作成され末尾に追加される。
209+
210+
*** コマンドの呼び出し規約
211+
212+
コマンドを追加するにあたって、そのコマンドをどのように呼び出すのかを指定する必要がある。
213+
214+
- 'no-wrap :: そのまま呼び出す。
215+
- 'with-datum :: 現在選択中の構文要素を第一引数にして呼び出す。
216+
- 'at-begin :: ポイントを現在選択中の構文要素の先頭に移動して呼び出す。
217+
- 'at-post-affiliated :: ポイントを現在選択中の構文要素のaffiliated keywordの直後に移動して呼び出す。
218+
219+
例えば次のような状況を考える。
220+
221+
#+begin_src org
222+
1. Item1
223+
2. Item2
224+
3. Item3
225+
- Item3-1 *現在のポイントここ*
226+
- Item3-2
227+
#+end_src
228+
229+
現在のポイントは、plain-list(ordered)の中のitemの中のplain-list(unordered)の中のitemの中のparagraphの中のboldの中にある。
230+
231+
ユーザーは、現在のポイントを包む全ての親要素(plain-list, item, plain-list, item, paragraph, body)へメニューを切り替えることができる。従ってコマンドは現在どの要素が選択されているのか知らなければ正しい処理を行えない場合がある。
232+
233+
例えば構文要素全体をカットするコマンドは、現在選択されているの要素がboldなら*から*までをカットすれば良い。しかしplain-listが選択されているならそのコマンドは「- Item3-1」と「- Item3-2」の二行をカットしなければならない。そういった場合には、'with-datumを指定して第一引数に構文要素の情報を引き渡して貰うか、または、 ~(org-cmenu-target-datum)~ 関数を使用して取得する必要がある。
234+
235+
#+begin_src elisp
236+
(defun my-cut-element (datum)
237+
(kill-region
238+
(org-element-property :begin datum)
239+
(org-element-property :end datum)))
240+
241+
(defun my-copy-element (datum)
242+
(kill-ring-save
243+
(org-element-property :begin datum)
244+
(org-element-property :end datum)))
245+
246+
(org-cmenu-add-commands
247+
'("Common")
248+
'(("x" "Cut Element" my-cut-element)
249+
("c" "Copy Element" my-copy-element))
250+
'all
251+
'with-datum)
252+
#+end_src
253+
254+
逆に対象となる構文要素の情報が不要な場合もある。例えば次のような状況を考える。
255+
256+
#+begin_src org
257+
| abcdef | *現在のポイントここ* |
258+
| ABCDEF | 123456 |
259+
#+end_src
260+
261+
現在のポイントが指す構文要素は、bold、table-cell、table-row、tableとなる。
262+
263+
table-cellの内容を下に移動するコマンド(org-table-move-cell-down。org-modeに標準で入っている)は、現在のポイントがtable-cell上にありさえすれば良い。表は入れ子に出来ないのでどのtable-cellか曖昧になる事は無い。そのような場合は対象タイプを 'table-cell にして 'no-wrap を指定すればそのままそのコマンドを使うことができる。引数が無くても現在の位置から間違いなく対象のセルが特定できる。
264+
265+
#+begin_src elisp
266+
(org-cmenu-add-commands
267+
'("Table Cell")
268+
'(("D" "Move Down" org-table-move-cell-down))
269+
'table-cell
270+
'no-wrap)
271+
#+end_src
272+
273+
* 構文要素タイプ
274+
275+
org-element.el は org-mode の構文要素を次のように分類している。
276+
277+
#+begin_example elisp
278+
(defconst org-element-all-elements
279+
'(babel-call center-block clock comment comment-block diary-sexp drawer
280+
dynamic-block example-block export-block fixed-width
281+
footnote-definition headline horizontal-rule inlinetask item
282+
keyword latex-environment node-property paragraph plain-list
283+
planning property-drawer quote-block section
284+
special-block src-block table table-row verse-block)
285+
"Complete list of element types.")
286+
287+
(defconst org-element-all-objects
288+
'(bold citation citation-reference code entity export-snippet
289+
footnote-reference inline-babel-call inline-src-block italic line-break
290+
latex-fragment link macro radio-target statistics-cookie strike-through
291+
subscript superscript table-cell target timestamp underline verbatim)
292+
"Complete list of object types.")
293+
#+end_example
294+
295+
org-element.el 内では、objectが行内要素、elementが非行内要素を指しており、その両方を含むあらゆる要素はdatumと呼ばれていることが多い。
296+
297+
各要素タイプの具体的な例は [[https://raw.githubusercontent.com/misohena/org-cmenu/main/examples/all-types.org][examples/all-types.org]] を参照のこと。[[https://github.com/misohena/org-cmenu/blob/main/org-cmenu-typedoc.el][org-cmenu-typedoc.el]]にはタイプ名とorg-modeマニュアルへのURLの対応リストが書いてある。org-cmenuのメニューから "?" を押すと選択中の構文要素の説明がブラウザで開くので参考にして欲しい。
298+
299+
org-cmenuではこれらのタイプ名シンボルが使用できるほか、次の別名も使用できる。
300+
301+
- all :: org-element-all-elements と org-element-all-objects の各タイプ
302+
- elements :: org-element-all-elements の各タイプ
303+
- objects :: org-element-all-objects の各タイプ
304+
- aff-elements :: Affiliated Keywordsを持てるelement
305+
- com-elements :: コメントアウトできるelement
306+
- contents :: 内容を持つことができる全タイプ(org-cmenu-contents-range 関数を参照)

0 commit comments

Comments
 (0)