diff --git a/operational b/operational index d8160eab93e2304f57ad496d8e26d5baba7b3691..664959327f3ae595722b62812383b03faf986d3e 100644 --- a/operational +++ b/operational @@ -111,11 +111,58 @@ cd ~/lisp/elisp/zero/ * later :entry: * current :entry: ** -** 2019-11-03 add completion support for zero-input-set-im -complete registered im symbols. ** 2019-10-23 checkdoc and package-lint can't ignore some non-issues. I can't run them in git pre-commit hook. * done :entry: +** 2019-11-03 add completion support for zero-input-set-im +complete registered im symbols. + +- 2020-02-16 + Function: completing-read prompt collection &optional predicate + + make sure non-interactively usage still works. + (zero-input-set-im 'pinyin) + +- DONE allow input method name to be string. + to add backward compatibility, symbol is also supported. + symbol is auto converted to lower case string. + + string is a better fit for names. it can include unicode strings easier. + +- problems + - how to call completing-read when call interactively? + + search: use completing-read with interactive function + + just call the function when &optional arg is nil. + + - (zero-input-set-im 'pinyin) + this doesn't allow input pinyin after switching to table and back。 + + if then else issue. + fixed. + + - DONE when im name is string, alist eq comparison won't work. + change to string-equal based compare. + + search: assq-delete-all but with string-equal + + emacs - Elisp: How to delete an element from an association list with string key - Stack Overflow + https://stackoverflow.com/questions/9812393/elisp-how-to-delete-an-element-from-an-association-list-with-string-key + + - (zero-input-set-im 'pinyin) + method not registered. + + (assq im-name zero-input-ims) + (assoc im-name zero-input-ims) + + - try switch to empty and back. + + (zero-input-set-im 'pinyin) + (zero-input-set-im 'empty) + + it works. + ** 2020-02-16 declare zero-input-punctuation-level, zero-input-full-width-p using defcustom use set-default to set the value. diff --git a/zero-input-framework.el b/zero-input-framework.el index 6a862e55cb7dee4d313125c3752973cc74cc717e..27929fcc630a8a5c4da2a9cc5f30a6370f6c2e69 100644 --- a/zero-input-framework.el +++ b/zero-input-framework.el @@ -133,7 +133,7 @@ If item is not in lst, return nil." ;; zero-input-el version (defvar zero-input-version nil "Zero package version.") -(setq zero-input-version "2.4.0") +(setq zero-input-version "2.5.0") ;; FSM state (defconst zero-input--state-im-off 'IM-OFF) @@ -797,11 +797,14 @@ virtual functions corresponding variable registered input method is saved in `zero-input-ims'" ;; add or replace entry in `zero-input-ims' - (unless (symbolp im-name) - (signal 'wrong-type-argument (list 'symbolp im-name))) - (setq zero-input-ims (assq-delete-all im-name zero-input-ims)) + (unless (stringp im-name) + (signal 'wrong-type-argument (list 'stringp im-name))) + (setq zero-input-ims (delq (assoc im-name zero-input-ims) zero-input-ims)) (setq zero-input-ims (push (cons im-name im-functions-alist) zero-input-ims))) +;; Built-in empty input method. It only handles Chinese punctuation. +(zero-input-register-im "empty" nil) + ;;============ ;; public API ;;============ @@ -845,21 +848,32 @@ LEVEL the level to set to." (message "punctuation level set to %s" zero-input-punctuation-level)) ;;;###autoload -(defun zero-input-set-im (im-name) +(defun zero-input-set-im (&optional im-name) "Select zero input method for current buffer. -if IM-NAME is nil, use default empty input method" - ;; TODO provide auto completion for im-name - (interactive "SSet input method to: ") +IM-NAME (a string) should be a registered input method in zero-input." + (interactive) ;; when switch away from an IM, run last IM's :shutdown function. (if zero-input-im - (let ((shutdown-func (cdr (assq :shutdown (cdr (assq zero-input-im zero-input-ims)))))) + (let ((shutdown-func (cdr (assq :shutdown (cdr (assoc zero-input-im zero-input-ims)))))) (if (functionp shutdown-func) (funcall shutdown-func)))) - (if im-name - (let ((im-functions (cdr (assq im-name zero-input-ims)))) - (if im-functions + (cond + ((null im-name) + ;; TODO is there an easier way to provide auto complete in mini buffer? + ;; I used a recursive call to the same function. + (let ((im-name-str (completing-read "Set input method to: " zero-input-ims))) + (if (s-blank? im-name-str) + (error "Input method name is required") + (zero-input-set-im im-name-str)))) + ((symbolp im-name) + ;; for backward compatibility + (zero-input-set-im (symbol-name im-name))) + (t (let* ((im-slot (assoc im-name zero-input-ims)) + (im-functions (cdr im-slot))) + (if im-slot (progn + (zero-input-debug "switching to %s input method" im-name) ;; TODO create a macro to reduce code duplication and human ;; error. ;; @@ -895,16 +909,7 @@ if IM-NAME is nil, use default empty input method" (if (functionp init-func) (funcall init-func))) (setq zero-input-im im-name)) - (error "Input method %s not registered in zero" im-name))) - (zero-input-debug "using default empty input method") - (setq zero-input-build-candidates-func 'zero-input-build-candidates-default) - (setq zero-input-build-candidates-async-func 'zero-input-build-candidates-async-default) - (setq zero-input-can-start-sequence-func 'zero-input-can-start-sequence-default) - (setq zero-input-handle-preedit-char-func 'zero-input-handle-preedit-char-default) - (setq zero-input-get-preedit-str-for-panel-func 'zero-input-get-preedit-str-for-panel-default) - (setq zero-input-backspace-func 'zero-input-backspace-default) - (setq zero-input-preedit-start-func nil) - (setq zero-input-preedit-end-func nil))) + (error "Input method %S not registered in zero" im-name)))))) ;;;###autoload (defun zero-input-set-default-im (im-name) diff --git a/zero-input-pinyin.el b/zero-input-pinyin.el index 9a9be146b4f86adc372c9775307fc97cc4dda691..ca5f39213fafeb456b8134954f9898296a45faa7 100644 --- a/zero-input-pinyin.el +++ b/zero-input-pinyin.el @@ -356,7 +356,7 @@ DIGIT 0 means delete 10th candidate." (defun zero-input-pinyin-register-im () "Register pinyin input method in zero framework." (zero-input-register-im - 'pinyin + "pinyin" (append (if zero-input-pinyin-use-async-fetch '((:build-candidates-async . zero-input-pinyin-build-candidates-async)) diff --git a/zero-input-table.el b/zero-input-table.el index ccba22684548fbad3cedda392ce3e8997f7c4b92..a985034f3926a7c856bc2c87e60143e2643f8f78 100644 --- a/zero-input-table.el +++ b/zero-input-table.el @@ -69,7 +69,7 @@ ;;=============================== (zero-input-register-im - 'zero-input-table + "zero-input-table" '((:build-candidates . zero-input-table-build-candidates) (:can-start-sequence . zero-input-table-can-start-sequence))) diff --git a/zero-input.el b/zero-input.el index 5e03a00c8bcb76c4f0279011236bd02a20bee971..1d7759009f6d57ed0dad5fe79ebbc13dcf0f1dbf 100644 --- a/zero-input.el +++ b/zero-input.el @@ -12,7 +12,7 @@ ;; See the License for the specific language governing permissions and ;; limitations under the License. -;; Version: 2.4.0 +;; Version: 2.5.0 ;; URL: https://gitlab.emacsos.com/sylecn/zero-el ;; Package-Requires: ((emacs "24.3") (s "1.2.0")) @@ -246,7 +246,7 @@ If item is not in lst, return nil." ;; zero-input-el version (defvar zero-input-version nil "Zero package version.") -(setq zero-input-version "2.4.0") +(setq zero-input-version "2.5.0") ;; FSM state (defconst zero-input--state-im-off 'IM-OFF) @@ -910,11 +910,14 @@ virtual functions corresponding variable registered input method is saved in `zero-input-ims'" ;; add or replace entry in `zero-input-ims' - (unless (symbolp im-name) - (signal 'wrong-type-argument (list 'symbolp im-name))) - (setq zero-input-ims (assq-delete-all im-name zero-input-ims)) + (unless (stringp im-name) + (signal 'wrong-type-argument (list 'stringp im-name))) + (setq zero-input-ims (delq (assoc im-name zero-input-ims) zero-input-ims)) (setq zero-input-ims (push (cons im-name im-functions-alist) zero-input-ims))) +;; Built-in empty input method. It only handles Chinese punctuation. +(zero-input-register-im "empty" nil) + ;;============ ;; public API ;;============ @@ -958,21 +961,32 @@ LEVEL the level to set to." (message "punctuation level set to %s" zero-input-punctuation-level)) ;;;###autoload -(defun zero-input-set-im (im-name) +(defun zero-input-set-im (&optional im-name) "Select zero input method for current buffer. -if IM-NAME is nil, use default empty input method" - ;; TODO provide auto completion for im-name - (interactive "SSet input method to: ") +IM-NAME (a string) should be a registered input method in zero-input." + (interactive) ;; when switch away from an IM, run last IM's :shutdown function. (if zero-input-im - (let ((shutdown-func (cdr (assq :shutdown (cdr (assq zero-input-im zero-input-ims)))))) + (let ((shutdown-func (cdr (assq :shutdown (cdr (assoc zero-input-im zero-input-ims)))))) (if (functionp shutdown-func) (funcall shutdown-func)))) - (if im-name - (let ((im-functions (cdr (assq im-name zero-input-ims)))) - (if im-functions + (cond + ((null im-name) + ;; TODO is there an easier way to provide auto complete in mini buffer? + ;; I used a recursive call to the same function. + (let ((im-name-str (completing-read "Set input method to: " zero-input-ims))) + (if (s-blank? im-name-str) + (error "Input method name is required") + (zero-input-set-im im-name-str)))) + ((symbolp im-name) + ;; for backward compatibility + (zero-input-set-im (symbol-name im-name))) + (t (let* ((im-slot (assoc im-name zero-input-ims)) + (im-functions (cdr im-slot))) + (if im-slot (progn + (zero-input-debug "switching to %s input method" im-name) ;; TODO create a macro to reduce code duplication and human ;; error. ;; @@ -1008,16 +1022,7 @@ if IM-NAME is nil, use default empty input method" (if (functionp init-func) (funcall init-func))) (setq zero-input-im im-name)) - (error "Input method %s not registered in zero" im-name))) - (zero-input-debug "using default empty input method") - (setq zero-input-build-candidates-func 'zero-input-build-candidates-default) - (setq zero-input-build-candidates-async-func 'zero-input-build-candidates-async-default) - (setq zero-input-can-start-sequence-func 'zero-input-can-start-sequence-default) - (setq zero-input-handle-preedit-char-func 'zero-input-handle-preedit-char-default) - (setq zero-input-get-preedit-str-for-panel-func 'zero-input-get-preedit-str-for-panel-default) - (setq zero-input-backspace-func 'zero-input-backspace-default) - (setq zero-input-preedit-start-func nil) - (setq zero-input-preedit-end-func nil))) + (error "Input method %S not registered in zero" im-name)))))) ;;;###autoload (defun zero-input-set-default-im (im-name) @@ -1088,7 +1093,7 @@ if IM-NAME is nil, use default empty input method" ;;=============================== (zero-input-register-im - 'zero-input-table + "zero-input-table" '((:build-candidates . zero-input-table-build-candidates) (:can-start-sequence . zero-input-table-can-start-sequence))) @@ -1548,7 +1553,7 @@ DIGIT 0 means delete 10th candidate." (defun zero-input-pinyin-register-im () "Register pinyin input method in zero framework." (zero-input-register-im - 'pinyin + "pinyin" (append (if zero-input-pinyin-use-async-fetch '((:build-candidates-async . zero-input-pinyin-build-candidates-async))