เยื้องรหัสเยื้องที่ไม่ดีอีกครั้ง


39

ฉันชอบฟีเจอร์สมาร์ทเยื้องของ Vim ทำให้ฉันสามารถสร้างบล็อคโค้ดที่เยื้องเข้าไปได้

ฉันคัดลอก / วางรหัสลงในบัฟเฟอร์อย่างสม่ำเสมอ แต่รหัสนั้นมักมีรูปแบบไม่ดี

สิ่งที่เหมาะสมที่สุดคือ "ประมวลผลซ้ำ" รหัสผ่านระบบสมาร์ท - เยื้อง

เป็นไปได้ไหม

ตัวอย่างเช่นคุณจะแก้ไขรหัสต่อไปนี้อย่างไร (แยกจากบล็อกขนาดใหญ่ - ฉันไม่ต้องการแก้ไขแต่ละบรรทัดด้วยตนเอง ... ):

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }

1
คุณกำลังพูดถึงการวางโค้ดที่เดิมเว้า ๆ แหว่ง ๆ หรือเว้าท์โค๊ดที่เปลี่ยนแปลงเมื่อคุณวางลงใน Vim หรือไม่?
jamessan

รหัสที่วางนั้นมีการย่อหน้าที่ไม่ดีเมื่อเริ่มต้น ขอยกตัวอย่าง ....
rolfl

คำตอบ:


48

ฉันทำหนึ่งในสองวิธีนี้

เยื้องปรับวาง

ก่อนอื่นถ้ารหัสในบัฟเฟอร์ถูกจัดรูปแบบ แต่ในระดับที่แตกต่างกันของการเยื้องฉันใช้]pแทนpซึ่งวางรหัสตามที่เป็นอยู่ แต่ด้วยการเยื้องเปลี่ยนไปเช่นที่บรรทัดแรกวางอยู่ลึกเช่นเดียวกับบรรทัดฉัน อยู่บน

คัดลอกแหล่ง EG ไปยังบัฟเฟอร์

while (1) {
    dostuff();
}

EG ผลลัพธ์ของการวางด้วย ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

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

ฟอร์แมตใหม่หลังจากวาง

ตัว=ดำเนินการในกลุ่มจะจัดรูปแบบโค้ดใหม่ตามกฎการจัดรูปแบบที่กำหนดไว้ สำหรับตัวอย่างสั้น ๆ ของการวางฉันจะเข้าสู่โหมดภาพด้วยvเลือกบรรทัดที่ฉันเพิ่งวางแล้วกด=เพื่อจัดรูปแบบใหม่

สำหรับวางที่ใหญ่กว่าฉันใช้ประโยชน์จากความจริงที่ว่าเคอร์เซอร์ไปที่บรรทัดแรกที่วางแล้ว จากนั้นฉันสามารถป้อน84==เพื่อ reflow บรรทัดที่ 84 (แน่นอนให้แทนที่ 84 ด้วยจำนวนบรรทัดที่คุณวางจริง)

อ้างอิง

:help ]p สำหรับการเยื้องที่ปรับ

:help =ครอบคลุม={motion}, [count]==และ{Visual}=สำหรับการกรองผ่านที่กำหนดเองหรือ builtin กฎเยื้อง


6
คุณสามารถเลือกรหัสที่คุณวางในโหมดภาพโดยใช้ `[v`]
craigp

1
@ แบดเจอร์เพียงเพื่อชี้แจงว่า backtick-bracket-v-backtick-bracket หรือไม่
phatskat

1
ใช่ .. ข้อความที่ประหลาดเกี่ยวกับ backticks ดังนั้นฉันไม่สามารถใส่มันในบล็อกรหัส: P
craigp

ตัวดำเนินการ = ใน vim จัดรูปแบบโค้ดใหม่ตามกฎการจัดรูปแบบที่กำหนดค่าไว้ที่ ฉันจะให้ +100 ถ้าทำได้ ฉันสามารถบันทึกวัน
Wossname

