история readline не работает

Итак, у Chicken-scheme есть отличное readline яйцо, которое можно использовать для добавления история, завершение табуляции и другие разумные функции в среду командной строки csi. Однако я не могу заставить его работать правильно, то есть он работает только при первом запуске csi после создания нового файла истории.

Я проверил документацию по яйцу и другим подобным яйцам, таким как linenoise и переговоры, но ни один из них не предлагает завершения табуляции или каких-либо советов о том, как обращаться этот недостаток readline.

Вот код, с которым я работаю:

(current-input-port (make-gnu-readline-port))
(gnu-history-install-file-manager
  (string-append (or (get-environment-variable "HOME") ".") "/.csi_history"))

ПРИМЕЧАНИЕ

Пока я писал это, я думаю, что, возможно, понял проблему или, по крайней мере, часть проблемы. Проблема, я думаю, заключается в том, что я устанавливаю файл истории; как это работает только для первой установки?

Тем не менее, моя попытка приготовить мою собственную установку readline file-manager делает так, что gnu readline никогда не записывает в файл истории, однако он будет читать из него.

(current-input-port (make-gnu-readline-port))
(let ((histfile (string-append (or (get-environment-variable "HOME") ".")
  "/.csi_history")))
  (and (file-exists? histfile) (gnu-readline-read-history histfile))
  (gnu-readline-append-history histfile))

Кто-нибудь еще сталкивался с этой проблемой?


person Alexej Magura    schedule 10.12.2014    source источник
comment
Похоже, вы используете устаревшую версию API чтения Chicken. Попробуйте обновить readline и свой .csirc согласно вики.   -  person nwk    schedule 05.01.2015
comment
@nwk, я забыл, что разместил этот вопрос. С тех пор на него ответили в списке рассылки пользователей курицы. Кроме того, я сопровождаю яйцо Chicken Readline, так что я хорошо осведомлен об обновлении, лол.   -  person Alexej Magura    schedule 06.01.2015


Ответы (2)


Оказывается, в моем файле ~/.zshrc у меня был псевдоним для csi, который вызывал csi с rlwrap:

alias csi='rlwrap csi'

Вызов rlwrap на csi приводил к тому, что csi использовал историю rlwrap вместо встроенной истории, предоставляемой яйцом readline.

person Alexej Magura    schedule 06.01.2015

readline устарел в куриной схеме, решение состоит в том, чтобы установить linenoise

и поместите это в свой .csirc:

(import linenoise)
(current-input-port (make-linenoise-port))

(set-history-length! 300)

(load-history-from-file ".linenoise-history")

(let loop ((expr (linenoise "> ")))
              (cond ((equal? expr "bye")
                             (save-history-to-file ".linenoise-history")
                             "Bye!")
                    (else
                        (display (eval (read (open-input-string expr))))
                        (newline)
                        (history-add expr)
                        (loop (linenoise "> ")))))
person Damien Mattei    schedule 02.03.2020