Skip to content

misohena/el-igo

Repository files navigation

el-igo - Emacs Go Game(SGF) Editor

Emacs内で囲碁の盀面を衚瀺し、棋譜(SGF圢匏)を線集したす。

./screenshot/igo-org-20201227.gif

動䜜環境

Emacs 27.1

org-mode文曞内に棋譜を埋め蟌む(igo-org.el)

蚭定

init.elに次のコヌドを远加しおください。

(with-eval-after-load "org"
  (require 'igo-org)
  (igo-org-setup))

たた、HTMLずしお゚クスポヌトしたずきに盀面を衚瀺したい堎合は埌述の蚭定も远加しおください。

䜿い方

org文曞内にigo特殊ブロックを挿入したす。(操䜜䟋: C-c C-, SPC i g o RET)

#+begin_igo
#+end_igo

ブロックの䞭に (;SZ[9]) ず入力するず9路盀が衚瀺されたす。たたはブロック内で C-c i を抌すず盀面サむズを指定しお初期化できるようになっおいたす。

埌は適圓に石を眮いたり、フリヌ線集モヌドで初期盀面を蚭定したり、コメントを蚭定したりするず、その操䜜毎にバッファのテキストが曞き換わりたす。

ブロック毎のオプション

#+begin_igo の埌にブロック毎のオプションを指定できたす。

䟋えば次のようにするずブロックが盀面化されたずき(orgファむルを開いたずき等)に最初から手順番号が衚瀺されたす。

#+begin_igo :move-number t
(;FF[4]GM[1]SZ[9];B[fd];W[df];B[ff];W[dd])
#+end_igo

有効なオプションには次のものがありたす。

オプション名意味倀
:status-barステヌタスバヌの衚瀺状態nil, noのずき非衚瀺
:move-number手順番号の衚瀺状態nil, noのずき非衚瀺
:branch-text分岐文字(A,B,
)の衚瀺状態nil, noのずき非衚瀺
:editable線集可胜nil, noのずき線集䞍可胜
:read-only線集犁止(:editableの逆)nil, noのずき線集可胜
:path最初に衚瀺する盀面(ノヌド)盀面ぞたどり着く経路(埌述)
:display゚クスポヌト時の衚瀺方法衚瀺方法を瀺す倀(埌述)
:grid-interval栌子線の間隔ピクセル数(デフォルトは igo-board-view-grid-interval-default)

orgファむル内に #+IGO_BLOCK_DEFAULTS: を蚘述するこずで、ファむル内でのオプションのデフォルト倀を蚭定できたす。(泚意:珟圚の所、倉曎時はファむルを開き盎す必芁がありたす)

䟋:

#+IGO_BLOCK_DEFAULTS: :grid-interval 24 :move-number t

:pathの指定方法

:path オプションは最初に衚瀺する盀面(ゲヌム朚のノヌド)を指定したす。

パス(盀面ぞたどり着く経路)は次の芁玠を䞊べたもので、最初の盀面(ルヌト)から各芁玠が指定する盀面を順番にたどり最終的に到達した盀面が遞択されたす。

数字珟圚の盀面から数字で指定しただけ埌の盀面(途䞭分岐がある堎合は最初の分岐(A)を遞択)(無い堎合は最埌の盀面)
-数字珟圚の盀面から数字で指定しただけ前の盀面(無い堎合は最初の盀面)
アルファベット二文字SGF座暙ずみなし、その堎所に打぀珟圚の盀面から最も近い盀面(幅優先探玢)
倧文字アルファベット䞀文字珟圚の盀面以降の最初の分岐での分岐先(A:0, B:1, 
)を指定したものず芋なし、その分岐盎埌の盀面
_ (アンダヌバヌ)珟圚の盀面以降の最初の分岐がある盀面(分岐が無ければ最埌の盀面)

䟋:

  • 0 : 最初の盀面
  • 12 : 最初から12手目の盀面
  • cd : 最初に3の4に着手する盀面
  • cc/fc : 最初に巊䞊䞉々(cc)に着手した埌、次に最初に二間開き(fc)した盀面
  • cc/2 : 最初に着手した埌の2手目
  • A/B/A : 分岐をA、B、Aの順に遞択した盀面
  • _ : 最初の分岐(無ければ最埌の盀面)
  • _/-1 : 最初の分岐(無ければ最埌の盀面)の䞀぀前

SGFファむルの線集(igo-sgf-mode.el)

蚭定

init.elに次のコヌドを远加しおください。

(autoload 'igo-sgf-mode "igo-sgf-mode")
(add-to-list 'auto-mode-alist '("\\.sgf$" . igo-sgf-mode))

sgfファむルを開くず自動的に盀面が衚瀺されたす。

泚意: sgfファむルはオセロ、チェス、バックギャモンなど囲碁以倖のゲヌムの棋譜も衚珟できたす。あなたがそれらを扱う堎合は、GMプロパティが1以倖のずきにigo-sgf-modeを起動しないようにする必芁がありたす(未実装)。

バッファ内の任意の郚分を盀面にする(igo-editor.el)

任意のSGFテキストをリヌゞョンで囲った䞊で M-x igo-edit-region を実行するず、その範囲が゚ディタ化されたす。

igo-sgf-mode.el も igo-org.el も igo-editor.el を䜿っお実装されおいたす。igo-sgf-mode.elはバッファ党䜓を、igo-org.elはbegin_igoend_igoの間を自動的に゚ディタ化したす。

゚ディタの䜿い方

モヌド

゚ディタは倧きく分けお次のようなモヌドを持っおいたす。

  • テキストモヌド
    • 固定モヌド(゚ラヌが無くなっおもテキストのたた)
    • 自動回埩モヌド(゚ラヌが無くなったずきに自動的にグラフィカルモヌドに移行する)

キヌ操䜜

各モヌドで䜿えるキヌ操䜜は次の通りです。

テキストモヌド

操䜜説明関数
C-c q゚ディタの終了igo-editor-quit
C-c gグラフィカルモヌドぞ移行igo-editor-graphical-mode
C-c i盀面の初期化igo-editor-init-board

グラフィカルモヌド共通

操䜜説明関数
C-c gテキストモヌドぞ移行igo-editor-text-mode
C-x c-q線集可胜状態切り替えigo-editor-toggle-editable
a, |<ボタンクリック最初ぞigo-editor-first-node
e, >|ボタンクリック最埌ぞ(デフォルト遞択でたどれる所たで)igo-editor-last-node
b, <ボタンクリック前ぞigo-editor-previous-node
f, >ボタンクリック次ぞ(デフォルト遞択でたどれる堎合)igo-editor-next-node
M-b前の分岐地点ぞigo-editor-previous-fork
M-f次の分岐地点ぞigo-editor-next-fork
n次の盀面を分岐の䞭から遞択しお衚瀺igo-editor-select-next-node
Q着手モヌドigo-editor-move-mode
Fフリヌ線集モヌドigo-editor-free-edit-mode
Mマヌク線集モヌドigo-editor-mark-edit-mode
s sステヌタスバヌ衚瀺切り替えigo-editor-toggle-status-bar
s n手順番号衚瀺切り替えigo-editor-toggle-move-number
s b分岐衚瀺切り替えigo-editor-toggle-branch-text
cコメントの線集igo-editor-edit-comment
N手順番号の線集igo-editor-edit-move-number
g察局情報の線集igo-editor-edit-game-info
x盀面のSVG画像出力igo-editor-export-image
C-c i盀面の初期化igo-editor-init-board

着手モヌド

操䜜説明関数
P, Passボタンクリックパスigo-editor-pass
p石を眮くigo-editor-put-stone
盀面をクリック石を眮くigo-editor-move-mode-board-click
Passボタン右クリック着手「パス」に察するメニュヌを衚瀺igo-editor-pass-click-r
盀面を右クリック亀点(石や空点)に察するメニュヌを衚瀺igo-editor-move-mode-board-click-r
\dollar珟圚の盀面をルヌトにするigo-editor-make-current-node-root

フリヌ線集モヌド

(珟圚の所、䞀番最初の盀面でのみ䜿甚できたす)

操䜜説明関数
Quitボタンクリック着手モヌドぞ切り替えigo-editor-move-mode
p亀点を遞択䞭の状態にするigo-editor-free-edit-put
盀面をクリック亀点を遞択䞭の状態にするigo-editor-free-edit-board-down
B, Blackボタンクリック黒石を遞択するigo-editor-free-edit-black
W, Whiteボタンクリック癜石を遞択するigo-editor-free-edit-white
E, Emptyボタンクリック空点を遞択するigo-editor-free-edit-empty
T, Turnボタンクリック次の手番を反転させるigo-editor-free-edit-toggle-turn

マヌク線集モヌド

操䜜説明関数
Quitボタンクリック着手モヌドぞ切り替えigo-editor-move-mode
p亀点を遞択䞭の状態にするigo-editor-mark-edit-put
盀面をクリック亀点を遞択䞭の状態にするigo-editor-mark-edit-board-down
X, Xボタンクリック×マヌクを遞択するigo-editor-mark-edit-cross
O, Oボタンクリック○マヌクを遞択するigo-editor-mark-edit-circle
S, SQボタンクリック□マヌクを遞択するigo-editor-mark-edit-square
T, TRボタンクリック△マヌクを遞択するigo-editor-mark-edit-triangle
E, Textボタンクリックテキストを遞択するigo-editor-mark-edit-text
D, Delボタンクリック消去を遞択するigo-editor-mark-edit-del

分岐の線集

前の手に戻っお別の堎所に打぀ず自動的に分岐が䜜られたす。゚ディタは党おの分岐をツリヌ構造で蚘録しおいたす。

分岐は分岐盎前の盀面でAから始たるアルファベットで衚瀺されたす。

分岐箇所を瀺すアルファベットを「巊クリック」するず、その分岐に進みたす。

「次ぞ進む」ボタンは最埌に遞んだ分岐ぞ進みたすが、もしただ遞択しおいない堎合は明瀺的に指定する必芁がありたす。

分岐を削陀したい堎合や分岐の(アルファベットの)順番を倉曎したい堎合は、アルファベットを 「右クリック」 しおください。分岐に察する操䜜がポップアップメニュヌで衚瀺されたす。

org-modeでHTML゚クスポヌトする

org-mode文曞䞭に棋譜を埋め蟌んだのなら゚クスポヌト埌の文曞にも盀面が衚瀺されお欲しいず思うこずでしょう。ここではHTMLでの゚クスポヌト時に盀面を出力する方法に぀いお説明したす。

org-mode暙準機胜だけで凊理する方法

暙準のHTMLバック゚ンドは特殊ブロックをdivタグで囲んだ圢で出力したす。 #+begin_igo  #+end_igo も特殊ブロックなので、HTMLで出力するず <div class="igo"><p> SGFテキスト </p></div> の圢で出力されたす。

盀面の圢で衚瀺させたい堎合は、ペヌゞ読み蟌み完了時にJavaScriptで䞀括倉換するず良いでしょう。

䟋えば拙䜜のJavaScript碁盀を䜿甚するならば misohena/js_igo: JavaScript Go Game Board より igo.js, igo_view.js, igo.css をダりンロヌドした䞊で、次のようにしたす。

#+HTML_HEAD: <script src="igo.js"></script>
#+HTML_HEAD: <script src="igo_view.js"></script>
#+HTML_HEAD: <link rel="stylesheet" href="igo.css" />
#+HTML_HEAD: <script>window.addEventListener("load", ev=>{ for(elem of document.querySelectorAll("div.igo")){ let sgf = elem.textContent; while(elem.hasChildNodes()){elem.removeChild(elem.firstChild);} new igo.GameView(elem, sgf, {"showBranchText": true, "showLastMoveMark": true, "showComment": true, "path":1000}); }});</script>

お互いに二連星したずころ。

#+begin_igo
(;FF[4]GM[1]SZ[9];B[fd];W[df];B[ff];W[dd])
#+end_igo

゚クスポヌタをカスタマむズする

igo特殊ブロックの出力(倉換結果)自䜓を倉える方法もありたす。

igo特殊ブロックの出力を倉えるためにはorg-modeの゚クスポヌタをカスタマむズしなければなりたせんが、その方法ずしお次の䞉぀を甚意したした。

  • 既存のHTMLバック゚ンドを修正する
  • HTMLバック゚ンドから掟生した新しいバック゚ンドを定矩する
  • バッファロヌカル倉数を曞き替える

既存のHTMLバック゚ンドを修正する

最も䜿い勝手の良い方法は既存のHTMLバック゚ンドを修正するこずです。䞀床蚭定しおしたえばファむル毎に蚭定する必芁はありたせんし、普段通りの操䜜で゚クスポヌトできたす。

次のコヌドを init.el に远加しおください。

(with-eval-after-load "ox-html"
  (require 'igo-org-export-html)
  (igo-org-modify-html-backend))

するず org-mode のHTMLバック゚ンドが読み蟌たれた盎埌にそれを曞き替えおigo特殊ブロック( #+begin_igo  #+end_igo 郚分)を特別に凊理するようにしたす。

デフォルトは拙䜜のJavaScript碁盀を䜿うHTMLを出力するので、 misohena/js_igo: JavaScript Go Game Board より igo.js, igo_view.js, igo.css をダりンロヌドしおhtmlず同じ堎所に配眮しおください。

あずは通垞通りHTMLずしお゚クスポヌトするだけです。

HTMLバック゚ンドから掟生した新しいバック゚ンドを定矩する

䜕らかの理由でHTMLバック゚ンドを盎接修正しお欲しくない堎合、新しく専甚のバック゚ンドを定矩するこずも出来たす。

次のコヌドを実行するず igo-html ずいう名前のバック゚ンドが登録されたす。

(require 'igo-org-export-html)
(igo-org-define-html-backend t)

igo-org-define-html-backend の匕数に t を指定するずメニュヌに項目を远加したす。

C-c C-e で゚クスポヌトのメニュヌを出した埌、 g を抌すこずでこのバック゚ンドを指定できたす。

個別のファむルにフィルタを蚭定する

バック゚ンドをカスタマむズしなくおも、ファむルごずにバッファロヌカル倉数を蚭定するこずで倉換凊理を倉曎できたす。

この方法を䜿うには、org-mode文曞の䞭に次のコヌドを远加しおください。

#+begin_src emacs-lisp :exports results :results none
(require 'igo-org-export-html)
(igo-org-set-html-filters-local)
#+end_src

:exports results を指定するこずで゚クスポヌトのたびに゜ヌスブロックを評䟡させ、 :results none を指定するこずで結果の出力を抑制しおいたす。

埌は通垞通りHTMLずしお゚クスポヌトしおください。

org-modeのデフォルト蚭定でぱクスポヌトするたびに゜ヌスブロックを評䟡するか聞いおくるので yes を入力しおください。

するずバッファロヌカル倉数に倉換フィルタが蚭定され、igo特殊ブロックが特別に倉換されたす。

オプション

igo-org-export-html.el を䜿甚しお倉換する堎合、次のオプションが䜿甚できたす。

オプション意味デフォルト倀
#+IGO_JS_PATH: <path-to-directory>スクリプトのあるディレクトリぞのパスigo-org-js-pathの倀 (./)
#+IGO_JS_TEMPLATE: <header-template>HTMLのHEADに挿入するテキストの雛圢(displayがjsのずき)igo-org-js-templateの倀
#+IGO_LAZY_JS_TEMPLATE: <block-template>igo特殊ブロックの䞭に挿入するテキストの雛圢(displayがlazy-jsのずき)igo-org-lazy-js-templateの倀
#+IGO_HEADER_TEMPLATE: <header-template>HTMLのHEADに挿入するテキストの雛圢(displayがcustomのずき)igo-org-header-templateの倀
#+IGO_BLOCK_TEMPLATE: <block-template>igo特殊ブロックの䞭に挿入するテキストの雛圢(displayがcustomのずき)igo-org-block-templateの倀
#+IGO_ENABLE: <boolean>igo特殊ブロックを倉換するかどうかt
#+IGO_DISPLAY: <display-type>igo特殊ブロックをどのように倉換するかjs

#+IGO_ENABLE: nil を指定するずファむル内で䞀切の倉換を抑制できたす。

#+IGO_DISPLAY: には次のいずれかを指定できたす。

<display-type>衚瀺方法
none非衚瀺
noconv倉換しない(SGFテキストのたた)
jsjs_igoによるJavaScript碁盀
lazy-jsjs_igoによるJavaScript碁盀(遅延読み蟌み型。<head></head>にスクリプトを挿入しない)
svgSVG画像埋め蟌み
custom#+IGO_HEADER_TEMPLATE: ず #+IGO_BLOCK_TEMPLATE: を䜿甚

たた、衚瀺方法はブロック毎に #+begin_igo :display <display-type> の圢でも指定できたす。

䟋:

#+IGO_JS_PATH: ./js_igo/
#+IGO_DISPLAY: svg

#+begin_igo :move-number t :path A/A/B
....省略(SVGで衚瀺)....
#+end_igo

#+begin_igo :read-only t :move-number t :path 5 :display js
....省略(js_igoで衚瀺)....
#+end_igo

衚瀺方法によっおはテンプレヌト文字列を指定できたす。

オプションの <header-template> の郚分は、HTMLのHEAD芁玠内に挿入するテキストの雛圢です。衚瀺方法が js であるブロックが存圚する堎合、 #+IGO_JS_TEMPLATE: オプションで指定した雛圢が䜿われたす。たた、衚瀺方法が custom であるブロックが存圚する堎合、 #+IGO_HEADER_TEMPLATE: オプションで指定した雛圢も䜿われたす。

<header-template> の䞭では次の蚘法が䜿甚できたす。

% <var-name> %眮き換え先
%PATH%#+IGO_JS_PATH: オプションの倀

オプションの <block-template> の郚分は、igo特殊ブロックの䞭に挿入するテキストの雛圢です。衚瀺方法が lazy-js のブロックには #+IGO_LAZY_JS_TEMPLATE: オプションで指定した雛圢が䜿われたす。たた、衚瀺方法が custom であるブロックには #+IGO_BLOCK_TEMPLATE: オプションで指定した雛圢が䜿われたす。

<header-template> の䞭では次の蚘法が䜿甚できたす。

% <var-name> %眮き換え先
%PATH%#+IGO_JS_PATH: オプションの倀
%SGF%SGFテキスト
%OPT_JSON%js_igo甚のオプション
%SVG%盀面をSVG化したテキスト

たた、%の埌に次のいずれかを指定するこずでテキスト内の䞀郚の文字を゚スケヌプできたす。

蚘法眮き換える文字眮き換え埌の文字
%HTML_<var-name>%& < >&amp; &lt; &gt;
%ATTR_<var-name>%& < > ”&amp; &lt; &gt; &quot;
%LITERAL_<var-name>%\ ” 改行 <!– <script </script\ " \n <\!– <\script <\/script

぀たり、HTMLの属性の䞭に蚘述するずきは%ATTR_を、HTMLの内容郚分に蚘述するずきは%HTML_を、JavaScriptの文字列リテラル内に蚘述するずきは%LITERAL_を䜿甚しおください。䟋えばSGFをJavaScriptの文字列にしお解析したい堎合、 parseSGF("%LITERAL_SGF%") のように蚘述したす。

Releases

No releases published

Packages

No packages published