Vi & Vim

คำถามและคำตอบสำหรับผู้ที่ใช้ตระกูล vi และ Vim ของเครื่องมือแก้ไขข้อความ

2
วิธีการเข้าร่วมทุกบรรทัดด้วยกันซึ่งเป็นรูปแบบการจับคู่?
ฉันต้องการรวมสายเข้าด้วยกันเฉพาะสำหรับบรรทัดที่มีรูปแบบบางอย่าง (เช่น;) อย่างไรก็ตามเมื่อใช้g/;/jมันจะไม่ทำงานอย่างที่คาดไว้เว้นแต่จะเรียกว่าสองครั้ง ตัวอย่างเช่นเนื้อหาต่อไปนี้: a 1; 2; 3; 4; 5; b 6; 7; 8; 9; c เมื่อใช้: :g/;/jผลลัพธ์คือ: a 1; 2; 3; 4; 5; b 6; 7; 8; 9; c หรือ:g/;/-jให้: a 1; 2; 3; 4; 5; b 6; 7; 8; 9; c คล้ายกับ: :g/;\_.\{-};/j. ผลลัพธ์ที่คาดหวังของฉันคือ: a 1; 2; 3; …

2
สิ่งที่ต้องติดตามเพื่อสร้างปลั๊กอินกลุ่ม?
ดังนั้นคำถามของฉันง่าย เป็นความคิดที่ดีหรือไม่ที่จะเรียนรู้การเขียนสคริปต์เป็นกลุ่มเพื่อสร้างเสียงเรียกเข้าหรือเราควรใช้ภาษาอื่นที่เป็นที่ยอมรับมากกว่านั้น ตัวอย่างเช่นลิงค์นี้เปิดวิดีโอ YouTube ซึ่งแสดงวิธีใช้ Python เพื่อสร้างปลั๊กอินกลุ่ม สคริปต์ที่เป็นกลุ่มจะไม่เป็นประโยชน์อย่างสิ้นเชิงเว้นแต่จะมีหนึ่งตั้งใจที่จะสร้างปลั๊กอินที่เป็นกลุ่มบางอย่าง ดังนั้นมีสิ่งใดที่ไม่สามารถทำได้ยกเว้นว่าใช้สคริปต์ vim เท่านั้น
12 vimscript 

2
ฉันจะบันทึกแมโครที่ซ้อนกันได้อย่างไร
ฉันต้องการบันทึกแมโครภายในมาโครเช่น: qa [ first macro ... ] qb [ second macro ... ] q [ some more stuff, involving @b ... ] q อย่างไรก็ตามที่สองqถูกตีความเป็นการร้องขอให้หยุดแมโครแรกและที่เหลือถูกตีความว่าเป็นคำสั่ง มีวิธีใดบ้างในการเริ่มบันทึกแมโครที่สองภายในแมโคร ถ้าไม่มีมีวิธีอื่นอีกไหมที่จะได้รับผลตามที่ต้องการในการกดแป้นซ้ำตามลำดับในขณะที่อยู่ในแมโครอยู่แล้ว?
11 macro 

1
ถ้าอื่น endif oneliner
ฉันมีออนไลเนอร์ตัวนี้อยู่vimrcแต่ไม่ได้ผล: if has("patch-7.4.710") | set listchars+=space:· else | set listchars+=trail:· | endif VIM พูดว่า: E518: Unknown option: else คุณสามารถช่วยฉันได้ไหม ?
11 vimscript 

