Có ai biết cách dán lên vùng được chọn trực quan mà không cần đặt vùng chọn trong thanh ghi mặc định không?
Tôi biết tôi có thể giải quyết vấn đề bằng cách luôn dán từ một sổ đăng ký rõ ràng. Nhưng rất đau cổ khi gõ "xpthay vì chỉp
Có ai biết cách dán lên vùng được chọn trực quan mà không cần đặt vùng chọn trong thanh ghi mặc định không?
Tôi biết tôi có thể giải quyết vấn đề bằng cách luôn dán từ một sổ đăng ký rõ ràng. Nhưng rất đau cổ khi gõ "xpthay vì chỉp
Câu trả lời:
"{register}psẽ không hoạt động như bạn mô tả. Nó sẽ thay thế lựa chọn bằng nội dung của sổ đăng ký. Thay vào đó, bạn sẽ phải làm điều gì đó như:
" I haven't found how to hide this function (yet)
function! RestoreRegister()
let @" = s:restore_reg
return ''
endfunction
function! s:Repl()
let s:restore_reg = @"
return "p@=RestoreRegister()\<cr>"
endfunction
" NB: this supports "rp that replaces the selection by the contents of @r
vnoremap <silent> <expr> p <sid>Repl()
Điều này sẽ ổn miễn là bạn không sử dụng một plugin có vmap sang p không nore và điều đó mong muốn một đăng ký bị ghi đè.
Mã này có sẵn dưới dạng tập lệnh ở đó . Ingo Karkat cũng xác định một plugin giải quyết vấn đề tương tự.
regtype(linewise?) Và ánh xạ lại p thành pgvylà đủ.
"xp, điều này không ghi đè @"nội dung với @xkhông giống nhưpgvy
:xnoremap p pgv@=v:register.'y'<cr>sao?
Tôi không thích những hành vi vim mặc định sao chép tất cả văn bản đã xóa với d, D, c, hoặc Cvào sổ đăng ký mặc định.
Tôi đã vượt qua nó bằng cách ánh xạ dtới "_d, ctới "_c, v.v.
Từ .vimrc của tôi:
"These are to cancel the default behavior of d, D, c, C
" to put the text they delete in the default register.
" Note that this means e.g. "ad won't copy the text into
" register a anymore. You have to explicitly yank it.
nnoremap d "_d
vnoremap d "_d
nnoremap D "_D
vnoremap D "_D
nnoremap c "_c
vnoremap c "_c
nnoremap C "_C
vnoremap C "_C
Sử dụng như sau:
xnoremap p pgvy
điều này sẽ chọn lại và kéo lại bất kỳ văn bản nào được dán ở chế độ trực quan.
Chỉnh sửa: để điều này làm việc với "xpbạn, bạn có thể làm:
xnoremap p pgv"@=v:register.'y'<cr>
v:register mở rộng đến tên thanh ghi cuối cùng được sử dụng trong lệnh chế độ bình thường.
"xp, cách tiếp cận này ghi đè @"với @x.
xnoremap p pgv"@=v:register.'y'<cr>không phù hợp với tôi. Tuy nhiên, điều này thực hiện:xnoremap <expr> p 'pgv"'.v:register.'y'
gkhông? Tôi đã không nhìn thấy nó trước đây.
gmột mình không làm gì cả. Nó cung cấp các lệnh mở rộng, nhiều phím, như z. Ví dụ: gochuyển đến byte thứ n trong bộ đệm, gjvà gkchuyển đến dòng tiếp theo và dòng hiển thị trước đó (khác với jkthời điểm các dòng được bao bọc), gahiển thị thông tin về ký tự dưới con trỏ, gJnối các dòng không có khoảng trắng và tại đây gvkhôi phục lựa chọn trực quan cuối cùng. Bạn có thể sử dụng :help gv.
:xnoremap <expr> p 'pgv"'.v:register.'y`>' , tôi đã thêm `` ``> `` Để khôi phục vị trí con trỏ
Trong của bạn .vimrc
xnoremap p "_dP
Tôi tìm thấy điều này từ một phản hồi trên một chủ đề tương tự, nhưng nguồn ban đầu là http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text . Nó đề cập đến một số nhược điểm, tuy nhiên nó hoạt động tốt đối với tôi.
.vimrc.localcũng được.
Giải pháp của Luc Hermitte hoạt động như một sự quyến rũ. Tôi đã sử dụng nó trong khoảng một tuần hoặc lâu hơn. Sau đó, tôi đã phát hiện ra một giải pháp từ .vimrc của Steve Losh hoạt động hiệu quả nếu YankRing là một phần của dòng plugin / gói của bạn:
function! YRRunAfterMaps()
" From Steve Losh, Preserve the yank post selection/put.
vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr>
endfunction
Hãy thử điều này trong ~/.vimrc:
xnoremap <expr> p 'pgv"'.v:register.'y'
xnoremapcó nghĩa là điều này chỉ dành cho Visualchế độ, không phải Visual + Selectchế độ.
<expr>phương tiện mà {rhs}các xnoremap {lhs} {rhs}thiết lập được đánh giá là một biểu thức.
Trong trường hợp này, biểu thức của chúng ta 'pgv"'.v:register.'y'đang sử dụng .để nối.
v:register được đánh giá vào sổ đăng ký đang được sử dụng trong quá trình hoàn thành ánh xạ.
Kết quả của "xpsẽ đánh giá pgv"xy, xđăng ký ở đâu.
Tôi đã được trợ giúp bởi câu trả lời cho câu hỏi stackoverflow này: Ánh xạ Vim với tiền tố thanh ghi tùy chọn kết hợp với câu trả lời của Benoit trên trang này
Chức năng của Luc hoạt động tốt cho tôi sau khi tôi thực hiện thay đổi để hỗ trợ thực tế là tôi có bộ nhớ tạm = bộ không tên:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
clipboard=unnamedplusđiều này phải được @+thay vì @*.
Luc Hermitte đã làm được trò lừa gạt! Thật sự tốt. Đây là giải pháp của anh ấy đưa vào một chức năng bật tắt, vì vậy bạn có thể chuyển đổi giữa hành vi bình thường và không cần đăng ký thay thế.
lệnh, bạn chuyển đổi hành vi
let s:putSwap = 1
function TogglePutSwap()
if s:putSwap
vnoremap <silent> <expr> p <sid>Repl()
let s:putSwap = 0
echo 'noreplace put'
else
vnoremap <silent> <expr> p p
let s:putSwap = 1
echo 'replace put'
endif
return
endfunction
noremap ,p :call TogglePutSwap()<cr>
silent! vunmapthay vìvnoremap <silent> <expr> p p
lập trình băng keo, nhưng phù hợp với tôi:
nmap viwp viwpyiw
nmap vi'p vi'pyi'
nmap vi"p vi"pyi"
nmap vi(p vi(pyi(
nmap vi[p vi[pyi[
nmap vi<p vi<pyi<
thử -
:set guioptions-=a
:set guioptions-=A