Как автоматически отформатировать блок исходного кода в режиме org

11

Когда я использую режим орг, чтобы делать заметки о книге, иногда я копирую / вставляю некоторые фрагменты кода в файл заметок. После вставки я

1. `C-c '` to call `org-edit-special`
2. `C-x h` to mark all the source code
3. `TAB` to format it

Есть ли для меня решение в режиме org, которое после вставки кода #+BEGIN_SRC...#+END_SRCавтоматически форматирует блок кода, или я могу использовать только одну клавишу, например, TABдля форматирования (отступа) всего блока исходного кода?

По умолчанию TAB(набирается в блоке, не используется C-c ') просто выравнивать все строки 2 столбца после #+BEGIN_SRCзаголовка, если в начале второй строки есть пробелы, он просто добавляет больше пробелов, он не отступает во всех строках, как 3 шага.

CodyChan
источник

Ответы:

7

Ниже приводится сложное решение, но оно отлично работает. На самом деле это просто функция, которая имитирует ваши операции и использует ее, run-at-timeчтобы вызывать ее каждые 10 секунд. Приветствия.

(defun indent-org-block-automatically ()
  (when (org-in-src-block-p)
   (org-edit-special)
    (indent-region (point-min) (point-max))
    (org-edit-src-exit)))

(run-at-time 1 10 'indent-org-block-automatically)

Конечно, вы можете вызывать его каждую 1 секунду, просто измените 10 на 1.

Leu_Grady
источник
Мне не нужно на run-at-timeсамом деле, как я могу связать TABключ, чтобы сделать это, чтобы заменить по умолчанию, TABкогда org-in-src-block-p. Значение по умолчанию TABобязательно, yas-expandно оно будет делать то, что я сказал в своем посте.
CodyChan
0

Вот код, который я написал, чтобы решить эту проблему:

(defun udf/my-org-tab-dwim (&optional arg)
  (interactive)
  (or (org-babel-do-key-sequence-in-edit-buffer (kbd "TAB"))
      (org-cycle arg)))

(define-key org-mode-map
  (kbd "<tab>") #'udf/my-org-tab-dwim)
kuwze
источник