3
ความแตกต่างระหว่าง '\ zs' และ '\ @ <=' อะตอมใน Vim regex คืออะไร
นี่คือสิ่งที่ฉันได้รับจากเอกสาร: \zs"จะเริ่มต้นส่วนไฮไลต์" หลังจากจับคู่ regex ก่อนหน้าและ\@&lt;="จะเริ่มต้นเป็นส่วนหนึ่งที่ไฮไลต์" หลังจากจับคู่ก่อนหน้านี้อะตอม แต่ฉันไม่เข้าใจรายละเอียดปลีกย่อยของเรื่องนี้ดังนั้นทุกคนสามารถอธิบายได้ว่าพวกเขามีความลึกมากกว่านี้อย่างไร นี่คือสิ่งที่ทำให้ฉันอยากรู้: ถ้าฉันวิ่ง /\_s\zsnnoremap เช่นเลือกnnoremapนำหน้าด้วยช่องว่างหรือจุดเริ่มต้นของบรรทัด (เช่น newline จากบรรทัดก่อนหน้าดังนั้น\_ก่อนหน้านั้นs) จากนั้นเรียกใช้gnเพื่อเข้าสู่โหมดภาพและเลือกการแข่งขันนัดถัดไปด้วยเหตุผลบางประการเฉพาะคอลัมน์แรก (เช่น ครั้งแรกnในnnoremap) ถูกเลือก - แม้จะมีความจริงที่ว่าทั้งnnoremapคำที่ไฮไลต์ที่มีการ:hlsearchเปิด อย่างไรก็ตามถ้าฉันเรียกใช้การค้นหาแทน /\_s\@&lt;=nnoremap จากนั้นลองgnเลือกทั้งหมดnnoremapอย่างถูกต้อง เกิดอะไรขึ้นที่นี่? ฉัน (ฉันกล้าพูด) พบข้อบกพร่องที่คลุมเครือบ้างไหม

3
เลือกภาพจากเคอร์เซอร์จนถึงบรรทัดว่างถัดไปหรือไม่
หนึ่งจะเลือกจากบรรทัดปัจจุบันไปยังบรรทัดว่างถัดไปได้อย่างไร ฉันรู้SHIFT+ Vแต่แล้วฉันต้องข้ามไปยังบรรทัดว่างถัดไปหรือกดปุ่มลงหลายครั้ง ฉันรู้วิธีการทำสิ่งนี้ได้ดีเมื่อมีตัวละครที่ตรงกันเช่น a }แต่ฉันไม่รู้ว่าจะทำอย่างไรเพื่อบรรทัดที่ว่างเปล่า

1
ข้อดีของการใช้โคลอนสำหรับคำสั่งแทนอัฒภาคคืออะไร
Vi ประสบความสำเร็จในการลดการเดินทางนิ้วและความเร็วให้น้อยที่สุดด้วยโหมดคำสั่ง การสลับ;และ:ดูเหมือนจะบันทึกการกดแป้น Shift พิเศษจำนวนมากสำหรับคำสั่งที่ใช้บ่อยกว่าการค้นหาจดหมายซ้ำ ๆ แต่มีข้อเสียเปรียบในการใช้เค้าโครงคีย์ที่ไม่ได้มาตรฐาน ข้อดีของ:คำสั่งคืออะไร เปรียบเทียบกับประสิทธิภาพและความสง่างามของ Vi โดยรวมแล้วฉันรู้สึกว่าต้องมีเหตุผลบางอย่างที่ฉันขาดไป

1
ยกเลิกเสร็จสิ้น
โดยทั่วไปแล้วการแทรกโหมดเสร็จสิ้น ( &lt;C-n&gt;) จะแทรกคำที่ถูกต้องในครั้งแรกที่ฉันกด&lt;C-n&gt;แต่ไม่เสมอไป ดังนั้นฉันต้องการให้ Vim แทรกการจับคู่ที่เห็นว่าดีที่สุดเมื่อฉันกด&lt;C-n&gt;แต่ก็ยังอนุญาตให้ฉันยกเลิกการแทรกนี้หลังจากนั้นหากการจับคู่ที่ถูกต้องไม่ปรากฏขึ้นหรือเป็นรายการยาว แน่นอนฉันสามารถเขียนโค้ดพฤติกรรมนี้ได้ แต่ฉันรู้สึกว่าควรมีคีย์มาตรฐาน (- รวม) เพื่อทำสิ่งนี้ ใครบางคนสามารถชี้ให้ฉันในทิศทางที่ถูกต้อง? คำถามโบนัส: มีคีย์อื่นที่ฉันสามารถใช้เพื่อให้ได้นัดที่ยาวที่สุด (เหมือนก่อนที่ฉันจะตี&lt;C-n&gt;)? สำหรับสิ่งที่คุ้มค่าฉันกำลังใช้ completeopt=menu

