วิธีการทำสำเนาทั้งบรรทัดใน Vim ที่ Eclipse


1624

ฉันจะทำซ้ำทั้งบรรทัดเป็นกลุ่มในวิธีที่คล้ายกับCtrl+ Dใน IntelliJ IDEA / Resharper หรือCtrl+ Alt+ / ในEclipse ได้อย่างไร


49
คนไม่เรียกใช้ vimtutor อีกต่อไปหรือไม่ นี่น่าจะเป็นภายในห้านาทีแรกของการเรียนรู้วิธีใช้ Vim
dash-tom-bang

131
คุณต้องการคัดลอกบรรทัดนี้หรือไม่ Yes Pเช่า :)
Stavr00

3
FWIW ฉันทำ vimtutor ประมาณหนึ่งครั้งในช่วง 2 เดือนที่ผ่านมาและแนวคิดนี้ไม่ครอบคลุม มันบอกวิธีการทำ "dd" และ "v - นำทาง - y" ตามด้วย "p" มันไม่ได้บอกวิธีการคัดลอกบรรทัดเดียวโดยไม่ต้องลบมันตามที่ถามที่นี่
danielson317

คำตอบ:


2769

yyหรือYคัดลอกบรรทัด (จำ: Y ank )
หรือ
ddจะdหนึ่งคำสาย (สำเนาเป็นกลุ่มสิ่งที่คุณลบเป็นคลิปบอร์ดเหมือน "สมัคร" เช่นการตัดการทำงาน)

แล้วก็

pเพื่อp asteข้อความที่คัดลอกหรือลบหลังจากบรรทัดปัจจุบัน
หรือ
Pเพื่อp asteข้อความที่คัดลอกหรือลบก่อนบรรทัดปัจจุบัน


129
จุดที่ยอดเยี่ยม แต่ด้วยเหตุผลบางอย่างฉันพบว่าการกดปุ่ม y สองครั้งนั้นเร็วกว่าสำหรับฉันมากกว่า SHIFT-y
Mark Biek

25
@camflan ฉันคิดว่า Y ควร "คัดลอกจากเคอร์เซอร์ไปยังจุดสิ้นสุด"
Dzung Nguyen

42
และ 2yy สามารถใช้เพื่อคัดลอก 2 บรรทัด (และสำหรับ n อื่น ๆ )
Amir Ali Akbari

5
@nXqd: ใช่เป็นร้อยละใหญ่ของผู้ใช้แผนที่เพื่อY y$(สอดคล้องกับDและC. ( แต่ไม่ Vi เข้ากันได้ (ไม่มีใครใส่ใจ))) :help Yที่มีการเสนอที่แม้จะอยู่ใน
Aaron Thoma

11
เพื่อคัดลอกสองบรรทัดมันเร็วยิ่งกว่าที่จะไปyjหรือykโดยเฉพาะอย่างยิ่งเมื่อคุณไม่ได้เพิ่มจำนวนอักขระหนึ่งตัว นอกจากykนี้เป็นเวอร์ชันย้อนหลังที่2yyไม่สามารถทำได้และคุณสามารถใส่จำนวนบรรทัดที่จะไปข้างหลังในy9jหรือy2kอื่น ๆ ความแตกต่างเพียงอย่างเดียวคือการนับของคุณจะต้องn-1เป็นจำนวนnบรรทัดทั้งหมด แต่หัวของคุณสามารถเรียนรู้ได้ว่า อย่างไรก็ตาม.
zelk

406

โหมดปกติ: ดูคำตอบอื่น ๆ

Exวิธี:

  • :t. จะซ้ำบรรทัด
  • :t 7 จะคัดลอกหลังจากบรรทัด 7
  • :,+t0จะคัดลอกบรรทัดปัจจุบันและบรรทัดถัดไปที่จุดเริ่มต้นของไฟล์ ( ,+เป็นคำพ้องสำหรับช่วง.,.+1)
  • :1,t$จะคัดลอกบรรทัดจากจุดเริ่มต้นจนถึงตำแหน่งเคอร์เซอร์ไปยังจุดสิ้นสุด ( 1,เป็นคำพ้องความหมายสำหรับช่วง1,.)

