Org-mode Emacs как перестать верить в GUI
Мои заметки на полях.
Удивительная вещь, в основном я пользуюсь для управления заданиями GNOME GTG синхронизированный через Dropbox(бойся облаков) и моё желание покопаться в org-mode было чисто из-за того, что GNOME GTG неудобен для мелких заданий, скорее для крупных… в день длинной. Но чем больше я узнавал про org-mode тем больше в нем зависал, списки, код, чекбоксы, создание таблиц и графиков.
Главный принцип - никаких сложных форматов и бинарных частей, все в plain-text и это подкупает.
Содержание
- 1. Введение и сбор литературы
- 2. Язык разметки
- 2.1. Заголовки и уровни
- 2.2. Выделение текста
- 2.3. Врезки
- 2.4. Ссылки в документе
- 2.5. Вставка картинок
- 2.6. Чекбоксы
- 2.7. Вставка LaTeX фрагментов
- 2.8. Вставка таблиц
- 2.9. Вставка программного кода и его подсветка
- 2.10. Исполнение кода вставка графов и диаграмм
- 2.11. Сноски
- 2.12. Экспорт и публикация
- 3. Органайзер
1 Введение и сбор литературы
Краткая справка по командам а также основной сайт со всеми инструкциями.
Статьи на русском:
Org-mode всеобъемлящий и уместить все его возможности в одной статье не выйдет. При всем огромно объеме всем я например не пользуюсь. Поэтому из того чем пользуюсь разобью на две части, это Язык разметки - т.е. применение org-mode для оформления текста, сложнее и с большими возможностями чем в Markdown но меньше загружено кодом по сранению с LaTeX. Вторая часть это Органайзер т.е. назначение заданий, календарь, напоминания.
2 Язык разметки
Зачем ,написание статей, как эта и публикация их. Содержание персональной wiki org-wiki. Литературное программирование и администрирование. итак кратко язык разметки.
2.1 Заголовки и уровни
Ну тут и рассказывать, ставиш * в начале строки, после неё пишешь название, чем больше звездочек, тем больше глубина списка
* Главный уровень ** Подуровень *** Подподуровень # комментарий
Помести текстовый курсор на заголовок и нажав С-TAB мы будем сворачивать содержимое вложенных в главу и подглавы, просто попробуйте.
Управляющие слова, поэкспериментируйте с ними поставив в начале вашего org файла:
#+STARTUP: showall #+STARTUP: indent #+STARTUP: hidestars
2.2 Выделение текста
*жирный* /курсив/ _подчеркнутый_ =выровненный текст= +зачеркнутый+ ~import кода текст~
Ну их довольно много жирный, курсив подчеркнутый , выровненный текст
зачеркнутый
import кода текст
2.3 Врезки
Есть специальная конструкция #+BEGIN_QUOTE .. #+END_QUOTE
Org mode is for keeping notes, maintaining TODO lists, planning projects, and authoring documents with a fast and effective plain-text system cite:dominik2003-org.
2.4 Ссылки в документе
Ну вот ссылка на статью по теме , формат указан ниже, также можно заметить что интернет ссылки, подхватываются автоматически, а ссылки на файлы дожны начинаться с заветного слова file:
[[ссылка][описание]] или альтернативно [[ссылка]] [[file:адрес абсолютный или относительный]]
- Мало же он знает уравнение,только это 1
- Ссылка на метку(label) в тексте работает для изображений и таблиц
- Механизм внутренних ссылок черех CUSTOM_ID
- Механизм вставки куска другого файла.
2.5 Вставка картинок
Попробуем вставить сюда картинку.
#+CAPTION: This is Science Bastard #+LABEL: fig:SED-AVATAR [[file://../../avatar/docsleepless.jpg]] Ссылка на метку(label) в [[fig:SED-AVATAR][тексте]].
а отобразить её в Emacs можно с помощью включения M-x iimage-mode
Рис. 2.: This is Science Bastard
Метка Label нужна для ссылок при экспорте, наример при экспорте в LaTeX.
Ссылка на метку(label) в тексте.
2.6 Чекбоксы
Состоят из - [] ,иногда для количественной оценки вставляют [/]
или для процентой [%]
, вставляют сразу перед списком чекбоксов.
*** Обычные(пример чикбоксов) [0/3] - [ ] Инна - [ ] Маша - [ ] Даша
Простановка нужного чекбокса осуществляется клавишами C-c C-c в данной строке.
*** Процентные чекбоксы:[75%] - [X] 1 - [X] 2 - [X] 3 - [ ] 4
2.6.1 Помыть посуду [2/3]
:
[ ]
F[X]
G[X]
O
2.7 Вставка LaTeX фрагментов
Это очень круто, надо поставить только пакет CDLaTeX1, а дальше все просто, для экспорта в html используется mathjax Θ Вот и вставили символ посреди текста, моё мнение что это лучше чем генерация картинок из формул, хотя такая опция тоже есть.
GUI Emacs может автоматически преобразовывать формулы и символы после ввода комбинации C-c C-x \, повторный ввод, отменяет этот режим.
Одна формула
\begin{equation}
\frac{1}{f}=\sqrt[3]{\mu RT}
\end{equation}
Две формулы
#+NAME: eqn:1
\begin{eqnarray}
pV&=\frac{m}{\mu} RT\\
pV&=\frac{m}{\mu} RT
\end{eqnarray}
Мало же он знает уравнение,только это [\[eqn:1]]
Одна формула
\begin{equation} \frac{1}{f}=\sqrt[3]{\mu RT} \end{equation}Две формулы
\begin{eqnarray} pV&=\frac{m}{\mu} RT\\ pV&=\frac{m}{\mu} RT \end{eqnarray}
Конструкция #+NAME
работает также с кодовыми блоками.
2.7.1 TODO Ссылки на формулы в тексте
увы по ним нельзя прыгать как в LaTeX \ref(конструкция)
2.7.2 Экспорт формул в Wordpress
этот кусок нужен для экспорта в данный блог
#+HTML: [lаtex] код #+HTML: [/lаtex]
2.7.3 Автоматическое преобразование и экранирование символов
Согласно справке следующие символы '^','_','{}' автоматически подвергаются преобразованию.
Локальное решение поместить в начале org файла
# это полностью отключит преобразование #+OPTIONS: ^:nil #+OPTIONS: _:nil # это будет преобразовывать все что в скобках #+OPTIONS: ^:{} #+OPTIONS: _:{} W^T_F W^{T}_{F}
W^T_F W^{T}_{F}
для радикальных мер можно задать эти параметры в управляющем файле настроек (например .emacs)
(setq org-export-with-sub-superscripts nil) (setq org-use-sub-superscripts '{})
Ручное экранирование, например в блоках кода описывающих сам org-mode. Пример C-c '
:
*C-c '\\*
Документация http://orgmode.org/manual/Special-symbols.html
2.8 Вставка таблиц
Это отдельный мир, с отдельным меню Tbl, при вставке, таблица автоматически выравнивает поля и в отличии от LaTeX вполне читабельна,хотя наверное слишком сложные вещи лучше делать в calc.
Как видно в примере ниже, поддерживается LaTeX синтаксис формул, а также поддерживается непосредственно вычисление формул:
#+CAPTION: Table Caption | \(N\) | \(N^2\) | \(N^3\) | \(N^4\) | \(\sqrt n\) | \(\sqrt[4]N\) | |-------+---------+---------+---------+-----------+-----------------| | 1 | 1 | 1 | 1 | 1 | 1 | | 2 | 4 | 8 | 16 | 1.4142 | 1.1892 | | 3 | 9 | 27 | 81 | 1.7321 | 1.3161 | |-------+---------+---------+---------+-----------+-----------------| #+TBLFM: $2=$1^2::$3=$1^3::$4=$1^4::$5=sqrt($1)::$6=sqrt(sqrt(($1)))
\(N\) | \(N^2\) | \(N^3\) | \(N^4\) | \(\sqrt n\) | \(\sqrt[4]N\) |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 |
2 | 4 | 8 | 16 | 1.4142 | 1.1892 |
3 | 9 | 27 | 81 | 1.7321 | 1.3161 |
2.9 Вставка программного кода и его подсветка
Собственно проще простого.
http://orgmode.org/manual/Working-With-Source-Code.html#Working-With-Source-Code
#+begin_src python import os a=5 print "Hello Megan" #+end_src
Получаем
import os a=5 print "Hello Megan"
Как видно org-mode самостоятельно разбирается с подсветкой синтаксиса
Немного разобрался как вставлять код самого org-mode это конструкция begin\end_src org , но помогает не всегда Поэтому иногда я прятал код в конструкции begin\end_example.
Полезное сочетание, переместив курсор в область с кодом нажмите C-c '
.
Вы переместитесь в отдельный буфер только с вашим кодом и в нем
будет работать mode для указанного языка программирования.
Повторное сочетание клавиш вернет вас обратно.
2.9.1 Проблема экспорта темы в HTML
Важным также будет заметить, что без настроек org-mode использует для экспорта ТЕКУЩУЮ подсветку синтаксиса, при этом не перенося фон и как результат темные темы экспортируются в невидимое нечто.
Есть два пути решения этой проблемы, первый отключает вставку css настроек в вашем экспорте, ожидая что все они описаны в подключенном css файле.
(use-package htmlize :custom (org-html-htmlize-output-type 'css) (org-html-htmlize-font-prefix "org-"))
Второй добавляет, почему-то пропущенные настройки фона и шрифта, в ваш экспорт по умолчанию.
(defun my-org-inline-css-hook (exporter) "Insert custom inline css" (when (eq exporter 'html) (let ((my-pre-bg (face-background 'default)) (my-pre-fg (face-foreground 'default))) (setq org-html-head-include-default-style nil) (setq org-html-head (format "<style type=\"text/css\">\n pre{color: %s; background-color: %s;}</style>\n" my-pre-fg my-pre-bg))))) (add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)
2.10 Исполнение кода вставка графов и диаграмм
По мимо того что можно вставлять код, также можно его и выполнять, на вашей, или благодаря TRAMP на удаленной, машине. За этот функционал отвечает Babel.
Например получать графы http://doc.norang.ca/org-mode.html#Graphviz прописать в настройках.
;; этот кусок конфига отвечает за ;; выполнение кода и генерацию изображений ;; в org-mode (org-babel-do-load-languages (quote org-babel-load-languages) (quote ((emacs-lisp . t) (dot . t) (ditaa . t) (R . t) (python . t) (ruby . t) (gnuplot . t) (clojure . t) (sh . t) (ledger . t) (org . t) (plantuml . t) (latex . t))))
при экспорте(С-c C-e) система спросить Вас выполнять ей код или нет, пока пробовал только графы , хотя есть опции работы с UML диаграммами, Gnuplot и прочим. а ditaa вообще бездонный океан.
Пример кода
#+begin_src dot :file ../pics/some_dot_filename.png :cmdline -Kdot -Tpng digraph G { size="8,6" ratio=expand edge [dir=both] plcnet [shape=box, label="PLC Network"] subgraph cluster_wrapline { label="Wrapline Control System" color=purple subgraph { rank=same exec sharedmem [style=filled, fillcolor=lightgrey, shape=box] } edge[style=dotted, dir=none] exec -> opserver exec -> db plc -> exec edge [style=line, dir=both] exec -> sharedmem sharedmem -> db plc -> sharedmem sharedmem -> opserver } plcnet -> plc [constraint=false] millwide [shape=box, label="Millwide System"] db -> millwide subgraph cluster_opclients { color=blue label="Operator Clients" rankdir=LR labelloc=b node[label=client] opserver -> client1 opserver -> client2 opserver -> client3 } } #+end_src
Самого кода вы не увидите лишь результат его выполнения ниже:
2.10.1 Литературное программирование
2.11 Сноски
Сноска разделана на две части собственна метка и описание сноски.
- C-c C-x f поставить сноску.
- Поместить курсор на сноску С-с С-с прыгнуть к описанию или обратно.
- Поместить курсор на сноску С-с '
отредактировать описание сноски в отдельном окне и вернуться
2.12 Экспорт и публикация
Экспорт ваших файлов в внешний мир. Простой способ это нажать C-c C-e и в выбранном меню найти тот формат что Вам нужен. Но помните ,тот же LaTex ODT и Mardown будут требовать внешние программы.
На практике для статей использую экспорт в HTML. Но хотелось бы те же статьи экспортировать и в LaTex. Как и все универсальное лучше оно будет работать с управляющими костыликами, например:
#+HTML: [lаtex] код #+HTML: [/lаtex]
эта конструкция добавляет указанный код при экспорте в HTML, также
есть флаги #_HTML_HEAD:
они отвечают за например подключение своего
CSS или какого-нибудь javascript-а. Аналогично в LaTeX.
Для LaTeX экспорта есть отдельные настройки, если вы решитесь использовать класс beamer отвечающий за создание презентаций2.
Также можно экспортировать ваши заметки в различные, форматы документации, texinfo, man. Для любителей README.md , можно сказать что github поддерживает и парсит org файлы.
2.12.1 Публикация через webrpc используя org2blog
Из плюсов, можно развернуть на вордпрессе и не париться с CSS, тэгами, категориями, меню, добавлением функционала.
Из минусов постоянные вставки чего-то дополнительного в ваш org файл, постоянная правка xml-rpc.el, после обновления. Возможное прекращение поддержки webrpc как уязвимого протокола. Ну и поддержка wordpress это как плюс так и минус.
2.12.2 Публикация средствами самого org-mode
Если один файл можно экспортировать в HTML. То отдельная настройка позволяющая публиковать и связывать большие проекты из множества org файлов, составлять index и экспортировать готовые html(?) файлы и изображения в указанные папки.
Подробнее можно почитать здесь, а примером использования является этот сайт.
3 Органайзер
Помните для органайзера не важно содержание пунктов, ему важен только заголовок ну и управляющие слова подвергаются и рядом с ним.
Пакеты которые могут вас заинтересовать.
org-journal пакет отвечает за ведение дневников, по одному файлу в день.
orgzly приложение для android для повседневных заметок и напоминаний сохраняющее свои данные в org формате. В связи с особенностями андроида не взаимодействует с другими календарями, но выглядит лучше MobileOrg и обладает собственным виджетом.
3.1 Назначение заданий
Всё делается комбинацией C-c C-t, помещаете курсор на заголовок и нажимаете, с начала устанавливается TODO, после повторного нажатия, задача считается закрытой(DONE). Следующее нажатие C-c C-t вернет все на круги своя. Это комбинация настраивается в ней три положение только по умолчанию.
** DONE Проверить возможность назначения и выполнения заданий CLOSED: [2013-07-31 Ср. 22:40]
Назначение собственных ключевых слов для пометки состояний делается
через переменную #+TODO:
в начале файла и описано здесь,также все
это можно задать глобально в ваших настройках.
3.1.1 Проверить почему не ставиться дата окончания задания
Потому как надо прописать в ваших настройках следующую строку.
;;Временная метка при закрытии задания (setq org-log-done t)
3.1.2 Назначение заданий по календарю
Делается с помощью нажатия C-c C-s перемещение по календарю осуществляется стрелками при зажатой клавише Shift,а предел выполнения по комбинации C-c C-d
*** Пример назначенного задания SCHEDULED: <2013-04-07 Вс.>
3.2 Тэги :tags.work:
Перемещаемся на заголовок и жмем C-c C-c, на предлагают ввести тэги вводим tags,work
3.2.1 TODO Плохо отображаются в css и содержании
3.3 Архивация
Когда у вас в файле накапливаются сделанные дела вы можете, удалить их или заархивировать.
Указав в начале файла #+ARCHIVE путь/имя.org-файла
Поместите курсор на нужный заголовок или дерево(т.е. несколько вложенных заголовков) и нажмите
C-c C-x C-a ,указанная задача переедет в указанный архивный файл и получит свойства, пример ниже:
Archived entries from file /home/user/org/tutorial-org-mode.org * DONE Архивированная задача :PROPERTIES: :ARCHIVE_TIME: 2018-08-29 Ср 00:06 :ARCHIVE_FILE: ~/org/tutorial-org-mode.org :ARCHIVE_OLPATH: Органайзер/Agenda :ARCHIVE_CATEGORY: tutorial-org-mode :ARCHIVE_TODO: DONE :END:
Также есть возможность переносить все выполненные задачи с дерева C-u C-x C-a C-s.
Также указав в свойствах(PROPERTIES) корня дерева, :ARCHIVE:
файлархив.org
, это позволит всем записям входящим в этот корень архивироваться в этот файл.
3.4 Приоритет
Странная дополнительная особенность, можно установить с помощью стрелок Shift-Up/Down
3.5 Agenda
Agenda это менеджер вашего органайзера, есть переменная
org-agenda-files
, а также возможность добавлять туда файлы через
С-с [ и удалять С-с ].
Итого у вас есть список с разбросанными файлами и заданиями и тэгами в них, набираем M-x org-agenda и вуаля. Перед нами меню:
С кучей опций:
- a тэгами показать задачи с указанными флагами
- t только TODO задачи
- s поиск по regexp
- n показать сразу и всё , советую пока использовать эту опцию.
и.т.д. , дальше agenda сформирует специальный буфер, где будут отфильтрованные под ваш запрос задачи; из этого буфера вы сможете их закрывать обычным сочетание С-c С-t, после этого нажав в этом буфере s, вы сохраните изменения в исходных файлах. Ну и конечно выбрав задачу в agenda и нажав Enter, вы переместитесь в исходный org файл.
Также можно создавать собственные настроенные agenda buffer и экспортировать agenda views(опять же стандартные или ваши буферы, куда нибудь в тот же гугло календарь через пакет.) Можно архивировать , удалять и перемещать(refile) между файлов ваши задачи.
Сноски:
CDLaTeX http://staff.science.uva.nl/~dominik/Tools/cdlatex/cdlatex.el или с помощью пакетного менеджера MELPA
https://orgmode.org/worg/exporters/beamer/tutorial.html описание создание презентации в org-mode