Vi & Vim

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

2
วิธีการตรวจสอบว่าไฟล์ swp มีการเปลี่ยนแปลงที่ไม่ได้บันทึกหรือไม่
เมื่อแก้ไขซอร์สโค้ดโดยใช้ gvim (v.7.4.488) ฉันต้องการคอมมิทการเปลี่ยนแปลง vcs (ฉันใช้ git 2.1.4 จากบรรทัดคำสั่งใน Ubuntu linux) git --status แสดงไฟล์ที่ฉันเปลี่ยน อย่างไรก็ตามมันยังแสดง vim .*.swpของบัฟเฟอร์ที่มองเห็นได้ในปัจจุบัน (ทั้งคู่ถ้าไฟล์มีการเปลี่ยนแปลงที่ไม่ได้บันทึกและเมื่อไฟล์ที่แก้ไขเหมือนกันกับ.*.swp-file) แน่นอน, git สามารถละเว้นไฟล์เหล่านี้หรือเป็นกลุ่มสามารถเก็บไฟล์ swap ในตำแหน่งอื่น (ดูvim.wikiaหรือคำถามนี้ที่ stackoverflow ) แต่ฉันชอบ - .*.swpไฟล์ที่ปรากฏขึ้นgit --statusเมื่อพวกเขามีการเปลี่ยนแปลงที่ไม่ได้บันทึกเพราะมันเป็นสัญญาณให้ฉันเห็นว่าฉันกำลังยืนยันไฟล์ในสถานะที่แตกต่างจากสิ่งที่ฉันคิดว่าพวกเขามี ฉันจะหลีกเลี่ยงผลบวกปลอมของ.*.swp-files ที่ปรากฏขึ้นgit --statusเมื่อไฟล์ที่บันทึกไว้เหมือนกับ -file ได้อย่างไรใน.*.swpขณะที่สามารถเห็นไฟล์ที่จะคอมมิทนั้นจะอยู่ในสถานะที่แตกต่างจากที่ฉันแก้ไขด้วย vim เป็นไปได้หรือไม่ที่มี.*.swp-files เท่านั้นเมื่อไฟล์บนดิสก์และไฟล์ใน vim แตกต่างกัน? มีวิธีอื่นในการตรวจจับไฟล์ที่ไม่ได้บันทึกหรือไม่? การรวมความคิดเห็นของ@elyashivและ@VanLaserเป็นวิธีที่ง่ายกว่าการตรวจจับว่าไฟล์สลับแปลว่าไฟล์ที่ไม่ได้บันทึกหรือไม่: อย่าปล่อยให้คอมไพล์ละเว้นไฟล์. *. sw [po]; เมื่อกระทำถ้าgit --statusพบว่าไฟล์ใด ๆ.*.sw[po]ทำ a …
11 git  swap-file 

1
ระดับ Word แตกต่างกันเป็นกลุ่ม
เท่าที่ฉันเข้าใจ vimdiff เริ่มต้นจะทำเฉพาะ linewise ต่างกัน อย่างไรก็ตาม somtimes มีประโยชน์ในการทำระดับคำศัพท์ต่าง ๆ โดยเฉพาะอย่างยิ่งสำหรับไฟล์ข้อความเช่น Markdown, LaTeX เป็นต้นมีเครื่องมือบางอย่างเช่น wdiff หรือ dwdiff ซึ่งทำ diff ในระดับคำ เป็นไปได้หรือไม่ที่จะใช้ไฟล์เหล่านี้ในกลุ่มเพื่อเปรียบเทียบไฟล์ข้อความสองไฟล์เคียงข้างกัน?
11 vimdiff 

