ฉันสามารถทำให้ Vim บันทึก "การลบขนาดเล็ก" ลงในการลงทะเบียน "1 ได้หรือไม่


14

ฉันเพิ่งลบปลั๊กอิน YankRing ออกจากการตั้งค่าของฉันส่วนหนึ่งเพราะมันทำให้เกิดปัญหาบางอย่างกับมาโคร แต่ส่วนใหญ่เป็นเพราะฉันตัดสินใจว่าจะเป็นการดีกว่าถ้าฉันจะฝึกตัวเองให้ใช้รีจิสเตอร์ Vim แทน - โดยเฉพาะอย่างยิ่ง"1แล้วขยับตัวขึ้นผ่าน"2, "3ฯลฯ เป็นลบต่อไปจะทำให้เป็นประโยชน์อย่างมาก

อย่างไรก็ตามเมื่อการลบ / การเปลี่ยนแปลงลบข้อความน้อยกว่าหนึ่งบรรทัดมันจะถูกเก็บไว้ในการ"-ลบการลงทะเบียนขนาดเล็กแทน(มีข้อยกเว้นเล็กน้อยสำหรับคำสั่งการเคลื่อนไหวบางอย่าง) หากทำการลบขนาดเล็กในลำดับต่อมาข้อความส่วนนั้นจะหายไป

เป็นไปได้ไหมที่จะให้ Vim เก็บการลบทั้งหมดในการลงทะเบียน"1?

nnoremap d "1d เกือบจะทำงาน แต่คุณท้ายด้วยข้อความทั้งในการลงทะเบียนและ"1 "2

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

คำตอบ:


10

ที่ใช้ในการทำงานในกลุ่มที่มีอายุมากกว่า 7.3 รุ่นเมื่อคุณ:set clipboard=unnamed(ดูการอภิปราย Reddit นี้เป็นผลมาจากข้อผิดพลาดซึ่งผมเคยรายงานไว้ที่นี่

ชุดข้อความนั้นมีโปรแกรมแก้ไขโดย Aryeh Leib Taurog ซึ่งแนะนำ'regone'ตัวเลือก สิ่งนี้ทำให้มันเป็นรายการสิ่งที่ต้องทำ (ยาวเกินไป) แต่ไม่น่าจะถูกรวมเข้าไว้ในไม่ช้า ดังนั้นขณะนี้คุณมีเพียงตัวเลือกในการปรับลดรุ่นเป็น Vim ที่ล้าสมัยหรือสร้าง Vim ด้วยตัวคุณเองด้วยโปรแกรมปะแก้นั้น (และผลักดันการนำไปใช้กับรายการส่งจดหมาย vim_dev )


1
! ที่น่าสนใจ (โดยเฉพาะอย่างยิ่งความคิดของคุณเกี่ยวกับเกณฑ์) ขอบคุณสำหรับข้อมูล จะระงับการโหวต / ยอมรับในขณะที่อยู่ในความพยายามที่จะสนับสนุนให้ใครบางคนมากับ VimScript บ้าที่จะทำสิ่งนี้ในระหว่างกาล
Rich

5

ฉันมีวิธีพิสูจน์แนวความคิดที่ทำงานกับdคำสั่งด้วยการเคลื่อนไหวและในโหมดภาพ ยังไม่ได้แก้ปัญหาอย่างสมบูรณ์ (ตัวอย่างเช่นd[count]dไม่ทำงานและไม่ได้[count]D) แต่มันครอบคลุมเกือบทุกกรณีการใช้งานจริงของฉัน

มันทำงานโดยการตั้งค่าฟังก์ชั่นผู้ประกอบการของลูกค้าที่:

  1. เก็บเนื้อหาของการลงทะเบียน 1-8 ในพจนานุกรม
  2. ทำการลบลงทะเบียน 1
  3. ตั้งค่าการลงทะเบียน 2-9 ให้กับเนื้อหาที่บันทึกไว้ก่อนหน้าของการลงทะเบียน 1-8

ดู:help map-operatorคำอธิบายเกี่ยวกับการทำงานของผู้ปฏิบัติงาน

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 

ขออภัยที่แสดงความคิดเห็นในคำตอบเก่า ฉันนำโซลูชันนี้ไปใช้yและcสำหรับcnvim ของฉันไม่ได้เข้าสู่โหมดแทรกหลังจากการกระทำ ... ขณะนี้ฉันต้องทำexecute lและstartinsertวิธีการแก้ไขที่ไม่เหมาะสม (เช่นc$จะวางเคอร์เซอร์ในตำแหน่งที่ไม่ถูกต้อง) ความคิดใด ๆ
ซันนี่ปุน

2

ตรวจสอบคำขอดึงเข้าไปในตัวแก้ไขneovim :

[RFC] เพิ่มตัวเลือกเพื่อใช้การลงทะเบียนหมายเลขสำหรับการลบขนาดเล็ก # 8169

ฉันพยายามเพิ่มsmalldelตัวเลือกซึ่งช่วยให้คุณสามารถกำหนดจำนวนอักขระที่ถูกลบขั้นต่ำที่จะถูกผลักเข้าไปในทะเบียนเลข "1 .. " 9

รุ่น neovim ถัดไปหลังจากรวม PR แล้ว (หากเกิดเหตุการณ์นี้) จะมีตัวเลือกนี้

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