объединить режим python с режимом org для emacs

Я объединил org-mode с lisp-mode, чтобы добиться красивого сворачивания кода в emacs для кода lisp: lisp-orgi-mode. Обычно я использую ';' вместо "*" в качестве символа заголовка. Для комментариев я просто ставлю пробел перед ';', делая это ';' так что это не считается заголовком ...

Однако то же самое с python-mode не работает ... Вероятно, потому что символ '#', используемый в комментариях python, мешает настройкам org-mode ...

Кому-нибудь удалось успешно объединить функциональность? Я знаю, что люди объединили режим Python с режимом схемы (ссылка), но режим ouline не так хорош, как org-mode ...

Изменить: он отлично работает с outline-magic: python -magic.el


person Naveen    schedule 02.11.2010    source источник


Ответы (3)


Я использую 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)))
person monotux    schedule 03.11.2010
comment
Ницца. Можно ли циклически повторять уровни сворачивания за одну итерацию? - person Naveen; 04.11.2010
comment
Нет, он не так хорош, как org-mode с циклическим переключением уровней сворачивания. Но он по-прежнему очень полезен и намного быстрее, чем ‹kbd› C-x n n ‹/kbd›. - person monotux; 04.11.2010
comment
Решение, приведенное ниже, так же хорошо, как и org-mode, для циклического переключения различных уровней сворачивания. Вы пробовали это? - person Naveen; 05.11.2010
comment
Нет, не пробовал приведенный ниже код. Приведенный выше код работает практически для любого языка (lisp, java, python ...) с той же функциональностью, что довольно приятно. - person monotux; 05.11.2010

Хорошо, у меня есть вспомогательный контурный режим, прекрасно работающий со следующим контурным регулярным выражением: "[\ t] * # \ | [\ t] + \ (class \ | def \ | if \ | elif \ | else \ | while \ | for \ | try \ | except \ | with \) "Теперь я получаю сворачивание кода, используя как синтаксис Python, так и строки комментариев в качестве заголовков.
Можно ли адаптировать ваш код для использования табуляции для вызова 'indent-for -tab-command, и если нечего делать, вызовите 'outline-cycle?

python-magic.el:

; require outline-magic.el by CarstenDominik found here: 
; http://www.astro.uva.nl/~dominik/Tools/outline-magic.el
; modified code here by Nikwin slightly found here: 
;  http://stackoverflow.com/questions/1085170/how-to-achieve-code-folding-effects-in-emacs/1085551#1085551

(add-hook 'outline-minor-mode-hook 
           (lambda () 
             (require 'outline-magic)
))
(add-hook 'python-mode-hook 'my-python-outline-hook)

(defun py-outline-level ()
  (let (buffer-invisibility-spec)
    (save-excursion
      (skip-chars-forward "    ")
      (current-column))))

(defun my-python-outline-hook ()
  (setq outline-regexp "[ \t]*# \\|[ \t]+\\(class\\|def\\|if\\|elif\\|else\\|while\\|for\\|try\\|except\\|with\\) ")
  (setq outline-level 'py-outline-level)

  (outline-minor-mode t)
  (hide-body)
  (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)
)
(provide 'python-magic)
person Naveen    schedule 04.11.2010

Я думаю, что outline-magic был заменен outshine, и я не знаю, работает ли с ним приведенный выше код. Но мне удалось заставить работать следующий код благодаря сообщение в блоге Райана Дэвиса:

(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)

Может, кому-то это пригодится. Я считаю, что это отличный способ упростить редактирование кода и навигацию по нему.

person Community    schedule 15.03.2015