Czy ktoś wie, jak wkleić wizualnie wybrany obszar bez umieszczania zaznaczenia w domyślnym rejestrze?
Wiem, że mogę rozwiązać problem, zawsze wklejając z jawnego rejestru. Ale pisanie na maszynie "xpzamiast po prostu bolip
Czy ktoś wie, jak wkleić wizualnie wybrany obszar bez umieszczania zaznaczenia w domyślnym rejestrze?
Wiem, że mogę rozwiązać problem, zawsze wklejając z jawnego rejestru. Ale pisanie na maszynie "xpzamiast po prostu bolip
Odpowiedzi:
"{register}p
nie będzie działać tak, jak opisujesz. Zastąpi wybór treścią rejestru. Zamiast tego będziesz musiał zrobić coś takiego:
" 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()
Co powinno być w porządku, o ile nie używasz wtyczki, która ma mapę vmap inną niż nore na p i która oczekuje nadpisania rejestru.
Kod ten jest dostępny jako skrypt tam . Ingo Karkat zdefiniował również wtyczkę rozwiązującą ten sam problem.
regtype
(linewise?) I że ponowne odwzorowanie p do pgvy
jest wystarczające.
"xp
, to nie nadpisuje @"
treści @x
innympgvy
:xnoremap p pgv@=v:register.'y'<cr>
?
Nie lubię domyślne zachowanie vim kopiowania cały tekst usunięty z d
, D
, c
lub C
w domyślnym rejestrze.
Poradziłem sobie z tym, mapując d
do "_d
, c
do "_c
i tak dalej.
Z mojego .vimrc:
"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
Użyj następujących:
xnoremap p pgvy
spowoduje to ponowne zaznaczenie i ponowne szarpnięcie dowolnego tekstu wklejonego w trybie wizualnym.
Edycja: aby to działało "xp
, możesz wykonać:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
rozwija się do ostatniej nazwy rejestru używanej w poleceniu trybu normalnego.
"xp
tego podejścia nadpisuje @"
się @x
.
xnoremap p pgv"@=v:register.'y'<cr>
nie zadziałała dla mnie. To jednak robi:xnoremap <expr> p 'pgv"'.v:register.'y'
g
robi? Nie widziałem tego wcześniej.
g
sam nic nie robi. Zapewnia rozszerzone, wieloprzyciskowe polecenia, takie jak z
. Na przykład, go
przechodzi do n-tego bajtu w buforze gj
i gk
przechodzi do następnej i poprzedniej wyświetlanej linii (różni się od tego, jk
kiedy linie są zawijane), ga
wyświetla informacje o znaku pod kursorem, gJ
łączy linie bez spacji i tutaj gv
przywraca ostatnią wizualną selekcję. Możesz użyć :help gv
.
:xnoremap <expr> p 'pgv"'.v:register.'y`>'
, dodałem ``> '' Aby przywrócić pozycję kursora
W Twoim .vimrc
xnoremap p "_dP
Znalazłem to z odpowiedzi w podobnym wątku, ale oryginalne źródło to http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text . Wspomina o pewnych wadach, ale dla mnie działa dobrze.
.vimrc.local
też jest OK.
Rozwiązanie Luc Hermitte działa jak urok. Używałem go około tygodnia. Potem odkryłem rozwiązanie z .vimrc Steve'a Losha, które działa dobrze, jeśli YankRing jest częścią twojego zestawu wtyczek / pakietów:
function! YRRunAfterMaps()
" From Steve Losh, Preserve the yank post selection/put.
vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr>
endfunction
Spróbuj tego w swoim ~/.vimrc
:
xnoremap <expr> p 'pgv"'.v:register.'y'
xnoremap
oznacza, że dotyczy to tylko Visual
trybu, a nie Visual + Select
trybów.
<expr>
oznacza, że {rhs}
z xnoremap {lhs} {rhs}
ustawieniem jest oceniany jako wyrażenia.
W tym przypadku nasze wyrażenie 'pgv"'.v:register.'y'
jest using .
do konkatenacji.
v:register
jest oceniana do rejestru używanego podczas wykonywania mapowania.
Wynik "xp
byłby oceniany do pgv"xy
, gdzie x
jest rejestr.
Pomogła mi o odpowiedź na to pytanie stackoverflow: Vim - odwzorowanie z opcjonalnym przedrostkiem rejestru w związku z Benoit odpowiedź „s na tej stronie
Funkcja Luca działała dobrze dla mnie po wprowadzeniu zmiany, aby wspierać fakt, że mam zestaw clipboard = unnamed:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
clipboard=unnamedplus
tego musi być @+
zamiast @*
.
Luc Hermitte załatwił sprawę! Naprawdę dobry. Oto jego rozwiązanie, w którym zastosowano funkcję przełączania, dzięki czemu można przełączać się między normalnym zachowaniem a umieszczaniem rejestru bez zastępowania.
polecenie, u włącza zachowanie
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
zamiastvnoremap <silent> <expr> p p
programowanie taśmą klejącą, ale działa dla mnie:
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<
próbować -
:set guioptions-=a
:set guioptions-=A