วิธีแทรกข้อความที่จุดเริ่มต้นของการเลือกหลายบรรทัดใน vi / Vim


423

ในVimฉันจะแทรกอักขระที่จุดเริ่มต้นของแต่ละบรรทัดในการเลือกได้อย่างไร

ยกตัวอย่างเช่นผมต้องการที่จะแสดงความคิดเห็นออกบล็อกของรหัสโดย prepending ที่จุดเริ่มต้นของสมมติว่าภาษาของฉันของระบบการแสดงความคิดเห็นแต่ละบรรทัดไม่อนุญาตให้แสดงความคิดเห็นเช่นบล็อก// /* */ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


748
  • กดEscเพื่อเข้าสู่ 'โหมดคำสั่ง'
  • ใช้Ctrl+ Vเพื่อเข้าสู่โหมดบล็อกภาพ
  • ย้ายUp/ Downเพื่อเลือกคอลัมน์ของข้อความในบรรทัดที่คุณต้องการแสดงความคิดเห็น
  • จากนั้นกดShift+ iและพิมพ์ข้อความที่คุณต้องการแทรก
  • จากนั้นกดEsc, รอ 1 วินาทีและข้อความที่แทรกจะปรากฏในทุกบรรทัด

สำหรับข้อมูลเพิ่มเติมและการอ่านให้ดูที่ " การแทรกข้อความในหลายบรรทัด " ใน Vim Tips Wiki


6
คนเกียจคร้านเพียงคนเดียวที่ปรากฏว่า Ctrl + V ถูกแทนที่ใน GVIM
Jordan Parmer

14
ไม่ใช่สำหรับฉัน (บน linux) ไม่ใช่
pixelbeat

23
คุณสามารถใช้ Ctrl-Q แทน gVim (as: help Ctrl-V อธิบาย) แต่คุณต้องใช้ hjkl เพื่อนำทางในโหมดนี้แทนที่จะใช้ปุ่มลูกศร
Gareth

9
หาก ctrl-v ของคุณถูกแทนที่ใน windows gvim คุณควรแก้ไข vimrc ทั่วโลกเพื่อหยุดรวมถึง mswin.vim
graywh

18
ความคิดใดที่ว่าทำไมสิ่งนี้ถึงไม่ทำอะไรเลยหลังจากกด esc ฉันรอเช่น 10 วินาทีสำหรับสิ่งที่จะเกิดขึ้นในน้อยกว่าหนึ่งร้อยสาย - ไม่เคยใจผมได้รับการผลักดันไม่ได้Shift + v CTRL + v@ vkaul11 อาจเป็นสิ่งเดียวกันกับที่คุณทำฮ่า ๆ ๆ
Tek

186

สิ่งนี้จะแทนที่จุดเริ่มต้นของแต่ละบรรทัดด้วย "//":

:%s!^!//!

สิ่งนี้จะแทนที่จุดเริ่มต้นของแต่ละบรรทัดที่เลือก (ใช้โหมดภาพเพื่อเลือก) ด้วย "//":

:'<,'>s!^!//!

โปรดทราบว่าgv(ในโหมดปกติ) คืนค่าการเลือกภาพล่าสุดสิ่งนี้มีประโยชน์เป็นครั้งคราว


3
ขอบคุณ! ทำให้รู้สึกโดยรวม และการลบข้อความจะเป็นดังนี้: '<,'> s! ^ // !!
Jordan Parmer

