Aggiungi appunti del sistema operativo per uccidere l'anello


25

Spesso mi ritrovo a copiare uno snippet di codice negli Appunti del mio sistema operativo da Internet. Quindi, prendo i seguenti semplici passaggi:

  1. Passa alla mia finestra di Emacs
  2. Trova il posto in cui voglio incollare il codice
  3. Utilizzare C-y( yank) per inserire il testo copiato.

Tuttavia, a volte trovo (con mia grande delusione) che ho usato inconsapevolmente una qualche forma di comando kill (come kill-wordo kill-line) mentre ero al passaggio 2. In tali casi, il testo copiato dagli "Appunti" non riesce mai a uccidere squillare.

C'è un modo per assicurarsi che il testo copiato da altre applicazioni arrivi sempre nel mio kill ring?

Lavoro su Linux più spesso, ma utilizzo anche Emacs regolarmente su Windows e Mac OS X, quindi è preferibile una risposta indipendente dal sistema operativo.


Posso suggerire questo link ? sfogliando l'intera pagina, vedrai molti modi diversi di copiare / incollare da / negli appunti
Nsukami _

@Nsukami_ Grazie. Proverò a digerirlo, ma la pagina collegata è un ottimo esempio del motivo per cui mi stanco di cercare risposte su EmacsWiki. Molti degli hacker elisp sembrano pensare che il codice elisp sia auto-documentante e non richiede commenti e spiegazioni sulla funzione o sull'uso. Di solito non ho tempo per decodificare il codice solo per decidere se fa quello che voglio o no.
nispio,

ahah, ho capito;)
Nsukami _

Risposte:


31

Devi personalizzare save-interprogram-paste-before-killa t. Questo spingerà i tuoi appunti sull'uccisione nel caso in cui uccidi qualcosa in emacs prima di incollare gli appunti. Una personalizzazione correlata è yank-pop-change-selectionche inserisce negli appunti il ​​tuo yank attuale in emacs. Perché entrambi funzionino, è necessario x-select-enable-clipboard(sostituito da gui-select-enable-clipboardin emacs 25.1) essere quello tpredefinito.

Il motivo per cui questo è disattivato per impostazione predefinita è quello di impedire la spinta involontaria di una grande quantità di dati sull'uccisione che persiste per tutta la sessione a differenza degli appunti che sono facilmente sostituiti.


1
Ancora più pulito e più facile di quanto mi aspettassi. save-interprogram-paste-before-killsembra fare esattamente quello che voglio!
nispio,

Sono su emacs 26 e gui-select-enable-clipboardsi chiama giusto select-enable-clipboard.
Rune Kaagaard,

3

un'altra soluzione è utilizzare lo strumento cli, se possibile,

  • pbcopy / pbpaste su Mac

  • getclip / putclip su Cygwin

  • xsel su Linux
  • x-clipboard in GUI Emacs (come altri hanno già detto, devi attivare il flag x-select-enable-clipboard).

Il vantaggio di questa soluzione è che gli Appunti sono sempre utilizzabili (ad esempio, quando si usa ssh in remoto).

La mia risposta ha due parti. la prima parte introduce alcuni strumenti utili per manipolare gli appunti. la seconda parte risponderà alla tua domanda originale (archivia gli appunti in kill ring).

PRIMA PARTE

Inserisci il codice qui sotto nel tuo ~ / .emacs:

(setq *is-a-mac* (eq system-type 'darwin))
(setq *cygwin* (eq system-type 'cygwin) )
(setq *linux* (or (eq system-type 'gnu/linux) (eq system-type 'linux)) )
(defun copy-to-x-clipboard ()
  (interactive)
  (if (region-active-p)
      (progn
        (cond
         ((and (display-graphic-p) x-select-enable-clipboard)
          (x-set-selection 'CLIPBOARD (buffer-substring (region-beginning) (region-end))))
         (t (shell-command-on-region (region-beginning) (region-end)
                                     (cond
                                      (*cygwin* "putclip")
                                      (*is-a-mac* "pbcopy")
                                      (*linux* "xsel -ib")))
            ))
        (message "Yanked region to clipboard!")
        (deactivate-mark))
        (message "No region active; can't yank to clipboard!")))

(defun paste-from-x-clipboard()
  (interactive)
  (cond
   ((and (display-graphic-p) x-select-enable-clipboard)
    (insert (x-selection 'CLIPBOARD)))
   (t (shell-command
       (cond
        (*cygwin* "getclip")
        (*is-a-mac* "pbpaste")
        (t "xsel -ob"))
       1))
   ))

(defun my/paste-in-minibuffer ()
  (local-set-key (kbd "M-y") 'paste-from-x-clipboard)
  )

(add-hook 'minibuffer-setup-hook 'my/paste-in-minibuffer)

SECONDA PARTE

inserisci il codice seguente nel tuo ~ / .emacs e d'ora in poi usa "Mx paste-from-clipboard-and-cc-kill-ring" per incollare:

(defun paste-from-clipboard-and-cc-kill-ring ()
  "paste from clipboard and cc the content into kill ring"
  (interactive)
  (let (str)
    (with-temp-buffer
      (paste-from-x-clipboard)
      (setq str (buffer-string)))
    ;; finish the paste
    (insert str)
    ;; cc the content into kill ring at the same time
    (kill-new str)
    ))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.