Dodaj schowek systemu operacyjnego, aby zabić pierścień

25

Często zdarza mi się, że kopiuję fragment kodu do schowka mojego systemu operacyjnego z Internetu. Następnie wykonuję następujące proste kroki:

  1. Przejdź do mojego okna Emacsa
  2. Znajdź miejsce, w którym chcę wkleić kod
  3. Użyj C-y( yank), aby wstawić skopiowany tekst.

Jednak czasami stwierdzam (ku mojemu wielkiemu rozczarowaniu), że nieświadomie użyłem jakiejś formy polecenia zabicia (takiego jak kill-wordlub kill-line), gdy byłem w kroku 2. W takich przypadkach skopiowany tekst ze „schowka” nigdy nie trafia w zabójstwo pierścień.

Czy istnieje sposób, aby upewnić się, że skopiowany tekst z innych aplikacji zawsze trafia do mojego pierścienia zabijania?

Najczęściej pracuję w systemie Linux, ale regularnie używam Emacsa w systemach Windows i Mac OS X, więc preferowana jest odpowiedź na system operacyjny.

nispio
źródło
Czy mogę zasugerować ten link ? przeglądając całą stronę, zobaczysz wiele różnych sposobów kopiowania / wklejania ze / do schowka
Nsukami _
@Nsukami_ Dzięki. Spróbuję go przetrawić, ale linkowana strona jest doskonałym przykładem tego, dlaczego mam dość szukania odpowiedzi na EmacsWiki. Wielu hakerów elisp wydaje się uważać, że kod elisp sam się dokumentuje i nie wymaga komentarzy ani wyjaśnień dotyczących funkcji lub użycia. Zwykle nie mam czasu na przebudowywanie kodu tylko po to, aby zdecydować, czy robi to, co chcę, czy nie.
nispio
haha, rozumiem;)
Nsukami _

Odpowiedzi:

31

Musisz dostosować save-interprogram-paste-before-killdo t. Spowoduje to przesunięcie schowka do zabójstwa na wypadek, gdybyś zabił coś emacsem przed wklejeniem schowka. Powiązane dostosowanie polega na yank-pop-change-selectiontym, że popycha twój obecny szarpnięcie emacsem do schowka. Aby oba z nich działały, musisz x-select-enable-clipboard( domyślnie zastąpiony przez gui-select-enable-clipboardemacs 25.1) t.

Domyślnie jest to wyłączone, aby zapobiec przypadkowemu wypchnięciu dużej ilości danych na zabijanie, które trwa przez całą sesję, w przeciwieństwie do schowka, który można łatwo wymienić.

Vamsi
źródło
1
Jeszcze czystsze i łatwiejsze niż się spodziewałem. save-interprogram-paste-before-killwydaje się robić dokładnie to, co chcę!
nispio
Jestem na emacs 26 i gui-select-enable-clipboardnazywa się po prostu select-enable-clipboard.
Rune Kaagaard,
3

innym rozwiązaniem jest użycie narzędzia cli, jeśli to możliwe,

  • pbcopy / pbpaste na Macu

  • getclip / putclip na Cygwin

  • xsel w systemie Linux
  • x-schowek w GUI Emacs (jak wspomniano inni, należy włączyć flagę x-select-enable-clipboard).

Zaletą tego rozwiązania jest to, że schowek jest zawsze użyteczny (na przykład przy zdalnym ssh).

Moja odpowiedź składa się z dwóch części. część pierwsza przedstawia przydatne narzędzia do manipulowania schowkiem. część druga odpowie na twoje pierwotne pytanie (schowaj do schowka).

CZĘŚĆ PIERWSZA

Wstaw poniższy kod do ~ / .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)

CZĘŚĆ DRUGA

wstaw poniższy kod do ~ / .emacs i odtąd użyj „Mx paste-from-clipboard-and-cc-kill-ring”, aby wkleić:

(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)
    ))
Chen Bin
źródło