Org verilen <code> bloklarının arka planını temaya göre ayarla


24

Kuruluş modu dosyalarını oldukça sık dışa aktarıyorum ve neredeyse hepsinin içinde kod var. Dışa aktarma kodunu yaptığımda, temama bağlı olarak metni renklendirmekle bitiyor, ancak düzenli olarak karanlık bir tema ile hafif bir tema arasında geçiş yapıyorum. Işık teması durumunda, <code>blokların açık bir arka plana sahip olması gerekir ve karanlık bir tema için karanlık bir arka plana sahip olmaları gerekir (aksi halde grimsi bir arka plan üzerinde açık sarı metinle bitirdim ve okunamıyor).

Koyu arka planlar için bu satırı eklemeliyim:

#+HTML_HEAD: <style>pre.src {background-color: #303030; color: #e5e5e5;}</style>

Sonra açık renkli bir arka plana geçtiğimde kaldırmayı unutma

Geçerli temanın arka plan rengini dışa aktarma sırasında otomatik olarak tespit edip dışa aktarılan HTML'nin CSS'sinde kullanmamın bir yolu var mı?

DÜZENLE

Jordon'un cevabına gidiyorum (teşekkürler Jordon, karma puanları alıyorsunuz!), Ancak koduma ekleyeceğim çözümü göndermek istedim, çünkü cevabının biraz değiştirilmiş bir versiyonuydu:

(defun my/org-inline-css-hook (exporter)
  "Insert custom inline css to automatically set the
background of code to whatever theme I'm using's background"
  (when (eq exporter 'html)
    (let* ((my-pre-bg (face-background 'default))
           (my-pre-fg (face-foreground 'default)))
      (setq
       org-html-head-extra
       (concat
        org-html-head-extra
        (format "<style type=\"text/css\">\n pre.src {background-color: %s; color: %s;}</style>\n"
                my-pre-bg my-pre-fg))))))

(add-hook 'org-export-before-processing-hook 'my/org-inline-css-hook)

Bu sadece arka plan rengini değil, aynı zamanda ön plan rengini de ayarlar. Ayrıca satırı mevcut org-html-head-extraayara ekler, böylece diğer HTML’nin üzerine yanlışlıkla yazılmaz. Test ettim ve bu benim için harika!


1
Eminim ki bir yol vardır, ancak dışa aktarırken her zaman aynı temayı uygulamak yerine daha iyi olmaz mıydı? Yoksa kasıtlı olarak farklı temalarla mı ihraç ediyorsunuz?
Malabarba

@Malabarba'nın amacı, şu anda hangi temayı kullandığımı dışa aktarabilmem ve kodun okunabilmesini sağlamak. Birçok tema temiz bir şekilde değişmediğinden (hatta olsa bile disable-theme), günde birkaç kez yaptığım HTML'yi dışa aktarmak için Emacs'ı ayrı bir temayla yeniden başlatmak istemem.
Lee H

1
Doğru anladıysam, şu anki kurulumunuz zaten kod bloklarında temanın renklerini kullanıyor ve yaşadığınız sorun temanın arka planının kullanılmaması. Yanlış yaparsam, lütfen başlığınıza yaptığım düzenlemeyi geri almaktan çekinmeyin.
Malabarba

@Malabarba mevcut kurulumum kod bloklarının arka plan rengini belirtmiyor (yine de yardımcı olması için css'de bir arka plan rengini sabit kodlayabilirim). Org modu kod blokları için temanın arka plan renginin kullanılmasını istiyorum. Yeni başlık benim için çalışıyor.
Lee H

Yukarıdaki çözümde iki sorun var. İlk olarak, 'gray80' gibi renkler doğru şekilde CSS değerlerine çevrilmez ve ayarlanmaz. İkincisi, ihracat her çalıştığında, org-html-head-extrastilin işlevselliği bozulmayacak olsa da sınırsız büyümeye neden olacak şekilde eklenir.
RP Dillon

Yanıtlar:


10

İlk önce, org'un htmlizekaynak kod bloklarınızı temanıza göre otomatik olarak renklendirmek için kullanabileceğine inanıyorum .

Alternatif.

Check http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ . org-export-before-processing-hookBir html dışa aktarmadan önce, özel css'leri bir org belgesine atmak için nasıl kullanılacağının harika bir örneğidir .

İşte sitenin düşmesi durumunda kod:

Burada bir html dışa aktarmasında, org, geçerli dizinde styles.css adlı bir dosyayı ya da .emacs.d dizinindeki varsayılan bir dosyayı arayacak ve bu css'yi belgeye enjekte edecektir. Bu güzel ama kullanım durumunuz için mükemmel değil.

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let* ((dir (ignore-errors (file-name-directory (buffer-file-name))))
           (path (concat dir "style.css"))
           (homestyle (or (null dir) (null (file-exists-p path))))
           (final (if homestyle "~/.emacs.d/org-style.css" path)))
      (setq org-html-head-include-default-style nil)
      (setq org-html-head (concat
                           "<style type=\"text/css\">\n"
                           "<!--/*--><![CDATA[/*><!--*/\n"
                           (with-temp-buffer
                             (insert-file-contents final)
                             (buffer-string))
                           "/*]]>*/-->\n"
                           "</style>\n")))))

(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)

İstediğiniz şekilde çalışmasını sağlamak için bunu birkaç şekilde özelleştirebilirsiniz.

Bunun bir yolu, temanıza göre css'i manuel olarak oluşturmak ve bunu eklemek olacaktır.

Arka planını pre.srcvarsayılan yüzlerin onaltılık değerine ayarlayan değiştirilmiş bir sürüm : background özelliği.

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let ((my-pre-bg (face-background 'default)))
      (setq org-html-head-include-default-style nil)
      (setq org-html-head
            (format "<style type=\"text/css\">\n pre.src { background-color: %s;}</style>\n" my-pre-bg)))))

(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)

1
Teşekkürler Jordon, bu harika! Orijinal sorumu hafifçe düzenlenmiş sürümümle güncelledim, ancak ödül ve çözümü alıyorsunuz!
Lee H,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.