1
ฉันใช้ <control + R> "เพื่อวางเพื่อที่ฉันจะได้ไม่ต้องออกจากโหมดการแทรก] p เทียบเท่ากับ <control + R>" คืออะไร?
A --- B

15

=คำสั่งที่สามารถใช้เพื่อ reindent

เช่นเดียวกับคำสั่งโหมดปกติส่วนใหญ่สามารถใช้กับการเคลื่อนไหวได้ดังนั้นคุณจึงสามารถใส่รหัสที่เพิ่งวาง=']ใหม่ได้อีกครั้ง reindents นี้จากตำแหน่งเคอร์เซอร์ปัจจุบันไปยัง']เครื่องหมายซึ่งเป็นบรรทัดสุดท้ายของการวาง

= ยังสามารถใช้จากโหมดภาพ

คำสั่งที่มีประโยชน์อื่นคือ]pซึ่งวางในระดับเยื้องกับบรรทัดปัจจุบัน วิธีนี้สามารถช่วยวางข้อความที่เยื้องอย่างเหมาะสมแม้ว่าจะอยู่ในระดับความลึกของการเยื้องที่แตกต่างกันตามข้อความโดยรอบ


7

การใช้=ap (ช่วยในการจำคือ 'จัดรูปแบบย่อหน้า')จะมีความพยายามที่จะจัดรูปแบบย่อหน้าปัจจุบันโดยอัตโนมัติ

หากคุณต้องการให้ความสนใจอย่างระมัดระวังกับสิ่งที่คุณอาจจัดรูปแบบใหม่คุณอาจพบว่ามีความสุขและรวดเร็วยิ่งขึ้นในvapการเลือกย่อหน้าปัจจุบันให้มองเห็น=ได้ ฉันพบว่ามีประโยชน์ในไฟล์ที่ฉันรู้ว่าเสียงเรียกเข้าจะจัดรูปแบบไม่ถูกต้องและฉันไม่ต้องการจัดรูปแบบบรรทัดอื่นผิดโดยไม่ถูกต้อง


4

ในการรวมไฟล์ในบัฟเฟอร์อีกครั้งให้ใช้gg=G: ดูแก้ไขการเยื้อง

สำหรับการรวมส่วนของไฟล์อีกครั้งสามารถใช้ขอบเขตต่าง ๆ กับ=ตัวกรอง (ตัวอย่างเช่น==แก้ไขเฉพาะบรรทัดปัจจุบัน)

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

หากคุณพบว่าคุณกำลังวางสิ่งต่าง ๆ เป็นประจำคุณควรใช้เคล็ดลับนี้ใน VimWiki และตั้งค่าคีย์สำหรับสลับ "โหมดวาง" โดยเพิ่มบรรทัดเหล่านี้ใน.vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

จากนั้นคุณสามารถกด<F2>เพื่อสลับโหมดวาง vim จะแสดงคำว่า "PASTE" ในบรรทัดสถานะเมื่อโหมดการวางใช้งานอยู่


2
คำถามนี้ไม่เกี่ยวกับการวางโค้ดด้วยการเยื้อง แต่เป็นการแก้ไขโค้ดที่มีการเยื้องต่ำ
rolfl

4
ฉันไม่เห็นความคิดเห็นที่คุณโพสต์ อย่างไรก็ตามคุณยังสามารถใช้gg=Gเพื่อรวมไฟล์ทั้งหมดอีกครั้ง
Bhargav Bhat

@rolfl นั่นคือสิ่งที่ฉันมักจะเริ่มต้นในกรณีเช่นนี้: gg=Gจากนั้นดูชิ้นส่วนที่vimผิด
muru

หากคุณต้องการการควบคุมเพิ่มเติม (หรือลดความยุ่งยากซ้ำ ๆ ) พิจารณาเพิ่มคำสั่งอัตโนมัติเพื่อเรียกใช้เครื่องมือการจัดรูปแบบโค้ดเช่นastyleเมื่อคุณบันทึกบัฟเฟอร์ ดูคำถามนี้ใน SO เพื่อดูรายละเอียด
Bhargav Bhat

