Vi & Vim

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

4
ใช้ case สำหรับ neovim terminal emulator หรือไม่
ความแตกต่างที่สำคัญอย่างหนึ่งของ neovim และ Vim ก็คือ neovim นั้นมีเทอร์มินัลอีมูเลเตอร์ที่ทำงานแบบอะซิงโครนัส อย่างไรก็ตามฉันไม่เห็นว่าฉันจะได้ประโยชน์จากคุณลักษณะนี้อย่างไร ฉันจะใช้อะไรได้บ้าง คุณสามารถใช้เคสสำหรับคุณสมบัติเทอร์มินัลของ neovim เพื่อให้ฉันเข้าใจได้อย่างไรว่าฉันจะใช้มันให้ดีที่สุดได้อย่างไร? ในกลุ่มปกติผมปกติใช้:read !{command}, :write !{command}, Ctrl+Zและfgเช่นเดียวกับ tmux หน้าต่างแยก
10 terminal  neovim 

2
ปัญหาการเลื่อนเมื่อตั้งค่าตัวเลือก "ตัด"
ฉันพบว่าตัวเองกำลังจัดการกับปัญหานี้ทุกครั้งที่wrapมีการใช้งานตัวเลือก (ในกรณีของฉันโดยเฉพาะเมื่อใดก็ตามที่ฉันทำงานกับไฟล์ markdown) สิ่งที่เกิดขึ้นคือในขณะที่เลื่อนขึ้นและลงของบัฟเฟอร์ด้วยjและkบรรทัดข้อความที่พันไว้ (การสร้างย่อหน้าด้วยสายตา) ที่ด้านบนสุดและล่างสุดไม่เลื่อนอย่างราบรื่น (เช่นทีละหน้า) แต่ย่อหน้าทั้งหมดจะหายไปและปรากฏขึ้นอีกครั้งอย่างทันทีทันใดจากมุมมองและทำให้เกิดผลที่น่ารำคาญและน่ารำคาญ ฉันคิดว่า GIF จะอธิบายได้ดีขึ้นว่าเกิดอะไรขึ้น ที่นี่ฉันแค่กดkซ้ำ ๆ เพื่อเลื่อนขึ้น จับตาดูย่อหน้าใกล้ด้านล่าง! ฉันเคยชินกับพฤติกรรมนี้เพราะฉันไม่คิดว่ามันจะแก้ไขได้ แต่จากนั้นฉันก็ตระหนักว่ามันไม่ได้เกิดขึ้นกับสายกายภาพและwrapไม่มีการตั้งค่า มีวิธีที่จะบอกให้ Vim เลื่อนหน้าจอเป็นเส้นภาพแทนที่จะเป็นภาพจริงหรือไม่? PS: ใช่ฉันได้แมปของฉันjและkไปและgjgk

1
หากต้องการพิมพ์โดยเน้นผลลัพธ์การค้นหา
เมื่อเราค้นหารูปแบบเป็นกลุ่มการจับคู่มักจะเน้น อย่างไรก็ตามเมื่อเราพิมพ์ออกมาไฮไลท์จะหายไป ฉันพยายามทั้งสองและ:hardcopy > my_file.pdf :TOhtmlไม่คงไว้ซึ่งไฮไลต์ มีวิธีใดบ้างที่ฉันสามารถส่งออกเอกสารด้วยรูปแบบการจับคู่ที่เน้นสีไปยังไฟล์ pdf ฉันใช้ GVim 7.4 บนเครื่อง Win 7

