Làm thế nào để tôi trống tất cả các thanh ghi trong vim?


1

Làm cách nào để xóa các giá trị liên quan đến tất cả các thanh ghi trong vim?

Tôi tìm thấy đoạn trích này trên web:

function! ClearRegisters()
    let regs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-="*+'
    let i=0
    while (i<strlen(regs))
        exec 'let @'.regs[i].'=""'
        let i=i+1
    endwhile
endfunction

command! ClearRegisters call ClearRegisters()

Nó gần như hoạt động, nhưng nó đặt một giá trị trống vào mỗi thanh ghi, thay vì xóa thanh ghi. Điều quan trọng, điều đó có nghĩa là khi bạn sử dụng :registerslệnh, tất cả các thanh ghi vẫn hiện diện, điều này làm cho màn hình trở nên cồng kềnh (mặc dù đáng chú ý là nếu bạn thoát vim và tải lại, thì các thanh ghi sẽ bị xóa hoàn toàn, ngay cả khi viminfođược đặt lên để cứu họ).

Làm cách nào tôi có thể xóa hoàn toàn tất cả các thanh ghi để :registerskhông hiển thị chúng và không cần khởi động lại?


Theo như tôi biết thì không có cách nào để làm điều này
FDinoff

Tại sao chính xác bạn muốn ẩn các thanh ghi?
romainl

Câu trả lời:


3

Không giống như các nhãn hiệu có :delmarkslệnh và giá trị "không được đặt" đặc biệt, các thanh ghi không thể bị xóa. Một thanh ghi trống là gần nhất với trạng thái "không sử dụng" mà bạn có thể nhận được. (Tuy nhiên, Vim và :registerslệnh thực hiện hành vi đặc biệt mà bạn đã quan sát thấy các thanh ghi chưa được khởi tạo chưa được khôi phục từ tệp viminfo bị bỏ qua trong đầu ra.)

Tôi nghĩ những gì bạn muốn sau là một :Registerslệnh tùy chỉnh mở rộng (thậm chí bạn có thể đặt bí danh cho lệnh gốc chữ thường với một plugin :cmaphoặc cmdalias ) mà bỏ qua các thanh ghi trống từ đầu ra của nó, như thế này:

function! s:Registers( arguments )
    redir => l:registersOutput
        silent! execute 'registers' a:arguments
    redir END
    for l:line in split(l:registersOutput, "\n")
        if l:line !~# '^"\S\s*$'
            echo l:line
        endif
    endfor
endfunction
command! -nargs=? Registers call <SID>Registers(<q-args>)

Ngoài ra, bạn có thể viết một bản vá Vim để giới thiệu một :delregisterslệnh. Nó không quá khó để viết; về cơ bản nó phải đặt y_regs[i].y_arraycấu trúc thành NULL(xem ops.ctrong mã nguồn Vim).


1

Đặt cái này trong .vimrc:

command! WipeReg for i in range(34,122) | silent! call setreg(nr2char(i), []) | endfor

và xóa mọi đăng ký với :WipeReg

Nếu bạn muốn điều đó xảy ra mỗi khi bạn bắt đầu, Vim cũng thêm:

autocmd VimEnter * WipeReg
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.