Vi & Vim

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

1
มีวิธีการแสดงส่วนที่พับเป็นต้นไม้หรือไม่?
การพับเป็นประโยชน์ในการซ่อนส่วนต่าง ๆ ของเอกสาร การแสดงภาพโครงสร้างพับเป็นต้นไม้จะเป็นประโยชน์ในการทำความเข้าใจโครงสร้างเอกสารได้อย่างรวดเร็ว
10 folding 

4
การ จำกัด การทำงานให้กับส่วนของรหัส
มีหลายครั้งในชีวิตการทำงานในแต่ละวันของฉันที่ฉันจำเป็นต้องใช้ในฟังก์ชั่นเฉพาะสิ่งต่าง ๆ เช่นการเน้นหรือค้นหาตัวแปร แต่ฉันไม่เคยจัดการเพื่อ จำกัด ขอบเขตของการแก้ไข / การค้นหา มีวิธีในการพูดเลือกคัดสรรค้นหาการอ้างอิงทั้งหมด$colorภายในชุดของวงเล็บปีกกาหรือพับนี้ ฯลฯ หากเป็นไปได้มันจะเหมาะอย่างยิ่งที่นี่เป็นเรื่องธรรมดาที่ค่อนข้างเพื่อที่จะสามารถนำไปใช้กับการแก้ไข / เปลี่ยนข้อความ ตัวอย่างเช่น: $color = "#fff"; function PickColor () { $color = "#bbb"; $newColors = ["#000", "#fbf", $color]; foreach ($newColors as $c) { if ($c == "#fff") { break; } } } $differentColor = $color; รหัสนี้เป็นตัวอย่างที่ค่อนข้างแย่อย่างไรก็ตามถ้าฉันต้องการแทนที่อินสแตนซ์ทั้งหมดของ $ color เราจะทำสิ่งนี้ในบริบทของฟังก์ชัน …

3
ข้อความจะถูกย้ายจากการลงทะเบียนหนึ่งครั้งไปยังจำนวนการลงทะเบียนได้อย่างไร?
มีวิธีใดที่จะทำให้ข้อความ 'ไพพ์' จากรีจิสเตอร์เป็นรีจิสเตอร์อื่นหรือรีจิสเตอร์อื่น ยกตัวอย่างเช่นย้าย"qไปลงทะเบียนผ่าน"1"5 ฉันมักจะต้องการสร้างมาโครรุ่นที่แตกต่างกันเล็กน้อยดังนั้นมันจึงมีประโยชน์ที่จะสามารถคัดลอกมาโคร 'เทมเพลต' ไปยังรีจิสเตอร์หลาย ๆ รีจิสเตอร์แล้วปรับเปลี่ยนแต่ละอัน เพื่อให้เป็นตัวอย่างในทางปฏิบัตินี่คือปัญหาที่ทำให้ฉันมีคำถามนี้ ฉันต้องเปลี่ยนบรรทัดต่อไปนี้จากภาษาคำอธิบายฮาร์ดแวร์เป็นบล็อกซ้ำหลาย ๆ RAM64(in=in, load=load0, address=address[0..5], out=out1); ถึง RAM64(in=in, load=load1, address=address[0..5], out=out2); RAM64(in=in, load=load2, address=address[0..5], out=out3); RAM64(in=in, load=load3, address=address[0..5], out=out4); RAM64(in=in, load=load4, address=address[0..5], out=out5); ฉันมีแมโครที่มีประสิทธิภาพนี้โดยใช้ฟังก์ชั่นที่เพิ่มขึ้นเป็นที่ฉันเก็บไว้ในการลงทะเบียนyypW^At)^A"a บางครั้งฉันต้องการรูปแบบของการเพิ่มขึ้นที่จะแตกต่างกันเล็กน้อยเช่น RAM512(in=in, load=load1, address=address[0..8], out=out2); RAM512(in=in, load=load2, address=address[0..8], out=out4); RAM512(in=in, load=load3, address=address[0..8], out=out6); RAM512(in=in, load=load4, address=address[0..8], …

4
คุณจะบันทึกไฟล์ที่คุณกำลังทำงานเป็นไฟล์ใหม่ได้อย่างไร
มีบางครั้งที่ฉันต้องการทดสอบการเปลี่ยนแปลงไฟล์ก่อนที่ฉันจะเขียนทับต้นฉบับ มีวิธีใดบ้างที่ฉันสามารถบันทึกไฟล์ที่ถูกแก้ไขเป็นไฟล์ใหม่ได้?
10 save 

1
มีโหมดแทรกเสริมหรือไม่?
ฉันพยายามเขียนสตริงที่มีตัวอักษรทั้งหมดจากzถึงaและฉันคิดว่ามันจะง่ายกว่านี้ถ้าฉันเขียนย้อนหลังได้ แนวคิดจะเหมือนกับโหมด INSERT ที่เคอร์เซอร์ไม่ก้าวไปข้างหน้าหลังจากใส่ถ่านทุกอัน ฉันไม่พบอะไรแบบนั้นฉันจึงสงสัยว่าโหมดนี้มีอยู่แล้วหรือสามารถทำได้ในทางใดทางหนึ่งหรือไม่? หมายเหตุ:ฉันทราบว่าฉันสามารถย้อนกลับข้อความได้แต่นี่ไม่ใช่ประเด็น

2
ฉันจะแยกความแตกต่างระหว่าง vim และ vimdiff จากภายใน vimrc ได้อย่างไร
ฉันมีฟังก์ชั่นเป็นกลุ่มซึ่งจะเปิดบัฟเฟอร์ทั้งหมดเป็นแท็บ อย่างไรก็ตามหลังจากที่ฉันเพิ่มฟังก์ชั่นนี้ vimdiff ก็เปิดไฟล์ที่จะเปรียบเทียบเป็นแท็บที่แตกต่างกันและด้วยเหตุนี้จะไม่แสดงความแตกต่าง มีวิธีใดบ้างที่ฉันจะทราบได้ว่า vim หรือ vimdiff ซึ่งเรียกใช้ไฟล์ vimrc ของฉันหรือไม่ function! OpenTabs() let bf=len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) if bf > 1 exe "tab 5sball" endif endfunction
10 vimrc  vimdiff 

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

