jojojames/fussy

fussy-socre causes an args-out-of-range error when using fussy-fzf-native-score and passing non-ascii characters

Closed this issue · 0 comments

The repoducable code is here:

(let ((fussy-filter-fn #'fussy-filter-flex)
      (fussy-score-fn #'fussy-fzf-native-score))
  (fussy-score '("ポケモン.txt") "txt"))
;; => error: (args-out-of-range 13 16)

It seems that the position returned by fussy-fzf-native is calculated as a byte string instead of a string, so fussy-propertize-common-part results in args-out-of-range.

(fussy-fzf-native-score "ポケモン.txt" "txt")
;; => (80 13 14 15)
(fussy-fzf-native-score "pckemon.txt" "txt")
;; => (80 8 9 10)

I think this is a fzf-native issue, but I would be happy to have a workaround because fzf-native does not seem to take care of non-ascii (e.g. here).

Backtrace

Debugger entered--Lisp error: (args-out-of-range 13 16)
  add-face-text-property(13 16 completions-common-part nil #("ポケモン.txt" 0 1 (completion-score 80)))
  (let ((block-started (car (cdr score))) (last-char nil) (str (if (consp obj) (car obj) obj))) (let ((--dolist-tail-- (cdr score))) (while --dolist-tail-- (let ((char (car --dolist-tail--))) (if (and last-char (not (= ... char))) (progn (add-face-text-property block-started (1+ last-char) 'completions-common-part nil str) (setq block-started char))) (setq last-char char) (setq --dolist-tail-- (cdr --dolist-tail--))))) (add-face-text-property block-started (1+ last-char) 'completions-common-part nil str) (if (and last-char (> (length str) (+ 2 last-char))) (progn (add-face-text-property (1+ last-char) (+ 2 last-char) 'completions-first-difference nil str))) (if (consp obj) (cons str (cdr obj)) str))
  (if (<= (length score) 1) obj (let ((block-started (car (cdr score))) (last-char nil) (str (if (consp obj) (car obj) obj))) (let ((--dolist-tail-- (cdr score))) (while --dolist-tail-- (let ((char (car --dolist-tail--))) (if (and last-char (not ...)) (progn (add-face-text-property block-started ... ... nil str) (setq block-started char))) (setq last-char char) (setq --dolist-tail-- (cdr --dolist-tail--))))) (add-face-text-property block-started (1+ last-char) 'completions-common-part nil str) (if (and last-char (> (length str) (+ 2 last-char))) (progn (add-face-text-property (1+ last-char) (+ 2 last-char) 'completions-first-difference nil str))) (if (consp obj) (cons str (cdr obj)) str)))
  fussy-propertize-common-part(#("ポケモン.txt" 0 1 (completion-score 80)) (80 13 14 15))
  funcall(fussy-propertize-common-part #("ポケモン.txt" 0 1 (completion-score 80)) (80 13 14 15))
  (setq x (funcall fussy-propertize-fn x score))
  (progn (setq x (funcall fussy-propertize-fn x score)))
  (if (fussy--should-propertize-p) (progn (setq x (funcall fussy-propertize-fn x score))))
  (progn (put-text-property 0 1 'completion-score (car score) x) (if (fussy--should-propertize-p) (progn (setq x (funcall fussy-propertize-fn x score)))) (setq result (cons x result)))
  (if (and score (> (car score) 0)) (progn (put-text-property 0 1 'completion-score (car score) x) (if (fussy--should-propertize-p) (progn (setq x (funcall fussy-propertize-fn x score)))) (setq result (cons x result))))
  (let ((score (funcall fussy-score-fn x string cache))) (if (and score (> (car score) 0)) (progn (put-text-property 0 1 'completion-score (car score) x) (if (fussy--should-propertize-p) (progn (setq x (funcall fussy-propertize-fn x score)))) (setq result (cons x result)))))
  (if (> (length x) fussy-max-word-length-to-score) (setq result (cons x result)) (let ((score (funcall fussy-score-fn x string cache))) (if (and score (> (car score) 0)) (progn (put-text-property 0 1 'completion-score (car score) x) (if (fussy--should-propertize-p) (progn (setq x (funcall fussy-propertize-fn x score)))) (setq result (cons x result))))))
  (let ((x (car --dolist-tail--))) (setq x (copy-sequence x)) (if (> (length x) fussy-max-word-length-to-score) (setq result (cons x result)) (let ((score (funcall fussy-score-fn x string cache))) (if (and score (> (car score) 0)) (progn (put-text-property 0 1 'completion-score (car score) x) (if (fussy--should-propertize-p) (progn (setq x ...))) (setq result (cons x result)))))) (setq --dolist-tail-- (cdr --dolist-tail--)))
  (while --dolist-tail-- (let ((x (car --dolist-tail--))) (setq x (copy-sequence x)) (if (> (length x) fussy-max-word-length-to-score) (setq result (cons x result)) (let ((score (funcall fussy-score-fn x string cache))) (if (and score (> (car score) 0)) (progn (put-text-property 0 1 'completion-score (car score) x) (if (fussy--should-propertize-p) (progn ...)) (setq result (cons x result)))))) (setq --dolist-tail-- (cdr --dolist-tail--))))
  (let ((--dolist-tail-- candidates)) (while --dolist-tail-- (let ((x (car --dolist-tail--))) (setq x (copy-sequence x)) (if (> (length x) fussy-max-word-length-to-score) (setq result (cons x result)) (let ((score (funcall fussy-score-fn x string cache))) (if (and score (> ... 0)) (progn (put-text-property 0 1 ... ... x) (if ... ...) (setq result ...))))) (setq --dolist-tail-- (cdr --dolist-tail--)))))
  (let ((result 'nil)) (let ((--dolist-tail-- candidates)) (while --dolist-tail-- (let ((x (car --dolist-tail--))) (setq x (copy-sequence x)) (if (> (length x) fussy-max-word-length-to-score) (setq result (cons x result)) (let ((score ...)) (if (and score ...) (progn ... ... ...)))) (setq --dolist-tail-- (cdr --dolist-tail--))))) (reverse result))
  fussy-score(("ポケモン.txt") "txt")
  (let ((fussy-filter-fn #'fussy-filter-flex) (fussy-score-fn #'fussy-fzf-native-score)) (fussy-score '("ポケモン.txt") "txt"))
  (progn (let ((fussy-filter-fn #'fussy-filter-flex) (fussy-score-fn #'fussy-fzf-native-score)) (fussy-score '("ポケモン.txt") "txt")))
  elisp--eval-last-sexp(t)
  eval-last-sexp(t)
  eval-print-last-sexp(nil)
  funcall-interactively(eval-print-last-sexp nil)
  command-execute(eval-print-last-sexp)