Việc sử dụng thanh ghi lỗ đen ("_) là gì?


15

Gần đây tôi đã đọc về thanh ghi lỗ đen "_là một thanh ghi chỉ ghi.

Tài liệu Vim mô tả nó theo cách này:

  1. Đăng ký lỗ đen "_

Khi viết vào sổ đăng ký này, không có gì xảy ra. Điều này có thể được sử dụng để xóa văn bản mà không ảnh hưởng đến các thanh ghi bình thường. Khi đọc từ đăng ký này, không có gì được trả lại.

Trong tất cả các bài báo và sách tôi đọc, các tác giả luôn sử dụng cùng một ví dụ là sử dụng thanh ghi này khi chúng ta cần xóa một số văn bản mà không xóa những gì chúng ta đã viết trước đó.

Tôi hiểu cách sử dụng này nhưng tôi ngạc nhiên bởi thực tế là tôi không thể tìm thấy các trường hợp sử dụng khác của đăng ký này, điều này dẫn tôi đến 2 câu hỏi:

  • Là đăng ký này hữu ích trong một số trường hợp sử dụng khác ? Nếu có, cái nào?

  • Nếu mục đích duy nhất của thanh ghi này là được sử dụng trong trường hợp sử dụng mà tôi đã trích dẫn trước đó, tại sao những người tạo ra Vim lại quyết định giải quyết vấn đề này bằng một thanh ghi như vậy ? Ý tôi là câu trả lời này cho thấy một giải pháp cho vấn đề ngụ ý ít nhấn phím hơn là sử dụng "_. Sử dụng "0cũng có thể tránh việc sử dụng thanh ghi lỗ đen vậy tại sao họ lại tạo ra nó?

Câu trả lời:


18

Thanh ghi lỗ đen được sử dụng trong các tình huống tương tự như /dev/null: khi bạn thực hiện một hành động thường xuất ra một cái gì đó nhưng bạn không sử dụng cho đầu ra đó.

Hành vi mặc định của Vim là "cắt", không "xóa". Trong hầu hết các trường hợp, điều đó không thành vấn đề, nhưng đôi khi, người dùng thực sự có thể cần phải "xóa". Đó là nơi đăng ký lỗ đen có ích.

Là đăng ký này hữu ích trong một số trường hợp sử dụng khác?

Thanh ghi lỗ đen ở đây để cho phép chúng ta cắt các công cụ mà không ghi đè lên thanh ghi không tên và các thanh ghi được đánh số.

Các trường hợp sử dụng có thể rất nhiều nhưng tất cả đều rất giống nhau:

  • cung cấp một "xóa" thực tế,
  • kiểm soát tốt hơn các thanh ghi, chủ yếu là không tên
  • giữ các thanh ghi được đánh số ở trạng thái ổn định
  • cắt một cái gì đó trong khi vẫn giữ được khả năng đặt từ thanh ghi không tên, cho chúng tôi "đặt lặp lại",
  • đặt một cái gì đó lên trên một cái gì đó bạn không quan tâm,
  • ngăn chặn tác dụng phụ trong kịch bản

Người ta có thể sử dụng "0pcho kịch bản "đặt lặp lại" (trường hợp sử dụng phổ biến nhất, do đó tính phổ biến của nó trong tài liệu Vim) nhưng đăng ký đó không hữu dụng như "_các kịch bản khác.


Tôi thấy các trường hợp sử dụng của bạn nhiều hơn là hậu quả của hành vi của thanh ghi này, nhưng tôi nghĩ rằng câu trả lời của bạn mô tả rõ ràng về thanh ghi này với `Thanh ghi lỗ đen ở đây để cho chúng tôi cắt các công cụ mà không ghi đè lên thanh ghi không tên và các thanh ghi được đánh số. mong đợi câu trả lời khác nhưng có vẻ như đó là cách sử dụng duy nhất của đăng ký này. Cảm ơn bạn rất nhiều vì câu trả lời của bạn!
statox

5

Bên cạnh việc xóa văn bản, bạn có thể sử dụng thanh ghi lỗ đen để xóa các thanh ghi khác. Thí dụ:

:let @a=@_

Đây là một cách để xóa sổ đăng ký "a.


2
Trong trường hợp bất cứ ai khác đọc điều này nghĩ, "Tôi tự hỏi nếu đây là một sự thay thế ngắn hơn, rõ ràng hơn :call setreg('a', [])", như tôi đã làm: đáng tiếc, câu trả lời là không. Nó hoạt động như :call setreg('a', '')(để lại "atrong đầu ra của :registerslệnh.
Rich

@Rich Ý nghĩa của việc để lại "atrong đầu ra của :registersngười không quen thuộc là gì?
Alexej Magura

@AlexejMagura Chà, nếu mục tiêu của bạn là dọn dẹp những gì bạn thấy khi xem nội dung đăng ký của mình, thì việc để lại một loạt các thanh ghi trống có thể không lý tưởng. Tôi không chắc có sự khác biệt thực tế nào khác giữa một thanh ghi bị xóa và một thanh ghi hiện có để trống không.
Giàu

1

Một sử dụng thực tế trong một chức năng. Trong chức năng dưới đây, bình luận python #được thêm và xóa tùy thuộc vào kết quả của getline('.')[0]. Nếu dòng có một bình luận thì char #bị xóa, nhưng trong trường hợp này, chúng tôi không muốn nó bị rối với thanh ghi mặc định của chúng tôi.

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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.