2013-03-06 3 views
5

В режиме org-mode Emacs есть ли способ определения встроенных описаний сносок как рухнувших?в орг-режиме, как сложить/скрыть сноски?

Так что, например, линия, как это:

This effect is due to the strength of weak ties[fn:: Newman, Mark, Albert-László Barabási, and Duncan J. Watts. 2006. The Structure and Dynamics of Networks. Princeton, NJ: Princeton University Press]. 

может просто выглядеть следующим образом:

This effect is due to the strength of weak ties[✭]. 

Я также нужна команда, чтобы показать сноски в случае необходимости. Поэтому, возможно, нужны две команды: org-hide-footnotes и org-show-footnotes.

+0

Можем ли мы сузить предполагаемую концовку регулярного выражения '] .' к чему-то более определенно? Например, первое вхождение '].' Follow '[fn ::' - это означает, что вы не могли бы иметь вторую пару квадратных скобок внутри сноски. Или, может быть, мы можем сказать, что это будет первый «]., Который находится в конце строки с жестким возвратом? Будет ли потенциально более одной строки, например, абзаца или более, с пустыми линиями между абзацами? Предполагаемое решение предполагает, что эта сноска будет * не * находиться внутри ящика свойств, который складывается отдельно. – lawlist

+0

Сноска может не быть в конце строки. Но в сноске никогда не будет квадратных скобок. Таким образом, первое появление символа '' 'означает конец сноски. Другими словами, давайте рассмотрим ваше первое предложение. – incandescentman

ответ

2

ИСХОДНЫЙ (6 февраля 2014): Первый рабочий проект.

EDIT 18 февраля 2014: После доработки функции lawlist-toggle-block-visibility так, что он содержит правильным, если/то/другое заявление - то есть, если строка содержит реквизит начинающейся области регулярного выражение, то видимость блока будет переключена, иначе сообщение, извините. , , , Добавлена ​​ссылка на связанный поток для сворачивания кода. Пересмотрено сообщение об ошибке для ссылки на точку, а не на строку.

Исходный код для ответа ниже также хранятся на Github: https://github.com/lawlist/lawlist-org-block-toggle/blob/master/lawlist-org-block-toggle.el

В связи с данным вопросом (т.е., чтобы полностью скрыть свойство ящика в том числе слова :PROPERTIES:), пожалуйста, обратитесь к следующей теме: Completely hide the :PROPERTIES: drawer in org-mode

По полусоединенной проблеме (т.е., чтобы создать настраиваемый блок для сложения кода), см. также: https://tex.stackexchange.com/a/161196/26911

Это решение было протестировано с использованием довольно недавней версии Emacs Trunk (построенной 19 января 2014 г.), которая содержит версию org-mode версии 8.2. 5с. Поскольку ящик :PROPERTIES: через его :END: сбрасывается отдельно от сносок и блоков html, это решение предполагает, что блоки сносок и/или html-кода будут не быть в любом месте внутри этого ящика свойств. Сноска может появляться в любом месте текстового абзаца, но не может иметь другую пару квадратных скобок внутри сноски - так как этот код ищет первую конечную квадратную скобку, чтобы отметить конец сложенной области. Этот код предполагает, что #+BEGIN_HTML и #+END_HTML оба будут заподлицо слева с левым краем. Представления запуска все еще работают одинаково - например, переменные org-startup-folded и org-hide-block-startup.

Модификация org-cycle-internal-local включает в себя циклическое перемещение табуляции для всех форм складывания в орг-режиме. Все, что мы сделали, это исправление разбиения на страницы функции, чтобы сделать ее более читаемой, и добавил следующее условие: ((eq org-cycle-subtree-status 'subtree) (org-show-subtree) (message "ALL") (setq org-cycle-subtree-status 'all)). Интерактивная функция org-cycle по-прежнему используется для табуляции между всеми различными сложенными/развернутыми видами. Функция lawlist-block-org-cycle-internal-local является неинтерактивной функцией поддержки, которая используется org-cycle. Две части кода в этом решении необходимы для правильной работы. Вместо того чтобы использовать вкладку велосипедного, пользователь также может вызвать интерактивную функцию непосредственно в начале заголовков или подрубрик с: M-x org-cycle RET

Чтобы переключить видимость сноски или HTML блока непосредственно, мы используем интерактивную функцию lawlist-toggle-block-visibility. Поместите курсор в любом месте строки, содержащей начиная сноски или, в начиная в HTML блока и тип: M-x lawlist-toggle-block-visibility RET

