Объединить python-режим с org-mode для emacs
Я объединил org-mode с lisp -mode для достижения красивого сложения кода в emacs для кода lisp: lisp -orgi-mode.
В основном, я использую ';' вместо символа "*". Для комментариев я просто помещал пробел перед ';', создавая его; поэтому он не считается заголовком...
Однако делать то же самое с python-mode не работает... Вероятно, потому что символ "#", используемый комментариями python, мешает настройкам org-mode...
Кому удалось успешно объединить функциональность?
Я знаю, что люди комбинировали режим python с контурным режимом (ссылка), но ouline-mode не так хорош, как org-mode..
Изменить: он хорошо работал с outline-magic: python-magic.el
Ответы
Ответ 1
Я использую 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)))
Ответ 2
Хорошо, у меня был режим outline-minor-mode, работающий красиво со следующим контуром-regexp: "[\ t] * #\| [\ t] +\(class\| def\| if\| elif\| else\| while\| для \| try\| except\| with \)"
Теперь я получаю сворачивание кода, используя как синтаксис python, так и строки комментариев в качестве заголовков.
Можно ли адаптировать ваш код для использования вкладки, чтобы вызвать команду "indent-for-tab-command", и если вам нечего делать, вызовите "контурный цикл"?
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)
Ответ 3
Я думаю, что 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)
Возможно, кто-то найдет это полезным. Я думаю, что это отличный способ облегчить редактирование и навигацию кода.