ทำไม Vim เยื้องรหัสวางอย่างไม่ถูกต้อง?


100

ในกลุ่มถ้าฉันวางสคริปต์นี้:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

ฉันได้รับผลลัพธ์แปลก ๆ เหล่านี้:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

สัญญาณแฮช (#) และแท็บปรากฏขึ้น ทำไม?


31
นี่อาจเป็นคำถามที่ดีกว่าสำหรับ vi.stackexchange.com
Eric Renouf

@EricRenouf ทำไม (คำถามเที่ยงตรง)
Qix

3
@ qix ความคิดของฉันคือนี่เป็นคำถามเกี่ยวกับวิธีการทำงานของ vim ซึ่งเป็นเครื่องมือทั่วไปที่ใช้ใน * nix แต่ * nix ไม่ใช่ข้อกำหนดสำหรับการใช้ vim
Eric Renouf

1
@ JaredBurrows ฉันแน่ใจว่าหวังว่ามันจะทำให้มัน
Eric Renouf

1
คุณจะกระตุ้นการวางได้อย่างไร? ด้วยเมาส์?
Ben Voigt

คำตอบ:


122

มีสองเหตุผล:

สำหรับการวางในvimขณะเปิดใช้งานการเยื้องอัตโนมัติคุณต้องเปลี่ยนเป็นโหมดวางโดยพิมพ์:

:set paste

จากนั้นคุณสามารถเปลี่ยนเป็นโหมดแทรกและวางรหัสของคุณ หลังจากวางเสร็จแล้วให้พิมพ์:

:set nopaste

เพื่อปิดโหมดการวาง เนื่องจากนี่เป็นการกระทำทั่วไปและบ่อยครั้งvimเสนอโหมดสลับการวาง:

set pastetoggle=<F2>

คุณสามารถเปลี่ยนF2เป็นกุญแจอะไรก็ได้ที่คุณต้องการและตอนนี้คุณสามารถเปิดและปิดการวางได้อย่างง่ายดาย


ในการปิดการแทรกความคิดเห็นอัตโนมัติคุณสามารถเพิ่มบรรทัดเหล่านี้ในvimrcของคุณ:

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimยังมีการลงทะเบียนวางเพื่อให้คุณวางข้อความจากคลิปบอร์ดของระบบ คุณสามารถใช้"*pหรือ"+pขึ้นอยู่กับระบบของคุณ บนระบบที่ไม่มี X11 เช่น OSX หรือ Windows คุณต้องใช้การ*ลงทะเบียน บนระบบ X11 เช่น Linux คุณสามารถใช้ทั้งคู่ได้

อ่านเพิ่มเติม


2
ฉันใช้ Vim ตลอดกาลและไม่เคยรู้เรื่องนี้มาก่อน ขอบคุณมาก.
Caja

เครื่องเลียนแบบเทอร์มินัลกราฟิกที่ทันสมัยส่วนใหญ่รองรับคุณสมบัติที่เรียกว่า Vim สามารถขอให้เทอร์มินัลเปิดใช้งานโหมดนี้ซึ่งในทางกลับกันจะล้อมรอบข้อความที่วางด้วยลำดับการหลีกเลี่ยงบางอย่าง Vim สามารถจดจำสิ่งนี้และปิดการตัด / เยื้องในช่วงเวลาของการวาง Stort เรื่องยาว: การวางจะ "ทำงานอย่างที่คาดไว้" ฉันไม่ใช่ผู้ใช้ที่เป็นกลุ่ม แต่การค้นหาเว็บที่รวดเร็วจะช่วยบอกวิธีกำหนดค่าโหมดนี้ได้อย่างแน่นอน
egmont

2
@MichaelDurrant set pasteไม่ควรอยู่ในอารมณ์ร้ายของคุณ มันปิดใช้งานหรือรีเซ็ตสิ่งต่าง ๆ มากมายรวมถึงการแมปโหมดแทรกการแมปบรรทัดคำสั่งตัวย่อแบนด์วิดธ์ wrapmargin autoindent smartindent, softtabstop, formatoptions, indentexpr และอื่น ๆ อีกมากมาย :h pasteมีรายการทั้งหมด คนส่วนใหญ่ใช้สิ่งเหล่านี้บางส่วนหรือทั้งหมดและสงสัยว่าเหตุใดการตั้งค่าจึงถูกเพิกเฉย
FDinoff

4
ฉันมักจะใช้:r!catเพื่อวางคำต่อคำ
Simon Richter

1
อาจเป็นการสนทนาที่คุ้มค่าset mouseซึ่งสามารถเข้าและออกจากโหมดวางโดยอัตโนมัติเมื่อวางด้วยการคลิกเมาส์
Ben Voigt

36

ใช้เป็นกลุ่มวาง สิ่งที่คุณต้องการคือการวางสิ่งที่อยู่ในบัฟเฟอร์คลิปบอร์ด "+p

สิ่งนี้จะเลือก+และวางในตำแหน่ง

หากคุณใช้ Linux *เป็นบัฟเฟอร์ X / middle-click (ข้อความที่เลือกล่าสุด)

จากนั้นกลุ่มก็รู้ว่ามันเป็นการวาง

มิฉะนั้นกลุ่มคิดว่าคุณได้พิมพ์คีย์ที่ถูกวางและทำการเยื้องอัตโนมัติของตัวเอง (ด้านบนของการเยื้องที่คัดลอกของคุณ) จนถึงจุดสิ้นสุด

ในฐานะที่เป็นโน้ตสำหรับสิ่งนี้ในการทำงานกับ SSH คุณจะต้องตั้งค่าตัวเลือกสำหรับการแชร์คลิปบอร์ดของคุณ -Y

ดูman sshรายละเอียดเพิ่มเติมได้ที่


4
นี่เป็นคำตอบที่ถูกต้องจริงๆ
Kristoffer Sall-Storgaard

ดูเหมือนว่าจะใช้งานได้เฉพาะสำหรับ vim แบบกราฟิก ( gvim); เสียงเรียกใช้ในโปรแกรมจำลองเทอร์มินัลวางข้อความที่ถูกลบล่าสุดด้วย "* p ไม่ใช่ตัวเลือกปัจจุบัน
wurtel

ฉันไม่ได้ใช้ gvim เฉพาะกลุ่มที่เป็นกลุ่มเท่านั้น การตั้งค่าเมาส์ของคุณคืออะไร การตั้งค่าเมาส์ของฉันคือค ไม่แน่ใจว่ามันทำงานอย่างไรเมื่อเลือกเมาส์ได้ set mouse?
exussum

2
ตรวจสอบvim --versionดูว่ามันได้รับการรวบรวมด้วยการสนับสนุนคลิปบอร์ด+xterm_clipboardควรอยู่ในผลลัพธ์
exussum

@wurtel: บางทีคุณได้ตั้งคลิปบอร์ดกับunnamedสตริง
cuonglm

8

แท็บถูกแทรกเนื่องจากคุณเปิดใช้งานอัตโนมัติและคุณสามารถปิดใช้งานพฤติกรรมดังกล่าวได้โดยปิดการใช้งานอัตโนมัติ ( :set noai) ก่อนที่จะวางลงในเทอร์มินัล

บรรทัดความคิดเห็นถูกสร้างขึ้นโดยการแสดงความคิดเห็นอัตโนมัติและสามารถปิดการใช้งานได้โดยปิดที่

ทางเลือกสำหรับผู้ที่คุณควรได้รับพฤติกรรมที่ต้องการโดยใช้การสลับ :set pasteวางรหัสที่จัดรูปแบบของคุณและ:set nopasteเพื่อเรียกคืนพฤติกรรมปกติ

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