3
มีวิธี "ใช้ทั้งคู่" เมื่อใช้ Vim เป็นเครื่องมือผสานหรือไม่?
ฉันใช้ Vim เป็นแบบ 3 ทางผสานกับ Git และบางครั้งจำเป็นต้องทำการเปลี่ยนแปลงจากสาขาทั้งในและนอกเมือง kdiff3สามารถทำได้ด้วยการกดปุ่มสองครั้งมีวิธีการทำใน Vim หรือไม่?
11 vimdiff  merge 

2
ฉันจะแทรกตัวละครซ้ำ ๆ ได้อย่างไรแม้กระทั่งบรรทัดถัดไป
บอกว่าฉันมีความคิดเห็นเช่นนี้: //This is a comment และฉันต้องการทำให้เป็นเช่นนี้: //***************** //This is a comment //***************** มีวิธีง่าย ๆ ในการแทรกตัวอักษรซ้ำ ๆ กันแม้กระทั่งกับบรรทัดถัดไป / ก่อนหน้า?

2
Neomake ห้อยเมื่อใช้ eslint
ฉันติดตามบทเรียนทั้งสองต่อไปนี้เพื่อลองและตั้งค่าeslintและNeomake: รหัส Linting ด้วย Neomake และ Neovim รหัส Linting ด้วย Neovim และ Neomake - ESLint edition ดังนั้นฉันมีน้อยที่สุดดังต่อไปนี้ init.vim call plug#begin('~/.vim/plugged') Plug 'neomake/neomake' call plug#end() autocmd! BufWritePost,BufEnter * Neomake let g:neomake_verbose=3 let g:neomake_open_list = 2 let g:neomake_javascript_enabled_makers = ['eslint'] " neomake nmap &lt;Leader&gt;&lt;Space&gt;o :lopen&lt;CR&gt; " open location window nmap &lt;Leader&gt;&lt;Space&gt;c :lclose&lt;CR&gt; …

2
วิธีตรวจสอบให้แน่ใจว่าไม่มีการเปลี่ยนแปลงเกิดขึ้นกับไฟล์
มีอยู่แล้วฉันสามารถตรวจสอบให้แน่ใจว่าไฟล์ถูกล็อคเพื่อที่ฉันไม่สามารถทำการเปลี่ยนแปลงใด ๆ กับมัน มีคำสั่งสำหรับการล็อค / ปลดล็อคไฟล์ในกลุ่ม บางครั้งฉันต้องการไฟล์ให้อยู่ในโหมดอ่านอย่างเดียว
11 save 

