คัดลอกและตั้งเครื่องหมายใน Bash เช่นเดียวกับ Emacs?


16

ผมอยากที่จะสามารถคัดลอกและวางข้อความในบรรทัดคำสั่งในทุบตีใช้ผูกแป้นพิมพ์เดียวกันกับที่ใช้ Emacs โดยค่าเริ่มต้น (เช่นใช้C-spaceสำหรับset-mark, M-wเพื่อคัดลอกข้อความC-y, M-yการวาง ฯลฯ )

เอกสาร GNU ทุบตีบอกว่าทุบตีมาพร้อมกับบางส่วนของปุ่มลัดเหล่านี้ตั้งขึ้นโดยค่าเริ่มต้น

ตัวอย่างเช่น yanking ( C-y) ทำงานโดยค่าเริ่มต้นในเทอร์มินัลของฉัน อย่างไรก็ตามฉันไม่สามารถรับset-markและcopyสั่งให้ทำงานได้และดูเหมือนว่าพวกเขาจะไม่ถูกผูกไว้กับปุ่มใด ๆ โดยค่าเริ่มต้น

.inputrcโดยปกติวิธีที่ผู้ใช้สามารถกำหนดของเธอเองผูกที่สำคัญคือการเพิ่มพวกเขาไป ดังนั้นฉันจึงค้นหาและพบฟังก์ชันทุบตีต่อไปนี้ในเอกสารที่ฉันคิดว่าสามารถช่วยฉันกำหนดพฤติกรรมที่คล้ายกับ Emacs ที่ฉันต้องการ (เช่นset-markกับC-spaceและcopyด้วยM-w)

copy-region-as-kill ()

คัดลอกข้อความในพื้นที่ไปยังบัฟเฟอร์การฆ่าเพื่อให้สามารถดึงได้ทันที โดยค่าเริ่มต้นคำสั่งนี้ไม่ได้ผูกไว้

และ

set-mark (C-@)

ตั้งเครื่องหมายไปที่จุด หากมีการให้อาร์กิวเมนต์ที่เป็นตัวเลขเครื่องหมายถูกตั้งไว้ที่ตำแหน่งนั้น

หากฉันเข้าใจอย่างถูกต้องหมายถึงข้างต้นที่copy-region-as-killไม่ได้ผูกไว้กับลำดับคีย์บอร์ดใด ๆ โดยค่าเริ่มต้นในขณะที่set-markถูกผูกไว้C-@โดยค่าเริ่มต้น

ฉันลองใช้C-@เทอร์มินัลของฉัน แต่ฉันไม่คิดว่ามันจะทำงานset-markเพราะฉันไม่เห็นข้อความที่ไฮไลต์เมื่อฉันเลื่อนเคอร์เซอร์ ในกรณีใด ๆ ฉันพยายามเพิ่มการผูกแป้นพิมพ์ ( M-wและC-) เพื่อฟังก์ชั่น copy-region-as-killและset-markข้างต้นของฉัน.inputrcแล้วโหลดมันด้วยC-x C-rแต่ตอนนี้ไม่ได้ทำงาน ฉันรู้ว่ารายการอื่น ๆ ของฉัน.inputrcทำงานเพราะฉันมีการโยงคีย์อื่น ๆ ที่ผู้ใช้กำหนดไว้

มีอะไรที่ฉันทำผิดหรือเปล่า? ฉันไม่มีอะไรเลยหรือ


bashคุณใช้โปรแกรมเทอร์มินัลเวอร์ชันใดและรุ่นใด?
มิเคล

ฉันใช้ GNU bash รุ่น 3.1.17 (1) - ปล่อย (x86_64-redhat-linux-gnu) บน gnome-terminal (บน Terminator)
Amelio Vazquez-Reina

คำตอบ:


11

ไม่เน้นการเลือก แต่อย่างอื่นฉันคิดว่ามันทำงานได้ดี

ลองวิ่ง

$ bind -p | grep copy-region-as-kill

เพื่อให้แน่ใจว่าC-x C-rใช้งานได้จริง

มันควรจะพูดว่า:

"\ew": copy-region-as-kill

หลังจากนั้นควรทำงานได้ดี

ตัวอย่าง:

$ abc<C-Spc><C-a><M-w> def <C-y>

ให้ฉัน

$ abc def abc

หากคุณเคยต้องการที่จะทราบว่าเป็นเพียงแค่ทำmarkC-x C-x

ตัวอย่าง:

$ <C-Spc>abc<C-x><C-x>

จะวางเคอร์เซอร์กลับไปที่ตำแหน่งที่คุณตั้งเครื่องหมาย (จุดเริ่มต้นของบรรทัด)

นอกจากนี้ฉันไม่คิดว่าคุณต้องเพิ่มการset-markเชื่อมโยง ฉันไม่ได้

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(โปรดทราบว่าเทอร์มินัลส่วนใหญ่จะส่งC-@เมื่อC-Spcกดฉันถือว่าคุณทำเช่นเดียวกัน)

หากสิ่งนี้ล้มเหลว:

  • ไม่Ctrl+ Spaceทำงานemacs -nwใน terminal เดียวกันได้หรือไม่
  • อื่น ๆAlt/ Metaทางลัดทำงานในทุบตี?

1
ขอบคุณ! ฉันมี "Mw" แทนที่จะเป็น "\ ew" ใน. inputrc การขาดการเน้นยังทำให้ฉันสับสน ขอบคุณสำหรับตัวชี้ไปยังคำสั่ง bind โดยวิธี ตอนนี้มันใช้งานได้เหมือนมีเสน่ห์!
Amelio Vazquez-Reina

2
ยินดีต้อนรับ! ใช่คุณต้องเขียนหรือ\e \M-ดูไวยากรณ์ไฟล์ ReadLine init
มิเคล

ช่างเป็นคำตอบที่ยอดเยี่ยม! ขอบคุณ ทำให้ปัญหาที่คล้ายกันหมดลงสำหรับฉัน: D
ephsmith

set-mark และ copy-region-as-kill ทำงานอย่างเงียบ ๆ ฉันสามารถไฮไลต์ภูมิภาค (เช่นเดียวกับ emacs) ได้หรือไม่
mosh

4

ฉันยังผูก Cw สำหรับฆ่าภูมิภาค นี่. inputput ของฉัน:

# ดู http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00033.html
ตั้งปิดตัวอักษรพิเศษ tty

# กำหนดการผูกกุญแจ Emacs ที่ฉันโปรดปราน
"\ C- @": set-mark
"\ Cw": kill-region
"\ Mw": copy-region-as-kill
"\ M- /" ขยาย dabbrev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.