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}p
sẽ 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 pgvy
là đủ.
"xp
, điều này không ghi đè @"
nội dung với @x
khô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 C
vào sổ đăng ký mặc định.
Tôi đã vượt qua nó bằng cách ánh xạ d
tới "_d
, c
tớ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 "xp
bạ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'
g
không? Tôi đã không nhìn thấy nó trước đây.
g
mộ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ụ: go
chuyển đến byte thứ n trong bộ đệm, gj
và gk
chuyển đến dòng tiếp theo và dòng hiển thị trước đó (khác với jk
thời điểm các dòng được bao bọc), ga
hiển thị thông tin về ký tự dưới con trỏ, gJ
nối các dòng không có khoảng trắng và tại đây gv
khô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.local
cũ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'
xnoremap
có nghĩa là điều này chỉ dành cho Visual
chế độ, không phải Visual + Select
chế độ.
<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 "xp
sẽ đá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! vunmap
thay 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