2009-05-11 5 views
16

Si tratta di uno scenario in cui sono stato eseguito alcune volte:Come conservare il contenuto degli appunti in Emacs su Windows?

Copia del testo da un altro programma. Vai su Emacs e fai qualche modifica prima di incollare/tirare il testo dentro. Cy to yank e voilà ... non il testo che intendevo incollare. Poi mi rendo conto che mentre sto spostando le cose, ho usato comandi come kill- linea e parola uccisa all'indietro, e quelle linee e parole uccise ora occupavano l'uccisione. Ma digitando M-y non si riporta il testo originale copiato, quindi ho bisogno di tornare al mio programma originale per copiare nuovamente il testo. E anche peggio se il programma originale è chiuso, quindi ho perso completamente il testo copiato.

Kill-line, ecc. Sono comandi di base (come premere il tasto Canc, quasi), e anche se non mi dispiace che l'kill-ring sia un po 'ingombrante usando quel comando, mi aspetto che il mio originale il testo rimane da qualche parte nel kill-ring in modo che possa trovarlo digitando My poche volte. Come posso fare in modo che Emacs conservi automaticamente il contenuto degli appunti corrente nell'hit-ring prima di scavalcare il contenuto degli appunti?

risposta

12

Questo codice dovrebbe mettere automaticamente la selezione (da fuori Emacs) sul kill-ring ogni volta che si esegue un kill in Emacs. È stato testato su Linux, ma non dovrebbe essere limitato a Linux.

(defadvice kill-new (before kill-new-push-xselection-on-kill-ring activate) 
    "Before putting new kill onto the kill-ring, add the clipboard/external selection to the kill ring" 
    (let ((have-paste (and interprogram-paste-function 
         (funcall interprogram-paste-function)))) 
    (when have-paste (push have-paste kill-ring)))) 

Se vi trovate a fare questo molto, può essere utile dare un'occhiata al pacchetto browse-kill-ring, che ti dà una bella vista della kill-ring (al contrario di digitare più volte M-y).

+0

semplice, facile, perfetto. L'ho usato oggi. Aveva copiato del testo da un browser e poi era passato in emacs per incollarlo in un nuovo file. Senza rendermene conto, avevo usato alcuni comandi kill sul nome del file mentre stavo aprendo il nuovo file. Senza questo script il contenuto degli appunti sarebbe sparito. Ma questa volta ha funzionato come previsto! – Cheeso

2

Penso che il problema è che quando tieni fuori dagli appunti fuori emacs, non stai salvando sul kill ring.

Quello che ti serve è usare la funzione clipboard-yank per inserire la regione, quindi in qualche modo selezionarla e salvarla sul kill ring, come fa la funzione kill-ring-save.

O meglio ancora scrivere una funzione clipboard-save-to-kill-ring-and-yank che salva il clipboad sul kill ring e poi lo strappa.

modifica: Tracciamento del codice un po ', questo fa quello che vuoi; potresti collegarlo a una chiave. Salva il contenuto degli appunti di Windows sul kill ring.

(defun clipboard-to-kill-ring() 
    "save the external clipboard contents to the kill ring" 
    (interactive) 
    (let ((clip (funcall interprogram-paste-function))) 
     (when clip 
     (kill-new clip))) 

(defadvice yank (before maybe-copy-windows-clipboard (arg)) 
    (clipboard-to-kill-ring)) 

(ad-activate 'yank) 
+0

Questo è bello, ma ho bisogno di qualcosa di automatico (nel caso me lo dimentichi!) in modo che ogni volta che uccido qualcosa, qualunque cosa negli appunti sia conservata nell'anello uccidere se non è già presente. – polyglot

+0

Penso che la mia modifica funzioni. Il consiglio precedente fa sì che il comando yank salvi automaticamente gli appunti di Windows sul kill ring. – justinhj

+0

Credo che il codice non funziona nello scenario: selezionare il testo in una finestra non emacs (dire "XYZ") ora uccidono un testo in emacs (dire "ABC") Cy mio mio .. la XYZ non si trova b/c la selezione viene persa al primo kill, prima che il primo yank possa aggiungerlo al kill ring. –

0

direi si possa incidere comanda i vari kill per non mettere il testo negli appunti, e poi hanno clipboard-Yank legato a una chiave diversa, so se avrebbe funzionato.

0

In un certo senso, aggirare questo problema semplicemente strappando il testo e poi ri-uccidendolo, quando faccio un salto in emacs dopo averne fatto una copia o tagliato in un'altra app di Windows.

Un approccio migliore sarebbe quello di hackerare emacs in modo che quando si uccide qualcosa, confronta gli appunti esistenti con la voce più in alto nel kill ring e, se diverso, spinge il contenuto degli appunti sul kill ring, prima di eseguire il ucciderti esplicitamente richiesto.

+0

Non hai bisogno di controllare cosa c'è sul kill ring con la mia soluzione perché quando prendi appunti lo cancelli, quindi le chiamate successive diventano solo nul e non le aggiungono l'anello della morte. – justinhj

3

Si noti che la versione più recente Emacs CVS ha la variabile salva-interprogram-pasta-prima-kill, che fa esattamente questo cf: dal file etc/NEWS:

** Quando save-interprogram-paste-before-kill' is non-nil, emacs will not clobber the the interprogram paste when something is killed in it by saving the former in the kill-ring' prima che quest'ultimo .

+0

Oh dolce! (15 caratteri) – polyglot