2012-08-14 16 views
5

Mục đích của tôi là sử dụng bm.elVisible Bookmarks cho từng lời nhắc khi tôi nhấn RET. Tôi đã quản lý để đạt được điều này đến một mức độ nào đó .. Xin vui lòng bình luận về mã của tôi, dưới đây, nếu nó thiếu một số vấn đề quan trọng: ví dụ. Tôi không có ý tưởng nếu tôi cần phải xử lý các args vượt ra ngoài chỉ cần chuyển chúng vào chức năng mặc định.Emacs eshell. Cách đọc nội dung của dòng lệnh khi nhấn RET

Khi tôi nhấn RET trên dòng lệnh trống, tôi không muốn đánh dấu đường đó. Làm thế nào tôi có thể chặn nội dung dòng lệnh trước khi chuyển contol sang hàm mặc định eshell-send-input?

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "eshell-send-input, customized to add bm-bookmark to prompt line" 
(interactive) 
    (bm-bookmark-add) 
    (eshell-send-input use-region queue-p no-newline)) 

(add-hook 'eshell-mode-hook 
      #'(lambda() 
       (define-key eshell-mode-map 
       [return] 
       'eshell-send-input-zAp))) 

Trả lời

4

Mã của bạn có vẻ phong nha. Nếu bạn đọc mã số eshell-send-input, bạn sẽ thấy cách nhận dữ liệu nhập hiện tại.

Cũng đọc lên trên interactive đối số. Yêu cầu "P" để chuyển vùng người dùng đến eshell-send-input.

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "eshell-send-input, customized to add bm-bookmark to prompt line" 
    (interactive "*P") 
    (unless (string-equal (eshell-get-old-input use-region) "") 
    (bm-bookmark-add)) 
    (eshell-send-input use-region queue-p no-newline)) 
+0

Nó hoạt động độc đáo.Cảm ơn cho thanh toán bù trừ sương mù ... Với tất cả sự giúp đỡ tốt, tôi đang dần dần nứt này * elisp * nut :) –

1

esh-mode định nghĩa một biến eshell-last-output-end mà nó cập nhật mỗi lần sản lượng được in ra. Vì vậy, bạn có thể lấy chuỗi được gửi đến vỏ bằng cách làm một cái gì đó như (buffer-substring eshell-last-output-end (point-max)) Tôi tin.

EDIT: trích dẫn từ tài liệu trên eshel-send-input:.

"Gửi các đầu vào nhận được để Eshell để phân tích và xử lý Sau eshell-cuối-đầu ra-end, gửi tất cả các văn bản từ điểm đánh dấu mà chỉ như đầu vào. Trước khi đánh dấu đó, gọi 'eshell-get-cũ-input' để lấy đầu vào cũ, sao chép nó vào cuối của bộ đệm, và gửi nó.

Nếu SỬ DỤNG-REGION là phi nil , khu vực hiện tại (giữa điểm và điểm) sẽ được sử dụng làm đầu vào.

Nếu QUEUE-P không phải là số không, đầu vào sẽ được xếp hàng đợi cho đến lần nhắc tiếp theo, thay vì được gửi đến quy trình hiện đang hoạt động. Nếu không có quy trình, đầu vào được xử lý ngay lập tức.

Nếu NO-NEWLINE là phi nil, đầu vào sẽ được gửi mà không có một ngụ ý thức xuống dòng."

Accent là của tôi. Và nếu bạn nhìn vào nguồn gốc của eshel-send-input, bạn có thể nhận được các ý tưởng

Để phản ánh câu trả lời của event_jr - bạn không nhất thiết phải chuyển đối số chung cho hàm này nếu chức năng của riêng bạn không có tùy chọn như vậy ... Rõ ràng, cho đến nay bạn không sử dụng được , đó là loại không cần thiết.

+0

Tôi chưa thể lấy bất kỳ thứ gì chạy từ 'eshell-end-output-end'. Tài liệu của nó nói: * Không được ghi thành biến. * –

+0

Mhh .. phần 'esh-mode' và' eshel-'hơi khó hiểu một chút, nhưng dường như * mỗi phân đoạn * gạch nối của một tên hoàn thành riêng. Tôi dường như có một vài quá nhiều * bash * định kiến ​​.... (đọc lên trên tất cả bây giờ ... –

+0

Cảm ơn bạn đã tham khảo tốt .. Tôi đã học không phải là một vài điểm mới .. (ond có là một số ít để đi, trong elisp, nói chung :) –

0

(Ans wering câu hỏi của riêng tôi) ... Tôi nhận ra rằng eshell là cốt lõi của nó chỉ là một bộ đệm emacs, Vì vậy, với điều đó trong tâm trí, tôi đã đưa ra phương pháp này, mà không làm việc, nhưng có lẽ có thể được thực hiện tốt hơn. Có lẽ có một cái gì đó về nó mà tôi chưa biết, vì vậy tôi vẫn mở để gợi ý.

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline) 
    "A customized `eshell-send-input`, to add bm-bookmark to prompt line" 
    (interactive) 
    (let ((line (buffer-substring-no-properties (point-at-bol) (point-at-eol)))) 
    (if (string-match eshell-prompt-regexp line) 
     (if (> (length (substring line (match-end 0))) 0) 
      (bm-bookmark-add)))) 
    (eshell-send-input use-region queue-p no-newline)) 
Các vấn đề liên quan