การลงทะเบียนหลุมดำ ("_) คืออะไร?


15

ฉันเพิ่งอ่านเกี่ยวกับการลงทะเบียนหลุมดำ"_ซึ่งเป็นการลงทะเบียนแบบเขียนอย่างเดียว

เอกสารที่เป็นกลุ่มอธิบายด้วยวิธีนี้:

  1. ทะเบียนหลุมดำ "_

เมื่อเขียนลงทะเบียนนี้ไม่มีอะไรเกิดขึ้น สามารถใช้เพื่อลบข้อความโดยไม่มีผลต่อการลงทะเบียนปกติ เมื่ออ่านจากการลงทะเบียนนี้จะไม่มีการส่งคืนสิ่งใด

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

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

  • การลงทะเบียนนี้มีประโยชน์ในกรณีการใช้งานอื่นหรือไม่? ถ้าใช่แล้วอันไหนล่ะ?

  • หากวัตถุประสงค์เดียวของการลงทะเบียนนี้จะถูกใช้ในกรณีการใช้งานที่ฉันยกมาก่อนทำไมผู้สร้าง Vim จึงตัดสินใจแก้ปัญหานี้ด้วยการลงทะเบียนดังกล่าว ? ผมหมายถึงคำตอบนี้"_แสดงให้เห็นถึงวิธีการแก้ปัญหาที่เกิดขึ้นซึ่งหมายถึงการกดแป้นพิมพ์น้อยกว่าการใช้ การใช้"0สามารถหลีกเลี่ยงการใช้การลงทะเบียนหลุมดำดังนั้นทำไมพวกเขาจึงสร้างมันขึ้นมา?

คำตอบ:


18

การลงทะเบียนหลุมดำจะใช้ในสถานการณ์เดียวกับ/dev/null: เมื่อคุณทำการกระทำที่ปกติจะส่งผลบางอย่าง แต่คุณไม่ได้ใช้สำหรับผลลัพธ์นั้น

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

การลงทะเบียนนี้มีประโยชน์ในกรณีการใช้งานอื่นหรือไม่?

ทะเบียนหลุมดำอยู่ที่นี่เพื่อให้เราตัดสิ่งต่าง ๆ โดยไม่ขัดขวางการลงทะเบียนที่ไม่มีชื่อและหมายเลขทะเบียน

กรณีการใช้งานที่เป็นไปได้มีมากมาย แต่มีลักษณะคล้ายกันมาก:

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

หนึ่งสามารถใช้"0pสำหรับสถานการณ์ "ใส่ซ้ำ" (กรณีการใช้งานบ่อยที่สุดดังนั้นความแพร่หลายในวรรณคดีกลุ่ม) แต่การลงทะเบียนนั้นอยู่ไกลจากการเป็นประโยชน์"_สำหรับสถานการณ์อื่น ๆ


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

5

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

:let @a=@_

"aนี้เป็นวิธีหนึ่งของการล้างลงทะเบียน


2
ในกรณีที่คนอื่นที่อ่านข้อความนี้คิดว่า "ฉันสงสัยว่านี่เป็นวิธีที่สั้นกว่าและชัดเจนกว่า:call setreg('a', [])" อย่างที่ฉันเคยทำ: ที่น่าเสียใจคำตอบคือไม่ มันทำหน้าที่เหมือน:call setreg('a', '')(ออก"aในการส่งออกของ:registersคำสั่ง.
รวย

@ ที่มีความสำคัญในการออก"aในการส่งออก:registersสำหรับมือใหม่คืออะไร?
Alexej Magura

@AlexejMagura ดีถ้าเป้าหมายของคุณคือการจัดระเบียบสิ่งที่คุณเห็นเมื่อดูเนื้อหาการลงทะเบียนของคุณจากนั้นการออกจากทะเบียนที่ว่างเปล่าอาจไม่เหมาะ ฉันไม่แน่ใจว่ามีความแตกต่างในทางปฏิบัติอื่น ๆ ระหว่างการลงทะเบียนที่ถูกลบกับที่มีอยู่ที่ว่างเปล่าหรือไม่
รวย

1

ใช้งานได้จริงในฟังก์ชั่นเดียว ในฟังก์ชั่นการร้องความคิดเห็นหลามจะมีการเพิ่มและลบออกไปขึ้นอยู่กับผลการ# getline('.')[0]หากบรรทัดมีความคิดเห็นถ่าน#จะถูกลบ แต่ในกรณีนี้เราไม่ต้องการให้ระเบียบกับการลงทะเบียนเริ่มต้นของเรา

function! ToggleComment()
    let l:win_view = winsaveview()
    if getline('.')[0] == "#"
        normal! 0"_x
    else
        normal! I#
    endif
    call winrestview(l:win_view)
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
vnoremap <Leader>t <C-o>:call ToggleComment()<CR>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.