Tôi có thể làm cho Vim cũng lưu lại những phần xóa nhỏ của Wikipedia vào đăng ký "1 không?


14

Gần đây tôi đã gỡ bỏ plugin YankRing khỏi thiết lập của mình một phần vì nó gây ra một số vấn đề với macro, nhưng chủ yếu là vì tôi đã quyết định tốt hơn là nên tự mình sử dụng các thanh ghi của Vim - đặc biệt là cách văn bản bị xóa được lưu trữ ban đầu trong đăng ký "1và sau đó chuyển qua "2, "3v.v. vì việc xóa thêm được thực hiện là rất hữu ích.

Tuy nhiên, khi xóa / thay đổi sẽ xóa ít hơn một dòng văn bản, thay vào đó, nó được lưu trong "-thanh ghi xóa nhỏ (với một vài ngoại lệ cho các lệnh di chuyển nhất định). Nếu việc xóa nhỏ tiếp theo được thực hiện, bit văn bản đó sẽ bị mất.

Có thể có được Vim để lưu trữ tất cả các xóa trong đăng ký "1?

nnoremap d "1d gần như hoạt động, nhưng bạn kết thúc với văn bản trong cả hai thanh ghi "1 "2 .

Tôi không quan tâm liệu chức năng của thanh ghi xóa nhỏ có bị ảnh hưởng hay không. Đề nghị tôi thay đổi hành vi của mình để lưu các xóa nhỏ vào một thanh ghi có tên chắc chắn sẽ không phải là một câu trả lời hữu ích - đó là những gì tôi đang làm.

Câu trả lời:


10

Điều này được sử dụng để làm việc trong các phiên bản Vim 7.3 cũ hơn khi bạn :set clipboard=unnamed(xem cuộc thảo luận Reddit này , do lỗi, mà tôi đã báo cáo ở đây .

Chủ đề đó chứa một bản vá của Aryeh Leib Taurog giới thiệu một 'regone'tùy chọn. Điều này đã đưa nó vào danh sách việc cần làm (quá dài), nhưng không chắc sẽ sớm được kết hợp. Vì vậy, hiện tại bạn chỉ có tùy chọn hạ cấp xuống một Vim đã lỗi thời hoặc tự xây dựng Vim với bản vá đó (và thúc đẩy việc áp dụng trên danh sách gửi thư vim_dev ).


1
Hấp dẫn! (Đặc biệt là ý tưởng của bạn về ngưỡng.) Cảm ơn thông tin. Gonna không giữ upvote / chấp nhận trong thời gian này để cố gắng khuyến khích ai đó đưa ra một số VimScript điên rồ để làm điều này trong thời gian tạm thời.
Giàu

5

Tôi đã có một giải pháp bằng chứng khái niệm hoạt động cho dlệnh với chuyển động và ở chế độ trực quan. Đây chưa phải là một giải pháp hoàn toàn mạnh mẽ (ví dụ, d[count]dkhông hoạt động và cũng không [count]D), nhưng nó gần như bao gồm tất cả các trường hợp sử dụng thực tế của tôi.

Nó hoạt động bằng cách thiết lập chức năng vận hành khách hàng:

  1. lưu trữ nội dung của các thanh ghi 1 Lời8 trong một từ điển,
  2. thực hiện xóa vào đăng ký 1,
  3. thiết lập các thanh ghi 2 Lời9 cho các nội dung đã lưu trước đó của các thanh ghi 1.

Xem :help map-operatorđể được giải thích về cách hoạt động của các chức năng vận hành.

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 

Xin lỗi vì nhận xét về một câu trả lời cũ. Tôi đã áp dụng giải pháp này cho yccnvim của tôi không vào chế độ chèn sau hành động ... Hiện tại tôi phải execute lstartinsertđó không phải là cách khắc phục thích hợp (như c$sẽ đặt con trỏ sai vị trí). Có ý kiến ​​gì không?
Nắng Pun

2

Kiểm tra Yêu cầu kéo vào trình chỉnh sửa neovim :

[RFC] Thêm tùy chọn để sử dụng các thanh ghi được đánh số cho các lần xóa nhỏ hơn # 8169

Tôi đã cố gắng thêm smalldeltùy chọn, cho phép bạn định cấu hình số lượng ký tự bị xóa tối thiểu được đẩy vào các thanh ghi được đánh số "1 .." 9

Bản phát hành neovim tiếp theo sau khi PR này được hợp nhất (nếu điều này xảy ra) sẽ chứa tùy chọn này.

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.