{"id":18681295,"url":"https://github.com/psycofdj/xtdmacs","last_synced_at":"2025-10-30T01:32:06.279Z","repository":{"id":192751003,"uuid":"59885397","full_name":"psycofdj/xtdmacs","owner":"psycofdj","description":"Multi-language emacs development tools","archived":false,"fork":false,"pushed_at":"2025-02-01T10:01:51.000Z","size":1513,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-01T11:18:24.346Z","etag":null,"topics":["compilation","development-environment","emacs"],"latest_commit_sha":null,"homepage":"","language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/psycofdj.png","metadata":{"files":{"readme":"README.md","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,"publiccode":null,"codemeta":null}},"created_at":"2016-05-28T08:41:54.000Z","updated_at":"2025-02-01T10:01:54.000Z","dependencies_parsed_at":"2024-05-08T12:43:07.579Z","dependency_job_id":"b87631bd-2e51-4c62-9152-6e1bd94c9a7d","html_url":"https://github.com/psycofdj/xtdmacs","commit_stats":null,"previous_names":["psycofdj/xtdmacs"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psycofdj%2Fxtdmacs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psycofdj%2Fxtdmacs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psycofdj%2Fxtdmacs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psycofdj%2Fxtdmacs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/psycofdj","download_url":"https://codeload.github.com/psycofdj/xtdmacs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238921035,"owners_count":19552678,"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":["compilation","development-environment","emacs"],"created_at":"2024-11-07T10:06:49.140Z","updated_at":"2025-10-30T01:32:00.866Z","avatar_url":"https://github.com/psycofdj.png","language":"Emacs Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"\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- [Install](#install)\n- [Loading modes](#loading-modes)\n- [General purpose modes](#general-purpose-modes)\n    - [Bindings](#bindings)\n        - [Cursor Bindings](#cursor-bindings)\n        - [Other bindings](#other-bindings)\n    - [File Opener](#file-opener)\n    - [Generic code](#generic-code)\n        - [Column enforce](#column-enforce)\n        - [Line number](#line-number)\n        - [Aligning variables and parameters](#aligning-variables-and-parameters)\n        - [Code Bindings](#code-bindings)\n    - [Compile](#compile)\n        - [Window management](#window-management)\n        - [Behind the curtain](#behind-the-curtain)\n        - [Compile API](#compile-api)\n            - [Helper functions](#helper-functions)\n            - [Params functions](#params-functions)\n            - [Command functions](#command-functions)\n        - [Compile Configuration](#compile-configuration)\n            - [Standard customization](#standard-customization)\n            - [Per project commands](#per-project-commands)\n            - [Per mode commands](#per-mode-commands)\n        - [Compile Bindings](#compile-bindings)\n    - [Line mode](#line-mode)\n    - [Spelling](#spelling)\n        - [Spell Configuration](#spell-configuration)\n        - [Spell Faces](#spell-faces)\n        - [Spell API](#spell-api)\n        - [Spell Bindings](#spell-bindings)\n- [Language specific modes](#language-specific-modes)\n    - [C++](#c)\n        - [C++ Configuration](#c-configuration)\n        - [C++ Faces](#c-faces)\n        - [C++ API](#c-api)\n        - [C++ Bindings](#c-bindings)\n        - [C++ Compilation](#c-compilation)\n    - [Go](#go)\n        - [Go Configuration](#go-configuration)\n        - [Go Faces](#go-faces)\n        - [Go API](#go-api)\n        - [Go Bindings](#go-bindings)\n        - [Go Compilation](#go-compilation)\n    - [Python](#python)\n        - [Python Faces](#python-faces)\n        - [Python API](#python-api)\n        - [Python Configuration](#python-configuration)\n        - [Python Compilation](#python-compilation)\n    - [Php](#php)\n        - [Php Faces](#php-faces)\n        - [Php Configuration](#php-configuration)\n    - [Lisp](#lisp)\n        - [Configuration](#configuration)\n    - [Shell](#shell)\n        - [Shell Compilation](#shell-compilation)\n    - [Json](#json)\n        - [Json Bindings](#json-bindings)\n        - [Json Compilation](#json-compilation)\n    - [Yaml](#yaml)\n        - [Yaml Bindings](#yaml-bindings)\n        - [Yaml Compilation](#yaml-compilation)\n    - [Web](#web)\n    - [Makefile](#makefile)\n    - [Java](#java)\n    - [Javascript](#javascript)\n    - [Sphinx](#sphinx)\n        - [Sphinx Compilation](#sphinx-compilation)\n\n\u003c!-- markdown-toc end --\u003e\n\n# Introduction\n\nXtdmacs provides a bunch a development tools and ready-to-use configuration.\nEach feature is bundled as a separate minor mode.\n\n\n# Install\n\nXtdmacs depends on [yaml-path](https://github.com/psycofdj/yaml-path) which is not yet included\nas MELPA package and should be installed manually following [instructions](https://github.com/psycofdj/yaml-path).\n\n\nThe following procedure downloads latest package version and install xtdmacs and\nall its dependencies in your elpa directory, usually `~/.emacs.d/elpa`.\n\n ```bash\n tag=$(curl -s https://api.github.com/repos/psycofdj/xtdmacs/tags | jq -r '[ .[] | .[\"name\"] ] | sort | last')\n wget https://github.com/psycofdj/xtdmacs/archive/${tag}.tar.gz -O xtdmacs-${tag}.tar.gz\n tar xvzf xtdmacs-${tag}.tar.gz\n cd xtdmacs-${tag}\n make install\n ```\n\n# Loading modes\n\nEach mode provided by xtdmacs can be loaded like every other minor mode. However we recommend\nto use the **`xtdmacs-loader`** described below.\n\n* **Manually**\n\n  Example:\n  `M-x xtdmacs-bindings-mode RET`\n\n* **From ~/.emacs**\n\n  Example:\n  `(xtdmacs-bindings-mode)`\n\n* **Using customization**\n\n  `M-x customize-variable RET xtdmacs-bindings-mode RET`\n\n* **Using xtdmacs's loader**\n\n  **`xtdmacs-loader`** package provides its own minor-mode loading system. It is very similar\n  to default `minor-mode-alist` but allows to define the same mode list to several file extensions.\n\n  This package helps customizing which minors modes should be loaded for each\n  file extensions.\n\n  In order modify associations between file extensions are minor modes, the easiest is to\n  run the following command:\n  * `M-x customize-variable RET xtdmacs-loader-auto-minor-mode-alist RET`\n\n  ![alt text](doc/xtdmacs-loader.png \"Logo Title Text 1\")\n\n\n  To enable `xtdmacs-loader`, you need to load package at start up :\n  ```elisp\n  ;; in your ~/.emacs\n  (require 'xtdmacs-loader)\n  ```\n\n\n\n# General purpose modes\n\n## Bindings\n\n**`xtdmacs-bindings`** setup keyboard bindings for the most commonly used features.\n\nThe [ido](https://www.emacswiki.org/emacs/InteractivelyDoThings) mode provides an efficient way\nto navigate among opened buffers. Ido display available buffer names in mini-buffer and filters the\nlist as you type characters.\n\nIt defines functions to directly cycle among existing buffers. It also\nprovides a way to ignore a list of buffer names in this cycle. Typically,\nusers will ignore systems buffers like `*Help*` or `*Message*`.\n\nIgnored buffers but will be suggested if typed characters matches nothing but\nfiltered buffer names.\n\nTo customize list of ignored buffers :\n`M-x customize-variable RET ido-ignore-buffers RET`\n\nExample:\n![IDO mode](doc/ido-mode.png \"IDO mode\")\n\n\n| Key                           | Effect                                |\n|-------------------------------|---------------------------------------|\n| \\\u003cctrl\\\u003e+x \\\u003cctrl\\\u003e+\\\u003cdown\\\u003e  | Run ido interactive buffer selection  |\n| \\\u003cright\\\u003e                     | (in ido) next buffer suggestion       |\n| \\\u003cleft\\\u003e                      | (in ido) previous buffer suggestion   |\n| RET                           | (in ido) display selected buffer      |\n| \\\u003cctrl\\\u003e+x \\\u003cctrl\\\u003e+\\\u003cright\\\u003e | display next buffer (iflipb)          |\n| \\\u003cctrl\\\u003e+x \\\u003cctrl\\\u003e+\\\u003cleft\\\u003e  | display previous buffer (iflipb)      |\n\n\n### Cursor Bindings\n\n| Key                           | Effect                                |\n|-------------------------------|---------------------------------------|\n| \\\u003chome\\\u003e                      | move cursor to beginning of line      |\n| \\\u003cselect\\\u003e                    | move cursor to end of line            |\n| \\\u003calt\\\u003e+\\\u003cup\\\u003e                | move cursor to beginning of buffer    |\n| \\\u003calt\\\u003e+\\\u003cdown\\\u003e              | move cursor to end of buffer          |\n| \\\u003cctrl\\\u003e+\\\u003cleft\\\u003e             | move cursor to beginning of word      |\n| \\\u003cctrl\\\u003e+\\\u003cright\\\u003e            | move cursor to end of word            |\n| \\\u003cctrl\\\u003e+x \\\u003cright\\\u003e          | move cursor to the right window       |\n| \\\u003cctrl\\\u003e+x \\\u003cleft\\\u003e           | move cursor to the left window        |\n| \\\u003cctrl\\\u003e+x \\\u003cup\\\u003e             | move cursor to the top window         |\n| \\\u003cctrl\\\u003e+x \\\u003cdown\\\u003e           | move cursor to the bottom window      |\n| \\\u003cctrl\\\u003e+x \\\u003cctrl\\\u003e+g         | move cursor to given line             |\n\n### Other bindings\n\n| Key                           | Effect                                |\n|-------------------------------|---------------------------------------|\n| \\\u003cctrl\\\u003e+x \\\u003cctrl\\\u003e+f         | open file with xtdmacs's file opener  |\n| \\\u003calt\\\u003e+\\\u003cplus\\\u003e              | enlarge current window's height       |\n| \\\u003calt\\\u003e+\\\u003cminus\\\u003e             | shrink current window's height        |\n| \\\u003calt\\\u003e+\\\u003cdelete\\\u003e            | delete previous word (no kill-ring)   |\n| \\\u003calt\\\u003e+s                     | display speed-bar                     |\n| \\\u003calt\\\u003e+/                     | auto-complete current word            |\n| \\\u003cctrl\\\u003e+d                    | search and replace                    |\n| \\\u003cctrl\\\u003e+f                    | search and replace regexp             |\n| \\\u003calt\\\u003e+d                     | align regexp                          |\n| \\\u003cctrl\\\u003e+\\\u003cF11\\\u003e              | toggle terminal shell                 |\n| \\\u003cctrl\\\u003e+l                    | insert current date                   |\n| \\\u003calt\\\u003e+q                     | comment region                        |\n| \\\u003calt\\\u003e+a                     | uncomment region                      |\n| \\\u003cF5\\\u003e                        | delete buffer's trailing white-spaces |\n| \\\u003cctrl\\\u003e+\\\u003cF5\\\u003e               | refresh buffer syntax colors          |\n| \\\u003cF11\\\u003e                       | display menu                          |\n\n\n## File Opener\n\n**`xtdmacs-find`** package provides an overload of standard emacs' `find-file`\nfunction. This overload allows to open existing files to specified line and\ncolumn number.\n\n```bash\n# open file to line 38\n$ emacs -nw ~/.emacs:38\n\n# open file to line 38 and column 5\n$ emacs -nw ~/.emacs:38:5\n\n# open file normally\n$ emacs -nw ~/.emacs\n\n# open unexisting file\n$ emacs -nw ~/does_not_exist:20:4\n# this will literally open the file named \"does_not_exist:20:4\"\n```\n\nTo enable Xtdmacs' find overload, you need to load package at start up :\n```elisp\n;;in your .emacs:\n(require 'xtdmacs-find)\n```\n\n\n\n## Generic code\n\n**`xtdmacs-code-mode`** enables multi-language tools that help editing code.\n\n### Column enforce\n\n`column-enforce` colors text beyond a given column, discouraging (but not preventing) the developer\nto make too long lines.\n\nTo customize column limit :\n```\nM-x customize-variable RET fill-column RET\n```\n\nTo customize warning face :\n```\nM-x customize-face RET column-enforce-face RET\n```\n\n### Line number\n\n`linum-mode` displays current line number and fix default window margin\n\n![alt text](doc/xtdmacs-code-linum.png \"Logo Title Text 1\")\n\nTo customize columns number face :\n```\nM-x customize-face RET linum RET\n```\n\nMore generally, to customize the linum mode :\n```\nM-x customize-group RET linum RET\n```\n\n### Aligning variables and parameters\n\nxtdmacs-code-mode provides two utility functions that format a specific region\nto a **matrix readable** form :\n\n- *xtdmacs-code-align-vars*\n- *xtdmacs-code-align-args*\n\n```c++\n// given this code snippet :\n// mark\nvoid myfunction(const std::string\u0026 p_parameter1,\n                int p_param2,\n                std::vector\u003cstd::string\u003e\u0026 p_result);\n// cursor\n\n// xtdmacs-code-align-args between mark and cursor will produce :\nvoid myfunction(const std::string\u0026        p_parameter1,\n                int                       p_param2,\n                std::vector\u003cstd::string\u003e\u0026 p_result);\n\n\n// given this code snippet :\n// mark\n  std::cout \u003c\u003c \"my current process\" \u003c\u003c l_tmp\n            \u003c\u003c \"is about to fail because of \" \u003c\u003c l_reason\n            \u003c\u003c std::endl;\n// cursor\n\n// xtdmacs-code-align-args between mark and cursor will produce :\n  std::cout \u003c\u003c \"my current process\"           \u003c\u003c l_tmp\n            \u003c\u003c \"is about to fail because of \" \u003c\u003c l_reason\n            \u003c\u003c std::endl;\n\n\n\n// given this code snippet :\nvoid foo(void)\n{\n// mark\n  int l_var1 = 0;\n  string l_name = \"bar\";\n  const vector\u003cstring\u003e l_contacts = { \"foo\", \"bar\" };\n// cursor\n}\n\n\n// xtdmacs-code-align-vars between mark and cursor will produce :\nvoid foo(void)\n{\n  int                  l_var1     = 0;\n  string               l_name     = \"bar\";\n  const vector\u003cstring\u003e l_contacts = { \"foo\", \"bar\" };\n}\n```\n\n\nThis feature relies on a strict parameter and variables naming convention.\n- parameters : `p[cs]?_.* | p[cs]?[A-Z].*`\n- variables  : `l[cs]?_.* | l[cs]?[A-Z].*`\n- members    : `m[cs]?_.* | m[cs]?[A-Z].*`\n- globals    : `g[cs]?_.* | g[cs]?[A-Z].*`\n- counters   : `c[cs]?_.* | c[cs]?[A-Z].*`\n\nNote: `c` and `s` optional modifiers stands respectively for const and static\n\n\n\n### Code Bindings\n\n\n| Key                           | Effect                                         |\n|-------------------------------|------------------------------------------------|\n| \\\u003cctrl\\\u003e+\\\u003calt\\\u003e+\\\u003cup\\\u003e       | move cursor to beginning of current expression |\n| \\\u003cctrl\\\u003e+\\\u003calt\\\u003e+\\\u003cdown\\\u003e     | move cursor to end of current expression       |\n| \\\u003calt\\\u003e+q                     | comment region                                 |\n| \\\u003calt\\\u003e+a                     | uncomment region                               |\n| \\\u003cF4\\\u003e                        | indent region                                  |\n| \\\u003cctrl\\\u003e+\\\u003cF4\\\u003e               | indent buffer                                  |\n| \\\u003calt\\\u003e+d                     | runs `align-regexp` interactively              |\n| \\\u003cctrl\\\u003e+\\\u003cF1\\\u003e               | align variables between mark and cursor        |\n| \\\u003cctrl\\\u003e+\\\u003cF2\\\u003e               | align parameters between mark and cursor       |\n| \\\u003calt\\\u003e+f                     | fold current element using `yafolding-mode`    |\n| \\\u003cctrl\\\u003e+\\\u003cF2\\\u003e               | fold all elements using `yafolding-mode`       |\n\n\n## Compile\n\n**`xtdmacs-compile++-mode`** wraps the default compilation mode in order to provide a set of\npredefined compilation commands. It also allows to use function instead of\nplain string as default compile commands.\n\nThere is 6 predefined commands :\n - **:compile**\n - **:test**\n - **:deploy**\n - **:doc**\n - **:lint**\n - **:manual**\n\nWhere each commands are meant to be overridden in each specific language modes.\nBy default, the all run `make -j` in the current directory.\n\n### Window management\n\nxtdmacs-compile++ dedicates a window to the compilation buffer's preventing\nemacs to use it to open new files. It also sets this window's height according\nto `xtdmacs-compile++-buffer-height` variable and enables optionally\nautomatic scrolling if `xtdmacs-compile++-scroll-output` is non nil.\n\n\n### Behind the curtain\n\nThe predefined commands are defined in the `xtdmacs-compile++-config-alist` variable.\n\nWhere `xtdmacs-compile++-config-alist` is an alist of the form\n```lisp\n((\"\u003cmode-name\u003e\" .\n    ((:\u003ccommand1\u003e . config-alist)\n     (:\u003ccommand2\u003e . config-alist))))\n```\n\nand where each *config-alist* is an alist of the form\n```lisp\n((:get-params . function)\n (:command    . string-or-function))\n```\n\n\nThe **`\u003cmode-name\u003e`** gives a different configuration for the current major mode.\nWhen current major mode is not found, it falls back to the **default** key which values is given\nby `xtdmacs-compile++-default-config-alist`.\n\n\nThe **`\u003ccommand\u003e`** is one of the pre-defined command **:compile**, **:test**, **:deploy**, **:doc**\n**:lint** and **:manual**.\n\nThe **`:get-params`** function is called interactively to prompt for specific parameters\nof the command. Ex. for c++ :compile command, we prompt for working directory,\noptional environment variables and specific script to run.\n\nThe **`:command`** item build the final command send to default compilation-mode. Ex. for\nc++ it will construct something like `cd dir \u0026\u0026 key=value make -j` from values\nprompted by `:get-params`.\n\nUsually, **`:get-params`** uses `xtdmacs-compile++-config-alist` itself to store values given by\nuser. It also read defaults values from this variable when ran non interactively.\n```lisp\n((:compile .\n   ((:dir        . \"~/build\")\n    (:env        . \"VE=1\")\n    (:bin        . \"make -j 12\")\n    (:get-params . xtdmacs-compile++-default-params)\n    (:command    . xtdmacs-compile++-default-command))))\n```\n\n### Compile API\n\nThis mode provides utility functions that helps building your own `:get-params`, `:command`\nand default functions value.\n\n#### Helper functions\n\n* **`xtdmacs-compile++-get-nearest-filename (name)`** returns the closest path parent\n  to current buffer file that contains a file or a directory named *name*\n\n* **`xtdmacs-compile++-get-dir-locals-directory`** returns the path containing\n  the nearest .dir-locals.el configuration file (nil if none)\n\n* **`xtdmacs-compile++-get-dir-git`** return the closest parent from buffer containing\n  a *.git* directory, often used as project root directory.\n\n* **`xtdmacs-compile++-get-dir-buffer`** returns the directory path of current buffer.\n\n* **`xtdmacs-compile++-guess-directory`** returns the build directory assuming your\n  are using automake's VPATH builds in a directory named .release in your project root\n\n* **`xtdmacs-compile++-get-current-branch`** returns (if any) the git branch name of\n  the current buffer\n\n#### Params functions\n\n* **`xtdmacs-compile++-default-params(type \u0026optional mode)`**: Prompt\n  interactively for a **Directoy**, some **Environement** variables and for\n  a **Binary** for the current `type`.\n  Defaults values are respectively given by:\n  * `:dir` function/value\n  * `:env` function/value\n  * `:bin` function/value\n\n  In addition, use will be ask if given setting should be store to local buffer or\n  across all buffers.\n\n* **`xtdmacs-compile++-current-file-params(type \u0026optional mode)`** : Only\n  prompts for a **Binary** and a **File**\n  Defaults values are respectively given by:\n  * `:bin` function/value.\n  * `:file` function/value. Note: `buffer-file-name` is often given has\n    default value.\n\n* **`xtdmacs-compile++-compose-params(type \u0026optional mode)`** :\n  like `xtdmacs-compile++-default-params` but also prompts for :\n  * a docker-compose service name, default given by `:service` function/value\n  * a docker-compose file path, default given by `:compose-file` function/value\n\n* **`xtdmacs-compile++-docker-exec-params(type \u0026optional mode)`** :\n  like `xtdmacs-compile++-default-params` but also prompts for :\n  * a container name, default given by `:container` function/value\n\n\n* **`xtdmacs-compile++-docker-run-params(type \u0026optional mode)`** :\n  like `xtdmacs-compile++-default-params` but also prompts for :\n  * a docker image name, default given by `:image` function/value\n\n\n#### Command functions\n\n* **`xtdmacs-compile++-default-command(type \u0026optional mode)`** : build the command as:\n  * `cd :bin \u0026\u0026 :env\u003e :bin`\n\n* **`xtdmacs-compile++-simple-file-command(type \u0026optional mode)`** : build the command as:\n  * `:bin :file`\n\n* **`xtdmacs-compile++-compose-run-command(type \u0026optional mode)`** : build the command as:\n  * `cd :dir \u0026\u0026 SRCDIR=:dir docker-compose -f :compose-file run --rm [-e :env:key=:env:val]* :service :bin`\n\n* **`xtdmacs-compile++-compose-exec-command(type \u0026optional mode)`** : build the command as:\n  * `cd :dir \u0026\u0026 SRCDIR=:dir docker-compose -f :compose-file exec :service :bin`\n\n* **`xtdmacs-compile++-docker-run-command(type \u0026optional mode)`** : build the command as\n  * `docker run --rm=true :image [-e :env:key=:env:val]* /bin/bash -c 'cd :dir \u0026\u0026 :bin'`\n\n* **`xtdmacs-compile++-docker-exec-command(type \u0026optional mode)`** : build the command as\n  * `docker exec -t :container /bin/bash -c 'cd :dir \u0026\u0026 :env :bin'`\n\n\n### Compile Configuration\n\n#### Standard customization\n\nDefine the number of lines displayed in compilation buffer :\n* `M-x customize-variable RET xtdmacs-compile++-buffer-height RET`\n\nEnables automatic scrolling of compilation buffer :\n* `M-x customize-variable RET xtdmacs-compile++-scroll-output RET`\n\nSet commands configuration interactively :\n* `M-x customize-variable RET xtdmacs-compile++-buffer-local RET`\n\nThe following variables targets one of the `xtdmacs-compile++-config-alist` keys.\nEach command is bound to a specific keyboard key.\n- `M-x customize-variable RET xtdmacs-compile++-command-1 RET` : default `:compile`\n- `M-x customize-variable RET xtdmacs-compile++-command-2 RET` : default `:test`\n- `M-x customize-variable RET xtdmacs-compile++-command-3 RET` : default `:deploy`\n- `M-x customize-variable RET xtdmacs-compile++-command-4 RET` : default `:doc`\n- `M-x customize-variable RET xtdmacs-compile++-command-5 RET` : default `:lint`\n- `M-x customize-variable RET xtdmacs-compile++-command-6 RET` : default `:manual`\n\nCustomize mode-line face when compile process is running :\n* `M-x customize-face RET xtdmacs-compile++-compiling-face RET`\n\nCustomize mode-line face when compile exited with error :\n* `M-x customize-face RET xtdmacs-compile++-error-face RET`\n\n#### Per project commands\n\nSet commands for a specific project :\n```lisp\ncat ~/.dir-locals.el\n(\"dev/myproject/\"\n  . ((nil\n    . ((xtdmacs-compile++-config-alist\n       . ((\"default\"\n          . ((:compile\n             . ((:dir        . xtdmacs-compile++-get-dir-git)\n                (:get-params . xtdmacs-compile++-docker-params)\n                (:command    . xtdmacs-compile++-docker-run-command)\n                (:env        . \"\")\n                (:bin        . \"make -j 12\")\n                (:service    . \"ws-compile\")))\n             (:test\n             . ((:dir        . xtdmacs-compile++-get-dir-git)\n                (:get-params . xtdmacs-compile++-docker-params)\n                (:command    . xtdmacs-compile++-docker-run-command)\n                (:env        . \"\")\n                (:bin        . \"make test\")\n                (:service    . \"ws-rt\"))\n             (:deploy\n             . ((:dir        . xtdmacs-compile++-get-dir-git)\n                (:get-params . xtdmacs-compile++-docker-params)\n                (:command    . xtdmacs-compile++-docker-run-command)\n                (:env        . \"\")\n                (:bin        . \"sudo -E make install_all\")\n                (:service    . \"ws-rt\"))))))))))))\n```\n\n#### Per mode commands\n\nThe following example set the `compile` command for the mode `yaml-mode`\n\n```\n(defvar my-alist\n  '((:compile .\n     ((:file       . buffer-file-name)\n      (:bin        . \"yamllint -f parsable -d '{extends: relaxed, rules: {indentation: {spaces: consistent}, line-length: {max: 300}}}'\")\n      (:get-params . xtdmacs-compile++-current-file-params)\n      (:command    . xtdmacs-compile++-simple-file-command))))\n  )\n\n\n(xtdmacs-compile++-register-config \"yaml-mode\" my-alist)\n```\n\n\n\n### Compile Bindings\n\n\n| Key                           | Effect                                                                   |\n|-------------------------------|--------------------------------------------------------------------------|\n| \\\u003cF6\\\u003e                        | run xtdmacs-compile++-command-1 command (*compile*)                      |\n| \\\u003cctrl\\\u003e+u \\\u003cF6\\\u003e             | run xtdmacs-compile++-command-1 command (*compile*), interactive version |\n| \\\u003cF7\\\u003e                        | run xtdmacs-compile++-command-2 command (*test*)                         |\n| \\\u003cctrl\\\u003e+u \\\u003cF7\\\u003e             | run xtdmacs-compile++-command-2 command (*test*), interactive version    |\n| \\\u003cF8\\\u003e                        | run xtdmacs-compile++-command-3 command (*deploy*)                       |\n| \\\u003cctrl\\\u003e+u \\\u003cF8\\\u003e             | run xtdmacs-compile++-command-3 command (*deploy*), interactive version  |\n| \\\u003cctrl\\\u003e+\\\u003cF6\\\u003e               | run xtdmacs-compile++-command-4 command (*doc*)                          |\n| \\\u003cctrl\\\u003e+u \\\u003cctrl\\\u003e+\\\u003cF6\\\u003e    | run xtdmacs-compile++-command-4 command (*doc*), interactive version     |\n| \\\u003cctrl\\\u003e+\\\u003cF7\\\u003e               | run xtdmacs-compile++-command-5 command (*lint*)                         |\n| \\\u003cctrl\\\u003e+u \\\u003cctrl\\\u003e+\\\u003cF7\\\u003e    | run xtdmacs-compile++-command-5 command (*lint*), interactive version    |\n| \\\u003cctrl\\\u003e+\\\u003cF8\\\u003e               | run xtdmacs-compile++-command-6 command (*manual*)                       |\n| \\\u003cctrl\\\u003e+u \\\u003cctrl\\\u003e+\\\u003cF8\\\u003e    | run xtdmacs-compile++-command-6 command (*manual*), interactive version  |\n| \\\u003calt\\\u003e+\\\u003cF6\\\u003e                | kill running process                                                     |\n| \\\u003calt\\\u003e+\\\u003cF7\\\u003e                | kill running process                                                     |\n| \\\u003calt\\\u003e+\\\u003cF8\\\u003e                | kill running process                                                     |\n| \\\u003cF9\u003e                         | goto next compile error                                                  |\n| \\\u003cctrl\\\u003e+\\\u003cF9\u003e                | goto next compile error or warning                                       |\n\n\n\n## Line mode\n\n**`xtdmacs-code-line-mode`** tweaks the `mode-line` format in order to display :\n- **`buffer name`**:  with the customizable face `mode-line-buffer-id`\n- **`line`** and **`column`** of current point position\n- **`percentage`** of the current buffer scroll\n- **`function name`**, if any, or the current `buffer directory`\n\nThe function name is deduces by **`which-func-mode`** which is customizable with\nthe following command:\n\n`C-u M-x customize-mode RET which-func-mode RET`\n\n\nExample:\n\n![xtdmacs-code-line-mode](doc/code-line-mode.png \"xtdmacs-code-line-mode\")\n\n\n## Spelling\n\n**`xtdmacs-code-spell-mode`** and **`xtdmacs-code-spell-prog-mode`** are wrapping of `flyspell-mode`\nand `flyspell-prog-mode`. They both detected spelling error in current buffer.\nThe first analyzes all available text and the second only analyzes strings and comment.\n\n### Spell Configuration\n\nThe modes are affected by the following customizable variables :\n\n- `M-x customize-variable RET xtdmacs-code-spell-ignore-regexp RET` : list of\n  regexp patterns to ignore while spelling the buffer.\n\n- `M-x customize-variable RET xtdmacs-code-spell-max-lines RET` : maximum\n  allowed buffer lines to automatically run flyspell on buffer.\n\n- `M-x customize-variable RET ispell-local-dictionary RET` : default spelling\n  dictionary\n\n\n### Spell Faces\n\nThe following faces are used by underlying flyspell mode :\n\n- `M-x customize-face RET flyspell-incorrect RET` : Face to display detected\n  spelling errors\n\n- `M-x customize-face RET flyspell-duplicate RET` : Face to display detected\n  duplicated words.\n\n\n### Spell API\n\nUseful functions :\n\n- `M-X flyspell-buffer RET` : refresh spelling analysis of current buffer\n\n- `M-X xtdmacs-code-spell-change-dictionary RET` : changes spelling dictionary\n  and set new dictionary are local file variable.\n\n- `M-X xtdmacs-code-spell-next-word RET` : interactively correct the next\n  detected error\n\n- `M-X xtdmacs-code-spell-prev-word RET` : interactively correct the previous\n  detected error\n\n### Spell Bindings\n\n| Key                           | Effect                                 |\n|-------------------------------|----------------------------------------|\n| \\\u003cctrl\\\u003e+c \\\u003cctrl\\\u003e+c         | `xtdmacs-code-spell-change-dictionary` |\n| \\\u003cctrl\\\u003e+c \\\u003cctrl\\\u003e+\\\u003cdown\\\u003e  | `flyspell-buffer`                      |\n| \\\u003cctrl\\\u003e+c \\\u003cctrl\\\u003e+\\\u003cright\\\u003e | `xtdmacs-code-spell-next-word`         |\n| \\\u003cctrl\\\u003e+c \\\u003cctrl\\\u003e+\\\u003cleft\\\u003e  | `xtdmacs-code-spell-prev-word`         |\n\n\n![xtdmacs-code-spell-mode](doc/code-spell-mode.png \"xtdmacs-code-spell-mode\")\n\n# Language specific modes\n\n## C++\n\n**`xtdmacs-code-cpp-mode`** provides the following features :\n\n- **Fix -std=c++11 enum class** : Aging c++-mode doesn't handle new enum\n  class syntax available in c++11 and leads to a broken indentation. This minor\n  mode fixes `c-offsets-alist` and properly indents this structure.\n\n- **Cycling through headers and implementation files** : When editing a c++ header\n  (.hh), we often need to visit the corresponding implementation (.cc) and vice\n  versa. The mode defines a function that searches for file that matches current\n  buffer file name with the correct extension. Another function does the same but\n  creates the file if it doesn't already exist. Because c++ extensions are not\n  well standardized, you can set the list of searched extension in the variable\n  `xtdmacs-code-cpp-header-extensions` .\n\n- **Automatic indentation** : The mode offers to automatically indent\n  the whole buffer at open and/or at close. (*)\n\n  (*) Personnal note : Emacs is the best market product for editing and indenting\n  code. Sadly, not everybody uses Emacs and real world code is often poorly indented.\n  This usage is certainly highly arguable but I've been using this in industrial\n  collaborative environment for the past ten years and automatic code indentation\n  solved far more problems than it has created.\n\n- **Keywords** : The mode provides many font-lock additional keywords. Some of them\n  try to catch the new C++11/14 language keywords like `nullptr` or\n  `decltype` or `utf-8 strings` . Others define font-lock rules to color\n  particular naming patterns, allowing to easily distinguish local variables,\n  parameter, class members, const and static attributes without need to use\n  heavy syntax analyzers that often need to actually compile the code.\n\n- **Renaming variables** : The mode defines a function that generated the correct\n  `query-replace-regexp` call to rename symbol at point to match one of the\n  prefix rule defined for local variable, parameters or class member syntax\n  coloring.\n\n- **Completion** : The mode integrates [irony](https://github.com/Sarcasm/irony-mode)\n  and [auto-complete](https://github.com/auto-complete/auto-complete) to provide\n  C++ code completion. `xtdmacs-code-cpp-complete-irony-async` is bound to\n  `M-.` by default.\n\n  Completion is asynchronous, buffer name will be colored  with\n  `xtdmacs-code-cpp-ac-irony-working-face` until completion is ready. First call\n  may be quite long, further calls are cached by server and will return immediately.\n\n  It relies on a completion server provided by irony which can be automatically\n  installed using `M-x irony-install-server RET`.\n\n  In addition, `irony-get-type` bound to `C-e` keys prints the type of symbol\n  under cursor in the minibuffer.\n\n### C++ Configuration\n\n- `M-x customize-variable RET xtdmacs-code-cpp-indent-load-auto RET` : tells\n  if buffer should be automatically indented at load.\n\n- `M-x customize-variable RET xtdmacs-code-cpp-indent-save-auto RET` :  tells\n  if buffer should be automatically indented at save.\n\n- `M-x customize-variable RET xtdmacs-code-cpp-header-extensions RET` : defines\n  the list of extensions that are searched when cycling through headers and\n  implementation files. Note: this list can have more than two elements, this is\n  useful to handle template implementations or inline definition files like\n  `.hpp` or `.hxx` .\n\n- `M-x customize-variable RET xtdmacs-code-cpp-keywords-alist RET` : alist of\n  keywords and faces to add to font-lock when mode is activated.\n\n### C++ Faces\n\nThe mode uses faces defined in `xtdmacs-code-mode`. See\n`M-x customize-group RET code RET` .\n\n### C++ API\n\n- `M-x xtdmacs-code-cpp-header-cycle RET` : cycle through extensions defined\n  by `xtdmacs-code-cpp-header-extensions` .\n\n- `M-x xtdmacs-code-cpp-header-cycle-create RET` : cycle through extensions defined\n  by `xtdmacs-code-cpp-header-extensions`, create files if they don't exist.\n\n- `M-x xtdmacs-code-cpp-rename-variable RET` : rename variable under cursor. The\n  function prompt interactively for renaming prefix.\n\n- `M-x irony-get-type RET` : display in minibuffer the type of the symbol under\n  cursor.\n\n- `M-x xtdmacs-code-cpp-complete-irony-async RET` : trigger completion at current point.\n\n### C++ Bindings\n\n| Key                           | Effect                                                             |\n|-------------------------------|--------------------------------------------------------------------|\n| \\\u003cF12\\\u003e                       | `xtdmacs-code-cpp-header-cycle`                                |\n| \\\u003cctrl\\\u003e+\\\u003cF12\\\u003e              | `xtdmacs-code-cpp-header-cycle` (create file if dosen't exist) |\n| \\\u003cctrl\\\u003e+c \\\u003cctrl\u003e+e          | `xtdmacs-code-cpp-rename-variable`                             |\n| \\\u003cctrl\\\u003e+e                    | `irony-get-type`                                               |\n| \\\u003calt\\\u003e+.                     | `xtdmacs-code-cpp-complete-irony-async`                        |\n\n\n### C++ Compilation\n\nCommands are set by `xtdmacs-code-cpp-compile-alist` which can be customized by running:\n* `M-x customize-variable RET xtdmacs-code-cpp-compile-alist RET`\n\nBy default `xtdmacs-code-cpp-compile-alist` takes the value of\n`xtdmacs-compile++-default-config-alist`.\n\n\n## Go\n\n**`xtdmacs-code-go-mode`** provides the following features:\n\n* **Keywords**: define font-lock rules to color particular naming patterns, allowing to easily\n  distinguish local variables, parameter... etc.\n\n* **Completion**: Integrates [gocode](https://github.com/mdempsky/gocode) which must be manually\n  installed\n\n* **Formatting**: Provides automatic formatting functions, on-demand or at load/save\n\n* **Snippets**: Loads default go language snippets\n\n* **Compilation**: Provides default commands for compilation and linter checking\n\n\n### Go Configuration\n\n* `M-x customize-variable RET xtdmacs-code-go-keywords-alist RET`\n* `M-x customize-variable RET xtdmacs-code-go-indent-load-auto RET`\n* `M-x customize-variable RET xtdmacs-code-go-indent-save-auto RET`\n\n### Go Faces\n\n* `M-x customize-face RET xtdmacs-code-go-face-indent-error RET`\n\n### Go API\n\n* `xtdmacs-code-go-format-region`: (interactive) applies `gofmt` on current region\n* `xtdmacs-code-go-get-project-name`: compute and returns current go package name\n* `xtdmacs-code-go-command`: generates a `go build` command from current compilation configuration\n\n### Go Bindings\n\n| Key              | Effect                                             |\n|------------------|----------------------------------------------------|\n| \\\u003calt\\\u003e+t        | format region using `gofmt`                        |\n| \\\u003cctrl\\\u003e+\u003calt\u003e+t | format buffer using `gofmt`                        |\n| \\\u003calt\\\u003e+.        | completion at point                                |\n| \\\u003cctrl\\\u003e+e       | print documentation for symbol at point            |\n| \\\u003calt\\\u003e+e        | interactively query go documentation               |\n| f12              | go to definition of symbol at point                |\n| \\\u003cctrl\\\u003e+f12     | go to definition of symbol at point (other-window) |\n\n\n### Go Compilation\n\n* **`compile`**: Runs `go build` from top git directory. Output binary name is computed\n  from current package name.\n\n* **`lint`**: runs [gometalinter](https://github.com/alecthomas/gometalinter) on current package.\n  gometalinter must be installed manually.\n\n## Python\n\n**`xtdmacs-code-python-mode`** provides the following features :\n\n- Automatic indentation on load and/or save\n\n- Overrides default xtdmacs-compile++ configuration :\n  - run pylint on current buffer\n  - run unittest script\n\n- Defines font-lock keywords to identify local variables, parameters and class\n  members\n\n- Defines useful functions used in compilation commands\n\n### Python Faces\n\nThe mode uses faces defined in `xtdmacs-code-mode`.\n\n### Python API\n\n- `xtdmacs-code-python-module-root` : Returns buffers' most distant parent directory\n  containing a `___init__.py` file. If no such file found, returns buffer's\n  file directory.\n\n- `xtdmacs-code-python-project-root` : Returns parent directory of module root. If\n  module root couldn't be identified, returns buffer's file directory.\n\n- `xtdmacs-code-python-pylint-getargs` : Constructs argument string to pass to\n  compile command. If `.pylintrc` is found in project root, includes\n  `--rcfile=file` in constructed string.\n\n- `xtdmacs-code-python-pylint-bin` Constructs compile command from\n  `xtdmacs-code-python-pylint-bin-path` and `xtdmacs-code-python-pylint-args`.\n  The buffer's file path is added as last  argument on the returned command.\n\n- `xtdmacs-code-python-test-bin` Constructs compile command from\n  `xtdmacs-code-python-test-bin-path` and `xtdmacs-code-python-test-args`.\n\n- `xtdmacs-code-python-params` : same as `xtdmacs-compile++-default-params`,\n  prompt only for directory and binary command.\n\n- `xtdmacs-code-python-command` : same as `xtdmacs-compile++-default-command`,\n  construct final compile command from parameters built by\n  `xtdmacs-code-python-params` .\n\n### Python Configuration\n\n- `M-x customize-variable RET xtdmacs-code-python-pylint-bin-path RET`\n  - pylint static code checker file path\n\n- `M-x customize-variable RET xtdmacs-code-python-pylint-args RET`\n  - Static string or function to use as pylint script argument\n\n- `M-x customize-variable RET xtdmacs-code-python-test-bin-path RET`\n  - Unit test runner file path. If nil, use default xtdmacs runner\n\n- `M-x customize-variable RET xtdmacs-code-python-test-args RET`\n  - Static string or function to use as test binary arguments\n\n- `M-x customize-variable RET xtdmacs-code-python-indent-save-auto RET`\n  - Enables python code auto-indentation on save.\n\n- `M-x customize-variable RET xtdmacs-code-python-indent-load-auto RET`\n  - Enables python code auto-indentation on load.\n\n- `M-x customize-variable RET xtdmacs-code-python-keywords-alist RET`\n  - List of additional python font-lock keywords\n\n- `M-x customize-variable RET xtdmacs-code-python-compile-alist RET`\n  - overrides `xtdmacs-compile++-config-alist` for `python-mode`\n\n### Python Compilation\n\nCommands are set by `xtdmacs-code-python-compile-alist` which can be customized by running:\n* `M-x customize-variable RET xtdmacs-code-python-compile-alist RET`\n\n* **`compile`**: run [pylint](https://www.pylint.org/) on project root. Root is deduced by\n  walking buffer's parent directory until no `__init__.py` file is found.\n\n  Pylint configuration is searched by order of priority in the following locations:\n  * `\u003croot\u003e/.pylintrc`\n  * `${HOME}/.pylintrc`\n  * `\u003cxtdmacs_installdir\u003e/vendor/pylintrc`\n\n* **`test`**: run unittests. Binary is given by `xtdmacs-code-python-test-bin-path` and\n  defaults to `\u003cxtdmacs_installdir\u003e/bin/unittests.py` which is a default python unittest wrapper\n  that produces a parsable output.\n\n\nFull definition\n```lisp\n'((:compile .\n     ((:dir        . xtdmacs-code-python-project-root)\n      (:bin        . xtdmacs-code-python-pylint-bin)\n      (:env        . \"\")\n      (:get-params . xtdmacs-compile++-default-params)\n      (:command    . xtdmacs-compile++-default-command)))\n    (:test .\n     ((:dir        . xtdmacs-code-python-project-root)\n      (:bin        . xtdmacs-code-python-test-bin)\n      (:env        . \"\")\n      (:get-params . xtdmacs-compile++-default-params)\n      (:command    . xtdmacs-compile++-default-command))))\n```\n\n\n## Php\n\n**`xtdmacs-code-php-mode`**  provides de following features :\n- Fix anonymous function indentation introduced in PHP 5.3.0\n\n- Sets default doxymacs comment template `doxymacs-function-comment-template`\n  to phpdoc compatible `xtdmacs-code-doxymacs-template-phpdoc`.\n\n- Adds font-lock keywords to identify local variables, parameters and class members\n\n- Fixes syntax table for a better work boundary detection\n\n- Automatic indentation on buffer load and/or save\n\n### Php Faces\n\nIn addition to faces defined in `xtdmacs-code-mode`. (See\n`M-x customize-group RET code RET` ), the mode defines :\n\n- `M-x customize-face RET xtdmacs-code-php-operator RET` : Used to fontify PHP\n  language operators such as ';' or '::'\"\n\n\n### Php Configuration\n\n- `M-x customize-variable RET xtdmacs-code-php-indent-load-auto RET` : Enables\n  code auto-indentation on buffer load.\n\n- `M-x customize-variable RET xtdmacs-code-php-indent-save-auto RET` : Enables\n  code auto-indentation on buffer save.\n\n\n## Lisp\n\n**`xtdmacs-code-lisp-mode`** provides automatic indentation on load and save.\n\n### Configuration\n\n- `M-x customize-variable RET xtdmacs-code-lisp-indent-load-auto RET` : Enables\n  code auto-indentation on buffer load.\n\n- `M-x customize-variable RET xtdmacs-code-lisp-indent-save-auto RET` : Enables\n  code auto-indentation on buffer save.\n\n## Shell\n\n**`xtdmacs-code-shell-mode`**  defines additional fontlock keywords and a default compilation\ncommand that runs [shellcheck](https://github.com/koalaman/shellcheck) linter.\n\n### Shell Configuration\n\nDefine path to `shellcheck` binary\n* `M-x customize-variable RET xtdmacs-code-shell-shellcheck-bin-path RET`\n\nDefine additional fontlock keywords\n* `M-x customize-variable RET xtdmacs-code-shell-keywords-alist RET`\n\nDefine compilation configuration\n* `M-x customize-variable RET xtdmacs-code-shell-compile-alist RET`\n\n### Shell Compilation\n\nCommands are set by `xtdmacs-code-shell-compile-alist` which can be customized by running:\n* `M-x customize-variable RET xtdmacs-code-shell-compile-alist RET`\n\n* **`compile`** : runs `shellcheck` on current buffer\n\nFull definition:\n\n```lisp\n  '((:compile .\n     ((:file      . buffer-file-name)\n     (:bin        . xtdmacs-code-shell-shellcheck-bin)\n     (:get-params . xtdmacs-compile++-current-file-params)\n     (:command    . xtdmacs-compile++-simple-file-command))))\n```\n\n## Json\n\n**`xtdmacs-code-json-mode`** loads `json-mode`, sets defaults `js-indent-level` to 2 and defines default compilation\ncommand.\n\n### Json Bindings\n\n| Key                           | Effect                              |\n|-------------------------------|-------------------------------------|\n| \\\u003cctrl\\\u003e+c \\\u003cctrl\\\u003e+f         | beautify-buffer                     |\n| \\\u003cctrl\\\u003e+c \\\u003cctrl\\\u003e+p         | show json path at point             |\n\n### Json Compilation\n\nCommands are set by `xtdmacs-code-json-compile-alist` which can be customized by running:\n* `M-x customize-variable RET xtdmacs-code-json-compile-alist RET`\n\n* **`compile`** : runs `jsonlint-php` on current  buffer\n\nFull definition:\n\n```lisp\n  '((:compile .\n     ((:file       . buffer-file-name)\n      (:bin        . \"jsonlint-php -q\")\n      (:get-params . xtdmacs-compile++-current-file-params)\n      (:command    . xtdmacs-compile++-simple-file-command)))\n    )\n```\n\n## Yaml\n\n**`xtdmacs-code-yaml-mode`** integrates [yaml-path](https://github.com/psycofdj/yaml-path) to\n`which-function-mode` and define default compilation settings.\n\n### Yaml Bindings\n\n| Key                           | Effect                              |\n|-------------------------------|-------------------------------------|\n| \\\u003cctrl\\\u003e+e                    | prints yaml path under cursor       |\n\n\n### Yaml Compilation\n\nCommands are set by `xtdmacs-code-yaml-compile-alist` which can be customized by running:\n* `M-x customize-variable RET xtdmacs-code-yaml-compile-alist RET`\n\n* **`compile`** : Runs [yamllint](https://github.com/adrienverge/yamllint) on current buffer\n\nFull definition:\n\n```lisp\n  '((:compile .\n     ((:file       . buffer-file-name)\n      (:bin        . \"yamllint -f parsable -d '{extends: relaxed, rules: {indentation: {spaces: consistent}, line-length: {max: 300}}}'\")\n      (:get-params . xtdmacs-compile++-current-file-params)\n      (:command    . xtdmacs-compile++-simple-file-command)))\n    )\n```\n\n\n\n## Web\n\n**`xtdmacs-code-web-mode`** overrides default `comment-start` and `comment-end` that are\npoorly set by `web-mode`.\n\n## Makefile\n\n**`xtdmacs-code-makefile-mode`** highlights tabs with `hi-yellow` face.\n\n## Java\n\n**`xtdmacs-code-java-mode`** adds font-lock keywords :\n`M-x customize-variable RET xtdmacs-code-java-keywords-alist RET`\n\n## Javascript\n\n**`xtdmacs-code-js-mode`** adds font-lock keywords :\n`M-x customize-variable RET xtdmacs-code-js-keywords-alist RET`\n\n## Sphinx\n\n**`xtdmacs-code-sphinx-mode`** set compilation settings for `rst-mode`.  It also turns\noff `electric-indent-mode` which appear to not work very properly with reStructuredText.\n\n### Sphinx Compilation\n\nCommands are set by `xtdmacs-code-sphinx-compile-alist` which can be customized by running:\n* `M-x customize-variable RET xtdmacs-code-sphinx-compile-alist RET`\n\n* **`compile`** : Generates sphinx documentation by:\n  - searching for directory containing conf.py as compile directory\n  - detects compile command as follow :\n    - `make html` when compile directory has a Makefile\n    - `sphinx-build -M html . build` otherwise\n\nFull definition:\n```lisp\n  '((:compile .\n     ((:dir        . xtdmacs-code-sphinx-project-root)\n      (:bin        . xtdmacs-code-sphinx-bin)\n      (:env        . \"\")\n      (:get-params . xtdmacs-compile++-default-params)\n      (:command    . xtdmacs-compile++-default-command))))\n```\n\n\n\u003c!-- LocalWords:  xtdmacs config alist RET params cd dir env API dev toc wget --\u003e\n\u003c!-- LocalWords:  param filename automake's VPATH sudo ctrl goto xvzf ido fci --\u003e\n\u003c!-- LocalWords:  swbuff multi linum doxymacs flyspell reStructuredText --\u003e\n\u003c!-- Local Variables: --\u003e\n\u003c!-- ispell-local-dictionary: \"american\" --\u003e\n\u003c!-- End: --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpsycofdj%2Fxtdmacs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpsycofdj%2Fxtdmacs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpsycofdj%2Fxtdmacs/lists"}