หยุดการเลือกเป็นกลุ่มให้เป็นข้อความ!


10

ฉันใช้ VI และ VIM เป็นเวลาหลายปี (30 หรือมากกว่า) (ใน xterms ไม่ใช่หน้าต่างของตัวเอง gvim) และฉันมีคลังคำสั่ง vim ขนาดใหญ่ที่ฉันให้ vim โดยใช้ปุ่มกลางของเมาส์เป็นตัวเลือก

ตัวอย่างเช่นฉันมักจะทำสิ่งต่าง ๆ เช่น ...

 vi {many_hundreds_of_files}
   paste vim commands using mouse - one paste per file.

การเลือกจะรวมคำสั่ง VIM จำนวนมากเพื่อทำสิ่งต่าง ๆ เช่นการแทนที่การทดสอบการจัดรูปแบบการย้ายเส้นรอบ ๆ ฯลฯ ฯลฯ และโดยทั่วไปแล้วลงท้ายด้วย: w และ: คำสั่ง VIM ถัดไปในตอนท้ายของการเลือก ดังนั้นเสียงเรียกเข้าก็พร้อมให้ฉันวางอีกครั้งในไฟล์ถัดไป สิ่งนี้ช่วยให้ฉันอัปเดตไฟล์จำนวนมากในรูปแบบที่ซับซ้อนมากโดยไม่จำเป็นต้องใช้สคริปต์พิเศษ (เช่นการแก้ไขในสถานที่ perl) เพื่อดำเนินการ