1
เรียงตามคำที่คั่นด้วยเครื่องหมายจุลภาค
คำสั่งปกติ: การเรียงลำดับสามารถเรียงลำดับบรรทัดตามคอลัมน์หรือคอลัมน์เสมือน ( \%cหรือ\%v), สามารถใช้คอลัมน์ตรรกะระดับสูงกว่าเป็นคีย์การเรียงลำดับได้หรือไม่ การใช้นิพจน์ทั่วไปนั้นมีความซับซ้อนเล็กน้อยสำหรับสถานการณ์นี้ (คอลัมน์อยู่ใกล้กับจุดสิ้นสุดของบรรทัด) และดูเหมือนว่ายูทิลิตีการเรียงลำดับทำอะไร ( sork -k) แต่การเรียงลำดับด้วยฟังก์ชันนี้ไม่สามารถใช้งานได้บน Windows ปลั๊กอินที่เป็นกลุ่มจะช่วยได้เช่นกัน ตัวอย่างเช่นฉันต้องการเรียงลำดับ 2 บรรทัดด้านล่างตามคอลัมน์สุดท้ายคั่นด้วยเครื่องหมายจุลภาค สถานการณ์จริงของฉันมีคอลัมน์และรูปแบบสตริงมากขึ้น ระบุตัวคั่นคอลัมน์จะทำให้มันง่ายขึ้นมาก xxx,yyy,zzz,0x123 zzxz,xxxx,yyyy,0x121

2
ภูมิภาคสี่เหลี่ยมเป็นวัตถุข้อความ?
เป็นไปได้ที่จะกำหนดวัตถุข้อความในกลุ่มที่จะทำหน้าที่ในพื้นที่สี่เหลี่ยม? ตัวอย่างเช่นสมมติว่าฉันมีแนวคอลัมน์แนวตั้งของข้อความเช่นนี้ column 1 co column 2 col lumn 1 colu umn 2 column mn 1 column 2 column 2 c 1 column 1 olumn 2 colu มันจะเป็นไปได้ที่จะกำหนด textobject cสำหรับคอลัมน์เช่นนั้นdacจะลบคอลัมน์yacจะดึงมันcacจะเปลี่ยนหรือไม่? (ฉันรู้เกี่ยวกับ Control-V สำหรับการเลือกพื้นที่สี่เหลี่ยมและฉันรู้ว่าคุณสามารถใช้d, yฯลฯ เพื่อลบ, งัด ฯลฯ ภูมิภาคที่เลือก แต่ฉันอยากรู้เฉพาะเกี่ยวกับสิ่งที่เป็นไปได้โดยใช้วัตถุข้อความ)

2
เป็นไปได้หรือไม่ที่จะใช้ผู้รับมอบสิทธิ์หรือส่งผ่านฟังก์ชันเป็นอาร์กิวเมนต์ใน Vimscript
ฉันกำลังพยายามสร้างปลั๊กอินขนาดเล็กเพื่อเรียนรู้ vimscript เป้าหมายของฉันคือการสร้างฟังก์ชั่นบางอย่างที่ประมวลผลข้อความที่เลือกและแทนที่ด้วยผลลัพธ์ สคริปต์มีรายการดังต่อไปนี้: สองฟังก์ชั่นการประมวลผลข้อความ:พวกเขาใช้สตริงเป็นพารามิเตอร์ส่งคืนสตริงซึ่งควรใช้เพื่อแทนที่ข้อความต้นฉบับ สำหรับตอนนี้ฉันมีเพียงสองคน แต่อาจมีอีกมากในอีกไม่กี่ครั้ง ฟังก์ชั่นที่ได้รับข้อความที่เลือก:ซึ่งดึงการเลือกล่าสุดและส่งคืน ฟังก์ชั่น wrapper:ซึ่งเรียกฟังก์ชั่นการประมวลผลได้รับผลและแทนที่การเลือกเก่าด้วยผลลัพธ์นี้ ตอนนี้ฟังก์ชั่น wrapper ของฉันดูเหมือนว่า: function! Wrapper() " Get the string to insert let @x = Type1ProcessString(GetSelectedText()) " remove the old selection normal gvd " insert the new string normal "xp endfunction และฉันต้องสร้างเสื้อคลุมตัวที่สองแทนที่บรรทัด 3 ด้วย let @x = Type2ProcessString(GetSelectedText()) ฉันต้องการให้ฟังก์ชั่น wrapper ของฉันพารามิเตอร์ที่มีฟังก์ชั่นกระบวนการในการดำเนินการและใช้การโทรทั่วไปในบรรทัดที่ …

