grugru

Homepage: https://github.com/ROCKTAKEY/grugru

Author: ROCKTAKEY

Updated:

Summary

Rotate text at point

Commentary

How to Use?
  You can interactively use the function `grugru'.  This function rotate the thing at point
  if assigned.  You can assign rotated things with
  `grugru-define-on-major-mode', `grugru-define-on-local-major-mode', and `grugru-define-local'.
  If you use ~grugru~, you should assign ~grugru~ to 1 stroke key like ~C-;~, or ~M-g~.

    (global-set-key (kbd "C-;") #'grugru)   ; Or other key.


  If you want use default grugru, eval ~grugru-default-setup~.  In the other words,
  add to your init.el:

  (grugru-default-setup)

  If you want to change default action at point, you can use ~grugru-edit~,
  with which you can edit grugrus at point interactively.  The change edited by this
  function is saved in ~grugru-edit-save-file~,
  and loaded by run ~grugru-edit-load~.  So to load the change, you can write
  on init.el after ~(grugru-default-setup)~:

  (grugru-edit-load)


  If you want to use ivy or ido as completing-read, set ~grugru-edit-completing-function~.
  Or, you can use ~grugru-redefine-\*~ or ~grugru-remove-\*~
  for non-interactive editing of default setup.
Examples

    ;; Define grugru on major-mode.
    (grugru-define-on-major-mode 'c-mode 'symbol '("unsigned" "signed"))
    (grugru-define-on-major-mode 'c-mode 'word '("get" "set"))
    ;; Now, you can toggle unsigned <=> signed and get <=> set
    ;; by running the command grugru in c-mode.

    ;; You can pass a list of symbol major-mode instead of one.
    (grugru-define-on-major-mode '(java-mode c++-mode) 'word '("get" "set"))

    ;; Define grugru on current major-mode.
    ;; Same as (grugru-define-on-major-mode major-mode 'symbol '("red" "green" "yellow"))
    ;; This should be run in some hook or function,
    ;; because major-mode is not confirmed if in init.el.
    (add-hook 'c-mode-common-hook
     (lambda ()
      (grugru-define-on-local-major-mode 'symbol '("red" "green" "yellow"))))

    ;; Define grugru on local.  Should be defined in some hook or function,
    ;; because it is saved buffer local.
    (add-hook 'text-mode-hook
              (lambda ()
               (grugru-define-local 'word '("is" "was"))
               (grugru-define-local 'word '("I" "my" "me" "mine"))))

    ;; Define grugru globally.  This is applied in all buffers.
    (grugru-define-global 'symbol '("yes" "no"))

    ;; You can use function instead of list of strings.
    (grugru-define-on-major-mode
     'c-mode 'symbol
     (lambda (arg)
      (cond
       ((string-match "a\\(.*\\)b" arg)
        (concat "b" (match-string 1 arg) "c"))
       ((string-match "b\\(.*\\)c" arg)
        (concat "a" (match-string 1 arg) "b")))))

    ;; You can also write like:
    (grugru-define-multiple
     (fundamental-mode
      . ((word . ("aaa" "bbb" "ccc"))
         ;; (symbol "xxx" "yyy" "zzz") is same as below.
         ;; You can use both.
         (symbol . ("xxx" "yyy" "zzz"))
         (word . ("abc" "def" "ghi"))))
      (word . ("aaaa" "bbbb" "cccc"))
      (symbol . ("xxxx" "yyyyy" "zzzzz"))
      (word . ("abcd" "defd" "ghid")))
    ;; or
    (grugru-define-multiple
     (fundamental-mode
       (word "aaa" "bbb" "ccc")
       (symbol "xxx" "yyy" "zzz")
       (word "abc" "def" "ghi"))
      (word "aaaa" "bbbb" "cccc")
      (symbol "xxxx" "yyyyy" "zzzzz")
      (word "abcd" "defd" "ghid"))

    ;; Above two examples are both expanded to:
    (progn
      (progn
         (grugru-define-on-major-mode 'fundamental-mode 'word '("aaa" "bbb" "ccc"))
         (grugru-define-on-major-mode 'fundamental-mode 'symbol '("xxx" "yyy" "zzz"))
         (grugru-define-on-major-mode 'fundamental-mode 'word '("abc" "def" "ghi")))
       (grugru-define-global 'word '("aaaa" "bbbb" "cccc"))
       (grugru-define-global 'symbol '("xxxx" "yyyyy" "zzzzz"))
       (grugru-define-global 'word '("abcd" "defd" "ghid")))


    ;; You can define function which rotate pre-specified texts.
    ;; For example, three-state can rotate only 2 tuples,
    ;; ("water" "ice" "vapor") and ("solid" "liquid" "gas"),
    ;; not any other tuples defined by grugru-define-global and so on.
    (grugru-define-function three-state ()
     "Docstring.  This is optional."
     (symbol . ("water" "ice" "vapor"))
     (symbol . ("solid" "liquid" "gas")))
    ;; If you want to find the functions defined by `grugru-define-function'
    ;; with `describe-function', execute this:
    (grugru-find-function-integration-mode +1)

Interactive Functions
~grugru~
   This function rotates text at point.
   Rotated text is defined by ~grugru-define-*~ functions.
   If prefix argument is passed, repeatedly executed.  Negative prefix arguments means
   backward rotation.  Also, ~grugru-backward~ can be used for backward rotation.
~grugru-select~
   This function replace text at point.
   You can select grugru and string replaced to.

   You can assign completing function to ~grugru-completing-function~.
~grugru-edit~
   This function edits grugru at point defined by default.

   First, select grugru from grugrus available at point.
   Then, edit the list in minibuffer.

   The change is saved to file ~grugru-edit-save-file~.
   You can assign completing function to ~grugru-completing-function~.
Functions Defining grugru
~(grugru-define-global GETTER STRINGS-OR-GENERATOR)~
   Define global grugru with GETTER and STRINGS-OR-GENERATOR.

   GETTER is a function, or a symbol which is alias defined in ~grugru-getter-alist~.
   GETTER also can be positive or negative number, which means the number of characters.
   By default, symbol, word, char is available.
   If it is a function, it should return cons cell ~(begin . end)~
   which express things at point, and with no argument.

   STRINGS-OR-GENERATOR is list of string or function.

   List of string: If it includes string gotten by GETTER,
   the things gotten by GETTER is replaced to next string.

   Function: It is passed things gotten by GETTER, and should return string
   to replace the things to.

   You can use like:

     ;; Replace "yes" at point, to "no".
     ;; Or replace "no" at point, to "yes".
     (grugru-define-global 'symbol '("yes" "no"))

~(grugru-define-on-major-mode MAJOR GETTER STRINGS-OR-GENERATOR)~
   Define major-mode local grugru with GETTER and STRINGS-OR-GENERATOR.

   Same as ~grugru-define-global~, but grugru defined with this is applied
   only in buffer on MAJOR major-mode.  MAJOR can be list of major-modes.

     ;; Replace "yes" at point, to "no", or replace "no" at point, to "yes",
     ;; only in lisp-interaction-mode.
     (grugru-define-on-major-mode lisp-interaction-mode 'symbol '("yes" "no"))

~(grugru-define-local GETTER STRINGS-OR-GENERATOR)~
   Define buffer-local grugru with GETTER and STRINGS-OR-GENERATOR.

   Same as ~grugru-define-global~, but grugru defined with this is applied
   only in buffer where eval this expression.

     ;; This should be used in hook or others.
     ;; Because this definition is buffer-local.
     (add-hook 'text-mode-hook
                (lambda ()
                 (grugru-define-local 'word '("is" "was"))
                 (grugru-define-local 'word '("I" "my" "me" "mine"))))


   Also, you can run it interactively (though cannot set STRINGS-OR-GENERATOR to a function).
   On interactive usage, by default, GETTER is the length of car of STRINGS-OR-GENERATOR,
   and STRINGS-OR-GENERATOR is a list which has 2 elements, constructed interactively.
   With prefix argument, you can select GETTER and length of STRINGS-OR-GENERATOR.
   Default GETTER is set by ~grugru-local-interactively-default-getter~.

~(grugru-define-multiple &rest CLAUSES)~
   This function define multiple grugru.

   Each ~CLAUSE~ is:
   - ~(GETTER . STRINGS-OR-GENERATOR)~: means ~(grugru-define-global GETTER  STRINGS-OR-GENERATOR)~.
   - ~(MAJOR (GETTER . STRINGS-OR-GENERATOR)...)~: means ~(grugru-define-on-major-mode MAJOR GETTER  STRINGS-OR-GENERATOR)...~.
   - List of above.


    (grugru-define-multiple
     (fundamental-mode
      . ((word . ("aaa" "bbb" "ccc"))
         ;; (symbol "xxx" "yyy" "zzz") is same as below.
         ;; You can use both.
         (symbol . ("xxx" "yyy" "zzz"))
         (word . ("abc" "def" "ghi"))))
      (word . ("aaaa" "bbbb" "cccc"))
      (symbol . ("xxxx" "yyyyy" "zzzzz"))
      (word . ("abcd" "defd" "ghid")))
    ;; or
    (grugru-define-multiple
     (fundamental-mode
       (word "aaa" "bbb" "ccc")
       (symbol "xxx" "yyy" "zzz")
       (word "abc" "def" "ghi"))
      (word "aaaa" "bbbb" "cccc")
      (symbol "xxxx" "yyyyy" "zzzzz")
      (word "abcd" "defd" "ghid"))

    ;; Above two examples are both expanded to:
    (progn
      (progn
         (grugru-define-on-major-mode 'fundamental-mode 'word '("aaa" "bbb" "ccc"))
         (grugru-define-on-major-mode 'fundamental-mode 'symbol '("xxx" "yyy" "zzz"))
         (grugru-define-on-major-mode 'fundamental-mode 'word '("abc" "def" "ghi")))
       (grugru-define-global 'word '("aaaa" "bbbb" "cccc"))
       (grugru-define-global 'symbol '("xxxx" "yyyyy" "zzzzz"))
       (grugru-define-global 'word '("abcd" "defd" "ghid")))

~(grugru-define-function NAME () &optional DOCSTRING &rest BODY)~
   Define function which can roate only grugru defined by BODY.
   Each element of BODY is ~(GETTER . STRINGS-OR-GENERATOR)~,
   which meaning is same as ~grugru-define-*~ functions.

     ;; The function `three-state' rotate like "water"=>"ice"=>"vapor"=>"water",
     ;; or "solid"=>"liquid"=>"gas"=>"solid".
     (grugru-define-function three-state ()
      "Docstring.  This is optional."
      (symbol . ("water" "ice" "vapor"))
      (symbol . ("solid" "liquid" "gas")))

     ;; This sentense do NOT affect to the function `three-state'.
     (grugru-define-global 'symbol '("yes" "no"))

leaf-keyword ~:grugru~
  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]].

  By default, ~leaf--name~ is used as major-mode.
  Or you can write major-mode obviously.

    (leaf lisp-mode
     :grugru
     (symbol "nil" "t")
     (emacs-lisp-mode
      (word "add" "remove"))
     ...)
    ;; The section of `:grugru' means:
    (grugru-define-multiple
     (symbol "nil" "t")
     (emacs-lisp-mode
      (word "add" "remove")))

Custom Variables
~grugru-getter-alist~
   Alist of getter.

   Each key (car) of element is a symbol, which is regarded as ~GETTER~.

   Each value (cdr) of element is a function or sexp.
   It should return things at point.

~grugru-edit-save-file~
   The name of file saved the information by ~grugru-edit~.
   Default value is "~/.emacs.d/.grugru".

~grugru-completing-function~
   Completing function.  Default value is ~completing-read~.
   If you would like to use ivy or ido, write:

     ;; For ivy:
     (setq grugru-completing-function #'ivy-completing-read)
     ;; For ido:
     (setq grugru-completing-function #'ido-completing-read)


~grugru-select-function-generate-number~
   This variable have how many strings are generated from function
   in ~STRINGS-OR-GENERATOR~, on ~grugru-select~.

~grugru-local-interactively-default-getter~
   Indicate default getter on interactive usage of ~grugru-define-local~.
   0 means If 0, gets number from first string, otherwise it should be
   symbol in ~grugru-getter-alist~ or a function which gets things at point.
License
  This package is licensed by GPLv3. See [[file:LICENSE][LICENSE]].

Dependencies