2
เป็นไปได้ไหมที่จะลบรายการออกจากประวัติการเลิกทำ?
ฉันมีบรรทัดเหล่านี้ใน. vimrc ของฉันเพื่อช่วยในการเยื้อง: autocmd BufReadPost * set noexpandtab | retab! 4 autocmd BufWritePre * set expandtab | retab! 4 autocmd BufWritePost * set noexpandtab | retab! 4 อย่างไรก็ตามพวกเขาสร้างเสียงดังมากในประวัติศาสตร์การเลิกทำ เนื่องจากพวกเขาไม่ได้ทำอะไรจากมุมมองของผู้ใช้ฉันต้องการลบพวกเขาออกจากประวัติหรืออย่างน้อยก็ต้องกำจัดพวกเขาอย่างใดอย่างหนึ่ง มีวิธีทำเช่นนั้นหรือไม่?
10 vimrc  undo-redo 

2
ทำซ้ำบัฟเฟอร์ลงในแท็บใหม่แทนที่จะย้าย
ฉันมักจะต้องการเพิ่มบัฟเฟอร์ในหน้าแท็บชั่วคราวแล้วกลับไปที่การกำหนดค่าบัฟเฟอร์เก่าที่ฉันดู ขั้นตอนการทำงานปัจจุบันของฉันสำหรับการทำบางสิ่งบางอย่างเช่นนี้เป็นทั้งการปิดบัฟเฟอร์อื่น ๆ ที่ใช้<c-w>oหรือจะย้าย buffer <c-w>Tฉันกำลังมองหาที่ไปที่แท็บของตัวเอง ปัญหาเกี่ยวกับแนวทางที่สองคือมันลบบัฟเฟอร์ออกจากหน้าแท็บเดิม ผมเติมสามไฟล์a.txt, b.txtและc.txtด้วยa, bและcตามลำดับ % echo a > a.txt % echo b > b.txt % echo c > c.txt เมื่อฉันเปิดไฟล์ทั้งสามนี้ในหน้าแท็บเดียวฉันจะได้สิ่งต่อไปนี้ จากนั้นฉันสามารถย้ายa.txtไปที่แท็บด้วยตัวเอง อย่างไรก็ตามเมื่อฉันทำa.txtถูกลบออกจากหน้าแท็บเดิม (ดังนั้นนี่จะเป็นหลัง<c-w>Tgt) ฉันต้องการความสามารถในการเลือกในเวลาที่ฉันจะกด<c-w>Tเพื่อรักษาเนื้อหาของบัฟเฟอร์เดิมสร้างหน้าแท็บใหม่ที่มีเฉพาะบัฟเฟอร์ที่มุ่งเน้นในขณะนี้แล้วมุ่งเน้นหน้าแท็บใหม่ที่ฉันเพิ่ง สร้าง กล่าวอีกนัยหนึ่งคำสั่งเหมือนกันเกือบทุกอย่าง<c-w>Tยกเว้นว่าหน้าแท็บดั้งเดิมนั้นได้รับการเก็บรักษาไว้และขณะนี้a.txtอยู่ในหน้าแท็บสองหน้า มีวิธีทำเช่นนี้หรือไม่?

