{"id":13862604,"url":"https://github.com/plandes/flex-compile","last_synced_at":"2025-04-23T16:40:35.735Z","repository":{"id":80107513,"uuid":"77727207","full_name":"plandes/flex-compile","owner":"plandes","description":"Run, evaluate and compile functionality for a variety of different languages and modes.","archived":false,"fork":false,"pushed_at":"2025-04-11T23:39:40.000Z","size":337,"stargazers_count":11,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-12T00:29:18.029Z","etag":null,"topics":["cider","compiler-plugin","configuration","emacs","emacs-lisp","ess","melpa","org-mode","python","xml-validation"],"latest_commit_sha":null,"homepage":null,"language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/plandes.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-12-31T05:45:05.000Z","updated_at":"2025-04-11T23:38:12.000Z","dependencies_parsed_at":null,"dependency_job_id":"58ccae61-d92d-418e-a728-63708acea44f","html_url":"https://github.com/plandes/flex-compile","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plandes%2Fflex-compile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plandes%2Fflex-compile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plandes%2Fflex-compile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plandes%2Fflex-compile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/plandes","download_url":"https://codeload.github.com/plandes/flex-compile/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250471880,"owners_count":21436035,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cider","compiler-plugin","configuration","emacs","emacs-lisp","ess","melpa","org-mode","python","xml-validation"],"created_at":"2024-08-05T06:01:48.420Z","updated_at":"2025-04-23T16:40:35.719Z","avatar_url":"https://github.com/plandes.png","language":"Emacs Lisp","funding_links":[],"categories":["Emacs Lisp"],"sub_categories":[],"readme":"# Flexible Evaluation and Compilation\n\n[![MELPA badge][melpa-badge]][melpa-link]\n[![MELPA stable badge][melpa-stable-badge]][melpa-stable-link]\n[![Build Status][build-badge]][build-link]\n\n\nRun, evaluate and compile functionality for a variety of different languages\nand modes.  The specific \"compilation\" method is different across each add-on\nlibrary, which are called *flexible compilers*.  For example, for ESS and\nClojure you can evaluate a specific file and/or evaluate a specfic expression\nvia a REPL.  For running a script or starting a `make` an async process is\nstarted.\n\n\n\u003c!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc --\u003e\n## Table of Contents\n\n- [Introduction](#introduction)\n    - [Motivation](#motivation)\n- [Configuration](#configuration)\n- [Usage](#usage)\n    - [Special Cases](#special-cases)\n- [Compiler Configuration](#compiler-configuration)\n    - [Revealing The Interactive Buffer](#revealing-the-interactive-buffer)\n- [Compilers](#compilers)\n    - [Choice program](#choice-program)\n    - [CLI Python](#cli-python)\n    - [Clojure](#clojure)\n    - [Comint](#comint)\n    - [Command](#command)\n    - [Do nothing](#do-nothing)\n    - [Emacs speaks statistics](#emacs-speaks-statistics)\n    - [Lisp](#lisp)\n    - [Make](#make)\n    - [Org mode](#org-mode)\n    - [Python](#python)\n    - [Script](#script)\n    - [XML](#xml)\n- [Invoking a Compiler Programmatically](#invoking-a-compiler-programmatically)\n- [Writing Your Own Compiler](#writing-your-own-compiler)\n- [Changelog](#changelog)\n- [License](#license)\n\n\u003c!-- markdown-toc end --\u003e\n\n## Introduction\n\nThe general idea is the keybindings to compile you get use to are \"switched\" to\nwhatever specific problem you're working on.  For example, if you're compiling\nwith a makefile, use the *make* compiler to initiate an make process.  If\nyou're working with a REPL based langauage (i.e. [flex-compile-python],\n[flex-compile-clojure] etc) instead a buffer or expression is evaluated.\n\n\n### Motivation\n\nMany of the \"compilers\" (i.e. the [flex-compile-command] and\n[flex-compile-script]) don't do much more than invoke a function or execute a\nscript.  However, when jumping between several development tasks the strength\nof the library comes from easily switching between compilers using the same\nkeybindings and finger muscle memory to invoke them.\n\n\n## Configuration\n\nTo install the package from [MELPA], add the following to your `~/.emacs` file:\n```emacs-lisp\n(unless (assoc-default \"melpa-stable\" package-archives)\n  (add-to-list 'package-archives\n               '(\"melpa-stable\" . \"https://stable.melpa.org/packages/\") t))\n\n(use-package flex-compile\n  :ensure t\n  ;; recommended global key bindings\n  :bind ((\"C-x C-p\" . flex-compiler-do-activate)\n         (\"C-x C-u\" . flex-compiler-do-compile)\n         (\"C-x C-y\" . flex-compiler-do-clean)\n         (\"C-x C-i\" . flex-compiler-do-run-or-set-config)\n         ;; clobbers `delete-blank-lines'\n         (\"C-x C-o\" . flex-compiler-do-eval)))\n```\nThis loads the library and creates global key bindings.\n\n\n## Usage\n\nMost flexible compilers (any subclass of `config-flex-compiler`) define a\nspecific source file called the *config* file.\n\nThere are the operations (also included are the [given](#key-bindings) key\nbindings):\n* **Choose a Compiler** (`C-x C-p` or `M-x flex-compiler-do-activate`):\n  select/activate a flex compiler.\n* **Set Configuration** (`C-u C-x C-u` or `C-u M-x flex-compiler-do-compile`):\n  This allows the configuration of the compiler.  In most compilers the first\n  step is to select the property, then the configuration for that property is\n  prompted.  In some cases a specific property is set, like the [Make](#make)\n  compiler jumps to the target.  All\n  properties are always available for configuration with `C-u 0 C-x C-u`.  \n* **Select or Get Information** (`M-x flex-compiler-do-list`): This displays a\n  list of available compilers that are selectable with RET or provide\n  documentation and configuration with `?`.  In addition, `e` configures the\n  compiler.\n* **Prompt for Config File** (`C-u 1 C-x C-u` or `C-u 1 M-x\n  flex-compiler-do-compile`): This the file the compiler will use.  For example,\n  the [Script](#script) compiler will run selected script file and display the\n  output on compile.  For REPL compilers, like the [Python](#python) copiler,\n  the starting directory can also be set (see **Set Configuration**)..\n* **Set Config File** (`C-u 1 C-x C-i` or `C-u 1\n  flex-compiler-do-run-or-set-config`): This sets the *config* file to compile, run\n  or interpret.  The term *config* is a nomenclature and examples include\n  `Makefile`, `.clj`, `.r`, `.sh` files.\n* **Go to Config File** (`C-u C-x C-i` or `C-u M-x\n  flex-compiler-do-run-or-set-config`): This displays the *config* file/buffer to\n  the current buffer.  For some compilers, this also displays the interactive\n  (i.e. REPL) buffer.  See the [reveal\n  buffer](#revealing-the-interactive-buffer) section for more information, and\n  specifically how to force show the buffer.\n* **Compile** (`C-x C-u` or `M-x flex-compiler-do-compile`): This is the default\n  *make something* command.  For make it invokes the first target, for REPL\n  languages like Clojure and ESS it evaluates a `.clj` or `.r` file.\n* **Run** (`C-x C-i` or `M-x flex-compiler-do-run-or-set-config`): This starts\n  invokes a `run` target for make, starts the REPL for REPL type languages.\n* **Evaluate** (`C-x C-o` or `M-x flex-compiler-do-eval`): This invokes the\n  compiler's evaluation functionality.  For REPL based languages, this\n  evaluates the current form and stores the result in the kill buffer.\n* **Clean** (`C-x C-y` or `M-x flex-compiler-do-clean`): This invokes the `clean`\n  target for make and kills the REPL for REPL based compilers.\n* **Generate Compiler Docs** (`M-x flex-compiler-doc-show`): this generates the\n  documentation given in the [compilers](#compilers) section (verbatim).\n\nEach compiler also has configuration setting ability, which is invoked with the\n`C-u` universal argument to the compile `C-x C-u` invocation per the\naforementioned `flex-compiler-do-run-or-set-config`.\n\n\n### Special Cases\n\nSome compilers are configured differently for the default configuration key\nbinding.  For example the [make](#make) compiler sets the make target defined\nin the make file, and in this case uses `C-u 0 C-u` to set configuration\nproperties.\n\n\n## Compiler Configuration\n\nThis package uses a configuration system that moves the responsibility out of\nthe specific compilers for configuration.  This package extends from the\n`config-manage` framework in the [buffer manage] library by extending and\nbuilding configuration meta data.  For example, the `M-x flex-compiler-list`\nlists available compiler with `?` providing information and `e` configuring the\ncompiler.\n\n\n### Revealing The Interactive Buffer\n\nOne of the features of the *flex compiler* library is it provides specific\nbehavior on example where and how to display buffers, which is a compiler\nconfiguration.  These buffers are usually interactive buffers, i.e. REPL\nbuffers.  Any compiler that extends `single-buffer-flex-compiler` has this\ncapability, which include the following:\n\n* [flex-compile-make]\n* [flex-compile-command]\n* [flex-compile-cli]\n* [flex-compile-script]\n* [flex-compile-clojure]\n* [flex-compile-python]\n* [flex-compile-ess]\n* [flex-compile-xml-validate]\n* [flex-compile-choice-program]\n\n\nThe two properties for these compilers include:\n\n* **Buffer New Mode**: used when the interactive buffer is created.\n* **Buffer Exists Mode**: used when the interactive buffer is already exists.\n\n\nThese can be set to the *Global* settings, which means to take it from the\ncustomzied variables `flex-compile-single-buffer-display-buffer-new-mode` and\n`flex-compile-single-buffer-display-buffer-exists-mode`.  These variables and\nthe compiler level properties can be set to one of:\n\n* **Switch to Buffer** means to first pop then switch to the buffer.\n* **Display Buffer** means to show the buffer in a different window.\n* **Next Frame Otherwise Switch** means to use the next frame if there are\n  multiple frames, otherwise pop and switch to the buffer.\n* **Next Frame Otherwise Display** means to use the next frame if there are\n  multiple frames, otherwise show buffer.\n* **Next Frame Skip Switch** means to do nothing there are multiple frames,\n  otherwise pop and switch to the buffer.\n* **Next Frame Skip Display** means to do nothing there are multiple frames,\n  otherwise display the buffer.\n* **Never** means to never show the buffer.\n* **Only If Error** means to display the buffer if at least one error was\n  detected such a compilation error with the [make](#make) compiler.  **Note**:\n  and not all compilers support this option.\n\nThe decision of where to show a buffer (or not) happens either when the\ninterative buffer is created or during a compilation.  In many cases you might\nnot want to ever show the buffer, so you could set both buffer `new` and\n`exist` properties to *never*.  In this case, you still force the interactive\nbuffer with `C-u 2 C-x C-i` or `C-u 2 M-x flex-compiler-run-or-set-config`.\n\n\n## Compilers\n\nConcrete instances of *flexible* compilers that provide a common interface.\nEach is an implementation of glue code to the respective compilation method.\n\nNote that all compilers that extend from `conf-file-flex-compiler`, which\ninclude `make`, `script`, `xml-validate`, `org-mode`, `python`, `clojure`, and\n`ess` have their `start-directory` property unset each time the `config-file`\nis set.\n\nThis documentation was generated with `M-x flex-compiler-doc-show`.\n\n\n### Choice program\n\nPrompt and more easily invoke choice/action based programs using the\n[Choice Program](https://github.com/plandes/choice-program) Emacs library.\n\nProperties:\n  * Program: An instance of `choice-program`.\n  * Action: The action to invoke on the program.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n\n\n### CLI Python\n\nProvides support for user input for action mnemonics and options using Python\nprograms that use the\n[Zensols action CLI](https://plandes.github.io/util/doc/command-line.html).\n\nThis compiler gets the command line metadata as a list of actions and their\nrespective positional and option arguments.  It this prompts the user with\ndocumentation associated, first the action, then the action's arguments.\nFinally, it constructs the command line and executes the Python program with\nthe arguments.\n\nProperties:\n  * Action: The action to invoke on the program.\n  * Config File: The file to use for *configuring* the compiler.\n  * Arguments: The arguments to give to the script.\n  * Cache Metadata: \n    Whether or not to cache the Python program's CLI metadata.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n  * Start Directory: The directory for starting the compilation.\n\n\n### Clojure\n\nThis is a REPL based compiler that allows for evaluation Clojure\nbuffers, expressions and starting the REPL using\n[Cider](https://github.com/clojure-emacs/cider).\n\nThe Clojure compiler connects using two Cider modes: the default `jack-in`\nmode or connecting to a host and port remotely with `cider-connect`.  You can\nswitch betwee these two methods with the [given keybindings](#key-bindings):\n\n  `M-x 1 C-u C-x C-u`\n\nSee documetation with `M-h f flex-compiler-query-eval` method for more\ninforamtion (and current binding).\n\nTodo: support multiple Cider buffers as this implementation currently does\nnot.\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n  * Connect Mode: Defines how to connect to a Clojure REPL.\n  * Repl Port: The port running the REPL; default: 32345\n  * Output Clear: Whether or not to clear comint buffer after a compilation.\n  * Prompt Kill Repl Buffer: If non-`nil` then prompt to kill a REPL buffer on clean.\n  * Repl Buffer Start Timeout: Number of seconds as an integer to wait to start before giving up (and not\n    displaying).\n  * Repl Buffer Start Wait: Number of seconds (as a float) to wait before issuing any first command to the\n    REPL.\n  * Start Directory: The directory for starting the compilation.\n\n\n### Comint\n\nSend text to any running `comint` buffer.\nThis is useful for entering a command in a shell, SQL etc buffer that otherwise\nrequires switching back and forth between buffers, which is a hassle.\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Content: The string to insert in the buffer referred by the `buffer` slot.\n  * Buffer: The buffer to insert the `content` slot.\n  * Start Directory: The directory for starting the compilation.\n\n\n### Command\n\nThis \"compiler\" is more of a convenience to invoke an Emacs Lisp function or\nform.  This is handy for functions that you end up invoking over and over with\n`M-x` (i.e. `cider-test-run-ns-tests`).  See [motivation](#motivation).\n\nProperties:\n  * Sexp: The symbol expression to evaluate.\n\n\n### Do nothing\n\nA no-op compiler for the disabled state.\n\n\n### Emacs speaks statistics\n\nThis is a REPL based compiler to evaluate R code with\n[Emacs Speaks Statistics](https://ess.r-project.org) .\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n  * Output Clear: Whether or not to clear comint buffer after a compilation.\n  * Prompt Kill Repl Buffer: If non-`nil` then prompt to kill a REPL buffer on clean.\n  * Repl Buffer Start Timeout: Number of seconds as an integer to wait to start before giving up (and not\n    displaying).\n  * Repl Buffer Start Wait: Number of seconds (as a float) to wait before issuing any first command to the\n    REPL.\n  * Start Directory: The directory for starting the compilation.\n\n\n### Lisp\n\nThis is a REPL based compiler that allows for evaluation Lisp buffers and\nexpressions using [slime](https://github.com/slime/slime).\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n  * Compile On Load: Whether to also compile when loading the source file.\n  * Output Clear: Whether or not to clear comint buffer after a compilation.\n  * Prompt Kill Repl Buffer: If non-`nil` then prompt to kill a REPL buffer on clean.\n  * Repl Buffer Start Timeout: Number of seconds as an integer to wait to start before giving up (and not\n    displaying).\n  * Repl Buffer Start Wait: Number of seconds (as a float) to wait before issuing any first command to the\n    REPL.\n  * Start Directory: The directory for starting the compilation.\n\n\n### Make\n\nThis compiler invokes make as an asynchronous process in a\nbuffer.  The first target, `run` target, and `clean` target are\ninvoked respectfully with *compile*, *run* and *clean* Emacs\ncommands (see [usage](#usage)).\n\nThis is a special compiler in it's configuration.  Instead of\nsetting properties, the default configuration mechanism is to set\nthe make target instead.  If you want to set a flex compiler\nproperty, use `\\C-u 0 \\C-u`.\n\nWhen setting the configuration file the target property is unset.\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Target: The make file target to satisfy.\n  * Run Target: The target used to run or test as the secondary compilation functionality.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n  * Start Directory: The directory for starting the compilation.\n\n\n### Org mode\n\nThis compiler exports [Org mode](https://orgmode.org) to external formats and\nthen shows the output in the browser.  Only HTML is currently supported.\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Export Fn: The Org mode export function.\n  * Open File: Whether to open the file after exported.\n  * Output Directory: The output directory.\n  * Frame Focus Command: \n    The command to refocus the Emacs frame after rendering the output (browser).\n  * Frame Focus Delay: Seconds before refocusing the Emacs frame after redering the output.\n  * Start Directory: The directory for starting the compilation.\n\n\n### Python\n\nThis is a REPL based compiler that allows for evaluation Python buffers and\nexpressions using [python mode](https://github.com/fgallina/python.el).\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n  * Output Clear: Whether or not to clear comint buffer after a compilation.\n  * Prompt Kill Repl Buffer: If non-`nil` then prompt to kill a REPL buffer on clean.\n  * Repl Buffer Start Timeout: Number of seconds as an integer to wait to start before giving up (and not\n    displaying).\n  * Repl Buffer Start Wait: Number of seconds (as a float) to wait before issuing any first command to the\n    REPL.\n  * Start Directory: The directory for starting the compilation.\n\n\n### Script\n\nThis compiler runs a script with optional arguments in an async buffer.\nSee [motivation](#motivation).\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n  * Arguments: The arguments to give to the script.\n  * Start Directory: The directory for starting the compilation.\n\n\n### XML\n\nImplementation compiler for XML validation using command line\n[xmllint](http://xmlsoft.org/xmllint.html) command line tool.\n\nProperties:\n  * Config File: The file to use for *configuring* the compiler.\n  * Schema File: Location of the schema file to validate against.\n  * Buffer Exists Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-exists-mode`.\n  * Buffer New Mode: Compiler instance of `flex-compile-single-buffer-display-buffer-new-mode`.\n  * Kill Buffer Clean: If non-nil kill the buffer on clean.\n  * Start Directory: The directory for starting the compilation.\n\n\n## Invoking a Compiler Programmatically\n\nThere might be instances where it's necessary to execute other actions along\nwith a compilation.  If you know Emacs Lisp, you can create your own function\nto invoke other compilers, and then use the [Command](#command) compiler to\ninvoke it as a command (an interactive function), such as:\n\n```lisp\n(defun clean-and-call-python-compiler ()\n  \"Invoke `make clean', then call the Python compiler.\"\n  (interactive)\n  (shell-command \"make clean\")\n  (let ((this (flex-compiler-by-name \"python\")))\n    (flex-compiler-compile this)))\n```\n\nOther Emacs Lisp snippets that do things with compilers:\n```lisp\n;; names of compilers\n(let* ((this flex-compile-manage-inst)\n       (names (config-manager-entry-names this)))\n  names)\n\n;; the currently set compiler's name and descriptor\n(let* ((this flex-compile-manage-inst)\n       (active (flex-compile-manager-active this)))\n  (format \"Current compiler: %s (desc: %s)\"\n      (slot-value active 'object-name)\n      (slot-value active 'description)))\n\n;; get a compiler by name and set its configuration file\n(let ((this (flex-compiler-by-name \"python\")))\n  (with-slots (config-file start-directory) this\n    (setq config-file \"~/work/src/example.py\"\n          start-directory \"~/work\")))\n\n;; run the compiler\n(let ((this (flex-compiler-by-name \"python\")))\n  (flex-compiler-compile this))\n\n;; set the active compilerby name\n(let ((this flex-compile-manage-inst))\n  (config-manager-activate this \"python\"))\n```\n\n\n## Writing Your Own Compiler\n\nWriting your own flexible compiler is pretty easy if you know how to write\nEmacs object oriented programs.  Even if you don't, you should be able to find\na compiler already written that follows your use case among those concerete\n(see [compilers](#compilers)) that are already given in this package.  You can\nalso submit an issue (see the [contributing instructions](CONTRIBUTING.md)).\n\n\n## Changelog\n\nAn extensive changelog is available [here](CHANGELOG.md).\n\n\n## License\n\nCopyright © 2017-2025 Paul Landes\n\nGNU Lesser General Public License, Version 2.0\n\n\n\u003c!-- links --\u003e\n[flex-compile-make]: #make\n[flex-compile-command]: #command\n[flex-compile-cli]: #cli-python-file\n[flex-compile-script]: #script\n[flex-compile-clojure]: #clojure\n[flex-compile-python]: #python\n[flex-compile-ess]: #ess\n[flex-compile-xml-validate]: #xml-validation\n[flex-compile-choice-program]: #choice-program\n\n[melpa-link]: https://melpa.org/#/flex-compile\n[melpa-stable-link]: https://stable.melpa.org/#/flex-compile\n[melpa-badge]: https://melpa.org/packages/flex-compile-badge.svg\n[melpa-stable-badge]: https://stable.melpa.org/packages/flex-compile-badge.svg\n[build-badge]: https://github.com/plandes/flex-compile/workflows/CI/badge.svg\n[build-link]: https://github.com/plandes/flex-compile/actions\n\n[MELPA]: https://melpa.org/\n\n[buffer manage]: https://github.com/plandes/buffer-manage\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplandes%2Fflex-compile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplandes%2Fflex-compile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplandes%2Fflex-compile/lists"}