วิธีคัดลอกข้อความจาก Emacs ไปยังแอปพลิเคชันอื่นบน Linux


113

เมื่อฉันตัด (ฆ่า) ข้อความใน Emacs 22.1.1 (ในหน้าต่างของตัวเองบน X ใน KDE บน Kubuntu) ฉันไม่สามารถวาง (ดึง) ลงในแอปพลิเคชันอื่นได้


ผมขอแนะนำให้คุณอ่านบทความนี้: CopyAndPaste-Emacs วิกิพีเดีย สิ่งนี้อธิบายปัญหาการทัวร์ได้เป็นอย่างดี
El borito

คำตอบ:


122

ระวังคำจำกัดความของเราที่นี่

  • สำเนา Emacsเป็นคำสั่งkill-ring-save(มักจะผูกไว้กับM-w)
  • สำเนาระบบคือสิ่งที่คุณมักจะได้รับจากการกดC-c(หรือเลือก "Edit-> คัดลอก" ในหน้าต่างโปรแกรม)
  • สำเนา Xคือ "ร่างกาย" ไฮไลต์ข้อความที่มีเคอร์เซอร์ของเมาส์
  • Emacs วางเป็นคำสั่งyank(มักจะผูกไว้กับC-y)
  • การวางระบบคือสิ่งที่คุณมักจะได้รับจากการกดC-v(หรือเลือก "แก้ไข - วาง" ในหน้าต่างแอปพลิเคชัน)
  • การวาง Xคือการกด "ปุ่มกลางเมาส์" (จำลองโดยการกดปุ่มซ้ายและขวาของเมาส์พร้อมกัน)

ในกรณีของฉัน (บน GNOME):

  • ทั้ง Emacs และสำเนาระบบมักทำงานร่วมกับ X paste
  • X copy มักจะทำงานร่วมกับ Emacs paste
  • ที่จะทำให้การทำงานของระบบที่มีสำเนา Emacs วางและ Emacs คัดลอกทำงานกับวางระบบคุณต้องเพิ่มที่คุณ(setq x-select-enable-clipboard t) .emacsหรือลอง

    META-X set-variable RET x-select-enable-clipboard RET t

ฉันคิดว่านี่เป็นพฤติกรรมของ Unix สมัยใหม่ที่ค่อนข้างเป็นมาตรฐาน

สิ่งสำคัญที่ควรทราบ (แม้ว่าคุณจะบอกว่าคุณกำลังใช้ Emac ในหน้าต่างแยกต่างหาก) ว่าเมื่อ Emacs ทำงานในคอนโซลมันจะถูกแยกออกจากระบบโดยสิ้นเชิงและคลิปบอร์ด X: การตัดและวางในกรณีนั้นจะถูกสื่อกลางโดยเทอร์มินัล . ตัวอย่างเช่น "แก้ไข -> วาง" ในหน้าต่างเทอร์มินัลควรทำหน้าที่เหมือนกับว่าคุณพิมพ์ข้อความจากคลิปบอร์ดลงในบัฟเฟอร์ Emacs


7
นี่คือความสับสนคำศัพท์ ชื่อมาตรฐานและไม่สับสนสำหรับสิ่งที่คุณเรียกว่า "X copy / paste" คือ X ตัวเลือกหลัก สิ่งที่คุณเรียกว่า "คัดลอก / วางระบบ" คือคลิปบอร์ด X
Gilles 'SO- หยุดชั่ว'

ขอบคุณ ... ดูเหมือนว่าตัวแปรจะถูกเปลี่ยนชื่อตั้งแต่ที่เขียน META-X set-variable RET select-enable-clipboard RET tหรือ(setq select-enable-clipboard t)
David McCorrie

95

แทรกสิ่งต่อไปนี้ลงใน.emacsไฟล์ของคุณ:

(setq x-select-enable-clipboard t)

3
ไม่ใช่คำพูดบอกคุณสิ่งที่คุณต้องรู้ คำตอบที่ยอดเยี่ยม
JasonFruit

ทำงานได้อย่างสมบูรณ์ฉันใช้ Ubuntu 12.04 ขอบคุณ
zhihong

