Tôi đang cố gắng để tạo ra một chương trình mà chấp nhận đầu vào người dùng như cách tương tự như iex
hoặc erl
không (ví dụ. Khi nhấn phép phím để di chuyển lịch sử trước đó).Bất kỳ hỗ trợ ràng buộc dòng đọc cho elixir?
Nếu tiêu chuẩn IO.gets
được sử dụng như sau,
IO.gets "user> "
Giao diện điều khiển kết thúc với những sản phẩm sau khi up-cho phép được nhấn.
user> ^[[A^[[A
Có bất kỳ chức năng/thư viện có khả năng readline mà có thể được sử dụng bên trong mã elixir?
Những gì tôi đã điều tra cho đến nay là,
- Một số ngôn ngữ có tính ràng buộc hỗ trợ cho các thư viện readline, nhưng tôi đã không thể tìm thấy khả năng tương xứng cho elixir.
iex
thực hiện dường như ủy quyền khả năng này choerl
(/lib/iex/history.ex dường như chỉ quản lý danh sách lịch sử), nhưng tôi chưa thể tìm ra chức năng tương ứng ở phía bên erlang.- Tôi đã thử
erl_ddll.load
, nhưng không đi xa hơn từ những điều sau đây.
trên IEX,
iex(4)> :erl_ddll.load('/usr/lib', 'libreadline')
{:error, {:open_error, -10}}
iex(5)> :erl_ddll.format_error({:open_error, -10})
'dlopen(/usr/lib/libreadline.so, 2): image not found'
Tôi đang trên OSX và cài đặt libreadline qua homebrew, và tôi có thể tìm libreadline.dylib
trong /usr/lib
.
[Ghi chú thêm về mục đích]
tôi đã thử nghiệm trên như sau (mal) với elixir, mà là một repl lisp thực hiện bằng các ngôn ngữ khác nhau (nhưng không phải với elixir/erlang).
Phần của bước đang thực hiện repl với lịch sử, và một số ngôn ngữ đang sử dụng thư viện readline ràng buộc nếu có không phải là một người bản xứ.
[Một chút nữa cập nhật - 2015/3/22]
Tôi đã cố gắng tiếp cận với NIF (như tương tự như encurses) để sử dụng thư viện readline. Tôi có thể làm cho nó phần nào làm việc trên erlang (erl), nhưng bị mắc kẹt ở bên elixir. Khi đọc đầu vào từ thư viện C (readline hoặc chỉ scanf thuần túy), "mix run -e" hoặc "iex" có vẻ có vẻ hơi lạ (bỏ qua hoặc bỏ qua một số đầu vào), nhưng không thể tìm ra lý do. encurses dường như hành xử tương tự.
Sau đây là thử nghiệm của tôi.
https://github.com/parroty/ereadline
https://github.com/parroty/readline
Tôi có thể xảy ra với cách tiếp cận tổng quát hơn như rlwrap.
có thể trùng lặp của [Làm thế nào để lưu/đăng nhập đầu ra của vỏ iex để có được lịch sử lệnh liên tục?] (Http://stackoverflow.com/questions/22426716/how-to-save-log-the-output- of-the-iex-shell-to-get-persistent-command-history) –
Tôi không biết về bất kỳ tích hợp readline nào nhưng sẽ ncurses giúp đỡ với những gì bạn muốn đạt được? https://github.com/jzellner/encurses –
Cảm ơn bạn đã tham khảo. Tôi đã tìm kiếm lịch sử thực hiện bên ngoài của iex (tôi đã cập nhật nền trong câu hỏi). Tuy nhiên, một số kỹ thuật có thể được áp dụng. Tôi sẽ kiểm tra chúng thêm. Tôi sẽ kiểm tra ncurses quá. – parroty