I wrote a function to insert some special characters in "EMACS", which will ask to input the name and it inserts the corresponding special character.
Example: when I type "alpha", the function will insert α instead.
But when I type these characters, I found out that I cannot use auto completion. I defined alpha as α and beta as β, but when I type al[Tab] it just inserts a tab.
How can I define the auto completion for my function?
--Edit--------------------------------
Sorry, I'm still new to emacs and just started to write elisp function yesterday.
I just used a straightforward way to implement this function, using interactive with code s to read strings
That's why I wonder how to get the auto-completion done. Because I didn't find any tutorials about such things. Maybe it's for my lack in elisp knowledge to search the right answer.
Anyway, here is my code:
(defun sp-char (char)
"Insert some special chars."
(interactive "sInput char name: ")
(let ((funky-char))
    (setq funky-char
      (cond
       ((string= char "Alpha" ) "Α")
       ((string= char "alpha" ) "α")
       ((string= char "Beta" ) "Β")
       ((string= char "beta" ) "β")
       ((string= char "Gamma" ) "Γ")
       ((string= char "gamma" ) "γ")
       ((string= char "Delta" ) "Δ")
       ((string= char "delta" ) "δ")
       ))
(insert funky-char)))
I searched the read-string, but still confused how to get the completion done.
I'd appreciate it if you show me a little piece of code as example.
If it's just Unicode chars you're after, there are other ways to solve the problem:
insert-char bound to C-x 8 RET.
It's got completion, so *alpha will get you everything
with alpha in it.xmodmap to redefine your keyboard:
each key, like w has not two, but four states:
normal, shift, Mod4 and Mod4+shift.
I've it configured like this: w W ω Ω.yasnippet to accomplish this task.
Like the second method, and different from the
first and your method, it has a big advantage that it doesn't
break your flow: you're not distracted by having to look
at the minibuffer and/or read the possible choices -
you just type what you wanted to type and expand.expand-abbrev is similar to yasnippet but
easier to add to, since each abbrev is just an element
in the list, instead of a file. But it doesn't have
fields/mirrors.But it all really depends on what you're trying to do.
This completion will exit as soon as the candidate is unique.
(defvar zz-minibuffer-map (copy-keymap minibuffer-local-must-match-map))
(define-key zz-minibuffer-map
  [remap self-insert-command] 'zz-self-insert-complete-and-exit)
(defun zz-self-insert-complete-and-exit (n)
  (interactive "p")
  (self-insert-command n)
  (ignore-errors
    (completion--do-completion nil 'expect-exact))
  (let ((candidates (completion-all-sorted-completions)))
    (cond
      ((null candidates)
       (backward-delete-char-untabify 1)
       (minibuffer-complete))
      ((eq 1 (safe-length candidates))
       (minibuffer-complete-and-exit)))))
(defun sp-char (char)
  "Insert some special chars."
  (interactive
   (list
    (let ((minibuffer-local-must-match-map zz-minibuffer-map))
      (completing-read "Input char name: " special-char-alist nil t))))
  (insert (cadr (assoc char special-char-alist))))
(defvar special-char-alist
  '(("Alpha" "Α")
    ("alpha" "α")
    ("Beta" "Β")
    ("beta" "β")
    ("Gamma" "Γ")
    ("gamma" "γ")
    ("Delta" "Δ")
    ("delta" "δ")))
                        Use completing-read rather than read-string (or worse, read-from-minibuffer).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With