4
ฉันจะเรียกใช้จาวาสคริปต์โดยตรงและแสดงผลลัพธ์ได้อย่างไร
ฉันแค่ทำการทดสอบด้วยคุณสมบัติภาษา JavaScript โดยไม่ต้องจัดการ DOM ดังนั้นฉันจึงแก้ไขไฟล์ js และฉันสงสัยว่าจะรันและแสดงเอาต์พุตคอนโซลได้อย่างไร ฉันติดตั้งปลั๊กอินmoll / vim-nodeแต่ไม่ทราบวิธีการเรียกใช้รหัส js

3
Vim ทำงานช้าลงเมื่อเวลาผ่านไปโดยมีการเปิดไวยากรณ์
มีสิ่งใดบ้างที่ฉันสามารถทำได้syntax onเมื่อใช้ Vim ทันทีที่ฉันเปิดสิ่งที่เป็นกอบเป็นกำก็แทบจะเป็นไปไม่ได้ที่จะแก้ไขหลังจากผ่านไประยะหนึ่ง การกดคีย์ทุกครั้งทำให้เกิดความล่าช้า ถ้าฉันปิดการเน้นไวยากรณ์หรือเรียกใช้เป็นกลุ่ม - มันใช้ได้อีกครั้ง ฉันได้synmaxcolตั้งไว้ที่ 120 ไฟล์ตัวอย่างทับทิมมีความยาวเพียง 59 บรรทัดและไม่เกิน 80 อักขระ ฉันใช้และvim-rubyvim-rails ปัญหาคือความล่าช้าดูเหมือนจะสะสมตลอดเวลา เมื่อฉันเปิดไฟล์ตั้งแต่เริ่มต้นก็ถือว่าใช้ได้ หลังจากนั้นไม่นานมันก็ช้าลงเรื่อย ๆ

3
ทำคำสั่งโหมด command-line พิมพ์ <Esc> และ Ctrl
ลองนึกภาพคุณต้องการพูดคำด้านล่าง หาก|เป็นตำแหน่งเคอร์เซอร์คุณสามารถพูดคำด้วยcw""&lt;Esc&gt;Pจากโหมดปกติได้อย่างง่ายดาย |below ฉันต้องการที่จะบรรลุพฤติกรรมเดียวกันในโหมดบรรทัดคำสั่ง คำถามของฉันคือฉันจะพูดกับโหมดบรรทัดคำสั่งที่ฉันต้องการพิมพ์ได้&lt;Esc&gt;อย่างไร ฉันพยายาม:norm cw""&lt;Esc&gt;Pและบางรูปแบบอื่น ๆ แต่ผมเพิ่งได้รับแทน""&lt;Esc&gt;P"below" ยังคงเกี่ยวข้องกับสิ่งนี้ฉันต้องการที่จะรู้ว่าฉันจะทำคำสั่ง Ctrl ประเภทโหมดบรรทัดคำสั่งได้อย่างไร ตัวอย่างเช่นฉันสามารถพูดคำดังกล่าวด้วยcw"&lt;C-r&gt;""&lt;Esc&gt;แทน แต่ฉันก็ต้องใช้ Command-line พิมพ์&lt;C-r&gt;ให้ฉัน ฉันจะทำสิ่งนี้ได้อย่างไร