1
การแมป Ctrl พร้อมเครื่องหมายเท่ากับ
ฉันพยายามแมป Ctrl และเครื่องหมายบวกด้วยกัน นี่คือสิ่งที่ฉันพยายามใน vimrc ของฉัน: nnoremap <C-=> : echo "Hello" <CR> อย่างไรก็ตามดูเหมือนว่าการแมปจะไม่ถูกทริกเกอร์ มีข้อเสนอแนะเกี่ยวกับสิ่งที่ฉันอาจทำผิดหรือเปล่า? ฉันใช้ MacVim

2
แบ่งปันความสำเร็จระหว่างการเรียกใช้อินสแตนซ์กลุ่ม
ฉันใช้tmuxส่วนใหญ่แทนการใช้vimแท็บและการแยก เสียงเรียกเข้ามีความสามารถในการแบ่งปันความสำเร็จ (ผ่านCtrlnและCtrlp) ระหว่างการใช้งานอินสแตนซ์หรือไม่? มีวิธีการตั้งค่าที่แต่ละการvimsสื่อสารกับเซิร์ฟเวอร์vimหรือไม่

3
ฉันจะจัดการและจดจำตัวย่อจำนวนมากใน vimrc ของฉันได้อย่างไร
ฉันมีตัวย่อมากกว่า 500 ตัว ( iabbr, abbr) และการแมปบางอย่างในไฟล์ vimrc ของฉันจาก Java, PHP, C / C ++ และ Latex มันไม่ง่ายเลยที่จะจดจำได้ทันทีเมื่อฉันไม่ได้ใช้ภาษาในบางครั้ง ฉันสงสัยว่าฉันสามารถทำชื่อตัวย่อให้สำเร็จได้หรือไม่ มีวิธีใดที่ดีกว่าในการเข้าถึง / จัดการตัวย่อทั้งหมดเหล่านี้?

2
Gundo plugin ต้องการ python 2.4 เมื่อติดตั้งเวอร์ชั่น 2.7
ฉันติดตั้ง Python 2.7.9 แล้ว และตอนนี้ฉันได้รับข้อความว่าปลั๊กอิน Gundo ต้องการ 2.4 มีวิธีแก้ปัญหาหรือไม่? นี่คือไฟล์ vimrc ของฉัน: set nocompatible " be iMproved, required filetype off " required " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " alternatively, pass a path where Vundle should install plugins "call vundle#begin('~/some/path/here') " let …

4
สลับค่า“ จริง” และ“ เท็จ” ผ่าน ctrl + a, ctrl + x
ฉันคิดว่ามันจะเป็นประโยชน์ที่จะมีความเป็นไปได้ที่จะแลกเปลี่ยนtrueและfalseค่าในรหัสอย่างรวดเร็วด้วยการรวมกันctrl+ aหรือ+ctrl xมีปลั๊กอินสำหรับสิ่งนั้นหรืออย่างอื่น?

1
ตัวเลือก 'switchbuf' ควรทำงานอย่างไร
ฉันเพิ่งค้นพบตัวเลือกswitchbufและพยายามที่จะใช้ แต่ฉันไม่สามารถพูดได้ว่าฉันไม่เข้าใจว่ามันจะทำงานอย่างไรหรือถ้ามันใช้ไม่ได้จริง ๆ บน Vim ของฉัน เกี่ยวกับค่าที่เป็นไปได้ที่แตกต่างกัน doc พูดว่า: useopenถ้ามีให้ข้ามไปที่หน้าต่างแรกที่เปิดซึ่ง มีบัฟเฟอร์ที่ระบุ (ถ้ามี) usetab เช่นเดียวกับ "useopen" แต่ให้พิจารณาหน้าต่างในหน้าแท็บอื่นด้วย ฉันได้ใช้ไปแล้วset switchbuf=useopen,usetabและคำสั่งต่อไปนี้ในอินสแตนซ์กลุ่มใหม่: เปิดบัฟเฟอร์แรก :e file1 แยกหน้าจอ :split เปิดบัฟเฟอร์ที่สอง :e file2 กลับไปที่บัฟเฟอร์แรก:e file1(ฉันเคยใช้ด้วย:bN) คำสั่งสุดท้ายเพื่อไปที่บัฟเฟอร์แรกเปิดในการแยกที่สอง useopenจากสิ่งที่ฉันเข้าใจจากเอกสารคำสั่งที่ควรวางเคอร์เซอร์ไปที่แยกแรกที่บัฟเฟอร์ที่มีอยู่แล้วขอบคุณที่เปิดให้ พฤติกรรมก็เหมือนกันเมื่อฉันลองใช้คำสั่งเดียวกันกับแท็บแทนที่จะแยก พฤติกรรมนี้เป็นสิ่งที่คาดหวังหรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถอธิบายว่าตัวเลือกนี้ควรทำอย่างไร? หากไม่ใช่ฉันรู้ว่าฉันจะต้องแก้ไขข้อบกพร่องของฉัน.vimrcแต่อาจมีการตั้งค่าทั่วไปที่รบกวนการทำงานswitchbufหรือไม่
10 vimrc  buffers  split 

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