読み書き可能なOrg-mode構成ファイルをバッキングEmacs Lispファイルでインストルメントすることは可能ですか?


7

Orgモードでは、文芸的プログラミングスタイルを使用してEmacs構成ファイルを作成するのが一般的です。

あいにく、読みやすさは向上しますが、これにはプログラミング上の重大な欠点があります。特に、バッキング.elファイルがないため、Emacsは現在のソースブロック内のコードのみを認識します。これは、現在編集されているブロックを除いて、ナビゲーション、シンボル定義、およびフライチェックはすべて使用できないことを意味します。

#+BEGIN_SRC emacs-lisp
  (defun literate-but-invisible ()
    (interactive)
    (message "I close my eyes..."))
#+END_SRC

#+BEGIN_SRC emacs-lisp
  (defun humans-can-read-but-emacs-cannot ()
    (interactive)
    (literate-but-invisible) ; No navigation! Flycheck reports undefined symbol!
    (message "...so that the room will be empty"))
#+END_SRC

Emacsに生成された.elファイルをもつれさせて使用し、これらの機能を組織モードで提供する方法はありますか?そのような機能は、文芸的なEmacs Lispコードの保守性を改善します。

FlycheckがOrgとEmacs Lispで同時に1つのバッファーで動作するのを見るのは素晴らしい機能ですが、私はorg-editバッファーorg-edit-special(通常(C-c ')を呼び出したときに取得する環境)を計測する方法についてのみ質問していることに注意してください。バッファにはアクティブモードが1つしかないため、これは簡単です。

Flycheckリポジトリの機能リクエストをこちらで開きました。別の問題について、関連する調査がここにあります。ただし、まだソリューションを構築することはできません。


このファイルを開くと、すべてのelisp srcブロックを評価できます。find-file-hooketcにフックを追加して、emacs config orgファイルを開くかどうかを検出します。
stardiviner

@stardivinerコメントを回答に拡大してもよろしいですか?提案されたソリューションを理解するのに十分なコンテキストがありません。
マシューピジアック2018年

回答:


2

ナビゲーションとシンボルの定義については、https://github.com/jkitchin/scimax/blob/master/scimax-literate-programming.elを参照してください

Mx scimax-lp-generate-tagsでTAGSファイルを生成できます。

この後、M-で関数定義に移動できます。そしてM-、。物事が動き回って追加されるときに、TAGSファイルをその関数で更新する必要がありますが、おそらくそれはsave-bufferフックなどで行うことができます。また、これにより、ソースファイル内の定義の場所ではなく、org-fileに関連するタグが与えられることに注意してください。

Mx scimax-lp-signature-docは、org-fileで定義されている場合、その時点のシンボルに関する情報を取得します。

私はflycheckをorg-filesのsrc-blocksで動作させるための概念的な方法を考え出しました。絡み合ったコードが含まれるプロキシファイルを、まったく同じ文字位置に配置することです(つまり、他のすべての文字をスペースに変更します)。次に、そのファイルでflycheckを機能させます。次に、flycheckオーバーレイをプロキシファイルから元のファイルに転送します。保存時にプロキシファイルを更新するフック関数を設定してから、オーバーレイを更新します。驚いたことに、これはかなりうまくいきます。

コードはhttps://github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.orgで確認できます

これは通常、コードの悪い部分がどのように見えるかです scimax-ob-flycheckの前

scimax-ob-flycheck-modeをオンにすると、次のようになります。

scimax-ob-flycheck-modeをオンにした後


Flycheckのようなものについてorg-editは、が呼び出されたときにのみアクティブだったとしても、完全に許容できると思います。その場合、バッファに対してアクティブなモードは1つだけになります。そこにニュアンスを加えるために質問を編集しました。
マシューピジアック2018年

私はgithub.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.orgでこのためのソリューションを作成しました。それは多かれ少なかれ、プロキシファイルでflycheckを使用して上で概説したことを行います。おそらくまだいくつかの問題がありますが、今のところ私には問題ありません!
ジョン・キチン

これは素晴らしいです!しかし、私はそれを再現するのに苦労します。を起動しemacs -q、依存関係をインストールしてから、を実行し(org-babel-load-file "scimax-ob-flycheck.org")ました(scimax-ob-flycheck-mode +1)。テストとして壊れたコードを作成してもFlycheckエラーは表示されません。
マシューピジアック2018年

ファイルを保存する必要があります。これにより、プロキシファイルが作成され、ファイルのチェックが完了すると、それらのファイルでflycheckが実行され、オーバーレイが転送されます。org-fileが開いている間、同じディレクトリにmd5ハッシュと.el拡張子が付いたファイルが作成されているはずです。これを見ると、そこにflycheckオーバーレイが表示されているはずです。そうでなければ、何か他のことが起こっています。私はこれをバニラemacs /セットアップで試していません。おそらく、そのためのinitを投稿して、試してみることができます。
ジョン・キチン

はい、はい。ファイルにflycheckオーバーレイが表示されmd5-hash.elます。ただし、scimax-ob-flycheck.orgscimax-ob-flycheck-modeonを使用しorg-edit-specialた場合)で、またはを使用した場合でも、重複は確認できません。
マシューピジアック2018年

-2
 (defun org-literate-programming-eval-src-blocks ()
   "Auto evaluate Org buffer all source blocks to get a complete
 project environment when Literate Programming."
   (if (string= (buffer-name) "init.org")
       (org-babel-execute-buffer)))

 (add-hook 'find-file-hook #'org-literate-programming-eval-src-blocks :before)

上のコードは、ファイル「init.org」に一致するバッファー内のすべてのソースブロックを評価する関数を追加します。ファイル名は必要に応じて変更できます。


これは、ブロックを評価してブロックを追加する以外は何もしませんRESULTS。Flycheckは引き続き使用できません。
マシューピジアック2018年

flycheckは、emacs-lispのorg-editモードで私には問題なく動作するようです。それはあなたのために何をしませんか?
ジョン・キッチン

@MatthewPiziakすべてのソースブロックがemacs-lispブロックであり、評価されている場合、すべてのelispコードがEmacsで使用できるはずです。flycheckはそれを認識します。また、flycheckは私のorg-edit-src-blockでも正常に動作します。
stardiviner 2018年

@JohnKitchin @stardiviner I GET emacs-lisp predicate:nil flycheck-verify-setup事実によるものbuffer-file-nameであるnilOrg Srcバッファ。
マシューピジアック2018年

buffer-file-name一時的な偽のファイルに設定できます。しかし、flycheckを無効にしたい場合は、無効にすることをお勧めします。
stardiviner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.