6
วิธีต่อท้ายบรรทัดท้ายไฟล์ถ้ายังไม่มีเท่านั้น?
ฉันต้องการแก้ไขไฟล์ในสถานที่โดยต่อท้ายบรรทัดเฉพาะในกรณีที่ยังไม่มีหลักฐานของสคริปต์ของฉัน ปกติฉันจะทำสิ่งที่ชอบ: cat >> ~/.bashrc <<EOF export PATH=~/.composer/vendor/bin:\$PATH EOF นอกจากนี้ยังเป็นไปได้ที่จะทำผ่าน ansible ( line+ insertafter=EOF+ regexp) แต่เป็นอีกเรื่องหนึ่ง ใน vi / ex ฉันสามารถทำสิ่งที่ชอบ: ex +'$s@$@\rexport PATH=\~/.composer/vendor/bin:$PATH@' -cwq ~/.bashrc แต่แล้วฉันจะตรวจสอบได้อย่างไรว่ามีบรรทัดนั้นอยู่แล้ว (และไม่ทำอะไรเลย) โดยสมบูรณ์โดยไม่ต้องทำซ้ำบรรทัดเดิม? หรืออาจจะมีวิธีที่ง่ายกว่าในการแก้ไขใน Ex?

1
แป้นตัวเลขไม่ทำงานกับ vi และ Putty?
เมื่อฉันแก้ไขไฟล์vimด้วย SSH ฉันจะพยายามใช้แป้นตัวเลขบนแป้นพิมพ์เพื่อป้อนหมายเลขยาว (เช่นที่อยู่ IP) Vimดูเหมือนจะไม่ชอบมาก ฉันใช้ PuTTY สำหรับ Windows เป็น SSH ลงในคอมพิวเตอร์ที่ใช้ Debian การกด123เข้าสู่ฉันนี้โดยไม่คำนึงว่าฉันอยู่ในโหมดแทรกหรือไม่: s r q เมื่อฉันใช้ปุ่มตัวเลข "ปกติ" (ไม่ใช่แป้นตัวเลข) ทุกอย่างใช้งานได้ดี เกิดขึ้นที่นี่คืออะไร?
10 terminal  putty 