หากคุณต้องการที่จะย้ายแทนการคัดลอกใช้แทน:m:t

สิ่งนี้มีประสิทธิภาพมากหากคุณรวมเข้ากับ:gหรือ:v:

  • :v/foo/m$ จะย้ายทุกบรรทัดที่ไม่ตรงกับรูปแบบ“ foo” ไปที่ท้ายไฟล์
  • :+,$g/^\s*class\s\+\i\+/t.จะคัดลอกบรรทัดต่อมาทั้งหมดของแบบฟอร์มclass xxxทันทีหลังจากเคอร์เซอร์

อ้างอิง: :help range, :help :t, :help :g, :help :mและ:help :v


1
เมื่อคุณกด:ในโหมดภาพมันจะถูกแปลงเป็น'<,'>ดังนั้นมันจะเลือกช่วงของเส้นที่การเลือกภาพที่ครอบคลุมไว้ล่วงหน้า ดังนั้นในโหมดภาพ:t0จะคัดลอกบรรทัดที่จุดเริ่มต้น
เบอนัวต์

1
สำหรับเรคคอร์ด: เมื่อคุณพิมพ์โคลอน (:) คุณจะเข้าสู่โหมดบรรทัดคำสั่งที่คุณสามารถป้อนคำสั่ง Ex vimdoc.sourceforge.net/htmldoc/cmdline.htmlคำสั่ง Ex อาจมีประสิทธิภาพและสั้น คำตอบ yyp คือคำสั่ง "โหมดปกติ" หากคุณต้องการคัดลอก / ย้าย / ลบบรรทัดที่อยู่ไกลหรือช่วงของบรรทัดคำสั่ง Ex อาจเร็วกว่ามาก
Niels Bom

7
Downvoted ไม่ได้เนื่องจากปัญหาเกี่ยวกับคำตอบเช่นนี้ (แม้ว่ามันจะไม่ทำงานสำหรับสถานการณ์ของฉันฉันไม่ทราบว่าหมายเลขบรรทัดที่ฉันต้องการจะทำซ้ำ) แต่เนื่องจากมันไม่ควรเป็นคำตอบที่ได้รับการยอมรับสูงสุดสำหรับเรื่องนี้ คำถามที่ค้นหาทั่วไป
mjaggard

9
@mjaggard: คำตอบที่ยอมรับมักจะอยู่ด้านบนเสมอโดยไม่คำนึงถึงคะแนน ใช่ฉันเพิ่มคำตอบนั้นเป็นส่วนเสริมและดูเหมือนว่าจะเหมาะกับ OP อย่างดี
เบอนัวต์

7
:t.เป็นคำตอบที่แน่นอนสำหรับคำถาม
Burak Erdem

294

YPหรือหรือYpyyp


Yมักจะถูกแมปใหม่ให้กับy$(งัด (คัดลอก)) จนถึงจุดสิ้นสุดของบรรทัด (จากตำแหน่งเคอร์เซอร์ปัจจุบันไม่ใช่จุดเริ่มต้นของบรรทัด)) ด้วยสายนี้ใน.vimrc::nnoremap Y y$
แอรอน Thoma

1
อย่าลืมคนแก่ที่น่าสงสารyyP
icc97

253

คัดลอกและวางเป็นกลุ่ม

ไม่ได้ง่ายกว่านี้อีกแล้ว! จากโหมดปกติ:

yy

จากนั้นเลื่อนไปที่บรรทัดที่คุณต้องการวางที่และ

p

34
คุณใช้อะไรทำ gif
Zoltán

4
@ Zoltánคุณสามารถใช้ LiceCap ซึ่งมีขนาดเล็ก
onmyway133

53

yy

จะดึงสายปัจจุบันโดยไม่ลบ

dd