4
เครื่องหมายอัศเจรีย์ความหมายในคำตอบข้างต้นคืออะไร? (:% s! ^! //!)
Henrik K

19
@HKK โดยปกติจะใช้อักขระเครื่องหมายทับหน้า / เป็นตัวคั่นสำหรับคำสั่งค้นหาและแทนที่ ในกรณีนี้เราใส่เครื่องหมายทับไปข้างหน้าเป็นส่วนหนึ่งของการค้นหาและแทนที่ดังนั้นเราจึงใช้ตัวคั่นทางเลือกคือตัวอักษรอัศเจรีย์!
cyber-monk

+1 สิ่งนี้ทำงานใน VsVim โดยที่ (Ctrl + V) (Shiift + I) Esc ไม่ได้
เซทเรโน

4
+1 มีความคิดที่คุณสามารถใช้อย่างอื่นเป็นตัวคั่น regex ไม่มี (ที่นี่ฉันถูกใช้/และมีการหลบหนี//ใน:s/^/\/\/แทนการเขียน:s!^!//)
Hashbrown

83

รูปแบบทั่วไปสำหรับการค้นหาและแทนที่คือ:

:s/search/replace/

แทนที่การเกิดขึ้นครั้งแรกของ 'ค้นหา' ด้วย 'แทนที่' สำหรับบรรทัดปัจจุบัน

:s/search/replace/g

แทนที่ 'การค้นหา' ทั้งหมดด้วย 'แทนที่' สำหรับบรรทัดปัจจุบัน 'g' ย่อมาจาก 'global'

คำสั่งนี้จะแทนที่ 'การค้นหา' แต่ละครั้งด้วย 'แทนที่' สำหรับบรรทัดปัจจุบันเท่านั้น % ถูกใช้เพื่อค้นหาไฟล์ทั้งหมด หากต้องการยืนยันการแทนที่แต่ละรายการแบบโต้ตอบผนวก 'c' เพื่อยืนยัน:

:%s/search/replace/c

Interactive ยืนยันการแทนที่ 'ค้นหา' ด้วย 'replace' สำหรับไฟล์ทั้งหมด

แทนที่จะใช้อักขระ% คุณสามารถใช้ช่วงหมายเลขบรรทัดได้(โปรดทราบว่าอักขระ '^' เป็นอักขระค้นหาพิเศษสำหรับจุดเริ่มต้นของบรรทัด) :

:14,20s/^/#/

แทรกอักขระ '#' ที่จุดเริ่มต้นของบรรทัดที่ 14-20

หากคุณต้องการใช้อักขระความคิดเห็นอื่น (เช่น //) ให้เปลี่ยนตัวคั่นคำสั่งของคุณ:

:14,20s!^!//!

แทรกลำดับอักขระ '//' ที่จุดเริ่มต้นของบรรทัดที่ 14-20

หรือคุณสามารถหลีกเลี่ยง // อักขระเช่น:

:14,20s/^/\/\//

แทรกลำดับอักขระ '//' ที่จุดเริ่มต้นของบรรทัดที่ 14-20

หากคุณไม่เห็นหมายเลขบรรทัดในเครื่องมือแก้ไขให้พิมพ์ต่อไปนี้

:set nu

หากต้องการลบ # เริ่มต้น: แทนที่จะเป็น: 14,20s / # / ^ / คุณควรใช้: 14,20s / # //
cn1h

1
@ cn1h ฉันคิดว่าสิ่งนี้จะแทนที่อื่น ๆ#ในบรรทัดเช่นกัน คุณควรใช้^#แทน
ankush981

ขอบคุณที่อธิบายพื้นฐาน เป็นการดีที่จะรู้ว่าทำไมบางสิ่งเกิดขึ้น
didierCH

38

อีกวิธีหนึ่งที่อาจเป็นเรื่องง่ายสำหรับผู้มาใหม่:

 some█
 code
 here

วางเคอร์เซอร์บนบรรทัดแรกเช่นโดย

gg

และพิมพ์ข้อความต่อไปนี้เพื่อเข้าสู่โหมดแทรกและเพิ่มข้อความของคุณ:

I / / Space

 // █some
 code
 here

กดEscเพื่อกลับไปที่โหมดคำสั่งและใช้ digraph:

j . j .

 // some
 // code
 //█here

jเป็นคำสั่ง motion เพื่อลงหนึ่งบรรทัดและ.ทำซ้ำคำสั่งแก้ไขล่าสุดที่คุณทำ


3
ง่ายจริงๆ :) หากคุณกำลังมีปัญหากับมันอาจจะเป็นเพราะคุณกำลังพิมพ์บาร์ (สัญลักษณ์อื่น ๆ ที่มีของคุณ \) แทนการใช้เงินทุน| Iฉันคิดว่ามันเป็น|ครั้งแรก
cokedude

1
ถ้าฉันทำ "5. " มันลบ 5 ตัวอักษรจากบรรทัดเดียวกัน ฉันจะลบ 5 ตัวพร้อมกันจากแต่ละบรรทัดได้อย่างไร
ราหุลประสาท

1
@RahulPrasad สมมติว่าคุณมี 25 บรรทัดจากนั้นเริ่มที่ด้านหน้าของบรรทัดแรกเพียงบันทึก 5xj ลงในการลงทะเบียนและเล่นที่ลงทะเบียน 24 ครั้งตัวอย่างเช่น: qa5xjq25 @ a แต่มันจะดีกว่าถ้าคุณโพสต์คำถามนี้เป็นคำถามจริง ถ้ามันไม่มีอยู่แล้ว ...
เก้า

26

และอีกวิธีหนึ่ง:

  • ย้ายไปที่จุดเริ่มต้นของบรรทัด
  • เข้าสู่โหมด Visual Block ( CTRL- v)
  • เลือกบรรทัดที่คุณต้องการ (เลื่อนขึ้น / ลงด้วยj/ kหรือข้ามไปที่บรรทัดด้วย [บรรทัด] G)
  • กดI(นั่นคือทุนฉัน)
  • พิมพ์อักขระความคิดเห็น
  • กด ESC

20

สิ่งนี้จะเพิ่ม#ที่จุดเริ่มต้นของทุกบรรทัด:

:%s/^/#/

และผู้คนจะหยุดบ่นเกี่ยวกับการที่คุณขาดความคิดเห็นสคริปต์


2
จะเกิดอะไรขึ้นถ้าคุณต้องการเพิ่ม # บนบรรทัดที่เลือก (หรือไม่กี่) เท่านั้น
ราหุล

15

หากคุณต้องการได้รับสุดยอดแฟนซีใส่ไว้ใน. vimrc ของคุณ:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

จากนั้นเมื่อใดก็ตามที่อยู่ในโหมดภาพคุณสามารถกด\cเพื่อ omment การป้องกันและ\uการยู ncomment มัน แน่นอนคุณสามารถเปลี่ยนการกดแป้นพิมพ์ลัดเหล่านั้นเป็นอะไรก็ได้


โหวตขึ้นเพราะมันแนะนำสิ่งใหม่ - vmap!
ankush981

11

อีกวิธีหนึ่ง:

:'<,'>g/^/norm I//

/^/เป็นเพียงรูปแบบจำลองที่เข้าคู่กันทุกบรรทัด normให้คุณเรียกใช้คำสั่งโหมดปกติที่ตามมา I//บอกว่าให้เข้าสู่โหมดแทรกขณะที่กระโดดเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดจากนั้นแทรกข้อความต่อไปนี้ (สองสแลช)

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


1
จริงๆแล้วคำสั่ง: g ไม่จำเป็น สิ่งนี้จะทำ:: '<,'> norm I //
Cyber ​​Oliveira

1
และ: s จะดีกว่าที่จะใช้ในกรณีนี้เช่นกัน
graywh

นี่คือคำตอบที่มีประโยชน์ที่สุด
สงบสุข

3

สำหรับการใส่บล็อกความคิดเห็นของโค้ดฉันชอบปลั๊กอินNERD Commenter

เลือกข้อความบางส่วน:

Shift-V
...select the lines of text you want to comment....

หมายเหตุ:

,cc

uncomment:

,cu

หรือเพียงแค่สลับสถานะความคิดเห็นของบรรทัดหรือบล็อก:

,c<space>

2

ฉันสามารถแนะนำปลั๊กอินEnhCommentify

เช่น. นำสิ่งนี้ไปใช้กับ vimrc ของคุณ:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

จากนั้นคุณสามารถแสดงความคิดเห็น / ไม่ใส่เครื่องหมายในบรรทัด (ที่เลือก) ด้วย ', c'


3
คุณสามารถใช้ Nerd Commenter ได้ที่vim.org/scripts/script.php?script_id=1218
Nathan Fellman

1

ทำเครื่องหมายพื้นที่ที่จะแสดงความคิดเห็นเป็นบล็อกภาพ ( <C-V)

และทำ c#<ESC>p

  1. cให้เปลี่ยนเป็น "#"
  2. ใส่กลับ

หากคุณทำบ่อยให้กำหนดทางลัด (ตัวอย่าง\q) ใน. vimrc ของคุณ

:vmap \q c#<ESC>p

1

ในกรณีที่การเลือกหลายบรรทัดของใครคนหนึ่งเป็นจริงย่อหน้าไม่จำเป็นต้องเลือกบรรทัดด้วยตนเอง เป็นกลุ่มสามารถทำเพื่อคุณ:

  1. vip: เลือกและทำเครื่องหมายย่อหน้าทั้งหมด
  2. shift-i: แทรกข้อความที่จุดเริ่มต้นบรรทัด
  3. escape: ออกจากโหมดแทรก / เข้าสู่โหมดปกติ [เริ่มต้นบรรทัดยังคงเลือกอยู่]
  4. escape: ยกเลิกการเลือกจุดเริ่มต้นของบรรทัด

0

วิธีแทรก "ABC" ที่จุดเริ่มต้นของแต่ละบรรทัด:

1) ไปที่โหมดคำสั่ง

2):% norm I ABC


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