1
ป้องกันการรีเฟรชหน้าจอจนกว่าฟังก์ชั่นจะเสร็จสมบูรณ์
ฉันมีฟังก์ชั่นที่เคลื่อนไหวและส่งออกข้อความจำนวนมากไปยังบัฟเฟอร์ vim ปัจจุบันและเมื่อฉันเรียกใช้การเห็นสิ่งที่เกิดขึ้นด้วยความเร็วที่ทำให้ไม่เห็นนั้นเป็นสิ่งที่ทำให้สับสน ฉันจะตรึงหน้าจอจนกว่าฟังก์ชันจะเสร็จสิ้นได้อย่างไร นี่คือฟังก์ชันที่เป็นปัญหา: function! MakeChoices() :let save_view = winsaveview() let start = line('.') "Locate previous *choice. (b=backwards, W=nowrap, n=doNot move cursor) let choiceStartLine = search('^*choice', 'bW') if !choiceStartLine echo "No *choice found. (*choice must not be indented. This is to avoid finding *choice blocks nested in another *choice …
10 vimscript 

3
มีการเคลื่อนไหวคล้ายกับ "ที่ไม่รวมช่องว่างนำ?
ฉันใช้การa"เคลื่อนไหวค่อนข้างบ่อยเป็นกลุ่ม เช่นใช้ca"ในขณะที่ refactoring ชิ้นส่วนของรหัสเพื่อแทนที่อาร์กิวเมนต์ hardcoded ด้วยชื่อตัวแปร ปัญหาของวิธีนี้คือa" มีช่องว่างนำหน้าหากไม่มีช่องว่างต่อท้าย : พื้นที่สีขาวต่อท้ายจะรวมอยู่ด้วยเว้นแต่จะไม่มีไม่มีดังนั้นจึงมีพื้นที่สีขาวนำหน้า ดังนั้นเมื่อฉันแก้ไขการเรียกใช้ฟังก์ชันดังนี้: aFunction(arg1, "toBeReplaced", arg3) #original aFunction(arg1, replacedArg, arg3) #refactored ฉันได้ด้วยตนเองอีกครั้งแทรกพื้นที่ก่อนที่จะreplacedArgเป็นca"ลบมัน มีการเคลื่อนไหวใด ๆ ที่คล้ายกันซึ่งไม่รวมพื้นที่สีขาวนี้หรือมีอะไรอีกบ้างที่ฉันสามารถใช้แทนca"สิ่งนั้นได้ซึ่งช่วยให้ฉันไม่ต้องพิมพ์พื้นที่เพิ่มเติมหรือไม่ หมายเหตุ: cf"ทำสิ่งที่ฉันต้องการตราบเท่าที่สตริงไม่มีเครื่องหมายคำพูดใด ๆ ที่หลบหนี แต่ต้องการให้ฉันมีเคอร์เซอร์ที่จุดเริ่มต้นของสตริง ฉันต้องการบางสิ่งบางอย่างที่ฉันสามารถใช้จากที่ใดก็ได้ภายในสตริงและ?"<Enter>cf"ค่อนข้างอึดอัดที่จะพิมพ์ มันเกี่ยวกับการ<Space>กดแป้นเดียวน้อยกว่าและเกี่ยวกับความจริงที่ว่าบ่อยครั้งที่ฉันมักลืมที่จะรวมพื้นที่ทำให้ฉันต้องกดแป้นพิเศษเพิ่มเติมอย่างน้อยสี่ครั้ง ( bi<Space><Esc>) และหยุดโฟกัสของฉัน ดังนั้นความยาวของคำสั่งการเปลี่ยนจึงไม่สำคัญตราบใดที่มันจะลบเฉพาะข้อความระหว่างตัวอักษรที่กำหนดและจากนั้นเข้าสู่โหมดแทรก

3
ฉันจะนับคำในส่วนของไฟล์ได้อย่างไรโดยไม่ต้องปล่อย vim?
ฉันมีไฟล์ที่เต็มไปด้วยข้อความ (พูดว่า Markdown หรือ LaTeX) ฉันต้องการนับจำนวนคำในไฟล์นี้ ฉันรู้ว่าฉันสามารถทำได้:! wc -w %เพื่อรัน wc -w บนบัฟเฟอร์ปัจจุบัน และฉันรู้ว่าฉันสามารถดึงส่วนที่น่าสนใจไปลงทะเบียนชื่อ ฉันเดาว่าจะมีวิธีการส่งการลงทะเบียนที่มีชื่อไปยังระบบปฏิบัติการเพื่อใช้ในคำสั่งหรือไพพ์ แต่ฉันไม่สามารถหาได้ หรือมีวิธีที่ดีกว่าในการนับคำในการลงทะเบียน? กรณีการใช้งานของฉันคือฉันเขียนการเขียนโปรแกรมที่ไม่ใช่จำนวนมาก (บันทึกย่อ, วิทยานิพนธ์, ฯลฯ ) เป็นกลุ่มและฉันต้องการที่จะนับจำนวนคำที่ฉันได้เพิ่มลงในส่วนที่กำหนดของไฟล์ในระหว่างการแก้ไข เซสชั่น

4
เรียกใช้ชื่อไฟล์ปัจจุบันสำหรับรุ่นในบรรทัดคำสั่ง
ฉันจะนำพา ธ ไปยังไฟล์ปัจจุบันในบรรทัดคำสั่งเพื่อพิมพ์ชื่อไฟล์ที่คล้ายกันได้อย่างไร ฉันไม่ต้องการตัวย่อที่จะถูกแทนที่ด้วยชื่อไฟล์ปัจจุบันฉันต้องการแก้ไขชื่อไฟล์พร้อมเส้นทางไดเรกทอรี ตัวอย่างเช่นฉันต้องการ:editไฟล์ที่มีชื่อคล้ายกันหรือในไดเรกทอรีที่คล้ายกันเช่น vim src/submodule/frontend/frobnicate2.c และตอนนี้ฉันต้องการแก้ไข../trunk/src/submodule/frontend/frobnicate.cและฉันต้องการแทรก../trunkและลบ2เท่านั้นไม่ใช่พิมพ์เส้นทางแบบเต็ม แน่นอนว่าฉันสามารถเลื่อนกลับไปที่เชลล์และใช้ประวัติคำสั่งของมันหรือฉันสามารถคัดลอก - วางเส้นทางผ่าน GUI แต่ฉันกำลังมองหาวิธีที่มีประสิทธิภาพมากขึ้นโดยไม่ต้องออกไปเป็นกลุ่ม

1
NERDTree วิธีเปิดไฟล์และปิดบัฟเฟอร์ explorer โดยอัตโนมัติ
เมื่อใช้ปลั๊กอิน NERDTreeพฤติกรรมเริ่มต้นคือการเปิดไฟล์ใหม่และทำให้บัฟเฟอร์ NERDTree เปิดอยู่ สิ่งที่ฉันต้องการจะทำคือการรักษาพฤติกรรมเริ่มต้นนี้ แต่ยังเอาชนะเมื่อฉันต้องการดังนั้นบัฟเฟอร์ NERDTree จะถูกปิดหลังจากที่ฉันเปิดไฟล์ ฉันรู้ว่าฉันสามารถใช้let NERDTreeQuitOnOpen=1เพื่อปิดบัฟเฟอร์ NERDTree โดยอัตโนมัติเมื่อฉันเปิดไฟล์ใหม่ แต่ตัวเลือกนี้จะแทนที่พฤติกรรมเริ่มต้นโดยสิ้นเชิง (ซึ่งไม่ใช่สิ่งที่ฉันต้องการ) เป็นการดีที่ฉันต้องการทราบว่ามีคุณลักษณะในตัวใน NERDTree ที่จะทำสิ่งที่ฉันต้องการ (ฉันค้นหามาแล้วแต่ไม่พบอะไรแบบนั้นดังนั้นฉันคิดว่ามันไม่มีอยู่จริง) และถ้านั่นไม่อยู่ฉันมีสองความคิด: คนแรกคือการสร้างฟังก์ชั่นซึ่งจะกำหนดNERDTreeQuitOnOpenที่จะ1เปิดไฟล์นั้นตั้งค่าอีกครั้งเพื่อNERDTreeQuitOnOpen0 สิ่งที่สองคือการสร้างการแมปต่อไปนี้: map d<CR> <CR> :NERDTree <CR> :bd<CR>ซึ่งเปิดไฟล์ (ก่อน<CR>), กลับไปที่ NERDTree buffer ( :NERDTree <CR>) และปิด buffer นี้ ( :bd <CR>) ฉันควรปรับปรุงเพื่อให้การแมปมีอยู่ในบัฟเฟอร์ NERDTree เท่านั้น แต่ฉันรู้สึกว่านั่นเป็นวิธีแก้ปัญหาที่น่าเกลียดและฉันสามารถปรับปรุงได้ ความคิดใดจะดีที่สุดและทำไม หรือมีตัวเลือกที่ดียิ่งขึ้น?

2
การแมปโหมดแทรกความไวตามบริบทหรือตัวย่อ
ฉันวางแผนที่จะใช้การแมปอรรถประโยชน์สำหรับปลั๊กอิน LaTeXของฉันเพื่อทำให้การพิมพ์ทางคณิตศาสตร์ง่ายขึ้น ตัวอย่างเช่นฉันต้องการสร้างตัวย่อที่คล้ายกับ `a : \alpha `b : \beta -> : \to => : \Rightarrow และคล้ายกัน ฉันต้องการ (บางส่วน) การแมปเท่านั้นที่จะสามารถใช้งานได้ในสภาพแวดล้อมทางคณิตศาสตร์ไม่ใช่ด้านนอก ฉันรู้ว่าฉันสามารถรับรู้สภาพแวดล้อมทางคณิตศาสตร์ผ่านกลุ่มไวยากรณ์คือและtexMathZoneE texMathZoneXอย่างไรก็ตามฉันไม่ทราบวิธีใช้สิ่งนี้เพื่อทำการแมปตามบริบทหรือตัวย่อ

1
ดำเนินการเนื้อหาบัฟเฟอร์เป็น vimscript
ฉันมีnofileบัฟเฟอร์ที่มี vimscript และฉันต้องการดำเนินการ อย่างไรก็ตาม:so % จะไม่ทำงานเนื่องจากต้องใช้ไฟล์ที่บันทึกไม่ใช่บัฟเฟอร์ มีคำสั่ง vim ให้ทำตามค่าเริ่มต้นหรือไม่? หากไม่สามารถสร้างฟังก์ชั่นที่ทำสิ่งเดียวกันได้หรือไม่?

2
ไปที่อักขระที่ไม่ใช่ช่องว่างสุดท้ายของบรรทัดก่อนหน้า / ถัดไปหรือไม่
ฉันชอบปุ่ม-และ<C-M>โหมดปกติสำหรับไปที่อักขระที่ไม่ใช่ช่องว่างตัวแรกของบรรทัดก่อนหน้า / ถัดไป มีคีย์ที่สอดคล้องกันสำหรับการไปยังอักขระที่ไม่ใช่ช่องว่างสุดท้ายบนบรรทัดก่อนหน้า / ถัดไปหรือไม่

4
วิธีการเลือกข้อความที่มีความยาวแตกต่างกันในแต่ละบรรทัด
สมมติว่าฉันมีข้อความต่อไปนี้: aaa-dd-e: "aaa", bb-x: "bb", c-9: "c" ฉันต้องการที่จะทำการเลือกเช่นด้านล่าง: aaa-dd-e:"aaa", bb-x:"bb", c-9:"c" ฉันพยายามใช้ cv เพื่อสร้างบล็อกแบบเห็นภาพ แต่หลังจากฉันสร้างส่วนที่เลือกในคอลัมน์แรกและฉันกด "f:" (ฉันหมายถึงการขยายส่วนที่เลือกไปยังเครื่องหมายโคลอนในทุกบรรทัดด้านบน) สิ่งที่ฉันได้คือ: aaa-dd-e: "aaa",: bb-x"bb", c-9:"c" ส่วนที่เลือกจะหยุดที่เครื่องหมายโคลอนแรกและสร้างสี่เหลี่ยมผืนผ้า

1
เป็นไปได้หรือไม่ที่จะสร้างคำสั่ง "set" ที่กำหนดเองในไฟล์ rc ของฉันและเรียกพวกมันจาก modeline?
ฉันเพิ่งถามคำถามที่ฉันได้เรียนรู้ว่ามันเป็นไปไม่ได้ที่จะผ่านอะไรยกเว้นพารามิเตอร์ไป:setในแบบจำลองเป็นกลุ่ม ฉันเข้าใจถึงความกังวลด้านความปลอดภัย แต่ฉันสงสัยว่าจะไม่มีวิธีแก้ไขปัญหานี้อีกหรือไม่ คำถามล่าสุดเกี่ยวกับ SOเกี่ยวกับการตั้งกระบวนการขนาดใหญ่ของพารามิเตอร์เพื่อให้สอดคล้องกับมาตรฐานการเข้ารหัสมีฉันคิดมันจะเป็นไปได้ที่จะกำหนดเป็น "กลุ่ม" ของสิ่งที่อยู่ในแฟ้ม rc ของฉันที่สามารถเปิดหรือปิดจาก modeline หรือไม่ ยกตัวอย่างโค้ดหลอก แต่มีวิธีสร้างฟังก์ชั่นที่ถูกทริกเกอร์จากพารามิเตอร์ที่ตั้งไว้หรือไม่? set_function! codestyle() if &1 == 'psr-2' set ts=4 set sw=4 endfi if &1 == 'drupal7' set ts=2 set sw=2 iab D8 Drupal 8 endif endset_function สิ่งนี้สามารถถูกทริกเกอร์โดย modeline เช่น # vim: codestyle=psr-2 นี่อาจเป็นวิธีที่คล้ายกับการจับคู่ประเภทไฟล์ แต่อนุญาตการแทนที่ด้วยตนเอง นอกจากนี้ยังจะตั้งค่าสภาพแวดล้อมในรูปแบบที่กำหนดไว้ล่วงหน้าอื่น ๆ หลีกเลี่ยงปัญหาด้านความปลอดภัยของการมีไฟล์ที่เรียกใช้คำสั่งโดยพลการอื่น ๆ …

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