{"id":18037678,"url":"https://github.com/bbatsov/ob-clojure-literate","last_synced_at":"2026-01-16T04:04:06.709Z","repository":{"id":66234787,"uuid":"116245620","full_name":"bbatsov/ob-clojure-literate","owner":"bbatsov","description":"Setup scaffold for Clojure Literate Programming in Org-mode.","archived":false,"fork":false,"pushed_at":"2018-01-04T10:15:28.000Z","size":30,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-05T00:27:12.635Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Emacs Lisp","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"purcell/ob-clojure-literate","license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bbatsov.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2018-01-04T10:15:03.000Z","updated_at":"2023-07-15T08:08:55.000Z","dependencies_parsed_at":"2024-01-29T19:08:11.792Z","dependency_job_id":null,"html_url":"https://github.com/bbatsov/ob-clojure-literate","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bbatsov/ob-clojure-literate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbatsov%2Fob-clojure-literate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbatsov%2Fob-clojure-literate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbatsov%2Fob-clojure-literate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbatsov%2Fob-clojure-literate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bbatsov","download_url":"https://codeload.github.com/bbatsov/ob-clojure-literate/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bbatsov%2Fob-clojure-literate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28477206,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T03:13:13.607Z","status":"ssl_error","status_checked_at":"2026-01-16T03:11:47.863Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-30T13:13:16.907Z","updated_at":"2026-01-16T04:04:06.694Z","avatar_url":"https://github.com/bbatsov.png","language":"Emacs Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"#+TITLE: ob-clojure-literate\n\n* Screenshots\n\n** use default session\n\n#+begin_src org\n,#+begin_src clojure :session \"*cider-repl ob-clojure*\" :results output\n(prn *ns*)\n,#+end_src\n\n,#+RESULTS:\n: #namespace[user]\n#+end_src\n\n** support generate plot\n\n** support header argument :dir\n\n\n* Installation\n\n** use-package\n\n#+begin_src emacs-lisp\n(use-package ob-clojure-literate\n  :ensure t\n  :after org\n  :init\n  (setq ob-clojure-literate-auto-jackin-p t)\n  (add-hook 'org-mode-hook #'ob-clojure-literate-mode)\n  )\n#+end_src\n\n\n* Motivation\n\nI like Emacs Org-mode \"Literate Programming\" very much. It's a kind of paradigm.\nI can apply this idea on many places. Now Clojure is my favourite programming\nlanguage. I hope to combine them together. But ~ob-clojure~ does not suitable for\nLiterate Programming very much like other language babel (like Python) supports.\n\n_This README is totally written in Org-mode Literate Programming._\n\nSo I decide to solve this problem in my way.\n\n\n* Todos\n\n** TODO Support generate inline plot image under current working directory\n:LOGBOOK:\n- State \"TODO\"       from              [2017-12-22 Fri 09:52]\n:END:\n\n** TODO Support babel header argument :dir\n:LOGBOOK:\n- State \"TODO\"       from              [2017-12-22 Fri 09:52]\n:END:\n\n\n* Usage\n\n** This package workflow\n\n*** auto start an CIDER REPL for ob-clojure\n\n1. First, create a plain Clojure project with Leiningen to used for ob-clojure.\n\n   #+begin_src shell :dir \"~/.emacs.d/Org-mode/\"\n   lein new ob-clojure\n   #+end_src\n\n2. Then auto start CIDER REPL session in this plain Clojure project.\n\n   1. Set ob-clojure default header arguments to a static session name:\n\n      #+begin_src emacs-lisp\n      (add-to-list 'org-babel-default-header-args:clojure\n                   '(:session . \"*cider-repl ob-clojure*\"))\n      #+end_src\n\n   2. open a file in project to prepare for CIDER jack-in.\n\n      #+begin_src emacs-lisp\n      (progn\n        (find-file (expand-file-name \"~/.emacs.d/Org-mode/ob-clojure/src/ob_clojure/core.clj\"))\n        (cider-jack-in))\n      #+end_src\n\n3. To fix ~org-babel-execute:clojure~ has a line ~(cider-current-ns)~ which will\n   invoke ~(cider-find-ns)~. The ~(cider-find-ns)~ will try to extract Clojure\n   namespace from current buffer.\n\n   This will cause a problem, like in following org-mode file content:\n\n   #+begin_src org\n   ,* test results output\n\n   ,#+BEGIN_SRC clojure :result output\n   (println \"hi\")\n   (println (str *ns*))\n   ,#+END_SRC\n\n   When I execute first src block [C-c C-c], it will find namespace and\n   return wrong namespace ~kk~ in second src block. This is not a\n   expected behavior.\n\n   ,* different namespace\n\n   ,#+BEGIN_SRC clojure :result output\n   (in-ns 'kk)\n   (println (str *ns*))\n   ,#+END_SRC\n   #+end_src\n\n   In order to fix this problem, I asked a lot of places, and try many methods.\n\n   Finally I found the variable ~cider-buffer-ns~ (which in function\n   ~cider-current-ns~) docstring description.\n\n   #+begin_example\n   Current Clojure namespace of some buffer.\n\n   Useful for special buffers (e.g. REPL, doc buffers) that have to\n   keep track of a namespace.\n\n   This should never be set in Clojure buffers, as there the namespace\n   should be extracted from the buffer's ns form.\n   #+end_example\n\n   Then I come up an idea:\n\n   - should I include org-mode as special for CIDER ~cider-buffer-ns~?\n     - It is ~nil~ in Clojure buffer.\n     - It is \"~user~\" in ~cider-repl ob-clojure~ session.\n     - Maybe I should use elisp code to manually set this ~ns~ to ~user~.\n\n4. So the final solution source code is:\n\n   #+begin_src emacs-lisp\n   ;; auto start CIDER REPL session in a complete Leiningen project environment for Org-mode Babel by jack-in.\n   (add-to-list 'org-babel-default-header-args:clojure\n                '(:session . \"*cider-repl ob-clojure*\"))\n\n   (progn\n     (find-file (expand-file-name \"~/.emacs.d/Org-mode/ob-clojure/src/ob_clojure/core.clj\"))\n     (cider-jack-in))\n\n   (defun ob-clojure-cider-do-not-find-ns ()\n     \"Fix the issue that `cider-current-ns' try to invoke `clojure-find-ns' to extract ns from buffer.\"\n     (setq-local cider-buffer-ns \"user\"))\n   (add-hook 'org-mode-hook #'ob-clojure-cider-do-not-find-ns)\n   #+end_src\n\n   But the function ~ob-clojure-cider-don-not-find-ns~ can be smarter:\n\n   How to execute elisp code in a specific buffer without actually switching to\n   it? I can writing a function get a buffer local variable in a specific (regex\n   matched) buffer.\n\n   #+begin_src emacs-lisp\n   (defun ob-clojure-cider-do-not-find-ns ()\n     \"Fix the issue that `cider-current-ns' try to invoke `clojure-find-ns' to extract ns from buffer.\"\n     (with-current-buffer \"*cider-repl ob-clojure*\"\n       (defvar ob-clojure-cider-repl-ns cider-buffer-ns)\n       (setq-local cider-buffer-ns ob-clojure-cider-repl-ns)))\n   #+end_src\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbbatsov%2Fob-clojure-literate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbbatsov%2Fob-clojure-literate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbbatsov%2Fob-clojure-literate/lists"}