การวางคำสั่ง vim เหล่านี้บางส่วนมีความยาวมากกว่า 200 บรรทัด (เก็บไว้ในไฟล์ข้อความที่ฉันปรากฏขึ้นบนหน้าจอและ 'คัดลอกทั้งหมด'! สิ่งเหล่านี้ทำให้เกิดการเปลี่ยนแปลงมากมายในชุดของไฟล์หลายพันไฟล์ที่ฉันกำลังฟอร์แมตใหม่ เฉพาะสำหรับชุดไฟล์ที่เฉพาะเจาะจงไม่ใช่สำหรับงาน vim แบบวันต่อวันของฉัน EG: การจัดรูปแบบจำนวนมากอีกครั้งสำหรับไฟล์ข้อความ / ข้อมูล

ปัญหา...

ในช่วงแพตช์ระบบล่าสุดของฉัน (Fedora 25) เป็นกลุ่มตอนนี้วางเมาส์ในการเลือกเป็น TEXT ไม่ใช่คำสั่ง vim และดูเหมือนว่าฉันจะหยุดมันไม่ได้!

มันยังใช้งานได้ดีกับระบบอื่น (Fedora 24)

หากฉันต้องการวางเป็นข้อความฉันจะเข้าสู่โหมดแทรกก่อนวาง! ฉันไม่ต้องการให้ VIM วางการเลือก AS text โดยอัตโนมัติเมื่อไม่ได้อยู่ในโหมดแทรก ฉันเข้าใจว่านี่เป็นคุณสมบัติด้านความปลอดภัย แต่สำหรับฉันแล้วมันเป็นปัญหาการใช้งานที่สำคัญ

ฉันได้ลองย้อนกลับไปหารายการ terminfo (xterm-256color) จากเครื่องที่ไม่ทำสิ่งนี้ (โดยเฉพาะรายการ terminfo "kmous") ฉันได้ดูที่เป็นกลุ่ม ": set mouse =" settings (ซึ่งเป็นโมฆะ!) ฉันไม่ทราบว่ามันเป็น xterm (หนี้สงสัยจะสูญ) หรือสิ่งที่เปลี่ยนแปลงใน VIM (น่าจะเป็น) และการเปลี่ยนแปลงบันทึกและ Google ได้รับการช่วยเหลือ

อย่างไรก็ตามไม่มีอะไรที่ดูเหมือนจะทำให้ฉันมีพฤติกรรมแบบเดิม


พบผู้ใช้รายอื่นที่มีปัญหาเดียวกันรายละเอียดน้อยลงไม่มีวิธีแก้ปัญหาunix.stackexchange.com/questions/346293/ …
anthony

1
ฉันสงสัยมันมากขึ้นน่าจะเป็นvimการเปลี่ยนแปลง: วิธีสามารถvimภายในxtermสิ่งที่รู้คือป้อนผ่านแป้นพิมพ์หรือวางผ่านปุ่มเมาส์? ฉันไม่รู้กลไกดังกล่าว ในทางกลับกันxtermรู้ว่ามันกำลังดำเนินการvimเพื่อให้สามารถตัดสินใจที่จะล้อมรอบการวางด้วยiและ <esc> ลอง (a) ด้วยหน้าต่างเทอร์มินัลชนิดอื่นและ (b) สำเนาที่vimมีชื่อแตกต่างกัน สิ่งนี้จะช่วยลดสาเหตุของปัญหาให้แคบลง
Philippos

ฉันเห็นด้วยกับ @philippos บางทีสิ่งอื่นนอกเหนือจากการvimไฮแจ็กวิธีการวางของคุณ อาจลอง ssh'ing หรือ telneting ในเครื่องของคุณและวางวิธีนั้น หากคุณมีกล่อง Windows ให้ใช้ผงสำหรับอุดรูเพื่อ ssh ลงในเครื่อง Fedora25 ของคุณและวางแบบนั้น
Jim U

ไม่เกี่ยวข้องโดยตรง แต่ gvim บน windows ทำตัวแบบนี้มานานหลายปี เมื่อคุณติดตั้ง gvim คุณจะได้รับสอง executables, gvim.exe(กราฟิกเป็นกลุ่ม) vim.exeและบรรทัดคำสั่ง วาง "iText" ใน gvim.exe itextและคุณได้รับ วางใน vim.exe แล้วคุณจะได้text
Jim U

1
@Philippos กลไกที่อาจจะมีวงเล็บวาง ฉันไม่รู้ว่า Vim จะสนับสนุนอย่างไรบางทีpastetoggleตัวเลือก?
Gilles 'หยุดชั่วร้าย'

คำตอบ:


12

หลังจากผ่านหน้าเว็บจำนวนมากหลายคนให้คำแนะนำบางอย่างที่ดูเหมือนจะไม่ได้ผลฉันพบคำใบ้ (ข้อความพิเศษรอบ ๆ แปะ) ที่นำฉันไปสู่สาเหตุและวิธีแก้ไขปัญหา

ดูเหมือนว่ากลุ่มได้สร้างไว้ในรายการ termcap 'ปลอม' จำนวนหนึ่งซึ่งใช้เมื่อรับรู้เทอร์มินัลเฉพาะ (และบางครั้งก็ผิดแม้ว่ามันจะไม่ผิดในกรณีนี้)

การตั้งค่า Termcap ในกลุ่มเป็นจำนวนที่เพิ่มขึ้นเช่นไม่แสดงในรายการการตั้งค่า ": set all" ปกติ ในการดูพวกเขาคุณต้องใช้ ": set termcap" การตั้งค่า termcap เฉพาะ 'ที่ไม่ได้มาตรฐาน' คือ "t_BE" (ดู vim ": help t_BE") ความช่วยเหลือในตัว "xterm-bracketed-paste" อธิบายการตั้งค่า termcap ภายในเป็น vim นี้

โดยทั่วไปหากการตั้งค่านี้ถูกกำหนด (ในกรณีนี้โดย Vim ไม่ใช่ termcap / terminfo) vim จะส่งไปที่ xterm เมื่อเริ่มต้นขึ้นซึ่งจะบอกให้ xterm เพิ่มรหัสพิเศษรอบข้อความใด ๆ ที่ผู้ใช้วางจากแหล่งภายนอก เมื่อ vim เห็นสิ่งเหล่านี้มันจะเข้าสู่โหมดแทรกโดยอัตโนมัติ แต่ยังตั้ง 'โหมดวาง' เพื่อไม่ให้จัดรูปแบบข้อความ

ในภายหลัง (โหมดวาง) คือฉันคิดว่ามีประโยชน์มาก! อดีตคือสิ่งที่ทำให้ฉันเดือดร้อนทั้งหมด

วิธีการแก้ปัญหากำลังดุร้ายถูกปิดใช้งาน bracketed-paste โดยเพิ่มสิ่งนี้ใน ".vimrc"

:set t_BE=

ทางเลือกอื่น ๆ ....

แทนที่จะปิดการใช้งาน bracketed-paste อย่างสมบูรณ์หยุดการกระทำเป็นกลุ่มเมื่อเห็นลำดับการเริ่มต้นของเทอร์มินัลวาง (จากเมาส์) ในขณะที่อยู่ในคำสั่งหรือโหมดปกติ

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

การใช้สิ่งนี้หมายความว่าหากคุณวางข้อความในขณะที่อยู่ในกลุ่มโหมดแทรกจะไม่พยายามจัดรูปแบบข้อความ (เยื้อง) ที่มีแนวโน้มมากกว่าเยื้องแล้ว

นี่ไม่ได้หมายความว่าฉันไม่จำเป็นต้องสลับโหมดวางอีกต่อไปเพราะฉันยังใช้สลับโหมดวาง (แมปกับ F2) เพื่อปิดการใช้งาน "showbreak" และ "listchars" (แสดงบรรทัดที่ถูกห่อแท็บช่องว่างไม่แตกและ ช่องว่างเพิ่มเติมที่ท้ายบรรทัด) ฉันยังคงต้องใช้กลุ่มในโหมดนั้นเมื่อฉันต้องการเลือกเมาส์เพื่อวางที่อื่น

ความคิดเห็นและข้อเสนอแนะเกี่ยวกับการแก้ปัญหายินดีต้อนรับ


สิ่งนี้ดูเหมือนว่าจะทำงานใน Cygwin Vm แต่น่าเศร้าที่ไม่สามารถแก้ปัญหาใน VS Vim
James Robinson

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