Vi & Vim

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

3
ฉันจะทำให้ 'n' ก้าวไปข้างหน้าได้อย่างไรแม้ว่าฉันจะเริ่มค้นหาด้วย '?' หรือ '#'?
กลุ่มมี (อย่างน้อย) ชุดคำสั่งสองชุดที่ค้นหาในทิศทางตรงกันข้าม การพิมพ์/จากนั้นรูปแบบจะค้นหาไปข้างหน้าผ่านเอกสารเพื่อหารูปแบบ พิมพ์?แล้วรูปแบบจะค้นหาย้อนหลัง มีความสัมพันธ์เดียวกันระหว่างคำสั่ง*และ# สิ่งที่ฉันไม่ชอบคือคำสั่งเหล่านี้ยังกำหนดทิศทางการค้นหาสำหรับnและNคำสั่ง หลังจากใช้ไป/แล้วให้nเดินหน้าเอกสารและNย้อนกลับ หลังจากที่ใช้?, nไปข้างหลังและNไปข้างหน้า (ในคำอื่น ๆnไปในทิศทางเดียวกันเสมอกับการค้นหาเดิมและNไปในทิศทางอื่นเสมอ) ฉันnจะก้าวไปข้างหน้าผ่านเอกสารและNถอยหลังได้อย่างไรโดยไม่คำนึงถึงทิศทางที่ฉันเริ่มค้นหา

1
อะไรคือความแตกต่างระหว่างคำสั่ง map, noremap, abbrev และ noreabbrev?
คำสั่งเหล่านี้เปลี่ยนการกดแป้นหนึ่งชุดไปเป็นชุดอื่น แต่อย่างใด แต่ฉันค่อนข้างคลุมเครือซึ่งคำสั่งหนึ่งเหมาะสมที่สุดสำหรับบางสถานการณ์ นอกจากนี้ยังมี!สายพันธุ์ของพวกเขาเช่นกัน ในขณะนี้การใช้งานของพวกเขานั้นค่อนข้างจับจดดังนั้นฉันจะรู้ได้อย่างไรว่ามีข้อผิดพลาดอะไรบ้าง โดยเฉพาะอย่างยิ่งหมายเหตุเกี่ยวกับรุ่นของโหมดต่าง ๆ อาจมีประโยชน์เนื่องจากฉันได้เรียนรู้จาก Peter Rincker ในความคิดเห็นที่cmapสามารถขยายได้ทุกที่ในบรรทัดและไม่เพียง แต่เมื่อฉันใช้:คำสั่ง ฉันสามารถใช้ความระมัดระวังแบบใดกับข้อผิดพลาดที่อาจเกิดขึ้นได้

2
สลับฟังก์ชันอาร์กิวเมนต์
เมื่อ refactoring code มันจะมีประโยชน์ที่จะสามารถแลกเปลี่ยนอากิวเมนต์ของฟังก์ชันได้ การเปลี่ยนเช่น: func(foo[0], bar(), baz.spam) เข้าไป func(baz.spam, foo[0], bar()) มีวิธีใดบ้างที่จะสลับอาร์กิวเมนต์ไปทางซ้าย / ขวาทำให้วงเล็บของฟังก์ชันและเครื่องหมายจุลภาคอยู่ในตำแหน่งหรือไม่? หมายเหตุสิ่งนี้อาจมีส่วนเกี่ยวข้องได้มากหากคุณต้องการพิจารณาข้อโต้แย้งที่ตัวเองเรียกใช้ฟังก์ชันด้วยข้อโต้แย้งของตัวเองเช่น: func(baz->spam, foo[0], bar(a, b, c))- การสนับสนุนกรณีเหล่านี้น่าจะเกี่ยวข้องกับการแยกวิเคราะห์ที่ครอบคลุมมากขึ้น
19 macro  refactor 

