LINUX.ORG.RU

Emacs. Выделение текста в org-mode

 , ,


0

1

Как реализовать выделение текста в org-mode между последовательностью символов, которые в свою очередь должны быть скрыты? Так как это реализовано в markdown, например для выделения кода с помощью трёх апострофов:

` ` `
с новой строки содержимое блока
...
многострочное
` ` `

Требуется нечто похожее на org-emphasis-alist, только с произвольным набором символов, которых будет более одного и должны уметь охватывать произвольное количество строк.

Да, есть ещё такая штука

#+BEGIN_SRC emacs-lisp
блок кода
...
#+END_SRC

но эти маркеры громоздкие, их невозможно скрыть, слишком массивно выглядят в тексте. Для больших объёмов даже удобно, поскольку могут сворачиваться, но для размещения в тексте кода на одну-две строки чрезмерны.

Ещё раз обобщу требования

  1. маркеры из произвольного набор сиволов;
  2. маркеры должны быть скрыты;
  3. маркеры должны обрабатывать многострочный текст.

Расскажите, а чем вы пользуетесь для решения этой задачи? Как выделяете текст/код в орг-заметках?



Последнее исправление: Dreamdrawer (всего исправлений: 1)

Да, есть ещё такая штука но эти маркеры громоздкие, их невозможно скрыть, слишком массивно выглядят в тексте.

Ну тогда пришлось бы выделять код как-то по-другому, а емакс не умеет в изменение фона части экрана ЕМНИП, поэтому пичальбида. Бывала там движуха в мейлинг листе на похожие темы, которые бы решили этот вопрос (да и первый твой вопрос тоже бы решили, если я все правильно понял), но ни к чему это не привело к сожалению, т.к. не нашлись люди которые бы это реализовали.

anonymous
()
Ответ на: комментарий от anonymous

Ну тогда пришлось бы выделять код как-то по-другому, а емакс не умеет в изменение фона части экрана ЕМНИП

А тут я конечно херню сморозил, т.к. он это умеет конечно, но вроде на уровне текста, а не отрезка строк, что в принципе тоже бы подошло, но вряд ли было бы настолько же быстрым насколько могло бы быть.

Но факт присутствия проблемы это не отменяет.

anonymous
()
Ответ на: комментарий от no-such-file

При наборе. Документ с plain-текстом в орг-режиме должен выделять куски кода, заключённые между назначенными символами. Грубо говоря, подсветка текста между тегами или маркерами.

Dreamdrawer
() автор топика
Ответ на: комментарий от anonymous

Но ведь есть же режим markdown, который прекрасно справляется с задачей. Хочу такое же в орг-моде. То есть, например, апострофы вместо
#+BEGIN_SRC emacs-lisp

#+END_SRC

Dreamdrawer
() автор топика
Ответ на: комментарий от Dreamdrawer

Но ведь есть же режим markdown, который прекрасно справляется с задачей. Хочу такое же в орг-моде. То есть, например, апострофы вместо

Я уж думал ты спрашиваешь про вообще спрятать это говно, что было бы реально «справиться с задачей». Это было бы достойно. А тут тебе простой фейковый реплейс поможет, скорее всего фейсами или с оверлеем, но я ни тем ни другим не пользовался.

Если не лень повозиться с лиспом можешь попробовать потыкать этот код https://emacs.stackexchange.com/questions/53243/fold-all-regexp-matches и https://www.gnu.org/software/emacs/manual/html_node/emacs/Faces.html

А ответ на твой первый вопрос тут похоже:

https://masteringemacs.org/article/highlighting-by-word-line-regexp

Доброжир

anonymous
()
Ответ на: комментарий от anonymous

Если не лень повозиться с лиспом можешь попробовать потыкат

хотя тут тебе придется скорее всего еще динамически менять фейс или что там если курсор оказывается на замененной строке. короче хз, я бы спросил в emacs stackexchange или в мейлинг листе. Наверняка ты не первый кто так же захотел.

Доброжир

anonymous
()
Ответ на: комментарий от anonymous

Это не то в принципе. Требует активного участия — указания вручную области для метки. Работает в рамках одного документа.
Моя задача в другом — выделяться должен текст между «тегами», независимо от документа. Можно привести в пример как это уже реализовано

*word* +word+ ... etc

только маркеры должны быть из нескольких символов и работать для нескольких строк.