7
ดีและเรียบง่าย แต่ใช้ไม่ได้ในเทอร์มินัล ไม่มีเหตุผลว่าทำไมทางลัดเดียวกันไม่ควรทำงานทั้งในเทอร์มินัลและหน้าต่างฟรีและคำตอบด้านล่างบางคำตอบพร้อมกัน
RussellStewart

1
เมื่อฉันเรียกใช้emacs -nwฉันใช้ทางลัดของเทอร์มินัลเอง Shift-Ctrl-X เพื่อตัด (ฆ่า) ข้อความและ Shift-Ctrl-C เพื่อคัดลอก
memius

4
มันจะไม่ได้ผลเมื่อคุณทำงานemacs -nwภายในหน้าต่าง tmux ที่แบ่งตามแนวนอน
Sridhar Ratnakumar

11

ฉันติดสิ่งนี้ใน. emac ของฉัน:

(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)

หลังจากนั้นฉันก็ไม่มีปัญหาในการตัดและวางกลับไปกลับมาจากสิ่งใด ๆ ใน Emacs ไปยังแอปพลิเคชัน X11 หรือ Gnome อื่น ๆ

โบนัส: เพื่อให้สิ่งเหล่านี้เกิดขึ้นใน Emacs โดยไม่ต้องโหลด. emac ใหม่ทั้งหมดให้ทำ Cx Ce โดยใช้เคอร์เซอร์หลังพาเรนปิดของแต่ละนิพจน์ในบัฟเฟอร์. emacs

โชคดี!


3
โซลูชันนี้ใช้ได้กับ emac ใน X Window เช่น emac กำลังทำงานภายในหน้า
ต่างหาก

Symbol’s function definition is void: x-cut-buffer-or-selection-value
alper

10

ความยากลำบากในการคัดลอกและวางใน Emacs คือคุณต้องการให้มันทำงานเป็นอิสระจาก kill / yank ภายในและคุณต้องการให้มันทำงานทั้งในเทอร์มินัลและ gui มีโซลูชันที่มีประสิทธิภาพสำหรับเทอร์มินัลหรือ gui แต่ไม่ใช่ทั้งสองอย่าง หลังจากติดตั้ง xsel (เช่นsudo apt-get install xsel) นี่คือสิ่งที่ฉันทำเพื่อคัดลอกและวางเพื่อรวมเข้าด้วยกัน:

(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(defun paste-from-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)

สำหรับฉันได้รับข้อผิดพลาดเนื่องจากไม่มีพารามิเตอร์ ฉันต้องการเปลี่ยนบรรทัดแรก "(defun copy-to-clipboard ()" to "(defun copy-from-ubuntu (text & optional push)" สิ่งนี้ใช้ได้กับฉัน: D
Renato Cassino

มันใช้งานได้ แต่การวางค่อนข้างช้ามันสามารถเชื่อมต่อกับเครือข่ายได้หรือไม่?
alper

7

ฉันถือว่าโดย emacs คุณหมายถึง Emacs ภายใต้ X (เช่นไม่อยู่ในหน้าต่างเทอร์มินัล)

มีสองวิธี:

  1. (ใช้กับระบบปฏิบัติการยูนิกซ์เท่านั้น) ไฮไลต์ข้อความที่ต้องการด้วยเมาส์ของคุณ (ซึ่งจะคัดลอกไปยังคลิปบอร์ด X) จากนั้นคลิกกลางเพื่อวาง
  2. ไฮไลต์ข้อความที่ต้องการแล้วเลือก "Mx clipboard-kill-ring-save" (โปรดทราบว่าคุณสามารถผูกสิ่งนี้กับคีย์ที่ง่ายกว่าได้) จากนั้นเพียงแค่ "แก้ไข -> วาง" ในแอปโปรดของคุณ

ใช้งานคลิปบอร์ดได้:

  • clipboard-kill-ring-save - คัดลอกการเลือกจาก Emacs ไปยังคลิปบอร์ด
  • clipboard-kill-region - ตัดการเลือกจาก Emacs ไปยังคลิปบอร์ด
  • clipboard-yank - วางจากคลิปบอร์ดไปยัง Emacs

7

มีบทความ EmacsWikiที่อธิบายปัญหาบางอย่างเกี่ยวกับการคัดลอกและวางภายใต้ X และวิธีกำหนดค่าให้ทำงาน


มีรายการวิกิ emacs เพื่อคัดลอกและวาง นั่นเป็นวิธีที่ไม่ดี
ลัส

4

ซึ่งใช้ได้กับM-wMac OSX เพียงเพิ่มลงในไฟล์. macsของคุณ

(defun copy-from-osx ()
   (shell-command-to-string "pbpaste"))
(defun paste-to-osx (text &optional push)
   (let ((process-connection-type nil))
      (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
         (process-send-string proc text)
         (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

ที่มาhttps://gist.github.com/the-kenny/267162


1

โค้ดข้างล่างนี้แรงบันดาลใจจาก @ คำตอบ RussellStewart เหนือ, เพิ่มการสนับสนุนสำหรับ X-หลักและ X-มัธยมศึกษาแทนที่region-active-pด้วยuse-region-pเพื่อให้ครอบคลุมกรณีที่มีพื้นที่ว่างที่ไม่ได้กลับมาอย่างเงียบ ๆ ถ้า xsel ยังไม่ได้รับการติดตั้ง (ผลตอบแทนข้อผิดพลาด) และรวมถึงฟังก์ชัน "ตัด" (emacs Cy, windows Cx)

(defun my-copy-to-xclipboard(arg)
  (interactive "P")
  (cond
    ((not (use-region-p))
      (message "Nothing to yank to X-clipboard"))
    ((and (not (display-graphic-p))
         (/= 0 (shell-command-on-region
                 (region-beginning) (region-end) "xsel -i -b")))
      (error "Is program `xsel' installed?"))
    (t
      (when (display-graphic-p)
        (call-interactively 'clipboard-kill-ring-save))
      (message "Yanked region to X-clipboard")
      (when arg
        (kill-region  (region-beginning) (region-end)))
      (deactivate-mark))))

(defun my-cut-to-xclipboard()
  (interactive)
  (my-copy-to-xclipboard t))

(defun my-paste-from-xclipboard()
  "Uses shell command `xsel -o' to paste from x-clipboard. With
one prefix arg, pastes from X-PRIMARY, and with two prefix args,
pastes from X-SECONDARY."
  (interactive)
  (if (display-graphic-p)
    (clipboard-yank)
   (let*
     ((opt (prefix-numeric-value current-prefix-arg))
      (opt (cond
       ((=  1 opt) "b")
       ((=  4 opt) "p")
       ((= 16 opt) "s"))))
    (insert (shell-command-to-string (concat "xsel -o -" opt))))))

(global-set-key (kbd "C-c C-w") 'my-cut-to-xclipboard)
(global-set-key (kbd "C-c M-w") 'my-copy-to-xclipboard)
(global-set-key (kbd "C-c C-y") 'my-paste-from-xclipboard)

มีเหตุผลใดบ้างที่จะไม่เขียนทับการเชื่อมโยงคีย์มาตรฐาน?
Paul Brodersen

@Paul: 'keybindings มาตรฐาน' ใช้สำหรับ 'emacs internal clipboard' ซึ่งแตกต่างจาก X-clipboard ฉันอ้างคำว่า 'emacs internal clipboard' เพราะคำศัพท์ emacs นั้นแตกต่างกัน - อ้างถึงคำอธิบายที่ยอดเยี่ยมของ Chris Conway ด้านบน
user1404316

1

ฉันใช้สิ่งต่อไปนี้ตามคำตอบอื่น ๆ ที่นี่เพื่อสร้างC-x C-wและC-x C-yคัดลอกและวางทั้งบน Mac และ Linux (ถ้ามีใครรู้เวอร์ชันสำหรับ Windows โปรดเพิ่มได้) โปรดทราบว่าบน Linux คุณจะต้องติดตั้ง xsel และ xclip ด้วยตัวจัดการแพ็คเกจของคุณ

;; Commands to interact with the clipboard

(defun osx-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "pbcopy"))

(defun osx-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "pbpaste" nil t nil))

(defun linux-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "xclip" nil nil nil "-selection" "c"))

(defun linux-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "xsel" nil t nil "-b"))

(cond
 ((string-equal system-type "darwin") ; Mac OS X
  (define-key global-map (kbd "C-x C-w") 'osx-copy)
  (define-key global-map (kbd "C-x C-y") 'osx-paste))
 ((string-equal system-type "gnu/linux") ; linux
  (define-key global-map (kbd "C-x C-w") 'linux-copy)
  (define-key global-map (kbd "C-x C-y") 'linux-paste)))

1
ที่จริงแล้วคุณสามารถใช้สำหรับการวางเนื้อหาคลิปบอร์ดได้เป็นอย่างดีโดยใช้xclip xclip -oสิ่งนี้จะเป็นประโยชน์สำหรับผู้ที่มีอยู่แล้วxclipและไม่ต้องการติดตั้งโปรแกรมอื่นเพื่อทำการคัดลอกและวาง
Amin NAIRI

0

อืมใช้แพลตฟอร์มอะไรและอีแมครุ่นอะไร ด้วย GNU Emacs 22.1.1 บน Windows Vista มันใช้งานได้ดีสำหรับฉัน

หากบังเอิญคุณกำลังทำสิ่งนี้จาก windows ไปยัง linux ผ่านโปรแกรมดู RealVNC ตรวจสอบให้แน่ใจว่าคุณกำลังเรียกใช้ "vncconfig -iconic" บนกล่อง linux ก่อน .....


0

ฉันใช้การวางอย่างรวดเร็วเสมอ - ลากการเลือกใน emacs กดปุ่มกลางของเมาส์ในหน้าต่างเป้าหมาย

(จากการอ้างอิงถึง kate ฉันคิดว่าคุณใช้ linux หรือคล้ายกันและอาจใช้ emac ใน X ไม่ทางใดก็ทางหนึ่ง)


0

คุณอาจต้องการระบุว่าคุณกำลังใช้แพลตฟอร์มใดอยู่ อยู่บน linux, unix, macosx, windows, ms-dos หรือไม่

ฉันเชื่อว่าสำหรับ windows มันควรจะใช้งานได้ สำหรับ MacOSX จะเพิ่มลงในคลิปบอร์ดของ x-windows ซึ่งไม่เหมือนกับคลิปบอร์ดของ macosx สำหรับ Linux มันขึ้นอยู่กับรสชาติของ window manager แต่ฉันเชื่อว่า x-windows จัดการกับมันได้ดีสำหรับพวกเขาส่วนใหญ่

ดังนั้นโปรดระบุ


-1

สิ่งที่ฉันทำคือใช้เครื่องมือเทอร์มินัลที่ดี (PuTTY บน Windows, Konsole หรือ Terminal บน Linux) ที่มีอุปกรณ์ทำสำเนาในตัว

ใน PuTTY คุณเน้นข้อความที่คุณต้องการด้วยเมาส์แล้ววางที่อื่น คลิกขวาในหน้าต่าง PuTTY เพื่อวางเนื้อหาของบัฟเฟอร์การคัดลอก / วางของ Windows

ใน Konsole หรือ Terminal บน Linux คุณเน้นสิ่งที่คุณต้องการจากนั้นกด Shift + Ctrl + C เพื่อคัดลอกและ Shift + Ctrl + V เพื่อวาง

ในการคอมไพล์ win32 ของ emacs ข้อความ yanking จะวางไว้บนบัฟเฟอร์คัดลอก / วาง .. โดยส่วนใหญ่แล้ว

บน Mac OS X ปุ่มลัดของ Apple จะทำงานได้ดีเพราะ Terminal ดักจับพวกมัน

ไม่มีวิธีดำเนินการโดยตรงบน commandline เนื่องจากเชลล์ไม่รักษาบัฟเฟอร์การคัดลอก / วางสำหรับแต่ละแอ็พพลิเคชัน ทุบตีไม่รักษาสำเนา / วางบัฟเฟอร์สำหรับตัวเองและตามค่าเริ่มต้น emacs ^ ทำงาน k / ^ Y ลัด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.