จะลบบรรทัดปัจจุบัน

p

putเส้นจะถูกจับโดยวิธีใดวิธีหนึ่งก่อนหน้านี้


3
อันนี้มาก่อน แต่มันซ้ำกันได้รับการยอมรับ: stackoverflow.com/a/73357/1438029
Geoffrey Hale

44

ทำเช่นนี้:

ก่อนอื่นyyให้คัดลอกบรรทัดปัจจุบันแล้วจึงpวาง


20
อย่าพิมพ์ช่องว่าง
Niels Bom

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

44

หากคุณต้องการวิธีอื่น:

"ayy: aนี้จะเก็บสายในบัฟเฟอร์

"ap: นี่จะใส่เนื้อหาของบัฟเฟอร์aที่เคอร์เซอร์

มีหลายรูปแบบในเรื่องนี้

"a5yy: นี้จะเก็บ 5 aสายในบัฟเฟอร์

ดู " ไฟล์ช่วยเหลือเป็นกลุ่มเพื่อความสนุกสนานมากขึ้น


ขอบคุณฉันใช้สิ่งนี้เป็นสิ่งผูกมัด: map <Leader> d "ayy" ap
frbl

39

yyp - จำด้วย "yippee!"

หลายบรรทัดที่มีตัวเลขอยู่ระหว่าง:

y7yp


17
7yy นั้นเทียบเท่ากับ y7y และอาจจำได้ง่ายกว่าว่าจะทำอย่างไร
graywh

10
y7yp (หรือ 7yyp) ไม่ค่อยมีประโยชน์ เคอร์เซอร์จะยังคงอยู่ในบรรทัดแรกที่คัดลอกเพื่อให้ p วางบรรทัดที่คัดลอกระหว่างบรรทัดแรกและบรรทัดที่สองของแหล่งที่มา ในการทำสำเนาบล็อกของเส้นใช้ 7yyP
Nefrubyr

@Nefrubyr หรือ:.,.+7 copy .+7: P
DarkWiiPlayer

23

yyp - วางหลังจาก

yyP - วางก่อน


6
เนื่องจากบรรทัดจะถูกทำซ้ำผลลัพธ์ที่ได้ของเนื้อหาจะเหมือนกัน
คิวเมนตัส

4
@ABB อย่างไรก็ตามมีความแตกต่างเล็กน้อยที่นี่ - เคอร์เซอร์ของคุณจะอยู่ตรงไหน
Mikk

12

ฉันชอบ: Shift+ v(เพื่อเลือกทั้งบรรทัดทันทีและให้คุณเลือกบรรทัดอื่นถ้าคุณต้องการ), y, p


11

นอกจากนี้คุณยังสามารถลอง <Cx> <Cl> ซึ่งจะทำซ้ำบรรทัดสุดท้ายจากโหมดแทรกและนำเสนอหน้าต่างที่มีบรรทัดทั้งหมดให้คุณ มันใช้งานได้เกือบเหมือน <Cp>


นี่มีประโยชน์มาก แต่เพื่อหลีกเลี่ยงการกดปุ่มหลายปุ่มฉันได้แมปไปที่ CTRL-L นี่คือแผนที่ของฉัน: inoremap ^ L ^ X ^ L
Jorge Gajon

11

ตัวเลือกอื่นจะไปกับ:

nmap <C-d> mzyyp`z

ช่วยให้คุณได้เปรียบในการรักษาตำแหน่งเคอร์เซอร์


10

สำหรับคนที่ไม่รู้จัก vi คำตอบบางอย่างจากด้านบนอาจทำให้เขาเข้าใจผิดด้วยวลีเช่น "วาง ... หลัง / ก่อนบรรทัดปัจจุบัน "
มันคือ "วาง ... หลัง / ก่อนเคอร์เซอร์ "

yyหรือYเพื่อคัดลอกบรรทัด
หรือ
ddเพื่อลบบรรทัด

แล้วก็

pเพื่อวางข้อความที่คัดลอกหรือลบหลังจากเคอร์เซอร์
หรือ
Pการวางข้อความที่คัดลอกหรือลบก่อนเคอร์เซอร์


สำหรับการเชื่อมโยงคีย์เพิ่มเติมคุณสามารถเยี่ยมชมไซต์นี้: vi รายการการผูกคีย์ที่สมบูรณ์


3

1 gotcha: เมื่อคุณใช้ "p" เพื่อวางบรรทัดมันจะวางไว้หลังบรรทัดที่เคอร์เซอร์ของคุณเปิดดังนั้นหากคุณต้องการเพิ่มบรรทัดหลังบรรทัดที่คุณกำลังลากอย่าขยับเคอร์เซอร์ลงบรรทัด ก่อนที่จะวางสายใหม่


4
หรือใช้ทุน P - ใส่ไว้ก่อน
Ghoti

3

ค่าเริ่มต้นคือyypแต่ฉันใช้การปฏิเสธนี้เป็นเวลาหนึ่งปีและรักมัน:

" set Y to duplicate lines, works in visual mode as well. nnoremap Y yyp vnoremap Y y`>pgv


3

ฉันรู้ว่าฉันไปงานปาร์ตี้สาย แต่อะไรก็ตาม; ฉันมีสิ่งนี้ใน. vimrc ของฉัน:

nnoremap <C-d> :copy .<CR>
vnoremap <C-d> :copy '><CR>

:copyคำสั่งสำเนาเพียงบรรทัดที่เลือกหรือช่วง (เสมอสายทั้งหมด) ให้ต่ำกว่าจำนวนบรรทัดให้เป็นอาร์กิวเมนต์

ในโหมดปกติสิ่งนี้จะcopy . คัดลอกบรรทัดนี้ไปด้านล่างบรรทัดนี้

และในโหมดภาพมันจะกลายเป็นสำเนาจากจุดเริ่มต้นของการเลือกไปยังจุดสิ้นสุดของการเลือกไปที่บรรทัดด้านล่างท้ายของการเลือก'<,'> copy '>


1
answer คำตอบที่ดีที่สุดที่นี่!

2

สำหรับผู้ที่เริ่มต้นเรียนรู้ vi ต่อไปนี้เป็นคำแนะนำที่ดีสำหรับ vi โดยการแสดงรายการคำสั่งเคียงข้างกับการเคลื่อนย้ายเคอร์เซอร์และปุ่มลัดของ Windows GUI Editor โดยทั่วไป มันแสดงรายการคำสั่งพื้นฐานทั้งหมดรวมถึงyy(คัดลอกบรรทัด) และp(วางหลัง) หรือP(วางก่อน)

vi (Vim) สำหรับผู้ใช้ Windows


1

หากคุณต้องการทำซ้ำบรรทัดและวางลงใต้ตำแหน่งปัจจุบันเช่นเดียวกับใน Sublime Ctrl+ Shift+ Dคุณสามารถเพิ่ม.vimrcไฟล์นี้ในไฟล์ของคุณได้

nmap <S-C-d> <Esc>Yp

หรือสำหรับโหมดแทรก:

imap <S-C-d> <Esc>Ypa


แม้ว่าจะออกจากโหมดแทรกและเพียงเพิ่มiไปยังจุดสิ้นสุดเพื่อกลับเข้ามาอีกครั้งundoดังนั้นการแก้ปัญหาการคัดลอกบรรทัดในโหมดแทรกจึงไม่สำคัญอย่างที่คิด
DarkWiiPlayer

มันใช้งานได้ดีอย่างสมบูรณ์แบบสำหรับฉัน: imap <S-C-d> <Esc>Ypi โหมดแทรกและ nmap <S-C-d> <Esc>Ypในโหมดปกติ
เจได

0

ฉันชอบที่จะใช้การทำแผนที่นี้:

:nnoremap yp Yp

เพราะมันทำให้มันสอดคล้องกับการใช้งานพร้อมกับYPคำสั่งพื้นเมือง

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