3
ฉันจะใช้เครื่องหมายเพื่อข้ามไปยังตำแหน่งที่ตั้งในไฟล์ที่ฉันเพิ่งเปิด แต่ไม่เปลี่ยนแปลงได้อย่างไร
บ่อยครั้งที่ฉันแก้ไขไฟล์ - คิดว่างานของฉันเสร็จแล้ว - จากนั้นปิดไฟล์และไปยังสิ่งต่อไป แต่แล้วฉันก็รู้ว่าฉันต้องกลับไปที่รหัสนั้นและปรับแต่งมันอีกเล็กน้อย ถ้าผมเปิดไฟล์อีกครั้งฉันสามารถใช้เครื่องหมายและข้ามไปยังตำแหน่งของการแก้ไขครั้งสุดท้ายด้วย. ตอนนี้ฉันกำลังพยายามหาวิธีใช้เครื่องหมายของกลุ่มเพื่อข้ามไปยังตำแหน่งที่ตั้งในไฟล์ที่ฉันเพิ่งเยี่ยมชม แต่ไม่เปลี่ยนแปลง ฉันรู้ว่าฉันสามารถตั้งเครื่องหมายด้วยตนเองได้ แต่ส่วนใหญ่ฉันไม่คาดหวังว่าจะกลับมาอีกดังนั้นฉันจึงไม่ได้ตั้งเครื่องหมายและจำเป็นต้องใช้เครื่องหมายที่เป็นกลุ่มที่สร้างโดยอัตโนมัติ เครื่องหมายดูเหมือนว่านี้อาจจะเป็นวิธีการที่จะบรรลุเป้าหมายนี้ได้จาก '.":h motion " ไปยังตำแหน่งเคอร์เซอร์เมื่อออกจากบัฟเฟอร์ปัจจุบันครั้งล่าสุด เริ่มต้นที่ตัวอักษรตัวแรกของบรรทัดแรก ดู | last-position-jump | สำหรับวิธีใช้สิ่งนี้สำหรับไฟล์ที่เปิดแต่ละไฟล์ มีการจดจำตำแหน่งเพียงหนึ่งตำแหน่งต่อบัฟเฟอร์ไม่ใช่หนึ่งตำแหน่งสำหรับแต่ละหน้าต่าง ตราบใดที่บัฟเฟอร์สามารถมองเห็นได้ในหน้าต่างตำแหน่งจะไม่เปลี่ยนแปลง {ไม่ใช่ใน Vi} อย่างไรก็ตามถ้าฉัน ปิดหน้าต่างทั้งหมดที่แสดงบัฟเฟอร์ (แต่บัฟเฟอร์นั้นยังคงอยู่ในรายการบัฟเฟอร์) หรือ: ฆ่าอินสแตนซ์ทั้งหมดของบัฟเฟอร์ ดูเหมือนว่าเครื่องหมายจะไม่อัปเดตฉันจะใช้เครื่องหมายเพื่อข้ามไปยังตำแหน่งของตำแหน่งเคอร์เซอร์สุดท้ายในบัฟเฟอร์ / ไฟล์ได้อย่างไร

1
ฉันจะทำให้ gvim ไม่ใช้กล่องโต้ตอบแบบกราฟิกสำหรับ ': set confirm' ได้หรือไม่?
ฉันใช้ gvim บน windows บ่อยมาก ฉันมีใน.vimrc: set confirm อย่างไรก็ตามนี่จะเปิดกล่องโต้ตอบเล็ก ๆ น้อย ๆ ดังนั้นฉันต้องใช้เมาส์เพื่อออก ในกลุ่มบรรทัดคำสั่งฉันได้รับสิ่งนี้: :q Save changes to "Untitled"? [Y]es, (N)o, (C)ancel: มีอยู่แล้วฉันสามารถกำหนดค่า gvim ให้ทำเช่นนี้
11 gvim 

3
วิธีแทรกข้อความซ้ำ ๆ ที่มีความแตกต่างเล็กน้อยในกลุ่ม?
ฉันต้องการแทรกข้อความแบบนี้: similar text wordA similar text ... similar text wordB similar text ... similar text wordC similar text ... ฉันรู้ว่าฉันสามารถวางข้อความได้หลายครั้งจากนั้นใช้การแทนที่เพื่อเปลี่ยนคำเดียวสำหรับแต่ละบรรทัด แต่ฉันก็ยังพบว่าวิธีนี้ไม่สะดวกมาก มีวิธีการบันทึกคำหรือรายการคำใน "ตัวแปร" แล้วใช้ตัวแปรนี้เพื่อสร้างข้อความที่คล้ายกัน? แก้ไขฉันทำสิ่งที่ไม่ชัดเจนในคำถามต้นฉบับจริง ๆ แล้วฉันพยายามทำให้ฟังก์ชั่นคำนิยามที่เหมือนกันดังนั้นwordA wordB... อาจปรากฏหลายครั้งในแต่ละโคลนของข้อความและข้อความอาจมีหลายบรรทัด รูปแบบเป็นเช่นนี้: similar_text1 wordA similar_text2 wordA similar_text3 ... similar_text1 wordB similar_text2 wordB similar_text3 ... similar_text1 wordC similar_text2 wordC similar_text3 ... (ข้อความอาจมีบรรทัดใหม่และ wordA, …

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