วิธีย้ายบล็อกข้อความได้เร็วขึ้น


25

นี่คือวิธีที่ฉันมักจะคัดลอกบล็อกข้อความหรือรหัส:

  1. เลือกบล็อกด้วยโหมด Visual ( V) และลบด้วย d; ddหรือถ้ามันเป็นเพียงบรรทัดเดียวใช้เพียง
  2. ไปที่ที่ฉันต้องการให้เป็นข้อความฉันโง่เกินกว่าที่จะจดจำความแตกต่างระหว่างpและPดังนั้นฉันจึงได้รับสิทธิ์นี้ประมาณ 50% ของเวลา (ถ้าฉันทำผิด: เลิกลองใหม่อีกครั้ง)
  3. บางครั้งการเยื้องต้องปรับดังนั้นฉันไปที่โหมด Visual Vอีกครั้งและเลือกบล็อกเดียวกันอีกครั้งและใช้>หรือ <เพื่อแก้ไข

มีวิธีที่ง่ายกว่านี้ไหม? ในบรรณาธิการบางคนฉันเห็นว่าคุณสามารถ "หยิบ" บล็อกข้อความเหมือนเดิมและเลื่อนไปมาได้ นี่คือตัวอย่างจาก Emacs (แต่ฉันเคยเห็นสิ่งนี้ในบรรณาธิการอื่น ๆ ):

Emacs

หรืออาจมีวิธีอื่น (ดียิ่งขึ้น)


เกี่ยวกับปัญหาการเยื้องที่คุณสามารถแก้ได้โดยการวางกับ]pหรือ[pมากกว่าหรือp Pวิธีนี้บล็อกที่คุณวางจะได้รับการจดทะเบียนอัตโนมัติ
Gonçalo Ribeiro

คุณอาจต้องการที่จะดู screencast โดยดึงนีลเดือดข้อความที่แนะนำให้ใช้เป็นกลุ่มที่ไม่บอบช้ำ-
Hotschke

คำตอบ:


13

มีปลั๊กอินสำหรับที่: dragvisuals.vim

มันไม่ได้ผูกกุญแจไว้ตามค่าเริ่มต้นดังนั้นคุณต้องทำเอง ฉันชอบแผนที่พวกเขาถึงControl+ Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

นอกจากนี้ยังมาพร้อมกับรหัสโบนัสเพื่อทำซ้ำการเลือกปัจจุบัน:

xmap <expr> D DVB_Duplicate()

ข้อดีของปลั๊กอินนี้มากกว่าคำตอบอื่น ๆ :

  • ไม่ทำให้ข้อความหายไปหากคุณพยายามเลื่อนขึ้นไปเกินบรรทัดแรก
  • มันจะขยายไฟล์ถ้าคุณย้ายไปด้านล่างบรรทัดสุดท้าย
  • การเลื่อนไปทางซ้าย / ขวาใช้งานได้ดีขึ้นเล็กน้อย

เคล็ดลับที่มีประโยชน์อีกข้อหนึ่งในการเสริมนี้คือ keybinds:

xnoremap > >gv
xnoremap < <gv

นี้จะ re-เลือกการเลือกภาพที่ผ่านมาหลังจากที่คุณใช้>ขณะอยู่ในโหมดภาพเพื่อให้คุณสามารถปรับแนวได้ง่ายขึ้น (คุณยังสามารถใช้ปุ่มลูกศร แต่นี้จะย้ายไปจากตัวละครตัวหนึ่งและไม่ได้เป็นหนึ่งshiftwidth)


1
มีอีกปลั๊กอินหนึ่งสำหรับสิ่งนี้ที่ผู้เขียนปลั๊กอินที่แนะนำของฉันอธิบายว่า "การปรับปรุงการทำงานซ้ำของ dragvisuals.vim ของฉัน": github.com/zirrostig/vim-schlepp
Jay Thompson

8

สำหรับขั้นตอนที่ 3 คุณสามารถใช้gv=แทน ( =หมายถึงเยื้องและgvหมายถึง "เลือกการเลือกภาพสุดท้าย" อีกครั้ง)

สำหรับพฤติกรรมของ Emacs มันค่อนข้างง่ายที่จะเพิ่มการแมปใน. vimrc ของคุณ:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

จากนั้นคุณสามารถใช้ปุ่มลูกศรขึ้นและลงเพื่อเลื่อนไปรอบ ๆ การเลือกเส้นสายตา (แน่นอนว่าคุณสามารถแมปไปยังปุ่มต่าง ๆ ได้เช่นกันหากคุณเกลียดลูกศร)

(คุณสามารถทำได้ด้วยการเลือกภาพปกติและเลื่อนไปทางซ้ายและขวาเช่นกัน: vnoremap <left> dhPgvhohoและvnoremap <right> dpgvlolo.)


gvไปที่การเลือกภาพสุดท้ายซึ่งในกรณีนี้จะเป็นย่อหน้าที่ถูกลบ ฉันพลาดอะไรไป
Robert Smith

4

คุณสามารถทำการแมปบางปุ่มเพื่อย้ายเส้นรอบ ๆ ตัวอย่างเช่นลูกศรขึ้นและลงหากคุณคุ้นเคยกับการเคลื่อนที่ไปhjklมา

เช่น. vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:mคำสั่งปกติเพื่อย้ายบรรทัด

+1หรือ-2เพื่อระบุบรรทัดขึ้นหรือลง (-1 เก็บบรรทัดไว้ในที่เดียวกัน)

gvเพื่อเลือกข้อความเดียวกันในVISUALโหมดอีกครั้ง

วิธีนี้ไม่รบกวนการลงทะเบียนดังนั้นข้อความที่คัดลอกจะยังคงมีอยู่รวมทั้งฟอร์แมตโค้ดเพื่อตั้งค่าการเยื้องที่เหมาะสม ฯลฯ


นี่เป็นสิ่งที่ดี แต่ไม่ใช่สำหรับฉันเนื่องจากฉันไม่ชอบการใช้งาน=(มักจะเปลี่ยนรูปแบบที่ไม่เกี่ยวข้องกับฉันมากเกินไป)
Martin Tournoij

4

วิธีที่ง่ายที่สุดที่ฉันพบคือทำเอกสารไว้ที่นี่: http://vimrcfu.com/snippet/77

ใส่สิ่งต่อไปนี้ใน. vimrc ของคุณ

vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv

นี้ดูเหมือนว่าจะเป็นเช่นเดียวกับคำตอบของ Khelben 8 กุมภาพันธ์ ?
Martin Tournoij


3

มีปลั๊กอินเล็กน้อยสำหรับสิ่งนี้ แต่ฉันชอบเสียงเรียกเข้าที่ไม่ได้รับการแก้ไขของ Tim Pope ( github ) (Ingo Karkat LineJugglerคล้ายกัน)

คุณเลือกบล็อกข้อความของคุณด้วยสายตาจากนั้นทำ]e(e สำหรับการแลกเปลี่ยน) เพื่อเลื่อนบล็อกลงด้านล่าง ( [eสำหรับทิศทางอื่น) ใช้.เพื่อทำซ้ำการกระทำ (คุณมีrepeat.vimติดตั้งไม่ได้คุณ) uถ้าคุณไปไกลเกินไปแล้วก็เลิกผ่านทาง

ตอนนี้ฉันคิดว่าเป็นการส่วนตัวpและPเป็นคำสั่งทั่วไปที่ดีที่สุดที่จะเรียนรู้พวกเขาก่อนที่จะสร้างนิสัยที่ไม่ดี จากนั้นคุณสามารถใช้]pเพื่อวางเยื้องเดียวกัน หากคุณใช้ unimpaired คุณสามารถทำได้>pเพื่อวางระดับการย่อหน้าให้ลึกหรือ=pเพื่อวางและฟอร์แมตใหม่