(require 'org) 

(defalias 'org-cycle-hide-drawers 'lawlist-block-org-cycle-hide-drawers) 

(defun lawlist-block-org-cycle-hide-drawers (state) 
    "Re-hide all drawers, footnotes or html blocks after a visibility state change." 
    (when 
    (and 
     (derived-mode-p 'org-mode) 
     (not (memq state '(overview folded contents)))) 
    (save-excursion 
     (let* (
      (globalp (memq state '(contents all))) 
      (beg (if globalp (point-min) (point))) 
      (end 
      (cond 
       (globalp 
       (point-max)) 
       ((eq state 'children) 
       (save-excursion (outline-next-heading) (point))) 
       (t (org-end-of-subtree t))))) 
     (goto-char beg) 
     (while 
      (re-search-forward 
      ".*\\[fn\\|^\\#\\+BEGIN_HTML.*$\\|^[ \t]*:PROPERTIES:[ \t]*$" end t) 
      (lawlist-org-flag t)))))) 

(defalias 'org-cycle-internal-local 'lawlist-block-org-cycle-internal-local) 

(defun lawlist-block-org-cycle-internal-local() 
    "Do the local cycling action." 
    (let ((goal-column 0) eoh eol eos has-children children-skipped struct) 
    (save-excursion 
     (if (org-at-item-p) 
     (progn 
      (beginning-of-line) 
      (setq struct (org-list-struct)) 
      (setq eoh (point-at-eol)) 
      (setq eos (org-list-get-item-end-before-blank (point) struct)) 
      (setq has-children (org-list-has-child-p (point) struct))) 
     (org-back-to-heading) 
     (setq eoh (save-excursion (outline-end-of-heading) (point))) 
     (setq eos (save-excursion (1- (org-end-of-subtree t t)))) 
     (setq has-children 
      (or 
      (save-excursion 
       (let ((level (funcall outline-level))) 
       (outline-next-heading) 
       (and 
        (org-at-heading-p t) 
        (> (funcall outline-level) level)))) 
      (save-excursion 
       (org-list-search-forward (org-item-beginning-re) eos t))))) 
     (beginning-of-line 2) 
     (if (featurep 'xemacs) 
     (while 
      (and 
       (not (eobp)) 
       (get-char-property (1- (point)) 'invisible)) 
      (beginning-of-line 2)) 
     (while 
      (and 
       (not (eobp)) 
       (get-char-property (1- (point)) 'invisible)) 
      (goto-char (next-single-char-property-change (point) 'invisible)) 
      (and 
      (eolp) 
      (beginning-of-line 2)))) 
     (setq eol (point))) 
    (cond 
     ((= eos eoh) 
     (unless (org-before-first-heading-p) 
      (run-hook-with-args 'org-pre-cycle-hook 'empty)) 
     (org-unlogged-message "EMPTY ENTRY") 
     (setq org-cycle-subtree-status nil) 
     (save-excursion 
      (goto-char eos) 
      (outline-next-heading) 
      (if (outline-invisible-p) 
      (org-flag-heading nil)))) 
     ((and 
      (or 
      (>= eol eos) 
      (not (string-match "\\S-" (buffer-substring eol eos)))) 
      (or 
      has-children 
      (not (setq children-skipped 
       org-cycle-skip-children-state-if-no-children)))) 
     (unless (org-before-first-heading-p) 
      (run-hook-with-args 'org-pre-cycle-hook 'children)) 
     (if (org-at-item-p) 
      ;; then 
      (org-list-set-item-visibility (point-at-bol) struct 'children) 
      ;; else 
      (org-show-entry) 
      (org-with-limited-levels (show-children)) 
      (when (eq org-cycle-include-plain-lists 'integrate) 
      (save-excursion 
       (org-back-to-heading) 
       (while (org-list-search-forward (org-item-beginning-re) eos t) 
       (beginning-of-line 1) 
       (let* (
        (struct (org-list-struct)) 
        (prevs (org-list-prevs-alist struct)) 
        (end (org-list-get-bottom-point struct))) 
        (mapc (lambda (e) (org-list-set-item-visibility e struct 'folded)) 
        (org-list-get-all-items (point) struct prevs)) 
        (goto-char (if (< end eos) end eos))))))) 
     (org-unlogged-message "CHILDREN") 
     (save-excursion 
      (goto-char eos) 
      (outline-next-heading) 
      (if (outline-invisible-p) 
      (org-flag-heading nil))) 
     (setq org-cycle-subtree-status 'children) 
     (unless (org-before-first-heading-p) 
      (run-hook-with-args 'org-cycle-hook 'children))) 
     ((or 
      children-skipped 
      (and 
      (eq last-command this-command) 
      (eq org-cycle-subtree-status 'children))) 
     (unless (org-before-first-heading-p) 
      (run-hook-with-args 'org-pre-cycle-hook 'subtree)) 
     (outline-flag-region eoh eos nil) 
     (org-unlogged-message 
     (if children-skipped 
      "SUBTREE (NO CHILDREN)" 
      "SUBTREE")) 
     (setq org-cycle-subtree-status 'subtree) 
     (unless (org-before-first-heading-p) 
      (run-hook-with-args 'org-cycle-hook 'subtree))) 
     ((eq org-cycle-subtree-status 'subtree) 
     (org-show-subtree) 
     (message "ALL") 
     (setq org-cycle-subtree-status 'all)) 
     (t 
     (run-hook-with-args 'org-pre-cycle-hook 'folded) 
     (outline-flag-region eoh eos t) 
     (org-unlogged-message "FOLDED") 
     (setq org-cycle-subtree-status 'folded) 
     (unless (org-before-first-heading-p) 
     (run-hook-with-args 'org-cycle-hook 'folded)))))) 

(defun lawlist-org-flag (flag) 
    "When FLAG is non-nil, hide any of the following: html code block; 
footnote; or, the properties drawer. Otherwise make it visible." 
    (save-excursion 
    (beginning-of-line 1) 
    (cond 
     ((looking-at ".*\\[fn") 
     (let* (
      (begin (match-end 0)) 
      end-footnote) 
      (if (re-search-forward "\\]" 
       (save-excursion (outline-next-heading) (point)) t) 
      (progn 
       (setq end-footnote (point)) 
       (outline-flag-region begin end-footnote flag)) 
      (user-error "Error beginning at point %s." begin)))) 
     ((looking-at "^\\#\\+BEGIN_HTML.*$\\|^[ \t]*:PROPERTIES:[ \t]*$") 
     (let* ((begin (match-end 0))) 
      (if (re-search-forward "^\\#\\+END_HTML.*$\\|^[ \t]*:END:" 
       (save-excursion (outline-next-heading) (point)) t) 
      (outline-flag-region begin (point-at-eol) flag) 
      (user-error "Error beginning at point %s." begin))))))) 

(defun lawlist-toggle-block-visibility() 
"For this function to work, the cursor must be on the same line as the regexp." 
(interactive) 
    (if 
     (save-excursion 
     (beginning-of-line 1) 
      (looking-at 
      ".*\\[fn\\|^\\#\\+BEGIN_HTML.*$\\|^[ \t]*:PROPERTIES:[ \t]*$")) 
    (lawlist-org-flag (not (get-char-property (match-end 0) 'invisible))) 
    (message "Sorry, you are not on a line containing the beginning regexp."))) 
+0

Это, кажется, больше не работает для меня (и ссылка github нарушена). В частности, если у меня есть несколько сносок на строке, она полностью терпит неудачу. Вы обновили его с тех пор? Если нет, я должен попросить снова дать видимость в случае, если кто-то еще имеет? – avv

3

Я не верю, что это возможно на данный момент. Также использование TAB в качестве ключа расширения внутри для него, вероятно, вызовет еще большую перегрузку ключа.

С другой стороны, существует ли какая-либо особая причина не использовать сноску для сносок?

C-c C-x f будет создавать/взаимодействовать с любыми сносками, которые у вас есть.

(орг-сноска действие & необязательно SPECIAL)

Сделайте правильную вещь для сносок.

Если на сноске ссылка, перейдите к определению.

Когда при определении перепрыгивайте ссылки, если они существуют, предложите создать их иначе.

Если ни в определении, ни в ссылке, создайте новую сноску, в интерактивном режиме.

С префиксом arg SPECIAL предлагает дополнительные команды в меню.

Дополнительные команды являются:

 s Sort the footnote definitions by reference sequence. During editing, 
      Org makes no effort to sort footnote definitions into a particular 
      sequence. If you want them sorted, use this command, which will 
      also move entries according to org-footnote-section. Automatic 
      sorting after each insertion/deletion can be configured using the 
      variable org-footnote-auto-adjust. 
     r Renumber the simple fn:N footnotes. Automatic renumbering 
      after each insertion/deletion can be configured using the variable 
      org-footnote-auto-adjust. 
     S Short for first r, then s action. 
     n Normalize the footnotes by collecting all definitions (including 
      inline definitions) into a special section, and then numbering them 
      in sequence. The references will then also be numbers. This is 
      meant to be the final step before finishing a document (e.g., sending 
      off an email). The exporters do this automatically, and so could 
      something like message-send-hook. 
     d Delete the footnote at point, and all definitions of and references 
      to it.