Vi & Vim

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

1
เหตุใดเคอร์เซอร์จึงเลื่อนไปที่จุดเริ่มต้นของบรรทัดหลัง <Esc>
ฉันสังเกตว่าขณะแก้ไขตามบรรทัดในไฟล์. txt ในโหมดแทรกเคอร์เซอร์จะเลื่อนไปที่จุดเริ่มต้นของบรรทัดหลังจากเขียนโดยใช้ลำดับคีย์: &lt;esc&gt;:w ฉันต้องการเปลี่ยนพฤติกรรมนี้เพื่อให้เคอร์เซอร์อยู่ในตำแหน่งต่อไปนี้: เขียน เป็นไปได้ไหม ฉันไม่ต้องการให้เคอร์เซอร์อยู่ในโหมดแทรกฉันแค่อยากให้มันรักษาตำแหน่งสุดท้ายหลังจากเขียน ฉันใช้ gVim 7.4 บน windows . vimrc ของฉันเป็นแบบพื้นฐานมากฉันไม่เชื่อว่าการตั้งค่าใด ๆ ของฉันจะรบกวนการทำงานนี้ ฉันได้ลบการจัดหา mswin.vim และ example.vim ออกจาก. vimrc ของฉันด้วย (ซึ่งมาพร้อมกับโปรแกรมติดตั้ง windows vim.org อย่างเป็นทางการ) หลังจากอ่านความคิดเห็นด้านล่างฉันดูที่ปัญหาอีกครั้งและตระหนักว่าเคอร์เซอร์เพียงเลื่อนไปทางซ้ายสุดหลังจากเขียนบนบรรทัดซึ่งทั้งหมดประกอบด้วยพื้นที่สีขาวต่อท้าย ในคำอื่น ๆ เคอร์เซอร์เพียงสไลด์ไปทางซ้ายไกลเมื่อ ESC-: W เมื่อสายเป็นเยื้องแขวนที่ไม่มีอักขระอื่น ๆ นอกเหนือจากช่องว่าง . vimrc กำลังจัดการพฤติกรรมเยื้องกับการตั้งค่าเหล่านี้: set tabstop=4 set softtabstop=4 set shiftwidth=4 set expandtab set …

2
แทรกแท็บในโหมด INSERT เมื่อตั้งค่า expandtab
ฉันได้ตั้งค่าexpandtabใน.vimrcไฟล์ของฉันให้แปลงtabเป็นหลายspaceอักขระ อย่างไรก็ตามบางไฟล์ (เช่น Makefile) จำเป็นต้องมีtabอักขระจริง มีวิธีง่าย ๆ ในการบังคับให้แทรกเมื่อtabฉันพิมพ์หรือไม่?

2
คุณพับฟังก์ชั่นอัตโนมัติได้อย่างไร?
มีวิธีการทำฟังก์ชั่น Vim fold บนพื้นฐานของไวยากรณ์ของการประกาศฟังก์ชั่นหรือไม่? เช่นมี vim เปิดฟังก์ชั่นเช่นนี้ def foobar(foo,bar): if foo &gt; bar: print "foo" elif foo &lt; bar: print "bar" elif foo == bar: print "foobar" เป็นนี้ +----- 7 lines: def foobar(foo,bar): ------------------------------------------------------------- มีชุดคำสั่งหรือฟังก์ชันที่ฉันสามารถใส่ลงในไฟล์. vimrc ของฉันเพื่อใช้ในการทำสิ่งนี้หรือไม่?
12 folding 

2
ฉันจะเรียกใช้ฟังก์ชั่นหรือมาโครข้ามโฟลเดอร์ของไฟล์ได้อย่างไร?
StripWhitespaceสมมติว่าผมมีฟังก์ชั่นการตั้งชื่อ :StripWhitespaceฉันสามารถทำงานบนไฟล์เดียวโดยการเปิดไฟล์และทำงาน ฉันจะเรียกใช้ฟังก์ชั่นนั้นกับโฟลเดอร์ของไฟล์โดยอัตโนมัติและบันทึกผลลัพธ์เมื่อฉันไปได้อย่างไร

