2011-12-25 19 views
8

Tôi muốn chơi và thử nghiệm với một số công cụ phần mềm, mỗi công cụ sẽ có giao diện dòng lệnh. Một số công cụ này bao gồm HBase, pig, erlang và prolog. Tôi muốn sử dụng emacs như một giao diện người dùng cho các công cụ này giống như cách tôi có thể chạy một trình bao python với M-x run-python hoặc một trình thông dịch Lisp với chế độ ielm.công thức để xây dựng một chế độ bao bọc emacs xung quanh một chương trình dòng lệnh?

Có công thức nào tôi có thể làm theo để bọc một trong các công cụ dòng lệnh này trong chế độ emacs không? Tôi đang tìm một cái gì đó sẽ hiển thị dấu nhắc của công cụ, hãy để tôi tìm kiếm thông qua lịch sử với C-c C-n/C-p, gửi đầu vào hiện tại vào quá trình của công cụ mà tôi nhấn Enter, và hiển thị đầu ra của công cụ.

Tôi biết nhiều công cụ này có thể đã có chế độ emacs, tôi quan tâm đến cách nhanh chóng xây dựng một chế độ nếu không có gì tồn tại.

+0

Nó không hoàn toàn trả lời câu hỏi của bạn, nhưng nếu bạn thực hiện một emacs lisp wrapper cho công cụ thì bạn có thể sử dụng nó từ ielm. Tôi làm điều này với emas redis wrapper của tôi ví dụ. http://code.google.com/p/eredis/ – justinhj

Trả lời

7

Gần đây tôi đã tạo "chế độ gosu kém hơn" cho ngôn ngữ gosu. Nó thực sự hóa ra là khá đơn giản: Tôi chỉ cần mở rộng comint đó là chế độ mà trên đó cả hai shellielm được dựa. Đây là bit quan trọng của mã:

(require 'comint) 
(defun inferior-gosu-mode() 
    (interactive) 
    (comint-mode) 
    (setq comint-prompt-regex inferior-gosu-prompt) 
    (setq major-mode 'inferior-gosu-mode) 
    (setq mode-name "Inferior Gosu") 
    (setq mode-line-process '(":%s")) 
    (use-local-map 'inferior-gosu-mode-map)) 

bit use-local-map bit chỉ là nơi bạn xác định ràng buộc phím đặc biệt; Tôi có nó như chỉ là một bản sao của các ràng buộc tình báo thông tin:

(defvar inferior-gosu-mode-map nil) 
(unless inferior-gosu-mode-map 
    (setq inferior-gosu-mode-map (copy-keymap comint-mode-map))) 

Sau này tôi đã có một số mã đơn giản mà định nghĩa một lệnh để khởi động quá trình đó sẽ bật mở đệm *inferior-gosu* nếu nó tồn tại. Tôi cũng đã thêm một chút mã vào chế độ gosu bình thường để mở một shell kém hơn gosu.

Tóm tắt: sử dụng comint.

Dưới đây là một liên kết đến toàn bộ mã, nhưng không có nhiều hơn nữa để nó: https://github.com/TikhonJelvis/Gosu-Mode/blob/master/inferior-gosu-mode.el

Đương nhiên thoải mái sử dụng mã tuy nhiên bạn muốn; bạn cũng có thể muốn xem xét chế độ gosu bình thường để xem cách bạn có thể tích hợp bạn erlang và prolog vào các chế độ chỉnh sửa tương ứng của ngôn ngữ.

+5

Điều đó có vẻ như một câu trả lời hữu ích, nhưng có lẽ không phải là cách tiếp cận tốt nhất để tạo chế độ của bạn? Tôi dự kiến ​​sẽ thấy '(define-derived-mode)' được sử dụng, với 'comint-mode' được chỉ định làm cha mẹ. – phils

Các vấn đề liên quan