2012-08-14 5 views
5

Moim zamiarem jest użycie bm.elVisible Bookmarks dla każdego monitu, gdy naciskam RET. Udało mi się to osiągnąć w pewnym stopniu. Proszę o komentarz do mojego kodu, poniżej, jeśli brakuje jakiegoś ważnego problemu: np. Nie mam pojęcia, czy muszę obsługiwać argumenty poza zwykłym przekazaniem ich do domyślnej funkcji.Emssa eshell. Jak odczytać treść wiersza poleceń po naciśnięciu klawisza RET

Po naciśnięciu RET w pustym wierszu polecenia, nie chcę dodać do zakładek tej linii. Jak mogę przechwycić treść wiersza poleceń przed przejściem do domyślnej funkcji 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))) 

Odpowiedz

4

Twój kod wygląda przyzwoicie. Jeśli przeczytasz kod eshell-send-input, zobaczysz, jak uzyskać aktualne dane wejściowe.

Przeczytaj również o argumentach interactive. Aby przekazać region użytkownika do eshell-send-input, wymagany jest numer "P".

(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

Dobrze działa, dzięki za oczyszczenie mgły ... Z całą dobrą pomocą, stopniowo rozprawiam się z tym * elisem * orzechowym :) –

1

esh-mode definiuje zmienną eshell-last-output-end który aktualizuje za każdym razem, wyjście jest drukowany. Możesz więc pobrać ciąg znaków, który ma zostać wysłany do powłoki, robiąc coś takiego, jak sądzę.

EDIT: cytat z dokumentacji dotyczącej eshel-send-input.

„Wyślij wejście otrzymanych do Eshell do analizowania i przetwarzania Po eshell-last-Output-końca, wysyła cały tekst z tego markera do punktu jak wejściowego. przed tym znacznikiem, nazywa `eshell-get-old-input” aby pobrać stare wejście, kopiuje go do końca bufora, i wysyła je.

Jeśli USE-REGION nie jest zerowa , bieżący region (między punktem i znakiem) zostanie użyte jako wejście.

Jeśli KOLEJKA-P nie jest zerowa, dane wejściowe będą umieszczane w kolejce do następnego monitu, zamiast do aktualnie aktywnego procesu. Jeśli nie ma żadnego procesu, dane wejściowe są przetwarzane natychmiast.

Jeśli NO-NEWLINE nie jest zerowa, wejście jest wysyłana bez domniemanej końcowego linią.”

Accent jest mój. A jeśli spojrzeć na źródła eshel-send-input, może masz pomysł Sposób użycia:

Aby zastanowić się nad odpowiedzią event_jr - nie musisz podawać uniwersalnego argumentu do tej funkcji, jeśli twoja funkcja nie ma takiej opcji ... Oczywiście, do tej pory nie masz na to żadnego wpływu To jest niepotrzebne.

+0

Nie mogłem uzyskać niczego działającego z 'eshell-last-output-end'. Jego dokumentacja mówi: * Nie dokumentowane jako zmienna. * –

+0

Mhh .. część 'esh-mode' i' eshel-'była nieco zagadkowa, ale wydaje się, że * każdy * dzielony segment nazwy ma swoje własne zakończenie. Wydaje mi się, że mam zbyt wiele * bash * uprzedzeń .... (czytając to wszystko teraz ... –

+0

Dziękuję za dobre referencje .. nauczyłem się kilku nowych punktów .. (ond there jest sporo do zrobienia, w elicie, ogólnie :) –

0

(Ans zastanawiając się nad moim własnym pytaniem) ... Zdałem sobie sprawę, że eshell jest w jego rdzeniu tylko buforem emacs, więc mając to na uwadze, wymyśliłem tę metodę, która działa, ale być może da się zrobić lepiej. Może jest w tym coś, czego jeszcze nie jestem świadomy, więc wciąż jestem otwarty na sugestie.

(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)) 
Powiązane problemy