2
คุณจะรู้ได้อย่างไรว่าตัวแปรใดที่ได้รับการกำหนดครั้งล่าสุด
ฉันกำลังพยายามตั้งค่าg:netrw_list_hideและดูเหมือนจะไม่ทำงาน ไม่ว่าสิ่งที่ผมตั้งในของฉันมันก็มีค่า.vimrc ,^\.\.\=/\=$เฉพาะในกรณีที่ฉันจัดหาvimrcไฟล์ของฉันอีกครั้งมันจะเก็บค่าที่ถูกต้อง ฉันจะแก้ไขข้อบกพร่องนี้ได้อย่างไร ฉันเดาว่ามีปลั๊กอินบางอย่างที่ตั้งค่าตัวแปรนั้นหรือไม่? อาจเป็นไปได้หลังจากที่ฉันvimrcถูกโหลดดังนั้นฉันต้องการดูว่ามันถูกตั้งไว้ที่ไหน

1
ทำให้ cnext และ cprevious loop กลับไปที่จุดเริ่มต้น
ถ้าฉันทำงาน:cnextเมื่อฉันอยู่ท้ายรายการด่วนฉันได้รับข้อความแสดงข้อผิดพลาด E553: No more items และไม่มีอะไรเกิดขึ้น แทนที่จะเป็นเช่นนี้เมื่อฉันเข้าไป:cnextที่ส่วนท้ายของรายการฉันต้องการให้กลุ่มกลับไปรอบ ๆ ไปยังรายการ quickfix แรก เป็นไปได้ที่จะกำหนดค่ากลุ่มสำหรับพฤติกรรมนี้หรือไม่?
12 quickfix 

1
รับหน้าต่าง / บัฟเฟอร์ / แท็บปัจจุบันใน Vimscript
ในไพ ธ อนเมื่อใช้โมดูล vim มันง่ายอย่างไม่น่าเชื่อที่จะได้หน้าต่าง / บัฟเฟอร์ / แท็บปัจจุบัน: current_win = vim.current.window current_buff = vim.current.buffer current_tabpage = vim.current.tabpage คำถามของฉันคือคุณจะทำสิ่งนี้ใน VimL / Vimscript บริสุทธิ์และวัตถุชนิดใดที่ถูกส่งคืน? ฉันไม่สามารถพบสิ่งนี้ได้ทุกที่ในwindows.txt( :h windows)

3
ฉันจะระบุแหล่งที่มาของการเลือก vimscript ได้อย่างไร?
หากฉันมี vimscript สองบรรทัดที่ฉันต้องการทดสอบก่อนที่จะใส่ vimrc ของฉันมันเป็นไปได้หรือไม่ที่จะสามารถเลือกภาพได้ ฉันเหนื่อย ทำการเลือกด้วยสายตาvจากนั้นจึงทำการเลือก ฯลฯ :'&lt;,'&gt;so แต่เป็นกลุ่มให้ข้อผิดพลาด ไม่อนุญาตให้ใช้ช่วง ด้วย :'&lt;,'&gt;w | so จะช่วยให้ ใช้! เพื่อเขียนบัฟเฟอร์บางส่วน ฉันจะแหล่ง vimscript ที่เลือกด้วยสายตาได้อย่างไร

1
ฉันจะเพิ่มกฎการเน้นไวยากรณ์เพิ่มเติมใน vimrc ในพื้นที่ได้อย่างไร
ฉันติดตั้ง gvim บนทั้ง Fedora และ Win7 ฉันพบว่าทั้ง vim และ gvim บน Fedora ไม่ได้เน้นชื่อฟังก์ชั่นในรหัส c ในขณะที่ gvim บน win7 ได้เน้นไว้ ฉันพบว่าใน win7 vim73/syntax/c.vimมีสายเพิ่มเติมในตอนท้าย: syn match cFunction "\&lt;[a-zA-Z_][a-zA-Z_0-9]*\&gt;[^()]*)("me=e-2 syn match cFunction "\&lt;[a-zA-Z_][a-zA-Z_0-9]*\&gt;\s*("me=e-1 hi cFunction gui=NONE guifg=#B5A1FF ถ้าฉันเพิ่มบรรทัดเหล่านี้c.vimใน Fedora, gvim สามารถเน้นชื่อฟังก์ชั่นได้เช่นกัน เพื่อรักษาความสะดวกในการพกพาฉันต้องการเพียงปรับเปลี่ยน.vimrcเพื่อเน้นชื่อฟังก์ชั่น อย่างไรก็ตามหลังจากเพิ่มบรรทัดเหล่านี้ลงใน.vimrcมันไม่ทำงาน ดังนั้นใครสามารถช่วยฉันได้ ฉันค้นหาและมีวิธีแก้ไขมากมายเพื่อเน้นชื่อฟังก์ชั่นเป็นกลุ่ม .vimrcแต่ผมแค่อยากรู้เกี่ยวกับวิธีที่จะทำให้เส้นเหล่านี้ทำงานใน ขอบคุณมาก ๆ!