Реализовывается же подсветка синтаксиса или вот к примеру, выделение содержимого скобок

(set-face-attribute 'show-paren-match nil
		    :foreground "#2aa198"
		    :weight: normal)

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

Dreamdrawer
() автор топика
Ответ на: комментарий от Dreamdrawer

Моя задача в другом — выделяться должен текст между «тегами»,

Ну ты попробуй таки highlight-regexp с многострочной регуляркой, которая будет матчить всё от тега до тега (или как ты там хочешь).

независимо от документа

Оно и работает независимо от документа.

no-such-file ★★★★★
()

Привет. Это не совсем то, что ты описываешь, но сам я использую вот такой хак:

(with-eval-after-load 'org
  (defvar-local rc/org-at-src-begin -1
    "Variable that holds whether last position was a ")

  (defvar rc/ob-header-symbol ?☰
    "Symbol used for babel headers")

  (defun rc/org-prettify-src--update ()
    (let ((case-fold-search t)
          (re "^[ \t]*#\\+begin_src[ \t]+[^ \f\t\n\r\v]+[ \t]*")
          found)
      (save-excursion
        (goto-char (point-min))
        (while (re-search-forward re nil t)
          (goto-char (match-end 0))
          (let ((args (org-trim
                       (buffer-substring-no-properties (point)
                                                       (line-end-position)))))
            (when (org-string-nw-p args)
              (let ((new-cell (cons args rc/ob-header-symbol)))
                (cl-pushnew new-cell prettify-symbols-alist :test #'equal)
                (cl-pushnew new-cell found :test #'equal)))))
        (setq prettify-symbols-alist
              (cl-set-difference prettify-symbols-alist
                                 (cl-set-difference
                                  (cl-remove-if-not
                                   (lambda (elm)
                                     (eq (cdr elm) rc/ob-header-symbol))
                                   prettify-symbols-alist)
                                  found :test #'equal)))
        ;; Clean up old font-lock-keywords.
        (font-lock-remove-keywords nil prettify-symbols--keywords)
        (setq prettify-symbols--keywords (prettify-symbols--make-keywords))
        (font-lock-add-keywords nil prettify-symbols--keywords)
        (while (re-search-forward re nil t)
          (font-lock-flush (line-beginning-position) (line-end-position))))))

  (defun rc/org-prettify-src ()
    "Hide src options via `prettify-symbols-mode'.

  `prettify-symbols-mode' is used because it has uncollpasing. It's
  may not be efficient."
    (let* ((case-fold-search t)
           (at-src-block (save-excursion
                           (beginning-of-line)
                           (looking-at "^[ \t]*#\\+begin_src[ \t]+[^ \f\t\n\r\v]+[ \t]*"))))
      ;; Test if we moved out of a block.
      (when (or (and rc/org-at-src-begin
                     (not at-src-block))
                ;; File was just opened.
                (eq rc/org-at-src-begin -1))
        (rc/org-prettify-src--update))
      (setq rc/org-at-src-begin at-src-block)))

  (defun rc/org-prettify-symbols ()
    (mapc (apply-partially 'add-to-list 'prettify-symbols-alist)
          (cl-reduce 'append
                     (mapcar (lambda (x) (list x (cons (upcase (car x)) (cdr x))))
                             `(("#+begin_src" . ?✎) ;;  
                               ("#+end_src"   .?✎) ;; 
                               ("#+header:" . ,rc/ob-header-symbol)
                               ("#+begin_quote" . ?»)
                               ("#+end_quote" . ?«)))))
    (turn-on-prettify-symbols-mode)
    (add-hook 'post-command-hook 'rc/org-prettify-src t t))
 (add-hook 'org-mode-hook #'rc/org-prettify-symbols))

Ну и добавить соответствующий хук:

;; Org-mode spec
(add-hook 'org-mode-hook (lambda ()
			   (rc/org-prettify-symbols))

Он скрывает стандартные строки с begin_src(и аргументы к ним) и меняет на соответствующий символ. Можно удалить символ ✎ и оставить вместо него пробел, тогда получится псевдоскрытие. Произвольный набор символов для блока скорее всего придётся определять вручную. Можно посмотреть на special blocks и скорее всего придётся немного отредактировать экспорт, что кажется довольно сложным и не совсем целесообразным, поскольку обычные блоки можно вставлять нажатием пары клавиш.

raven_cler ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.