Czy jest możliwe, aby yasnippets rozwijały fragmenty wewnątrz sekcji babel w trybie org w odpowiednim trybie?

10

Na przykład mam tryb organizacji, który ma następujące

#+BEGIN_SRC emacs-lisp


#+END_SRC

Czy można skonfigurować yasnippety w taki sposób, aby wszystkie fragmenty trybu emacs-lisp mogły zostać rozszerzone wewnątrz tego bloku, ale nie poza nim?

Rafa de Castro
źródło
6
Myślę, że „standardowym” sposobem byłoby edytowanie tych bloków za pomocą C-c '- w takim przypadku tryb główny emacs-lisp miałby załadowane odpowiednie fragmenty yasnippet podczas edycji bloku w osobnym oknie (co również dba o właściwe wcięcie itp.)
VanLaser,
Tak, zgadzam się na odpowiedź VanLaser. Działa w każdym języku obsługiwanym przez emacs.
dmg,
Och, prawda. Masz rację. Czy umiesz podać odpowiedź, aby oznaczyć odpowiedź jako prawidłową? Nie myślałem o tym: P
Rafa de Castro,

Odpowiedzi:

7

Począwszy od 2017 roku, 22 stycznia, jeśli ustawisz org-src-tab-acts-nativelyi org-src-fontify-natively, a następnie TAB w blokach źródłowych rozszerzy fragmenty języka bloku. Możesz ustawić yas-buffer-local-conditionopcję zatrzymywania fragmentów kodu w trybie organizacji przed zacieniowaniem fragmentów kodu trybu blokowego:

(defun my-org-mode-hook ()
  (setq-local yas-buffer-local-condition
              '(not (org-in-src-block-p t))))
(add-hook 'org-mode-hook #'my-org-mode-hook)

Zobacz także https://github.com/joaotavora/yasnippet/issues/761 , https://github.com/joaotavora/yasnippet/pull/760

npostavs
źródło
2

Używam do tego dwóch metod. Mam fragmenty organizacji, które pomagają mi tworzyć nagłówki babel. Na przykład ten tworzy C ++ - 14 nagłówków dla Babel. Piszę <s C++_i rozwijam:

# -*- mode: snippet -*-
# name: c++_header
# key: C++_
# --
C++ :main no :flags -std=c++14 -Wall --pedantic -Werror :results output :exports both
#include <iostream>
int main()
{
   $0

   return 0;
}

Następnie używam Cc ', który przełącza się w tryb konkretnego języka i używam fragmentów dla tego języka. Następnie użyj Cc ', aby wrócić do pliku org. To dobrze działa.

dmg
źródło
0

Ponieważ npostavs już odpowiedziały, fragmenty są rozwijane w różny sposób w zależności od języków w jednym pliku trybu org.

Wystarczy wpisać „co” i [tab] w bloku kodu Python lub Emacs Lisp.

#+BEGIN_SRC python :session *Python* :results output
co[tab]
# comment
#+END_SRC

#+BEGIN_SRC emacs-lisp :results value scalar
co[tab]
                                        ; comment
#+END_SRC
RUserPassingBy
źródło