1
ฉันจะบันทึกการป้อนข้อมูลด้วยแป้นพิมพ์เพื่อทำสถิติได้อย่างไร
ฉันต้องการค้นหารูปแบบที่พบบ่อยที่สุดที่ฉันใช้ระหว่างการเข้ารหัส ดังนั้นฉันกำลังมองหาวิธีการบันทึกแป้นพิมพ์ทั้งหมดของฉันในขณะที่ฉันเป็นกลุ่มโดยเฉพาะอย่างยิ่งกับการประทับเวลา จากนั้นฉันสามารถทำการวิเคราะห์เกี่ยวกับรูปแบบ / การเคลื่อนไหวล่าสุดที่ใช้ในการดำเนินการเวลาและค้นหาสิ่งต่าง ๆ เพื่อปรับให้เหมาะสม มีวิธีการทำสิ่งนี้ใน Vim หรือไม่? ฉันจะลองและเขียนปลั๊กอินสำหรับสิ่งนี้หรือไม่? อะไรคือความหมายของประสิทธิภาพในการทำอะไรแบบนี้ ขอบคุณ
12 vimrc 

2
ละเว้น URL และที่อยู่อีเมลในไฟล์สะกด
มีวิธีที่จะเป็นกลุ่มไม่ได้ตั้งค่าสถานะ URL HTTP และที่อยู่อีเมลเป็นข้อผิดพลาดการสะกด? หรือโดยทั่วไปแล้ววิธีในการแสดงรายการ regexes ของการสะกดที่ถูกต้อง?

1
ใช้เสียงเรียกเข้าและคาเฟอีนในเครื่องเดียวกัน
พื้นหลัง ฉันทำงานที่ห้องปฏิบัติการวิจัยและใช้สามระบบปฏิบัติการที่แตกต่างกันทุกวัน บนเครื่อง Windows และ Mac ฉันใช้Caffeineเพื่อป้องกันไม่ให้เครื่องเหล่านั้นเปิดใช้งานสกรีนเซฟเวอร์ในขณะที่ฉันทำงานกับเครื่องอื่น (Linux ไม่มีปัญหานี้) มันน่ารำคาญมากที่ต้องเข้าสู่ระบบอีกครั้งเมื่อฉันสลับกลับ ปัญหา เมื่อ vim หรือ gvim อยู่ในโหมดแทรกอักขระ&lt;F15&gt;จะปรากฏเป็นระยะ ๆ ในเอกสาร ฉันติดตามมันกลับไปที่คาเฟอีนหลังจากทำการวิจัยเล็กน้อย เว็บไซต์สำหรับคาเฟอีนระบุว่าซอฟต์แวร์ทำงานโดยการจำลอง&lt;F15&gt;เหตุการณ์กดปุ่มเป็นครั้งคราว: จากการกดปุ่มทั้งหมดที่มีอยู่ F15 น่าจะเป็นสิ่งที่รบกวนน้อยที่สุด (ฉันไม่เคยเห็นแป้นคีย์บอร์ด PC มาพร้อมกับปุ่มนั้น!) และมีโอกาสน้อยที่สุดที่จะรบกวนการทำงานของคุณ คาเฟอีนเป็นตัวการที่ชัดเจน อย่างไรก็ตามฉันยังคงต้องการใช้โปรแกรมแก้ไขข้อความที่ชื่นชอบในทั้งสามเครื่องและไม่ต้องการเปลี่ยนเพียงเพื่อรองรับการใช้คาเฟอีน คำถาม มีบางอย่างที่ฉันสามารถใส่vimrcเพื่อทำให้เป็นกลุ่มที่ไม่สนใจ&lt;F15&gt;เหตุการณ์กดปุ่มได้หรือไม่? แก้ไขเพื่อความชัดเจน ฉันไม่สามารถปิดการใช้งานสกรีนเซฟเวอร์ไทม์เอาต์; มันถูกกำหนดโดยแผนกไอทีเพื่อความปลอดภัย ดังนั้นด้วยการทำงานของคาเฟอีนเพื่อให้เป็นไปตามข้อกำหนดฉันต้องล็อคเครื่องด้วยตนเองเมื่อฉันก้าวออกจากโต๊ะ นั่นไม่เลวเลย แต่ปลดล็อคพวกเขาทุกสองสามนาทีคือ นอกจากนี้ฉันไม่ได้เขียน Caffeine ดังนั้นฉันจึงไม่รู้ว่าทำไมผู้พัฒนาเลือกที่จะคลิก&lt;F15&gt;หนึ่งครั้งต่อนาที ฉันอาจจะทำมันแตกต่างอาจมีการเคลื่อนไหวของเมาส์เล็กน้อยหรือแตะทัชแพดตามที่ @ Random832 แนะนำ

