10

org-mode と lisp-mode を組み合わせて、emacs で Lisp コードの美しいコード フォールディングを実現しました: lisp-orgi-mode。基本的には「;」を使います 見出し文字として「*」の代わりに。コメントについては、「;」の前にスペースを入れて「;」にします。見出しとしてカウントされないので...

ただし、python-mode で同じことを行ってもうまくいきません...おそらく、python コメントで使用される「#」文字が org-mode 設定に干渉するためです...

機能をうまく組み合わせることができた人はいますか? 人々がpython-modeとoutline-modeを組み合わせていることは知っていますが(リンク)、ouline-modeはorg-modeほど良くありません...

編集: outline-magicでうまく機能しました:python-magic.el

4

3 に答える 3

9

私はこの目的のためにhideshow-orgそしてここで簡単な紹介)を使用します、そしてそれは本当に、本当にうまくいくと思います。

これらはいくつかの追加ですが、便利なスニペットです。

(dolist (hook (list 'c-mode-common-hook
            'emacs-lisp-mode-hook
            'java-mode-hook
            'lisp-mode-hook
            'perl-mode-hook
            'sh-mode-hook))
  (add-hook hook 'my-hideshow-hook))

(defun my-hideshow-hook ()
  "thisandthat."
  (interactive)
  (progn (require 'hideshow-org)
     (global-set-key (kbd "C-c h") 'hs-org/minor-mode)
     (hs-org/minor-mode)))

(defadvice goto-line (after expand-after-goto-line activate compile)
  "hideshow-expand affected block when using goto-line in a collapsed buffer"
  (save-excursion
    (hs-show-block)))
于 2010-11-03T19:11:12.313 に答える
6

OK、outline-minor-mode は次の Outline-regexp でうまく動作するようになりました: "[ \t]*# \|[ \t]+\(class\|def\|if\|elif\|else\|while \|for\|try\|except\|with\) " これで、Python 構文とコメント行の両方を見出しとして使用してコードを折りたたむことができます。
タブを使用して「indent-for-tab-command」を呼び出し、何もすることがない場合は「outline-cycle」を呼び出すようにコードを調整することは可能でしょうか?

python-magic.el:

; ここにあるCarstenDominikによるrequire Outline-magic.el:
; http://www.astro.uva.nl/~dominik/Tools/outline-magic.el
; Nikwin がここで修正したコードは、ここでわずかに見つかりました:
; http://stackoverflow.com/questions/1085170/how-to-achieve-code-folding-effects-in-emacs/1085551#1085551

(add-hook 'outline-minor-mode-hook
           (ラムダ ()
             ('アウトラインマジックが必要)
)))
(add-hook 'python-mode-hook'my-python-outline-hook)

(defun py-outline-level ()
  (let (buffer-invisibility-spec)
    (保存エクスカーション
      (skip-chars-forward " ")
      (現在の列))))

(my-python-outline-hook の定義解除 ()
  (setq Outline-regexp "[ \t]*# \\|[ \t]+\\(class\\|def\\|if\\|elif\\|else\\|while\\|for\\ |try\\|except\\|with\\) ")
  (setq アウトライン レベル 'py アウトライン レベル)

  (アウトラインマイナーモード t)
  (体を隠す)
  (show-paren-mode 1)
  (define-key python-mode-map [tab] 'outline-cycle)
  (define-key Outline-minor-mode-map [S-tab] 'indent-for-tab-command)
  (define-key Outline-minor-mode-map [M-down] 'outline-move-subtree-down)
  (define-key Outline-minor-mode-map [M-up] 'outline-move-subtree-up)
)
(「python-magic」を提供)
于 2010-11-04T04:25:57.097 に答える
1

outline-magicに取って代わられていると思いますがoutshine、上記のコードがそれで機能するかどうかはわかりません。しかし、Ryan Davis によるブログ投稿のおかげで、次のコードを機能させることができました。

(defun python-mode-outline-hook ()
  (setq outline-level 'python-outline-level)

  (setq outline-regexp
    (rx (or
         ;; Commented outline heading
         (group
          (* space)  ; 0 or more spaces
          (one-or-more (syntax comment-start))
          (one-or-more space)
          ;; Heading level
          (group (repeat 1 8 "\*"))  ; Outline stars
          (one-or-more space))

         ;; Python keyword heading
         (group
          ;; Heading level
          (group (* space)) ; 0 or more spaces
          bow
          ;; Keywords
          (or "class" "def" "else" "elif" "except" "for" "if" "try" "while")
          eow)))))

(defun python-outline-level ()
  (or
   ;; Commented outline heading
   (and (string-match (rx
               (* space)
               (one-or-more (syntax comment-start))
               (one-or-more space)
               (group (one-or-more "\*"))
               (one-or-more space))
              (match-string 0))
    (- (match-end 0) (match-beginning 0)))

   ;; Python keyword heading, set by number of indentions
   ;; Add 8 (the highest standard outline level) to every Python keyword heading
   (+ 8 (- (match-end 0) (match-beginning 0)))))

(add-hook 'python-mode-hook 'python-mode-outline-hook)

多分誰かがこれが便利だと思うでしょう。コードの編集とナビゲートを簡単にする素晴らしい方法だと思います。

于 2015-03-15T06:12:59.260 に答える