8
วิธีการปิด "hlsearch" โดยอัตโนมัติหลังจากฉันค้นหาเสร็จแล้วจะทำอย่างไร
ฉันชอบการตั้งค่า "hlsearch" แต่หลังจากฉันค้นหาเสร็จฉันก็พบว่ามันน่ารังเกียจ โดยเฉพาะอย่างยิ่งถ้าฉันค้นหาบางอย่างที่มีการแข่งขันมาก ฉันรู้ว่าฉันสามารถปิดสิ่งนี้ด้วย :set nohlsearch แต่มันใช้การกดแป้นทั้ง 16 ครั้งและน่ารำคาญยิ่งกว่านั้นฉันต้องกลับไปค้นหาต่อไปด้วย :set hlsearch มีวิธีที่ฉันสามารถสลับ hlsearch โดยอัตโนมัติเมื่อฉันเริ่มค้นหาและปิดเมื่อฉันค้นหาเสร็จหรือไม่ ตัวอย่างเช่นหากฉันเข้าสู่โหมดแทรกหรือแก้ไขข้อความให้ปิด hlsearch โดยไม่ต้องกดแป้นเพิ่มเติมใด ๆ
19 search  highlight 

1
ทำความเข้าใจกับการผสมผสาน CTRL-U
ในคำตอบนี้ฉันต้องเผชิญกับการCTRL-Uใช้งานในการเรียกใช้ฟังก์ชั่นหลัง:และก่อนชื่อฟังก์ชั่นจริง :nnoremap <buffer> <cr> :<C-U>call append('.', repeat([''],v:count1))<cr> นี่คือสิ่งที่ช่วยพูดว่า: CTRL-U Scroll window Upwards in the buffer. The number of lines comes from the scroll option (default: half a screen). If [count] given, first set the 'scroll' option to [count]. ฉันลองด้วยตัวเองและใช้งานได้ตามที่ควร แต่ฉันไม่เข้าใจส่วนที่เกี่ยวกับscrollตัวเลือก พวกเขาหมายถึง'scroll' optionอะไร และนอกจากนี้ยังมีบางสิ่งที่แปลกในโหมดแทรก เท่าที่ฉันเข้าใจมันจะลบทุกอย่างตั้งแต่เคอร์เซอร์จนถึงจุดเริ่มต้นของบรรทัดจากนั้นรวมบรรทัดผลลัพธ์และบรรทัดด้านบน

6
ฉันสามารถเข้าร่วมบรรทัดด้วยเครื่องหมายจุลภาค (หรืออักขระอื่น) ได้หรือไม่
ฉันรู้ว่าฉันสามารถเข้าร่วมสายในเสียงเรียกเข้าด้วยJและหลายสายพันธุ์ของมัน ( gJ, ฯลฯ ); Jจะ"ลบเยื้องและใส่ได้ถึงสองช่องว่าง" แต่มีวิธีที่ตรงไปตรงมาในการแทรกตัวละครอื่นแทนที่จะเป็นช่องว่างทั้งสองหรือไม่? เช่นเครื่องหมายจุลภาค ( ,) หรือเครื่องหมายจุลภาค & space ( ,)? ได้รับ: 8 9 10 32 ฉันต้องการที่จะจบลงด้วย: 8, 9, 10, 32 หรือ: 8,9,10,32

1
การตั้งค่า TAB เป็น 2 ช่องว่าง
ฉันได้ดูคำตอบต่าง ๆ ซึ่งบ่งบอกว่าการตั้งค่าต่อไปนี้ใน. vimrc น่าจะเหมาะสมที่จะบังคับให้การแทรกแท็บกลายเป็นช่องว่าง filetype plugin indent on " On pressing tab, insert 2 spaces set expandtab " show existing tab with 2 spaces width set tabstop=2 set softtabstop=2 " when indenting with '>', use 2 spaces width set shiftwidth=2 อย่างไรก็ตามเมื่อฉันพยายามใช้ 2 ช่องว่างมันจะยังคงมีค่าเริ่มต้นเป็น 4 ช่องว่างต่อแท็บ ฉันได้ลองย้ายset expandtabไปที่ด้านล่างของการประกาศเหล่านี้ ฉันได้ลองลบsofttabstopคำแถลงนี้ ฉันได้กำจัดคำตอบต่าง …