1
ฉันจะเลื่อนบรรทัดเยื้องไปเป็นค่าเฉพาะได้อย่างไร
หลายครั้งที่ฉันพบกับสถานการณ์ที่บรรทัดไม่เยื้องอย่างเหมาะสม อีเธอร์ผ่านปลั๊กอินการเยื้องที่ไม่ดี / ไม่ต้องการหรือส่วนใหญ่มักจะเว้นวรรคเพื่อชดเชยค่าเยื้อง ฉันมักจะแก้ไขปัญหานี้โดย&lt;&lt;หรือ&gt;&gt;บรรทัดสองสามครั้งเพื่อแก้ไข ในกรณีที่มีช่องว่างเพิ่มเติมฉันจะทำหนึ่ง100&lt;&lt;ระดับ&gt;&gt;สำหรับแต่ละย่อหน้าที่ฉันต้องการ คำถามคือเช่นการ|เคลื่อนไหวที่ช่วยให้คุณกำหนดคอลัมน์ตามจำนวน10|ส่งเคอร์เซอร์ไปที่คอลัมน์ที่ 10 ฉันจะระบุระดับการเยื้องได้อย่างไร ตัวอย่าง (สิ่งนี้ใช้ไม่ได้) กับshiftwidth=4 expandtab: The quick (indent level 0) ••••Brown Fox (indent level 1) ••••••••••Jumped over the lazy dog (indent level 2 with two extra spaces) ในกรณีนี้ฉันต้องนับระดับเยื้องของบรรทัดสุดท้าย (2) และเพิ่มหนึ่งรายการสำหรับช่องว่างเพิ่มเติมจากนั้นพิมพ์3&lt;&lt;แล้วนับระดับเยื้องของสิ่งที่ฉันแล้ว1&gt;&gt;(หรือใช้autoindentและ==คำสั่ง) ฉันขอให้บางสิ่งบางอย่างเช่น1==บังคับให้เยื้องเป็นเยื้องระดับ 1 หรือในบางกรณี0==เพื่อลบการเยื้องออกด้วยกัน ฉันรู้ว่าตัวอย่างข้างต้นทำการเยื้องอัตโนมัติใน 1 หรือ 0 บรรทัด (ตามลำดับ) และไม่ทำสิ่งที่ฉันต้องการ แต่หวังว่ามันจะช่วยอธิบายคำถามได้ดีขึ้น

3
เป็นไปได้หรือไม่ที่จะมีเอาท์พุตเป็น:! คำสั่งในการแยกมากกว่าทั้งหน้าต่าง?
หากฉันมีเซสชันเป็นกลุ่มที่มีสองแยกเมื่อฉันรัน:!คำสั่งผลลัพธ์จะปรากฏในหน้าต่างทั้งหมด เป็นไปได้หรือไม่ที่จะแสดงผลลัพธ์เฉพาะส่วนแบ่งที่ใช้งานอยู่

4
: อ่านหลังเคอร์เซอร์แทนที่จะเป็นหลังบรรทัด
ฉันใช้:r !uuidgenบ่อยครั้งเพื่อแทรก uuid ใหม่ลงในบัฟเฟอร์ ใช้งานได้ แต่โดยทั่วไปฉันพยายามแทรก uuid ระหว่างเครื่องหมายคำพูดและ:r !uuidgenพิมพ์ uuid ในบรรทัดใหม่ เพื่อแก้ไขปัญหานี้ฉันกำลังใช้ keymap ง่ายๆ: nnoremap &lt;C-u&gt; mm:r!uuidgen&lt;CR&gt;dW"_dd`mp มาโครนี้ตั้งเครื่องหมายmmแทรก uuid r!uuidgenลบ uuid ที่แทรกไว้dWลบบรรทัดพิเศษ"_ddกลับไปที่เครื่องหมายBACKTICKmและวาง uuid ในpที่สุด มีวิธีการ:rทางขวาหลังจากเคอร์เซอร์ที่ไม่มีมาโคร / การผูกคีย์ที่ทำให้การรีจิสเตอร์เสียหรือเปล่า?

2
สลับระหว่างฟอนต์ที่รันไทม์ได้อย่างรวดเร็ว
ในขณะที่แบบอักษรที่สามารถเลือกได้ด้วยตนเองใน GVim จากเมนูฉันมีแบบอักษรไม่กี่ผมอยากจะสลับไปมาระหว่างขึ้นอยู่กับงานในมือ(บิตแมปขนาดเล็กขนาดใหญ่ OTF ... ฯลฯ ) มีวิธีที่ฉันสามารถตั้งค่าการผูกคีย์เพื่อวนรายการฟอนต์ที่กำหนดไว้ล่วงหน้าใน vimrc ของฉันได้หรือไม่?

