Bất kỳ cách nào để có vỏ emacs vượt qua TAB thành một lệnh readline chạy bên trong nó?


8

Ví dụ. khi bạn đang chạy những thứ hay ho như Perl hoặc Ruby REPL, bạn đã hoàn thành mã / lệnh thông qua GNU Readline. Những gì tôi muốn làm là đặt một số biến elisp / env khi nhập / thoát một chương trình như vậy để cho biết rằng tôi muốn shell-modetruyền khóa TAB vào các chương trình đó.

Lưu ý rằng điều đó C-q TABcũng không hoạt động, vì vậy tôi nghĩ rằng Readline cũng bỏ qua nó bởi vì TERM=dumb, nhưng đặt nó thành ví dụ. vt100 cũng không thực hiện được mánh khóe, vì vậy nó thậm chí có thể được xem xét EMACS=t.


3
Comint không hoạt động theo cách đó. Nó chờ đợi một dòng được gửi cùng RET, sau đó nhận đầu ra cho đến khi nhận ra lời nhắc. Hoàn thành do đó phải được giải quyết về phía nó.
wasamasa

Hãy xem ESS , hoặc chế độ sân cỏ để xem cách hoàn thành được xử lý trực tiếp trong elisp bên phía Emacs, thay vì dựa vào đường dẫn.
Tyler

Điều này cũng hữu ích với chế độ Prolog, trong đó việc nhấn tab được cho là để nhắc trình thông dịch tạo giải pháp tiếp theo.
wvxvw

@Tyler điều là nơi kiến ​​thức tồn tại ở nơi khác (ví dụ: trong một trình thông dịch đang chạy). Tôi đoán rằng tôi có thể tạo một số loại proxy đọc có thể hoàn thành được ủy quyền cho nó từ lisp - có vẻ như rất nhiều công việc :)
Đánh dấu Aufflick

@MarkAufflick ESS thực hiện một cái gì đó giống như tôi nghĩ, với hầu hết các hoàn thành được cung cấp qua elisp, nhưng một số trường hợp / tình huống đặc biệt được chuyển cho quy trình R. Các trường hợp đặc biệt có thể dẫn đến hoàn thành chậm đau đớn.
Tyler

Câu trả lời:


2

M-x shellhoạt động trực tuyến tại một thời điểm. Nó chuyển một dòng đầu vào cho quá trình shell bên ngoài khi bạn nhấn Retphím.

M-x termvượt qua mọi tổ hợp phím cho quy trình shell bên ngoài, với các ngoại lệ C-cvà tôi nghĩ Esc. Khi bạn nhấn Tabnó sẽ được nhìn thấy và giải thích bởi quá trình shell bên ngoài.


2

Như @ user20119 đã chỉ ra, M-x termcó thể là một lựa chọn tốt: nó cũng hỗ trợ tự động chuyển sang "chế độ đường truyền" tương tự như những gì bạn nhận được M-x shell.

M-x eshell cũng cố gắng cung cấp cho bạn một kết hợp của hai hành vi.

Tôi cũng sẽ chỉ ra rằng C-q TABnó không hoạt động bởi vì tất cả những gì nó làm là chèn một ký tự TAB vào bộ đệm (thay vì gửi TAB cho quy trình phụ). Hơn nữa, chỉ cần gửi một char TAB cho quy trình cơ bản là không đủ, bởi vì văn bản trên dòng hiện tại chưa được gửi đến quy trình, vì vậy bạn có thể cần một cái gì đó như:

(defun my-comint-tab ()
  (interactive)
  (let* ((proc (get-buffer-process (current-buffer)))
         (str (buffer-substring (process-mark proc) (point))))
    (process-send-string proc (concat str "\t"))))

và thực sự có lẽ bạn cũng cần phải thuyết phục M-x shellđể sử dụng một cài đặt khác cho $TERM.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.