ในกลุ่มฉันมักจะต้องลบหรือดึง / ใส่บล็อกข้อความขนาดใหญ่
ฉันสามารถนับบรรทัดข้อความและป้อนสิ่งที่ต้องการ50dd
ลบ 50 บรรทัด
แต่นั่นเป็นความเจ็บปวดเล็กน้อย ฉันจะลบบล็อคข้อความขนาดใหญ่นี้ได้โดยไม่ต้องรู้ว่าต้องลบกี่บรรทัดล่วงหน้า?
ในกลุ่มฉันมักจะต้องลบหรือดึง / ใส่บล็อกข้อความขนาดใหญ่
ฉันสามารถนับบรรทัดข้อความและป้อนสิ่งที่ต้องการ50dd
ลบ 50 บรรทัด
แต่นั่นเป็นความเจ็บปวดเล็กน้อย ฉันจะลบบล็อคข้อความขนาดใหญ่นี้ได้โดยไม่ต้องรู้ว่าต้องลบกี่บรรทัดล่วงหน้า?
คำตอบ:
ไปที่บรรทัดเริ่มต้นของบล็อกของคุณและพิมพ์ma(ทำเครื่องหมาย "a" ถึงแม้ว่าคุณสามารถใช้ตัวอักษรที่แตกต่างกันและแม้กระทั่งตัวอักษรหลายตัวสำหรับเครื่องหมายที่แตกต่างกันหากคุณสามารถเก็บไว้ในหัวของคุณสิ่งที่ตัวอักษรแต่ละตัวเป็นเครื่องหมาย) .
จากนั้นไปที่บรรทัดสุดท้ายและป้อนd'a(ลบเพื่อทำเครื่องหมาย "A") หรือy'a(งัดเพื่อทำเครื่องหมาย "A") (ก)
ที่จะลบ / ดึงทุกบรรทัดจากปัจจุบันไปยังบรรทัดที่ทำเครื่องหมายไว้ (รวมแล้ว)
จากนั้นคุณสามารถวางไว้ที่อื่นที่มีคำสั่งวางปกติเช่นหรือpP
นอกจากนี้ยังเข้ากันได้กับvi
และvim
ในโอกาสที่สภาพแวดล้อมของคุณไม่ได้รับพรกับหลัง
(a)ฉันใช้สิ่งนี้เพื่อบันทึกสถานที่ของฉันในไฟล์ถ้าฉันต้องไปที่อื่นเพื่อหาสิ่งที่ต้องการเช่นคัดลอกการวางคำจำกัดความของฟังก์ชั่นที่ฉันต้องการโทร
ฉันเพียงแค่ทำเครื่องหมายบรรทัดปัจจุบันในลักษณะเดียวกันmaแล้วเดินออกไปเพื่อค้นหาสิ่งที่คุณกำลังมองหา
จากนั้นเมื่อฉันพบมันและคัดลอกไปยังการลงทะเบียนฉันเพียงแค่ป้อน'aเพื่อกลับไปทำเครื่องหมาย "a" บรรทัดที่ฉันบันทึกไว้ล่วงหน้าซึ่งฉันสามารถวางได้
v
ปุ่มฉันถามตัวเองว่าฉันต้องการมันมากหรือมีวิธีการเคลื่อนไหวที่ดีกว่า?
ในกลุ่มให้ใช้โหมดบรรทัดภาพ :
สำหรับการลบบล็อคข้อความขนาดใหญ่สิ่งนี้เป็นที่ต้องการมากกว่าโหมดภาพธรรมดาเพราะคุณไม่จำเป็นต้องกังวลเกี่ยวกับคอลัมน์ที่เคอร์เซอร์อยู่
}
เพื่อเลือกทั้งย่อหน้าหรือ)
ประโยค มีมากขึ้นคุณสามารถอ่านเกี่ยวกับพวกเขาใน:h object-motions
/something<CR>
เป็นวิธีที่มีประสิทธิภาพมากในการเข้าถึงจุดสิ้นสุดของบล็อกที่คุณเลือก
j
เพื่อเลื่อนเคอร์เซอร์ลง (ขั้นตอนที่ 3) คุณสามารถพิมพ์หมายเลขบรรทัดตามด้วยG
เพื่อเลือกจนกระทั่งบรรทัดนั้น ตัวอย่าง:V150Gd
คุณสามารถทำได้:set relativenumber
ดังนั้นคุณไม่ต้องนับ ;)
:set number
จากนั้นใช้ d35G เพื่อลบจนถึงบรรทัด 35
relativenumber
:-) แต่ที่ดีกว่า
คุณสามารถลบบล็อคข้อความขนาดใหญ่ได้อย่างง่ายดายซึ่งทราบถึงโครงสร้างของมัน
หากเป็นย่อหน้าให้ใช้: d{(เช่นคุณสามารถใส่คำนำหน้าด้วยจำนวนย่อหน้า)
หากเป็นโค้ดที่อยู่ในวงเล็บให้ใช้: d%
หากข้อความปรากฏขึ้นจนสิ้นสุดไฟล์ให้ใช้: dG
หากคุณรู้ว่ามันจะจบลงอย่างไรใช้: d/และพิมพ์ข้อความลงท้ายตามด้วยEnter(คุณสามารถใช้นิพจน์ทั่วไปได้
หรือใช้โหมดภาพ ( V) และใช้ปุ่มเคลื่อนไหวเพื่อเลือกข้อความ (เช่นโดย{) และลบออก ( d)
หรือตามที่ Lie Ryan แนะนำให้ใช้d/search-string/e
เพื่อลบข้อความจากเคอร์เซอร์ปัจจุบันไปยังสตริงการค้นหา
ดู: :help d
และ:help motion
สำหรับข้อมูลเพิ่มเติม
d/search-string/e
การลบจากเคอร์เซอร์ปัจจุบันไปยังจุดสิ้นสุดของสตริงการค้นหารวมถึงสตริงการค้นหาตัวเองและc/search-query
เพื่อเข้าสู่โหมดแทรกหลังจากการลบ การใช้d/
กับset incsearch
เป็นชุดค่าผสมที่ประณีตเนื่องจากช่วยให้คุณทราบได้ว่าคุณกำลังทำงานในช่วงข้อความที่ถูกต้องหรือไม่และช่วยให้คุณรู้ว่าเมื่อใดควรหยุดพิมพ์คำค้นหาเพื่อหลีกเลี่ยงการพิมพ์เกินความจำเป็น
d
กับa
(ด้านนอก) หรือi
(ด้านใน) และตัวระบุวัตถุมีประโยชน์มาก วัตถุเช่นw
สำหรับคำp
สำหรับวรรค(
หรือb
สำหรับ(...)
, [
สำหรับ[...]
, {
หรือB
สำหรับ{...}
ฯลฯเอกสารสำหรับภาพผู้ประกอบการ-
คุณสามารถใช้การเคลื่อนไหวและ / หรือวัตถุข้อความ d}
ตัวอย่างเช่นคุณสามารถลบทุกอย่างจากเคอร์เซอร์ไปที่บรรทัดว่างถัดไปด้วย หากเคอร์เซอร์อยู่ภายในย่อหน้าวรรคอาจถูกลบออกด้วยหรือdip
dap
หากเคอร์เซอร์อยู่ภายในแท็ก HTML คุณสามารถลบได้ด้วยหรือdit
dat
จำที่ดีสำหรับเหล่านี้เป็น " dหนึ่งคำที่ฉัน nside" และ " dหนึ่งคำรอบ" (วรรค / แท็ก / วงเล็บ)
ฉันมักจะทำ
:<start>,<end>d
ซึ่งจะลบทุกบรรทัดระหว่างหมายเลขเริ่มต้นและจุดสิ้นสุดที่ให้ไว้ (รวมถึงบรรทัดที่ระบุ)
โปรดทราบว่าทั้งสองstart
และend
สามารถเป็นหมายเลขบรรทัดสัมบูรณ์รูปแบบหรือออฟเซ็ตจากตำแหน่งอื่น
ดูความคิดเห็นของ doubleDown เกี่ยวกับการดูเอกสารช่วงของ Vim ซึ่งมีเคล็ดลับที่เป็นประโยชน์
ตัวอย่าง:
สมมติว่าคุณมีไฟล์ต่อไปนี้:
1. The quick brown
2. fox jumps
3. over the
4. lazy dog.
จากนั้นโดยใช้คำสั่ง:2,3d
หรือ:/fox/,/over/d
หรือ:/quick/+1,/lazy/-1
หรือ:+1,+2d
ถ้าคุณอยู่ในบรรทัดแรกหรือ:-1,.d
ถ้าคุณอยู่ในบรรทัดที่สามคุณจะได้:
1. The quick brown
4. lazy dog.
:set ruler
จากนั้นไปที่ด้านบน & ล่างของข้อความเพื่อค้นหาstart
และend
หมายเลขบรรทัดจากนั้นทำ:<start>,<end>d
:+12,+24d
<start>
และ<end>
สำหรับสิ่งนี้ :h [range]
สำหรับการอ้างอิงให้ดู ดังนั้นมันจึงยืดหยุ่นกว่าที่คุณคิดเอาไว้
หากเป็นบล็อกที่คั่นด้วย (เช่น: รหัสหรือแท็ก XML / HTML) ที่คุณกำลังติดต่อด้วยคุณสามารถวางเคอร์เซอร์ไว้ที่จุดเริ่มต้นของบล็อกและใช้โหมดภาพพร้อมกับ%
เพื่อเลือกบล็อกทั้งหมดอย่างรวดเร็วจากนั้นกดปุ่มd
เพื่อลบ
dap
เพื่อลบย่อหน้าda(
, da{
, da[
, ลบบล็อก delimeted โดยวงเล็บวงเล็บหรือวงเล็บ สำหรับ html จะมีdat
ซึ่งจะลบแท็กและda'
และda"
ลบสตริง นอกจากนี้ยังมีdip
,, di(
ฯลฯ ตัวแปรที่จะลบทุกอย่างภายในตัวคั่น แต่ปล่อยให้ตัวคั่นสมบูรณ์ หรือคุณสามารถใช้vap
(resp vip
) เพื่อเลือกย่อหน้าทั้งหมด (resp inner) (และเพื่อให้มีva(
และvi(
.) นอกจากนี้ยังมีcap
และcip
(หรือca(
และci(
) เพื่อลบและไปที่โหมดแทรก (เช่น "เปลี่ยน") และyap
จะงัด
นอกเหนือจากคำแนะนำที่ดีอื่น ๆ ทั้งหมดฉันเพิ่มd+ Shift+ Lสำหรับการลบทุกอย่างจากตำแหน่งเคอร์เซอร์ปัจจุบันไปยังบรรทัดสุดท้ายที่มองเห็นบนหน้าจอ การทำซ้ำคำสั่งจะทำให้คุณผิดหวังอย่างรวดเร็ว
numbers.vimปลั๊กอินเป็นประโยชน์อย่างมากสำหรับเรื่องนี้ มันเป็นวิธีที่พัฒนาขึ้นเพื่อนำหน้าแต่ละบรรทัดด้วยหมายเลขบรรทัด กดไลค์'number'
และ'relativenumber'
ทั้งคู่เหมือนกัน!
มันเปิดใช้งานโดยค่าเริ่มต้นหลังจากการติดตั้งคุณยังต้องการเพิ่มset number
vimrc ของคุณหากคุณยังไม่ได้รับมันเพราะมันจะทำงานในรูปแบบแปลก ๆ ถ้าคุณไม่ได้
ในโหมดปกติดูเหมือนว่า:set relativenumber
:
3 call plug#begin('~/.vim/plugged')
2
1 Plug 'myusuf3/numbers.vim'
7 set number█
1
2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
3 Plug 'Yggdroot/indentLine'
มันแสดงหมายเลขบรรทัดสัมพัทธ์แก่คุณยกเว้นบรรทัดที่เคอร์เซอร์เปิดอยู่ซึ่งจะแสดงหมายเลขบรรทัดสัมบูรณ์ (7 ในกรณีนี้)
หากเราเปลี่ยนเป็นโหมดแทรกโหมดจะทำงานเหมือนnumber
ถูกตั้งค่าโดยแสดงหมายเลขบรรทัดที่แน่นอนเสมอ:
4 call plug#begin('~/.vim/plugged')
5
6 Plug 'myusuf3/numbers.vim'
7 set number█
8
9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
10 Plug 'Yggdroot/indentLine'
มีตัวเลือกเพิ่มเติมและคำสั่งเล็กน้อย (ตรวจสอบหน้าแรก) แต่ค่าเริ่มต้นควรใช้กับคนส่วนใหญ่
set number
, set relativenumber
แล้วautocmd InsertEnter * :set norelativenumber
และautocmd InsertLeave * :set relativenumber
d/delim
Enterอีกวิธีหนึ่งคือถ้าคุณกำลังพยายามที่จะลบเป็นรูปแบบเฉพาะคุณสามารถพิมพ์
คุณสามารถใช้ขั้นตอนปกติของการป้อนdรวมทั้งการเคลื่อนไหว (ตามที่อธิบายไว้แล้วในคำตอบอื่น ๆ ) ปลั๊กอิน EasyMotion จัดเตรียมการเคลื่อนไหวใหม่ที่คุณสามารถใช้ซึ่งสามารถแก้ไขปัญหาของคุณได้อย่างรวดเร็วและง่ายดาย
สมมติว่าคุณต้องการลบจากตำแหน่งเคอร์เซอร์ปัจจุบันไปยังจุดสิ้นสุดของคำที่ระบุบนหน้าจอปุ่มการเคลื่อนไหวจะเป็น<Leader>
<Leader>
e(คล้ายกับการe
เคลื่อนไหวปกติ) จากนั้นพิมพ์ตัวอักษรที่ไฮไลต์ที่ปรากฏท้ายคำที่เป็นปัญหา <Leader>
<Leader>
jนอกจากนี้ยังมีการเคลื่อนไหวบรรทัดเพื่อให้คุณสามารถลบบรรทัดปัจจุบันลงไปที่บรรทัดในคำถามด้วย
ฉันได้ฉันสำคัญการตั้งค่าให้<Leader>
,ดังนั้นคำสั่งทั้งหมดคือd<Leader>
<Leader>
e{ตัวอักษรเน้นสี}
จาก:help easymotion
:
EasyMotion มีวิธีที่ง่ายกว่ามากในการใช้การเคลื่อนไหวเป็นกลุ่ม ใช้เวลา
<number>
ไม่เกิน<number>
w หรือ<number>
f{char}
โดยเน้นตัวเลือกที่เป็นไปได้ทั้งหมดและให้คุณกดปุ่มหนึ่งเพื่อข้ามไปยังเป้าหมายโดยตรงเมื่อหนึ่งในการเคลื่อนไหวที่มีอยู่จะถูกเรียกใช้ข้อความที่มองเห็นก่อนหน้าหรือตามเคอร์เซอร์จะจางหายไปและเป้าหมายการเคลื่อนไหวจะเน้น
แก้ไข:
EasyMotion ของพื้นที่เก็บข้อมูล GitHubที่https://github.com/Lokaltog/vim-easymotion
การredditนี้เกี่ยวกับคนที่ใช้ easymotionอาจเป็นการอ่านที่สนุก
มีวิธีแก้ปัญหาง่ายๆที่สามารถแก้ปัญหาของคุณได้
d50gg
วางเคอร์เซอร์ที่จุดเริ่มต้นของบล็อกข้อความที่คุณต้องการที่จะลบและทำ
การดำเนินการนี้จะลบบรรทัดทั้งหมดออกจากตำแหน่งปัจจุบันของคุณเป็นบรรทัดที่ 50 ของข้อความของคุณ
EQ: ถ้าเคอร์เซอร์ของคุณอยู่ที่เส้น46 , d50gg
จะลบ4เส้น
G
แทน gg เพราะมันยังใช้งานได้ใน vi และแน่นอนว่า:set number
มีประโยชน์เสมอสำหรับการค้นหาหมายเลขบรรทัดที่คุณต้องการไป
ใช้โหมดภาพด้วยการเน้นเส้น
ฉันชอบวิธีนี้ในการลบกลุ่มของรหัสเพราะมันจะลบทั้งบรรทัดเมื่อเทียบกับเพียงแค่ใช้โหมดภาพที่คุณต้องวางเคอร์เซอร์ในคอลัมน์ด้านขวาเพื่อลบสิ่งที่คุณต้องการ
ฉันไม่ชอบrelativenumber
อยู่ตลอดเวลาดังนั้นฉันจึงกำหนดค่า Vim ให้เปิดใช้งานเฉพาะเมื่อฉันอยู่ในโหมดภาพ:
" Entering Visual mode
nnoremap <silent> v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent> gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent> V :set relativenumber<CR>V
" When finished
augroup ClearCursorColumnAndLine
autocmd!
autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END
สิ่งนี้ทำให้งานของคุณง่ายขึ้น:
V49jd
เพราะหลังจากกดปุ่มVคุณจะเห็นว่าเส้นเป้าหมายอยู่ห่างออกไปมากแค่ไหน
สิ่งนี้อาจพิสูจน์ได้ว่าน่ารำคาญในระยะยาว (ตัวอักษรเลื่อนไปทางซ้ายและขวาเมื่อเปิดใช้งาน / ปิดใช้งาน relativenumber) แต่จนถึงตอนนี้ฉันค่อนข้างสนุกกับมัน
v<Esc>d50j
?
V
ถ้าฉันรู้ว่าฉันจะทำการดำเนินการที่ชาญฉลาดและจากนั้นฉันสามารถออกd
จนกว่าจะล่าสุดเพื่อความมั่นใจมากขึ้น
สิ่งที่ทำงานได้ดีสำหรับฉันด้วยvi
:
:set number
เพื่อดูจำนวนบรรทัดจนกระทั่งตำแหน่งที่ฉันต้องการลบ
+1289 idle
+1289 idle
+1290 # <- I want to delete until here
+1291 if [[ ! -z "$SFIN" ]]
กลับไปที่บรรทัดที่ต้องเริ่มต้นการลบ
d1290G
move
จบ จากนั้นการลบไปยังจุดสิ้นสุดไม่ต่างไปจากการย้ายไปยังจุดสิ้นสุด