{"id":13861438,"url":"https://github.com/ROCKTAKEY/grugru","last_synced_at":"2025-07-14T09:31:54.431Z","repository":{"id":39482214,"uuid":"230588817","full_name":"ROCKTAKEY/grugru","owner":"ROCKTAKEY","description":"Rotate text at point in Emacs.","archived":false,"fork":false,"pushed_at":"2023-12-02T02:50:32.000Z","size":384,"stargazers_count":63,"open_issues_count":4,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-19T17:54:06.859Z","etag":null,"topics":["emacs","emacs-lisp","emacs-package","emacs-plugin"],"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/ROCKTAKEY.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":"2019-12-28T09:32:37.000Z","updated_at":"2024-10-25T02:13:45.000Z","dependencies_parsed_at":"2024-04-13T15:27:32.854Z","dependency_job_id":null,"html_url":"https://github.com/ROCKTAKEY/grugru","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ROCKTAKEY%2Fgrugru","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ROCKTAKEY%2Fgrugru/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ROCKTAKEY%2Fgrugru/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ROCKTAKEY%2Fgrugru/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ROCKTAKEY","download_url":"https://codeload.github.com/ROCKTAKEY/grugru/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225968819,"owners_count":17553143,"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":["emacs","emacs-lisp","emacs-package","emacs-plugin"],"created_at":"2024-08-05T06:01:22.281Z","updated_at":"2024-11-22T21:30:37.721Z","avatar_url":"https://github.com/ROCKTAKEY.png","language":"Emacs Lisp","funding_links":[],"categories":["Emacs Lisp"],"sub_categories":[],"readme":"[[https://raw.githubusercontent.com/ROCKTAKEY/images/4524403fbcdd9abe6d88197eddb1c4d241046e72/grugru.png]]\n[[https://github.com/ROCKTAKEY/grugru][https://img.shields.io/github/tag/ROCKTAKEY/grugru.svg?style=flat-square]]\n[[file:LICENSE][https://img.shields.io/github/license/ROCKTAKEY/grugru.svg?style=flat-square]]\n[[https://github.com/ROCKTAKEY/grugru/actions][https://img.shields.io/github/actions/workflow/status/ROCKTAKEY/grugru/CI.yml.svg?style=flat-square]]\n[[https://codecov.io/gh/ROCKTAKEY/grugru?branch=master][https://img.shields.io/codecov/c/github/ROCKTAKEY/grugru/master.svg?style=flat-square]]\n[[https://melpa.org/#/grugru][file:https://melpa.org/packages/grugru-badge.svg]]\n* Grugru: Rotate text at point.\n  With this package, you can rotate things at point.\n\n  #+begin_center\n  [[https://raw.githubusercontent.com/ROCKTAKEY/images/7baf9507a8fb9c20eda7395be1c9d91d0ae61c51/emacs-lisp-mode.gif]]\n  Fig. 1 demo on =emacs-lisp-mode=\n\n  [[https://raw.githubusercontent.com/ROCKTAKEY/images/35e323db33f4da1545c289f2741782c4ac04968b/c++-mode.gif]]\n  Fig. 2 demo on =c++-mode=\n\n  [[https://raw.githubusercontent.com/ROCKTAKEY/images/698f33489645a6e7b0c29d879771dbb15fa3fcd9/grugru-define-local.gif]]\n  Fig. 3 Use =grugru-define-local= interactively\n  #+end_center\n* How to Use?\n  You can interactively use the function =grugru=. This function rotate the thing at point\n  if assigned. You can assign rotated things with\n  =grugru-define-on-major-mode=, =grugru-define-on-local-major-mode=, and =grugru-define-local=.\n  If you use ~grugru~, you should assign ~grugru~ to 1 stroke key like ~C-;~, or ~M-g~.\n  #+begin_src emacs-lisp :tangle yes\n    (global-set-key (kbd \"C-;\") #'grugru)   ; Or other key.\n  #+end_src\n\n  If you want use default grugru, eval ~grugru-default-setup~. In the other words,\n  add to your init.el:\n  #+BEGIN_SRC emacs-lisp :tangle yes\n  (grugru-default-setup)\n  #+END_SRC\n\n  If you want ~grugru~ to highlight gurgruable thing, add to your init.el:\n  #+begin_src emacs-lisp :tangle yes\n    (grugru-highlight-mode)\n  #+end_src\n\n  If you want to change default action at point, you can use ~grugru-edit~,\n  with which you can edit grugrus at point interactively. The change edited by this\n  function is saved in ~grugru-edit-save-file~,\n  and loaded by run ~grugru-edit-load~. So to load the change, you can write\n  on init.el after ~(grugru-default-setup)~:\n  #+begin_src emacs-lisp :tangle yes\n  (grugru-edit-load)\n  #+end_src\n\n  If you want to use ivy or ido as completing-read, set ~grugru-edit-completing-function~.\n  Or, you can use ~grugru-redefine-\\*~ or ~grugru-remove-\\*~\n  for non-interactive editing of default setup.\n** Examples\n  #+BEGIN_SRC emacs-lisp -n\n    ;; Define grugru on major-mode.\n    (grugru-define-on-major-mode 'c-mode 'symbol '(\"unsigned\" \"signed\"))\n    (grugru-define-on-major-mode 'c-mode 'word '(\"get\" \"set\"))\n    ;; Now, you can toggle unsigned \u003c=\u003e signed and get \u003c=\u003e set\n    ;; by running the command grugru in c-mode.\n\n    ;; You can pass a list of symbol major-mode instead of one.\n    (grugru-define-on-major-mode '(java-mode c++-mode) 'word '(\"get\" \"set\"))\n\n    ;; Define grugru on current major-mode.\n    ;; Same as (grugru-define-on-major-mode major-mode 'symbol '(\"red\" \"green\" \"yellow\"))\n    ;; This should be run in some hook or function,\n    ;; because major-mode is not confirmed if in init.el.\n    (add-hook 'c-mode-common-hook\n     (lambda ()\n      (grugru-define-on-local-major-mode 'symbol '(\"red\" \"green\" \"yellow\"))))\n\n    ;; Define grugru on local. Should be defined in some hook or function,\n    ;; because it is saved buffer local.\n    (add-hook 'text-mode-hook\n              (lambda ()\n               (grugru-define-local 'word '(\"is\" \"was\"))\n               (grugru-define-local 'word '(\"I\" \"my\" \"me\" \"mine\"))))\n\n    ;; Define grugru globally. This is applied in all buffers.\n    (grugru-define-global 'symbol '(\"yes\" \"no\"))\n\n    ;; Define grugru keeping case:\n    (grugru-define-global 'symbol (grugru-metagenerator-keep-case '(\"yes\" \"no\")))\n\n    ;; If you want grugru to define grugru defaultly keeping case:\n    (customize-set-variable 'grugru-strings-metagenerator #'grugru-metagenerator-simple)\n\n    ;; You can use function instead of list of strings.\n    (grugru-define-on-major-mode\n     'c-mode 'symbol\n     ;; Optional argument `rev' is flag for backward rotation.\n     ;; If the second argument `rev' is ignoreable (for example, rotate two strings),\n     ;; you can just use the function receiving only 1 argument.\n     (lambda (arg \u0026optional rev)\n       (if rev\n           ;; backward\n           (cond\n            ((string-match \"a\\\\(.*\\\\)b\" arg)\n             ;; Rotate axyzb to cxyzd\n             (concat \"c\" (match-string 1 arg) \"d\"))\n            ((string-match \"b\\\\(.*\\\\)c\" arg)\n             ;; Rotate bxyzc to axyzb\n             (concat \"a\" (match-string 1 arg) \"b\"))\n            ((string-match \"c\\\\(.*\\\\)d\" arg)\n             ;; Rotate cxyzd to bxyzc\n             (concat \"b\" (match-string 1 arg) \"c\")))\n         ;; forward\n         (cond\n          ((string-match \"a\\\\(.*\\\\)b\" arg)\n           ;; Rotate axyzb to bxyzc\n           (concat \"b\" (match-string 1 arg) \"c\"))\n          ((string-match \"b\\\\(.*\\\\)c\" arg)\n           ;; Rotate bxyzc to cxyzd\n           (concat \"c\" (match-string 1 arg) \"d\"))\n          ((string-match \"c\\\\(.*\\\\)d\" arg)\n           ;; Rotate cxyzd to axyzb\n           (concat \"a\" (match-string 1 arg) \"b\"))))))\n\n    ;; You can indicate which position is valid to grugru in strings.\n    ;; The function can return not only string but also cons cell (BOUNDS . STRING).\n    ;; BOUNDS is a list of cons cell (BEG . END), which is pair of numbers indicating\n    ;; range valid to rotate.\n    (defun grugru-default@emacs-lisp+nth!aref (str)\n      \"Return STR exchanged `nth' and `aref' with argument permutation.\"\n      (cond\n       ((string-match \"^(\\\\_\u003c\\\\(nth\\\\)\\\\_\u003e\" str)\n        (cons\n         (cons (match-beginning 1) (match-end 1))\n         ;; This function permutate arguments on Lisp.\n         (grugru-utils-lisp-exchange-args\n         (replace-match \"aref\" nil nil str 1)\n         '(2 1))))\n       ((string-match \"^(\\\\_\u003c\\\\(aref\\\\)\\\\_\u003e\" str)\n        (cons\n         (cons (match-beginning 1) (match-end 1))\n         (grugru-utils-lisp-exchange-args\n         (replace-match \"nth\" nil nil str 1)\n         '(2 1))))))\n\n    ;; You can also write like:\n    (grugru-define-multiple\n     (fundamental-mode\n      . ((word . (\"aaa\" \"bbb\" \"ccc\"))\n         ;; (symbol \"xxx\" \"yyy\" \"zzz\") is same as below.\n         ;; You can use both.\n         (symbol . (\"xxx\" \"yyy\" \"zzz\"))\n         (word . (\"abc\" \"def\" \"ghi\"))))\n      (word . (\"aaaa\" \"bbbb\" \"cccc\"))\n      (symbol . (\"xxxx\" \"yyyyy\" \"zzzzz\"))\n      (word . (\"abcd\" \"defd\" \"ghid\")))\n    ;; or\n    (grugru-define-multiple\n     (fundamental-mode\n       (word \"aaa\" \"bbb\" \"ccc\")\n       (symbol \"xxx\" \"yyy\" \"zzz\")\n       (word \"abc\" \"def\" \"ghi\"))\n      (word \"aaaa\" \"bbbb\" \"cccc\")\n      (symbol \"xxxx\" \"yyyyy\" \"zzzzz\")\n      (word \"abcd\" \"defd\" \"ghid\"))\n\n    ;; Above two examples are both expanded to:\n    (progn\n      (progn\n         (grugru-define-on-major-mode 'fundamental-mode 'word '(\"aaa\" \"bbb\" \"ccc\"))\n         (grugru-define-on-major-mode 'fundamental-mode 'symbol '(\"xxx\" \"yyy\" \"zzz\"))\n         (grugru-define-on-major-mode 'fundamental-mode 'word '(\"abc\" \"def\" \"ghi\")))\n       (grugru-define-global 'word '(\"aaaa\" \"bbbb\" \"cccc\"))\n       (grugru-define-global 'symbol '(\"xxxx\" \"yyyyy\" \"zzzzz\"))\n       (grugru-define-global 'word '(\"abcd\" \"defd\" \"ghid\")))\n\n\n    ;; You can define function which rotate pre-specified texts.\n    ;; For example, three-state can rotate only 2 tuples,\n    ;; (\"water\" \"ice\" \"vapor\") and (\"solid\" \"liquid\" \"gas\"),\n    ;; not any other tuples defined by grugru-define-global and so on.\n    (grugru-define-function three-state ()\n     \"Docstring. This is optional.\"\n     (symbol . (\"water\" \"ice\" \"vapor\"))\n     (symbol . (\"solid\" \"liquid\" \"gas\")))\n    ;; If you want to find the functions defined by `grugru-define-function'\n    ;; with `describe-function', execute this:\n    (grugru-find-function-integration-mode +1)\n  #+END_SRC\n* Interactive Functions\n** ~grugru~\n   This function rotates text at point.\n   Rotated text is defined by ~grugru-define-*~ functions.\n   If prefix argument is passed, repeatedly executed. Negative prefix arguments means\n   backward rotation. Also, ~grugru-backward~ can be used for backward rotation.\n** ~grugru-select~\n   This function replace text at point.\n   You can select grugru and string replaced to.\n\n   You can assign completing function to ~grugru-completing-function~.\n** ~grugru-edit~\n   This function edits grugru at point defined by default.\n\n   First, select grugru from grugrus available at point.\n   Then, edit the list in minibuffer.\n\n   The change is saved to file ~grugru-edit-save-file~ if it is not ~local~ one.\n   You can assign completing function to ~grugru-completing-function~.\n* Functions Defining grugru\n** ~(grugru-define-global GETTER STRINGS-OR-FUNCTION)~\n   Define global grugru with GETTER and STRINGS-OR-FUNCTION.\n\n   GETTER is a function, or a symbol which is alias defined in ~grugru-getter-alist~.\n   GETTER also can be positive or negative number, which means the number of characters\n   after point.\n   By default, symbol, word, char is available.\n   If it is a function, it should return cons cell ~(begin . end)~\n   which express things at point, and with no argument.\n\n   STRINGS-OR-FUNCTION is list of string or function.\n\n   List of string: If it includes string gotten by GETTER,\n   the things gotten by GETTER is replaced to next string.\n\n   Function: It is passed things gotten by GETTER, and should return string\n   to replace the things to.\n\n   You can use like:\n   #+begin_src emacs-lisp :tangle yes\n     ;; Replace \"yes\" at point, to \"no\".\n     ;; Or replace \"no\" at point, to \"yes\".\n     (grugru-define-global 'symbol '(\"yes\" \"no\"))\n   #+end_src\n** ~(grugru-define-on-major-mode MAJOR GETTER STRINGS-OR-FUNCTION)~\n   Define major-mode local grugru with GETTER and STRINGS-OR-FUNCTION.\n\n   Same as ~grugru-define-global~, but grugru defined with this is applied\n   only in buffer on MAJOR major-mode. MAJOR can be list of major-modes.\n   #+begin_src emacs-lisp :tangle yes\n     ;; Replace \"yes\" at point, to \"no\", or replace \"no\" at point, to \"yes\",\n     ;; only in lisp-interaction-mode.\n     (grugru-define-on-major-mode lisp-interaction-mode 'symbol '(\"yes\" \"no\"))\n   #+end_src\n** ~(grugru-define-local GETTER STRINGS-OR-FUNCTION)~\n   Define buffer-local grugru with GETTER and STRINGS-OR-FUNCTION.\n\n   Same as ~grugru-define-global~, but grugru defined with this is applied\n   only in buffer where eval this expression.\n   #+begin_src emacs-lisp :tangle yes\n     ;; This should be used in hook or others.\n     ;; Because this definition is buffer-local.\n     (add-hook 'text-mode-hook\n                (lambda ()\n                 (grugru-define-local 'word '(\"is\" \"was\"))\n                 (grugru-define-local 'word '(\"I\" \"my\" \"me\" \"mine\"))))\n   #+end_src\n\n   Also, you can run it interactively (though cannot set STRINGS-OR-FUNCTION to a function).\n   On interactive usage, by default, GETTER is the length of car of STRINGS-OR-FUNCTION,\n   and STRINGS-OR-FUNCTION is a list which has 2 elements, constructed interactively.\n   With prefix argument, you can select GETTER and length of STRINGS-OR-FUNCTION.\n   Default GETTER is set by ~grugru-local-interactively-default-getter~.\n\n** ~(grugru-define-multiple \u0026rest CLAUSES)~\n   This function define multiple grugru.\n\n   Each ~CLAUSE~ is:\n   - ~(GETTER . STRINGS-OR-FUNCTION)~: means ~(grugru-define-global GETTER  STRINGS-OR-FUNCTION)~.\n   - ~(MAJOR (GETTER . STRINGS-OR-FUNCTION)...)~: means ~(grugru-define-on-major-mode MAJOR GETTER  STRINGS-OR-FUNCTION)...~.\n   - List of above.\n\n   #+begin_src emacs-lisp :tangle yes\n    (grugru-define-multiple\n     (fundamental-mode\n      . ((word . (\"aaa\" \"bbb\" \"ccc\"))\n         ;; (symbol \"xxx\" \"yyy\" \"zzz\") is same as below.\n         ;; You can use both.\n         (symbol . (\"xxx\" \"yyy\" \"zzz\"))\n         (word . (\"abc\" \"def\" \"ghi\"))))\n      (word . (\"aaaa\" \"bbbb\" \"cccc\"))\n      (symbol . (\"xxxx\" \"yyyyy\" \"zzzzz\"))\n      (word . (\"abcd\" \"defd\" \"ghid\")))\n    ;; or\n    (grugru-define-multiple\n     (fundamental-mode\n       (word \"aaa\" \"bbb\" \"ccc\")\n       (symbol \"xxx\" \"yyy\" \"zzz\")\n       (word \"abc\" \"def\" \"ghi\"))\n      (word \"aaaa\" \"bbbb\" \"cccc\")\n      (symbol \"xxxx\" \"yyyyy\" \"zzzzz\")\n      (word \"abcd\" \"defd\" \"ghid\"))\n\n    ;; Above two examples are both expanded to:\n    (progn\n      (progn\n         (grugru-define-on-major-mode 'fundamental-mode 'word '(\"aaa\" \"bbb\" \"ccc\"))\n         (grugru-define-on-major-mode 'fundamental-mode 'symbol '(\"xxx\" \"yyy\" \"zzz\"))\n         (grugru-define-on-major-mode 'fundamental-mode 'word '(\"abc\" \"def\" \"ghi\")))\n       (grugru-define-global 'word '(\"aaaa\" \"bbbb\" \"cccc\"))\n       (grugru-define-global 'symbol '(\"xxxx\" \"yyyyy\" \"zzzzz\"))\n       (grugru-define-global 'word '(\"abcd\" \"defd\" \"ghid\")))\n   #+end_src\n** ~(grugru-define-function NAME () \u0026optional DOCSTRING \u0026rest BODY)~\n   Define function which can roate only grugru defined by BODY.\n   Each element of BODY is ~(GETTER . STRINGS-OR-FUNCTION)~,\n   which meaning is same as ~grugru-define-*~ functions.\n   #+begin_src emacs-lisp :tangle yes\n     ;; The function `three-state' rotate like \"water\"=\u003e\"ice\"=\u003e\"vapor\"=\u003e\"water\",\n     ;; or \"solid\"=\u003e\"liquid\"=\u003e\"gas\"=\u003e\"solid\".\n     (grugru-define-function three-state ()\n      \"Docstring. This is optional.\"\n      (symbol . (\"water\" \"ice\" \"vapor\"))\n      (symbol . (\"solid\" \"liquid\" \"gas\")))\n\n     ;; This sentense do NOT affect to the function `three-state'.\n     (grugru-define-global 'symbol '(\"yes\" \"no\"))\n   #+end_src\n* Utilities to define grugru\n** ~(grugru-utils-lisp-exchange-args LIST-STRING PERMUTATION)~\n   Permute argument of sexp read from ~LIST-STRING~ according to ~PERMUTATION~.\n\n   For example, ~(grugru-utils-lisp-exchange-args \\\"(nth 1 '(x y z))\\\" '(2 1))~\n   returns ~(nth '(x y z) 1)~.  Newlines and whitespaces are also kept.\n\n   This function is defined for user to define the function for grugru which rotate\n   not only fuction's name but also arguments' order.\n*** Usage\n    #+begin_src emacs-lisp :tangle yes\n      (defun grugru-rotate-nth-aref (str)\n        (cond\n         ((string-match \"^(\\\\(\\\\_\u003cnth\\\\_\u003e\\\\)\" str) ;match to \"(nth\"\n          (grugru-utils-lisp-exchange-args\n           (replace-match \"aref\" nil nil str 1) ;replace function's name to \"aref\"\n           '(2 1)))                             ;exchange arguments' order\n         ((string-match \"^(\\\\(\\\\_\u003caref\\\\_\u003e\\\\)\" str) ;match to \"(aref\"\n          (grugru-utils-lisp-exchange-args\n           (replace-match \"nth\" nil nil str 1) ;replace function's name to \"nth\"\n           '(2 1)))))                          ;exchange arguments' order\n      (grugru-define-on-major-mode\n       'emacs-lisp-mode\n       'list\n       #'grugru-rotate-nth-aref)\n\n      ;; Then,\n      (nth 3 '(foo bar))\n      ;; is rotated to:\n      (aref '(foo bar) 3)\n    #+end_src\n* Custom Variables\n** ~grugru-getter-alist~\n   Alist of getter.\n\n   Each key (car) of element is a symbol, which is regarded as ~GETTER~.\n\n   Each value (cdr) of element is a function or sexp.\n   It should return things at point.\n\n** ~grugru-edit-save-file~\n   The name of file saved the information by ~grugru-edit~.\n   Default value is \"~/.emacs.d/.grugru\".\n\n** ~grugru-completing-function~\n   Completing function. Default value is ~completing-read~.\n   If you would like to use ivy or ido, write:\n   #+begin_src emacs-lisp :tangle yes\n     ;; For ivy:\n     (setq grugru-completing-function #'ivy-completing-read)\n     ;; For ido:\n     (setq grugru-completing-function #'ido-completing-read)\n   #+end_src\n\n** ~grugru-select-function-generate-number~\n   This variable have how many strings are generated from function\n   in ~STRINGS-OR-FUNCTION~, on ~grugru-select~.\n\n** ~grugru-local-interactively-default-getter~\n   Indicate default getter on interactive usage of ~grugru-define-local~.\n   0 means If 0, gets number from first string, otherwise it should be\n   symbol in ~grugru-getter-alist~ or a function which gets things at point.\n** ~grugru-point-after-rotate~\n   Where the point is after rotation by ~grugru~.\n   - ~as-is~ means keeping first position.\n   - ~beginning~ means beginning of rotated things.\n   - ~end~ means end of rotated things.\n** ~grugru-indent-after-rotate~\n   Indent rotated text after ~grugru~ or not.\n   Indent happens only if text after rotation has a newline.\n   #+begin_src emacs-lisp :tangle yes\n     (grugru-define-local 'list '(\"(abc def)\" \"(ghi\\njkl)\"))\n     ;; If `grugru-indent-after-rotate' is nil,\n     (abc def)\n     ;; is rotated to:\n     (ghi\n     jkl)\n\n     ;; If `grugru-indent-after-rotate' is t,\n     (abc def)\n     ;; is rotated to:\n     (ghi\n      jkl)\n   #+end_src\n** ~grugru-strings-metagenerator~\n   Function which generates default generator from strings on ~grugru-define-*~.\n   The function should recieve ~STRINGS~, list of string, as one argument,\n   and return function.  Returned function should recieve one or two argument(s),\n   string ~STRING~ as first one, boolean ~REVERSE~ as second one.\n\n   STRING means current string.  Returned function (generator) returns string next to STRING.\n   If REVERSE is non-nil, it returns previous one instead.\n* leaf-keyword ~:grugru~\n  You can use ~:grugru~ keyword on [[https://github.com/conao3/leaf.el][leaf.el]], if you use [[https://github.com/conao3/leaf-keywords.el][leaf-keywords.el]].\n\n  By default, ~leaf--name~ is used as major-mode.\n  Or you can write major-mode obviously.\n  #+begin_src emacs-lisp :tangle yes\n    (leaf lisp-mode\n     :grugru\n     (symbol \"nil\" \"t\")\n     (emacs-lisp-mode\n      (word \"add\" \"remove\"))\n     ...)\n    ;; The section of `:grugru' means:\n    (grugru-define-multiple\n     (lisp-mode\n      (symbol \"nil\" \"t\"))\n     (emacs-lisp-mode\n      (word \"add\" \"remove\")))\n  #+end_src\n* License\n  This package is licensed by GPLv3. See [[file:LICENSE][LICENSE]].\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FROCKTAKEY%2Fgrugru","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FROCKTAKEY%2Fgrugru","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FROCKTAKEY%2Fgrugru/lists"}