2012-08-14 12 views
5

La mia intenzione è quella di utilizzare bm.elVisible Bookmarks per ogni richiesta di conferma, come premo RET. Sono riuscito a raggiungere questo risultato fino ad un certo punto .. Si prega di commentare il mio codice, di seguito, se manca qualche problema importante: ad es. Non ho idea se ho bisogno di gestire gli argomenti oltre a passarli sulla funzione predefinita.Emacs eshell. Come leggere il contenuto della riga di comando su pressione del tasto Invio

Quando si preme RET su una riga di comando vuota, non voglio aggiungere questa linea ai segnalibri. Come posso intercettare il contenuto della riga di comando prima di passare il controllo alla funzione predefinita 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))) 

risposta

4

Il tuo codice sembra soddisfacente. Se leggi il codice di eshell-send-input, vedrai come ottenere l'input corrente.

Leggere anche su argomenti interactive. "P" è necessario per passare la regione utente su 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

Funziona bene, grazie per chiarire la nebbia ... Con tutto il buon aiuto, sto gradualmente cracking questo * elisp * nut :) –

1

esh-mode definisce una variabile eshell-last-output-end che aggiorna ogni volta l'uscita viene stampato. Quindi, puoi prendere la stringa che deve essere inviata alla shell facendo qualcosa come (buffer-substring eshell-last-output-end (point-max)) credo.

EDIT: citazione dalla documentazione sul eshel-send-input:.

"Invia l'input ricevuto per ESHELL per l'analisi e l'elaborazione Dopo eshell-last-uscita-end, invia tutto il testo da quel marcatore al punto come di ingresso. Prima di quel marcatore, chiama `eshell-get-old-ingresso' per recuperare vecchio ingresso, lo copia alla fine del buffer, e lo invia.

Se USE-regione è non-nil , la regione corrente (tra punto e punto) verrà utilizzato come input.

Se QUEUE-P è diverso da zero, l'input verrà messo in coda fino al prompt successivo, anziché inviato al processo attualmente attivo. Se nessun processo, l'input viene elaborato immediatamente.

Se NO-NEWLINE non è pari a zero, l'ingresso viene inviato senza un implicito finale a capo."

Accent è mio. E se si guarda nella fonte di eshel-send-input, si può ottenere l'idea di come viene utilizzato

Per riflettere sulla risposta di event_jr - non è necessario passare l'argomento universale a questa funzione se la propria funzione non ha tale opzione ... Ovviamente, finora non è possibile utilizzarlo È inutile:

+0

Non riesco a ottenere nulla in esecuzione da 'eshell-last-output-end'. La sua documentazione dice: * Non documentata come variabile. * –

+0

Mhh .. la parte 'esh-mode' e' eshel-'era un po 'sconcertante, ma sembra che * ogni * segmento di un nome scritto da un trattino abbia il suo completamento. Mi sembra di avere troppi preconcetti * bash * (leggendo tutto adesso ... –

+0

Grazie per i buoni riferimenti .. Ho imparato qualche nuovo punto ... sono abbastanza pochi per andare, in elisp, in generale :) –

0

(Ans wering la mia stessa domanda) ... Mi sono reso conto che il eshell è al suo interno solo un buffer di emacs, quindi, con questo in mente, ho trovato questo metodo, che funziona, ma forse potrebbe essere fatto meglio. Forse c'è qualcosa di cui non sono ancora a conoscenza, quindi sono ancora aperto a suggerimenti.

(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)) 
Problemi correlati