1
ความแตกต่างระหว่างสตริงที่ยกมาเดี่ยวและสองครั้งคืออะไร?
ความแตกต่างระหว่างสตริงที่ยกมาเดี่ยวและสองครั้งคืออะไร? มีวิธีการรับตัวแปรขยายภายในสตริงหรือไม่พวกเขาจำเป็นต้องเข้าร่วมเช่น: 'Hello, ' . s:name . '!'

2
แทนที่สตริงโดยไม่ต้องเปลี่ยนเคส?
เนื่องจากการเล่นโวหารในภาษาเฉพาะโดเมนที่ฉันทำงานด้วยฉันมักเผชิญกับงานของ (เลือกไม่ได้ทั่วโลก) แทนที่termหรือTERMด้วยwordหรือWORDตามลำดับ วิธีนี้ผมค้นหากรณี insensitively สำหรับterm, และต้องการที่จะแทนที่ด้วยword ขณะที่การรักษาตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กของเดิมtermเหมือนเดิม ตั้งแต่การตรวจสอบทั้งtermสำหรับสอดคล้อง / พิมพ์เล็กพิมพ์ใหญ่จะเป็นเรื่องยากและไม่จำเป็นจริงๆผมจะชำระสำหรับพิมพ์ใหญ่ / ตัวพิมพ์เล็กword/ ถูกตัดสินใจเกี่ยวกับอักษรตัวแรกของWORDterm ฉันจะบรรลุสิ่งนี้ได้อย่างไร
18 substitute 

1
ฉันจะรับความสูงและความกว้างที่แท้จริงของ Vim ได้อย่างไร
winheight()และwinwidth()ส่งคืนจำนวนคอลัมน์ / บรรทัดในหน้าต่างปัจจุบัน สิ่งที่ฉันกำลังมองหาคือสิ่งที่ใกล้เคียงกับความสูงและความกว้างจริงของพื้นที่แก้ไขหรือพื้นที่ที่แสดงหากทำงานในเทอร์มินัล ปัญหาของwinheight()และwinwidth()คืออัตราส่วนภาพที่คำนวณจากค่าเหล่านี้ไม่ได้สัมผัสกับอัตราส่วนภาพจริง :echo winwidth('%') winheight('%') winwidth('%') * 1.0 / winheight('%') 104 51 2.039216 ภาพหน้าจอของพื้นที่บัฟเฟอร์มีขนาด 936x918 พิกเซลซึ่งแสดงอัตราส่วนภาพ1.019608เป็น ฉันคิดว่าฉันสามารถรับค่าจริงโดยใช้ขนาดของแบบอักษร แต่ได้อย่างไร นี่คือการติดตามผลฉันจะทำให้ Vim ช่วยเปิดในแนวตั้งได้อย่างไร . ฉันพยายามที่จะปรับตัวเข้ากับวิธีการแก้ปัญหาของ Nobe4

5
หลังจากคัดลอกส่วนที่เลือกไปยังแป้นพิมพ์กลับไปที่ตำแหน่งเดิม
เคอร์เซอร์ของฉันอยู่ตรงกลางของย่อหน้าเมื่อฉันตัดสินใจกะทันหันฉันต้องคัดลอกย่อหน้านั้น: ดังนั้นฉันพิมพ์vipเพื่อเลือกย่อหน้าที่มองเห็นได้: ตอนนี้ฉันกดcmd+Cเพื่อคัดลอกไปยังคลิปบอร์ด (อาจแตกต่างกันไปในระบบของคุณ แต่ไม่ควรเกี่ยวข้องกับคำถามกลางของโพสต์ของฉัน) ซึ่งทำให้เคอร์เซอร์ของฉันอยู่ที่จุดเริ่มต้นของย่อหน้า: มากกว่าตำแหน่งที่ต้องการซึ่งเป็นตอนที่ฉันเริ่ม หมายเหตุ: yipปัญหาเดียวกันเกิดขึ้นเมื่อลากเลือกไม่ใช่สายตาด้วย ฉันต้องการพฤติกรรมเริ่มต้นที่จะ "กลับสู่ตำแหน่งเคอร์เซอร์เดิม" หลังจากทำการเลือก / คัดลอกการกระทำเช่นนี้ มีการกำหนดค่าที่ทำให้สิ่งนี้เป็นไปได้หรือไม่?