2

=%อีกครั้งเยื้องบล็อกทั้งบล็อกค้ำยันหรือวงเล็บโดยอัตโนมัติวางเคอร์เซอร์ในบรรทัดเดียวกันที่เป็นตัวยึดและลอง :set sw=2ในการเปลี่ยนความกว้างของการเปลี่ยนแปลงของคุณให้ใช้เช่น

หากวิธีนี้ใช้ไม่ได้ตามที่คาดไว้หากต้องการลดการเยื้องด้วยตนเอง ( ล้าสมัย ) ให้ลอง<%และทำซ้ำด้วย.(หากจำเป็น) ใช้>%สำหรับตรงกันข้าม

ดังนั้น:

else
       {
         // some code
       }

กลายเป็น:

else
{
  // some code
}

สำหรับรหัสเฉพาะการเยื้องหนึ่งบรรทัดหรือสองสามบรรทัดโดยอัตโนมัติลอง:

  • == เพื่อเยื้องบรรทัดปัจจุบันอีกครั้ง
  • 5== เพื่อเยื้อง 5 บรรทัด

หากต้องการเพิ่ม / ลดการเยื้องด้วยตนเองสำหรับหนึ่งบรรทัดหรือสองสามบรรทัดลอง:

  • << เพื่อยกเลิกการเยื้องบรรทัดปัจจุบันด้วยการเว้นวรรคความกว้าง
  • 5<< เพื่อยกเลิกการเยื้อง 5 บรรทัดโดยการเลื่อนช่องว่าง
  • >> เพื่อเยื้องบรรทัดปัจจุบันตามพื้นที่เลื่อนความเร็ว
  • 5>> เพื่อเยื้อง 5 บรรทัดโดยการเว้นวรรคความกว้าง
  • . ทำซ้ำหากจำเป็น

นอกจากนี้คุณยังสามารถเยื้องในโหมดภาพ ( v) โดยการเลือกข้อความและกด=(อัตโนมัติเยื้อง), <(เยื้อง) หรือ>(เยื้อง)

gg=Gเคล็ดลับก็คือการเยื้องที่ถูกต้องของไฟล์ทั้งหมดโดย:

หากคุณแท็บแทนช่องว่างให้ใช้: :retabซึ่งจะแทนที่แท็บทั้งหมดด้วยช่องว่าง (ดู: จะแทนที่แท็บด้วยช่องว่างได้อย่างไร )


สำหรับวิธีการภายนอกคุณสามารถลอง:

  • pythonTidyสำหรับฟอร์แมตโค้ด Python เช่น:

    :%!pythonTidy
    

ที่เกี่ยวข้อง:


1

ฉันเพิ่งติดตั้ง vim-pasta ( https://github.com/sickill/vim-pasta ) และดูเหมือนว่าจะปรับปรุงการเยื้องของรหัสเมื่อฉันวาง README ยังมีการสนทนาที่ดีเกี่ยวกับกลยุทธ์การวางโค้ดที่หลากหลาย


1

มีหลายสิ่งที่ครอบคลุมอยู่ในคำตอบที่มีอยู่แล้ว ฉันต้องการเพิ่มการแมปหนึ่งที่ฉันใช้บ่อยมากสำหรับการเยื้อง

nnoremap <Leader>i  mzgg=G`z

ฉันได้เห็น vimrc ด้วยแมป===นี้

วิธีนี้เป็นแผนที่ที่ยอดเยี่ยมและฉันใช้มันเกือบทุกครั้งโดยเฉพาะเมื่อวางโค้ดที่คัดลอกมาจากที่อื่น

หรือดียิ่งขึ้นใส่ไว้ในที่autocmdเพื่อให้เสียงเรียกเข้าเยื้องมันก่อนที่คุณจะเขียนการเปลี่ยนแปลงไปยังดิสก์

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