Merge pull request #5 from zzkt/main

melpa compatibility
This commit is contained in:
Michal Seta 2022-07-30 10:25:39 -04:00 committed by GitHub
commit 2eb8101151
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 79 additions and 28 deletions

41
.github/workflows/test.yml vendored Normal file
View file

@ -0,0 +1,41 @@
name: CI
on:
push:
paths-ignore:
- '**.org'
pull_request:
paths-ignore:
- '**.org'
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
emacs_version:
- 28.1
- 27.2
- 26.3
- 25.3
steps:
- name: Set up Emacs
uses: purcell/setup-emacs@master
with:
version: ${{matrix.emacs_version}}
- name: Install Eldev
run: curl -fsSL https://raw.github.com/doublep/eldev/master/webinstall/github-eldev | sh
- name: Check out the elisp source code
uses: actions/checkout@v2
- name: Test the uncompiled source
run: |
eldev -p -dtT test
- name: Compile and run tests again
run: |
eldev compile
eldev -p -dtT test

3
.gitignore vendored
View file

@ -1 +1,2 @@
*~ *~
*.elc

View file

@ -3,10 +3,21 @@
#+STARTUP: showstars #+STARTUP: showstars
** Why do I even? ** Why do I even?
[[https://orgmode.org/][Org-mode]] makes [[http://literateprogramming.com/][literate programming]] easy via [[https://orgmode.org/worg/library-of-babel.html][Library of Babel]]. Il simply allows to mix text with executable /code blocks/ (which can also be extracted (/tangled/) into separate, executable files. The beauty of the Library of Babel implementation in org-mode lies in the fact that it supports many languages. I craved support for [[https://github.com/supercollider/supercollider][SuperCollider]] and craving became an itch when I needed to document a working pipeline alternating between executing sclang and shell scripts. I scratched an itch with this little module. [[https://orgmode.org/][Org-mode]] makes [[http://literateprogramming.com/][literate programming]] easy via [[https://orgmode.org/worg/library-of-babel.html][Library of Babel]]. Il simply allows to mix text with executable /code blocks/ which can also be extracted (/tangled/) into separate, executable files. The beauty of the Library of Babel implementation in org-mode lies in the fact that it supports many languages. I craved support for [[https://github.com/supercollider/supercollider][SuperCollider]] and craving became an itch when I needed to document a working pipeline alternating between executing sclang and shell scripts. I scratched an itch with this little module.
** How to install? ** How to install?
First of all, you will need emacs (>=25) and SuperCollider (with emacs support) installed. Modern emacsen and Spacemacs come with bundled org-mode. At this point I am the sole user of this plugin and have just written it so I am not itching yet for MELPA or inclusion in the official org-mode repositories, so installation is manual. You can either drop [[file:ob-sclang.el]] somewhere in your Emacs' path or add its containing directory to ~load-path~ in =.init= file: First of all, you will need emacs (>=26) and SuperCollider (with emacs support) installed. Modern emacsen and Spacemacs come with bundled org-mode.
It can be installed as a package via [[https://melpa.org/#/i-ching][Melpa]] or manually.
#+BEGIN_SRC emacs-lisp
(use-package ob-sclang
:config (org-babel-do-load-languages
'org-babel-load-languages
'((sclang . t))))
#+END_SRC
To install manually you can either drop [[file:ob-sclang.el]] somewhere in your Emacs' path or add its containing directory to ~load-path~ in =.init= file:
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(add-to-list 'load-path "/path/to/ob-sclang/") (add-to-list 'load-path "/path/to/ob-sclang/")

View file

@ -1,11 +1,12 @@
;;; ob-sclang.el --- org-babel functions for sclang evaluation ;;; ob-sclang.el --- Org-babel interface for SuperCollider -*- coding: utf-8;
;; Copyright (C) 2018 Michal Seta ;; Copyright (C) 2018 Michal Seta
;; Author: Michal Seta ;; Author: Michal Seta
;; Keywords: supercollider, literate programming, reproducible research ;; Keywords: supercollider, literate programming, multimedia, languages, tools
;; Homepage: https://github.com/djiamnot/ob-sclang.git ;; URL: https://github.com/djiamnot/ob-sclang
;; Version: 0.02 ;; Package-Requires: ((emacs "26.1") (sclang "1.0"))
;; Version: 0.3
;;; License: ;;; License:
@ -24,21 +25,21 @@
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA. ;; Boston, MA 02110-1301, USA.
;;; Requirements: ;;; Commentary:
;;; sclang requires SuperCollider, of course. You need to have both the SuperCollider ;; ob-sclang enables SuperCollider source blocks to be used in org files
;;; system installed and the sclang-mode
;;; SuperCollider can be found at https://github.com/supercollider/supercollider
;;; Code: ;;; Code:
(require 'ob) (require 'ob)
(require 'sclang) (require 'sclang)
;; optionally define a file extension for this language ;; add file extensions for sclang
(add-to-list 'org-babel-tangle-lang-exts '("sclang" . "scd")) (add-to-list 'org-babel-tangle-lang-exts '("sclang" . "scd"))
;; optionally declare default header arguments for this language ;; declare default header arguments for sclang code blocks
(defvar org-babel-default-header-args:sclang (defvar org-babel-default-header-args:sclang
'((:results . "none"))) '((:session . "*SCLang:Workspace*")
(:result . "none")))
(defun org-babel-expand-body:sclang (body params) (defun org-babel-expand-body:sclang (body params)
"Expand BODY according to PARAMS, return the expanded body." "Expand BODY according to PARAMS, return the expanded body."
@ -56,37 +57,34 @@
body)) body))
(defun org-babel-sclang-var-to-sclang (var) (defun org-babel-sclang-var-to-sclang (var)
"Convert an elisp value to a string of sclang code represting the value of the "Convert an elisp value VAR to a string of sclang code.
variable with correct type." The value of the variable should be represented with correct type."
(if (listp var) (if (listp var)
(concat "[" (mapconcat #'org-babel-sclang-var-to-sclang var ", ") "]") (concat "[" (mapconcat #'org-babel-sclang-var-to-sclang var ", ") "]")
(cond ((stringp var) (format "%S" var)) (cond ((stringp var) (format "%S" var))
((floatp var) (format "%f" var)) ((floatp var) (format "%f" var))
((integerp var) (format "%d" var)) ((integerp var) (format "%d" var))
((symbolp var) (concat (format "%S" (symbol-name var)) ".asSymbol"))) ((symbolp var) (concat (format "%S" (symbol-name var)) ".asSymbol")))))
))
(defun org-babel-execute:sclang (body params) (defun org-babel-execute:sclang (body params)
"Execute a block of Sclang code with org-babel. "Execute a block of sclang code with org-babel.
This function is called by `org-babel-execute-src-block'" This function is called by `org-babel-execute-src-block' with BODY and PARAMS"
(sclang-eval-string (org-babel-expand-body:sclang body params)))
(sclang-eval-string (org-babel-expand-body:sclang body params))
)
(defun org-babel-prep-session:sclang (session params) (defun org-babel-prep-session:sclang (session params)
"Prepare SESSION according to the header arguments specified in PARAMS." "Prepare SESSION according to the header arguments specified in PARAMS."
(error "No need for session preparation") (message "No need for session preparation"))
)
(defun org-babel-sclang-initiate-session (&optional session) (defun org-babel-sclang-initiate-session (&optional session)
"If there is not a current inferior-process-buffer in SESSION then create. "If there is not a current inferior-process-buffer in SESSION then create one.
Return the initialized session." Return the initialized session."
(unless (string= session "none") (unless (string= session "none")
(let (session (if sclang-library-initialized-p (let ((session (if sclang-library-initialized-p
sclang-post-buffer sclang-post-buffer
(save-window-excursion (save-window-excursion
(sclang-start) (sclang-start)
(current-buffer) )))))) (current-buffer)))))
session)))
(provide 'ob-sclang) (provide 'ob-sclang)
;;; ob-sclang.el ends here ;;; ob-sclang.el ends here