2013-04-02 9 views
6

、 lispモードで私は必要なものインデントコード

は次のとおりです。

  • カーソルがSRCブロック内にあるかどうかを把握するための方法。その場合、デフォルトのorg折り畳みが行われるべきであるように、ヘッダー行自体をトリガーしないでください。
  • ヘッダーに指定されているモード(この場合はemacs-lisp)に従ってコードをインデントする方法。

Orgはすでにモードに従ってsrcブロックを強調表示することができ、TABフックはそこにあります。これはできると思われる。それが唯一のemacs-lispのブロックを処理し

(defun indent-org-src-block-line() 
    "Indent the current line of emacs lisp code." 
    (interactive) 
    (let ((info (org-babel-get-src-block-info 'light))) 
    (when info 
     (let ((lang (nth 0 info))) 
     (when (string= lang "emacs-lisp") 
      (let ((indent-line-function 'lisp-indent-line)) 
      (indent-for-tab-command))))))) 

(add-to-list 'org-tab-before-tab-emulation-hook 
      'indent-org-src-block-line) 

+1

現在のコードを編集しているので、 '' C-c '''で編集モードに入るだけで十分ですか? – gongzhitaao

+0

はい、私はそのショートカットについては知っていますが、emacsのconfig-within-orgファイルなどのように、短いスニペットを編集すると重すぎると感じます。 – user103576

+0

はこの[スレッド](http://lists.gnu.org/archive/html/emacs-orgmode/2012-02/msg00847.html)に役立つかもしれません – gongzhitaao

答えて

1

はここでラフなソリューションです。私はsrcブロックをインデントしていない(orgのデフォルトではない)だけでテストしました。

一般に、あるモードを別のモードで動作させるのは難しく、多くのキーボードコマンドは競合します。しかし、インデント、改行、コメントのためのタブ(orgは、#で間違っているlispコードをコメントする)のような、より基本的なストロークのいくつかは、仕事をすることができ、最大の影響を与えるように見えます。

9

ちょうど `ところ、

1
(defun my/org-cleanup() 
    (interactive) 
    (org-edit-special) 
    (indent-buffer) 
    (org-edit-src-exit)) 

はそれを行う必要があります...すべての構文higlighting広告、これはelispのモードでバッファをポップアップ表示するコードブロックを押しC-C '

にポイントを移動インデント・バッファが」と定義されています。Emacsの24.1以来

(defun indent-buffer() 
    (interactive) 
    (indent-region (point-min) (point-max))) 
15

あなたは今、次のオプションを設定することができます。

(setq org-src-tab-acts-natively t) 

...すべてのsrcブロックを処理する必要があります。

+0

これは私がこれを見つけることを期待していなかった最高の答えですweek :-) –

+0

これを行う際にyasnippet fallback loop'が発生したYasnippetユーザは、このスレッドが役に立ちます:https://github.com/joaotavora/yasnippet/issues/761 –