เมื่อฉันตัด (ฆ่า) ข้อความใน Emacs 22.1.1 (ในหน้าต่างของตัวเองบน X ใน KDE บน Kubuntu) ฉันไม่สามารถวาง (ดึง) ลงในแอปพลิเคชันอื่นได้
เมื่อฉันตัด (ฆ่า) ข้อความใน Emacs 22.1.1 (ในหน้าต่างของตัวเองบน X ใน KDE บน Kubuntu) ฉันไม่สามารถวาง (ดึง) ลงในแอปพลิเคชันอื่นได้
คำตอบ:
ระวังคำจำกัดความของเราที่นี่
kill-ring-save
(มักจะผูกไว้กับM-w)yank
(มักจะผูกไว้กับC-y)ในกรณีของฉัน (บน GNOME):
ที่จะทำให้การทำงานของระบบที่มีสำเนา 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
META-X set-variable RET select-enable-clipboard RET t
หรือ(setq select-enable-clipboard t)
แทรกสิ่งต่อไปนี้ลงใน.emacs
ไฟล์ของคุณ:
(setq x-select-enable-clipboard t)
emacs -nw
ฉันใช้ทางลัดของเทอร์มินัลเอง Shift-Ctrl-X เพื่อตัด (ฆ่า) ข้อความและ Shift-Ctrl-C เพื่อคัดลอก
emacs -nw
ภายในหน้าต่าง tmux ที่แบ่งตามแนวนอน
ฉันติดสิ่งนี้ใน. 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
โชคดี!
Symbol’s function definition is void: x-cut-buffer-or-selection-value
ความยากลำบากในการคัดลอกและวางใน 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)
ฉันถือว่าโดย emacs คุณหมายถึง Emacs ภายใต้ X (เช่นไม่อยู่ในหน้าต่างเทอร์มินัล)
มีสองวิธี:
ใช้งานคลิปบอร์ดได้:
มีบทความ EmacsWikiที่อธิบายปัญหาบางอย่างเกี่ยวกับการคัดลอกและวางภายใต้ X และวิธีกำหนดค่าให้ทำงาน
ซึ่งใช้ได้กับM-w
Mac 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)
โค้ดข้างล่างนี้แรงบันดาลใจจาก @ คำตอบ 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)
ฉันใช้สิ่งต่อไปนี้ตามคำตอบอื่น ๆ ที่นี่เพื่อสร้าง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)))
xclip
xclip -o
สิ่งนี้จะเป็นประโยชน์สำหรับผู้ที่มีอยู่แล้วxclip
และไม่ต้องการติดตั้งโปรแกรมอื่นเพื่อทำการคัดลอกและวาง
อืมใช้แพลตฟอร์มอะไรและอีแมครุ่นอะไร ด้วย GNU Emacs 22.1.1 บน Windows Vista มันใช้งานได้ดีสำหรับฉัน
หากบังเอิญคุณกำลังทำสิ่งนี้จาก windows ไปยัง linux ผ่านโปรแกรมดู RealVNC ตรวจสอบให้แน่ใจว่าคุณกำลังเรียกใช้ "vncconfig -iconic" บนกล่อง linux ก่อน .....
ฉันใช้การวางอย่างรวดเร็วเสมอ - ลากการเลือกใน emacs กดปุ่มกลางของเมาส์ในหน้าต่างเป้าหมาย
(จากการอ้างอิงถึง kate ฉันคิดว่าคุณใช้ linux หรือคล้ายกันและอาจใช้ emac ใน X ไม่ทางใดก็ทางหนึ่ง)
คุณอาจต้องการระบุว่าคุณกำลังใช้แพลตฟอร์มใดอยู่ อยู่บน linux, unix, macosx, windows, ms-dos หรือไม่
ฉันเชื่อว่าสำหรับ windows มันควรจะใช้งานได้ สำหรับ MacOSX จะเพิ่มลงในคลิปบอร์ดของ x-windows ซึ่งไม่เหมือนกับคลิปบอร์ดของ macosx สำหรับ Linux มันขึ้นอยู่กับรสชาติของ window manager แต่ฉันเชื่อว่า x-windows จัดการกับมันได้ดีสำหรับพวกเขาส่วนใหญ่
ดังนั้นโปรดระบุ
สิ่งที่ฉันทำคือใช้เครื่องมือเทอร์มินัลที่ดี (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 ลัด