2
ฉันจะแก้ไข Vim ให้ทำงานกับรูปแบบแป้นพิมพ์อื่นได้อย่างไร
ฉันพิมพ์ด้วยรูปแบบแป้นพิมพ์ที่ไม่ใช่แบบ QWERTY หลายปุ่มที่ Vim ใช้อยู่ในแถวบ้าน แต่การผูกกุญแจบางปุ่มไม่ทำงานปุ่มที่ชัดเจนที่สุดคือhjklกุญแจ ฉันจะเปลี่ยนการเชื่อมโยงคีย์เหล่านี้เพื่อให้ทำงานได้ดีขึ้นกับเค้าโครงแป้นพิมพ์ของฉันได้อย่างไรและที่ไหน

1
แม็พลำดับของตัวอักษรในโหมดแทรก
ฉันสามารถแมปคีย์ผสมในโหมดแทรกได้แล้ว: :inoremap abc &lt;do stuff&gt; อย่างไรก็ตามสิ่งนี้มีข้อบกพร่องเล็กน้อย: เมื่อพิมพ์บางส่วนของลำดับเช่นabอักขระจะไม่แสดงจริงในช่วงเวลาสั้น ๆ เนื่องจาก "รอ" เพื่อดูว่าคุณกำลังจะพิมพ์คำสั่งเต็มหรือไม่ สิ่งนี้ไม่พึงประสงค์ ฉันต้องการแมปลูกโซ่ของตัวอักษรโดยไม่หยุดถ้าสตริงย่อยบางส่วนของห่วงโซ่ถูกป้อน หากฉันพิมพ์abให้หยุดชั่วคราว (และรอจนกว่าอักขระจะปรากฏจริงตามที่กล่าวไว้ในจุดด้านบน) จากนั้นพิมพ์cคำสั่งจะไม่ถูกเรียกใช้งาน ฉันต้องการให้คำสั่งดำเนินการไม่ว่าจะรอนานแค่ไหน ฉันจะใช้iabแต่ไม่ได้ผลเพราะ: มันต้องป้อนช่องว่างหลังจากสตริง ฉันไม่สามารถดำเนินการคำสั่งโดยพลการด้วยมันเพียงแทรกสตริงของข้อความ มีวิธีใดบ้างที่จะรันคำสั่งหรือการกดแป้นถ้ามีการป้อนสตริงที่แน่นอนในโหมดแทรกโดยไม่ต้องใช้แผนที่ (ซึ่งจะทำให้หยุดชั่วคราวทุกครั้งที่ฉันพิมพ์aและไม่ทำงานหากฉันรอนานเกินไป)?

2
เป็นไปได้ไหมที่จะใช้ฟังก์ชั่นไคลเอนต์เซิร์ฟเวอร์ของ vim เพื่อรักษาการตั้งค่าให้ตรงกัน
ฉันมักจะมีหลายกลุ่มของการเรียกใช้บนเครื่องเดียวกัน เมื่อฉันทำการเปลี่ยนแปลงกับ vimrc ของฉันฉันสามารถ:source ~/.vimrc(ด้วยการแมปง่าย ๆ หรือ autocmd) แต่เพื่อให้อินสแตนซ์ที่ทำงานอยู่ทั้งหมดแสดงถึงการเปลี่ยนแปลงฉันต้องเรียกใช้งานนั้นในแต่ละครั้งแยกกัน ฉันสามารถใช้clientserverคุณสมบัตินี้เพื่อบอกอินสแตนซ์ทั้งหมดให้โหลด vimrc ของฉันใหม่ได้หรือไม่ ฉันจะสนใจโซลูชันที่ไม่ได้ใช้clientserverด้วย

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