หากคุณมีปัญหาในการจดจำpและPอาจช่วยให้คุณนึกถึงพวกเขาในแง่ของoและOคำสั่งซึ่งเป็นประเภทสมมาตร

ดังที่คนอื่น ๆ สังเกตเห็นคุณสามารถใช้gvเพื่อเลือกการเลือกภาพ อย่างไรก็ตามหากคุณใส่ / วางข้อความคุณจะสูญเสียการเลือกภาพของคุณ อย่าหงุดหงิดเพราะการเปลี่ยนแปลงทุกอย่าง (และกระชาก!) จะถูกตั้งค่า'[และ']รอบ ๆ พื้นที่ที่เปลี่ยนแปลง ดังนั้นคุณสามารถเยื้องผ่าน>'](อ่าน: เลื่อนไปทางขวาจนจบการเปลี่ยนแปลงครั้งสุดท้าย) และใช้.เพื่อย้ำเยื้องจนกว่าคุณจะมีข้อความอยู่ในจุดที่เหมาะสม

สำหรับความช่วยเหลือเพิ่มเติมดู:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

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

ตัวอย่างเช่นถ้าฉันมีไฟล์ต่อไปนี้:

1 aaa
2 bbb
3 ccc
4 ddd

และฉันต้องการย้ายเส้นของ a ไปตามหลังเส้นของ c ฉันวางเคอร์เซอร์บนบรรทัดของ a และป้อน:m3แล้วเส้นจะเลื่อนไป

สิ่งนี้ยังทำงานร่วมกับ +/- ออฟเซ็ต ในตัวอย่างข้างต้นผลลัพธ์เดียวกันสามารถทำได้โดย:m+2การย้ายบรรทัด 2 บรรทัดลง

สำหรับบล็อกข้อความความแตกต่างเพียงอย่างเดียวคือการเพิ่มในช่วงหรือส่วนที่เลือก ต้องการย้าย AAA และ BBB สายไปยังจุดสิ้นสุดของไฟล์ที่ใช้คำสั่งเหมือน:1,2m$($ = บรรทัดสุดท้าย) :m$หรือสายตาเลือกเส้นและ


1
สำหรับเคล็ดลับเพิ่มเติมเกี่ยวกับ:moveดู vim.wikia.com/wiki/Moving_lines_up_or_downหรือเคล็ดลับ 29 การทำซ้ำหรือย้ายบรรทัดโดยใช้คำสั่ง ': t' และ ': m'ในหนังสือแนวปฏิบัติโดย D. Neil
Hotschke

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