5
เป็นไปได้หรือไม่ที่จะสั่งคำสั่ง vim เป็นกลุ่ม?
ฉันต้องการเรียกใช้เชลล์ต่อไปนี้ wea-this is the end of the second word | vim j exit 0 ซึ่งฉันหวังว่าจะไปป์จังหวะสำคัญw(เลื่อนไปข้างหน้าคำ) จากนั้นe(จบคำ) จากนั้นa(ต่อท้าย) แล้ว-this is the end of the second word( ต่อท้าย) (ข้อความ) ไปยังเอกสาร Vim jที่มีคำซึ่งมีคำอยู่แล้ว ข้อผิดพลาดต่อไปนี้เกิดขึ้นเมื่อฉันรันเชลล์สคริปต์ /root/bin/tt.sh: line 1: wea-this: command not found Vim: Warning: Input is not from a terminal ฉันใช้ Ubuntu 14.04 คำตอบสองประเภทจะได้รับการชื่นชม: …
18 invocation 

1
ตัวเลขจำนวนมากทำให้กลุ่มทำงานช้าลงหรือไม่?
ดูเหมือนว่าเป็นคำถามที่บ้าคลั่งจริงๆ แต่ฉันมีไฟล์ Python ที่มีตัวเลขอยู่ในนั้นยาวพันหลักและไฟล์นั้นดูเหมือนจะทำงานช้ามากฉันไม่แน่ใจว่ามีการประมวลผลบางอย่างเกิดขึ้นไหม ไม่รู้ตัว ฉันกดแถวแล้วjก็หยุดสักประมาณ 1 วินาทีมันเจ็บปวดมาก! ฉันมีสิ่งนี้ในไฟล์ Python เท่านั้น แต่จะไม่เกิดกับผู้อื่น หลังจากลบหมายเลขไฟล์แล้วไฟล์จะทำงานตามปกติอีกครั้ง ... นี่คือหมายเลข: number=("""7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450""") มันไม่ได้เป็นจำนวนจริง ๆ มันคือสตริง

4
ล้างข้อมูลบรรทัดเร็วกว่า [0] [d] [$]
มีวิธีที่รวดเร็วกว่าในการลบข้อความในบรรทัดกว่า กด0เพื่อข้ามไปยังจุดเริ่มต้นแล้ว กดd$เพื่อลบจนกว่าจะสิ้นสุดบรรทัดหรือไม่ นอกจากนี้จะเกิดอะไรขึ้นถ้าฉันต้องการลบทุกอย่างยกเว้นการเยื้อง มีวิธีทำเช่นนั้นหรือไม่?

4
วิธีที่สะดวกที่สุดในการทำงานกับแป้นพิมพ์ที่แตกต่างกันในกลุ่มคืออะไร?
บางครั้งฉันต้องเขียนคำภาษากรีก แต่เมื่อฉันใช้แป้นพิมพ์ภาษากรีกการกดปุ่มการพูดการพูด<C-p>จะถูกเข้าใจ<C-π>และไม่ใช่คำสั่งที่ฉันตั้งใจ :map <C-p> <C-π>นี้สามารถแก้ไขด้วย ฉันสามารถทำสิ่งนี้กับตัวอักษรทั้งหมดโดยไม่ทำรายการทั้งหมดได้หรือไม่? PS การทำรายการทั้งหมดไม่ได้ผลลัพธ์ที่สมบูรณ์แบบ เช่นqอยู่;บน Gr แป้นพิมพ์ แต่เราไม่ต้องการแมป ถึง q นอกจากนี้ด้วยเหตุผลบางอย่างΖΖ (ซีตาซีตา) ไม่ทำงานหลังจาก:map Ζ Zนั้น และคำสั่งที่ฉันกำหนด\lwไม่สามารถใช้งาน\λςได้

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