3
วิธีแทนที่อักขระมากกว่าหนึ่งตัวโดยไม่ต้องเข้าสู่โหมดแทรก
ฉันมีไฟล์ที่มีบรรทัดที่มีลักษณะดังนี้: foofoo.xy.barbar ฉันต้องการที่จะเปลี่ยนไปxy ghฉันพยายามทำ2r-&gt; ghแต่เห็นได้ชัดว่าไม่ได้ผลเพราะมันแทนที่xyด้วยggแล้วเลื่อนเคอร์เซอร์ไปทางซ้ายหนึ่งจุด มีวิธีการนี้หรือไม่โดยไม่ต้องเข้าสู่โหมดแทรกหรือไม่ใช้การกดแป้นมากขึ้น (เช่น:s/xy/gh/)?

3
เป็นกลุ่มใน WSL: ซิงโครไนซ์คลิปบอร์ดระบบหรือไม่ (ตั้งค่าคลิปบอร์ด ^ = ไม่มีชื่อ)
ในขณะที่ใช้ WSL / Bash สำหรับ Windows ฉันต้องการที่จะใช้y yy 3yและpวิธีเดียวกับที่พวกเขาทำงานเป็นกลุ่ม แต่การเชื่อมต่อกับคลิปบอร์ดของระบบที่ใช้ร่วมกันโดยแอพทั้งหมดไม่ใช่คลิปบอร์ดภายในของ vim ... ฉันมีความชำนาญในการจัดการคลิปบอร์ด ประวัติศาสตร์ ดูเหมือนว่ากลุ่มมีตัวเลือกในตัวเพื่อซิงโครไนซ์บัฟเฟอร์การคัดลอก / วางกับคลิปบอร์ดของระบบ ... แต่ปัญหาเมื่อเรียกใช้ WSL คือคุณต้องใช้/mnt/c/Windows/System32/clip.exeเพื่อเข้าถึงคลิปบอร์ด ... ดังนั้นแม้ว่าฉันจะต้องการ เพื่อให้สามารถใช้: set clipboard^=unnamed ดูเหมือนว่ายังไม่มีการสนับสนุน WSL ฉันเข้าใจว่า neovim มีตัวเลือกนี้ แต่ฉันไม่ต้องการทดลองใช้ neovim ในตอนนี้ ... สำหรับตอนนี้สิ่งที่ใกล้เคียงที่สุดสำหรับวิธีแก้ไขปัญหาที่ฉันพบคือ: nnoremap &lt;silent&gt; &lt;leader&gt;y :call system('/mnt/c/Windows/System32/clip.exe', @0)&lt;CR&gt; vnoremap &lt;silent&gt; &lt;leader&gt;y :call system('/mnt/c/Windows/System32/clip.exe', @0)&lt;CR&gt; แต่นี่เป็นทางออกที่น่ากลัวจริงๆในความคิดของฉัน ... …

1
การแทนที่โกลบอลกลุ่มนั้นไม่ได้แทนที่ทุกการแข่งขัน
บางครั้งคำบรรยายย่อทั่วโลกของฉันไม่ได้แทนที่การแข่งขันทั้งหมดในบรรทัด มันได้รับการยืนยันจากความจริงที่ว่าฉันสามารถเห็นได้เมื่อฉันทำการทดแทนด้วยการยืนยันการแข่งขันจะพบในแถวที่มีการแข่งขันที่เป็นไปได้หลายรายการ แต่จากนั้นจะไปที่อีกสายหนึ่ง ผมใช้gหรือพารามิเตอร์การดำเนินงานในไฟล์ทั้งหมดที่มีgc% ในไฟล์นี้: hello hello hello hello hello hello hello ถ้าฉันจะ%s/hello/goodbye/gได้รับ goodbye hello goodbye goodbye hello hello goodbye สิ่งที่ฉันมีในการ.vimrcค้นหา / แทนที่คือ set hlsearch set ignorecase set incsearch
12 substitute 

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