ไม่มีใครรู้วิธีการวางบนพื้นที่ที่เลือกด้วยสายตาโดยไม่ต้องมีการเลือกไว้ในทะเบียนเริ่มต้น?
ฉันรู้ว่าฉันสามารถแก้ปัญหาได้โดยการวางจากการลงทะเบียนที่ชัดเจนเสมอ แต่มันปวดต้นคอ"xpแทนการพิมพ์เฉยๆp
ไม่มีใครรู้วิธีการวางบนพื้นที่ที่เลือกด้วยสายตาโดยไม่ต้องมีการเลือกไว้ในทะเบียนเริ่มต้น?
ฉันรู้ว่าฉันสามารถแก้ปัญหาได้โดยการวางจากการลงทะเบียนที่ชัดเจนเสมอ แต่มันปวดต้นคอ"xpแทนการพิมพ์เฉยๆp
คำตอบ:
"{register}p
จะไม่ทำงานตามที่คุณอธิบาย จะแทนที่การเลือกด้วยเนื้อหาของการลงทะเบียน คุณจะต้องทำสิ่งต่อไปนี้แทน:
" 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()
ซึ่งควรจะใช้ได้ตราบเท่าที่คุณไม่ได้ใช้ปลั๊กอินที่มี vmap ที่ไม่ใช่ nore เป็น p และคาดว่าจะมีการเขียนทับรีจิสเตอร์
รหัสนี้สามารถใช้ได้เป็นสคริปต์มี Ingo Karkat ยังกำหนดปลั๊กอินเพื่อแก้ปัญหาเดียวกัน
regtype
(linewise?) และการรีแมป p pgvy
เป็นก็เพียงพอแล้ว
"xp
นี้จะไม่เขียนทับ@"
เนื้อหาที่@x
ไม่เหมือนpgvy
:xnoremap p pgv@=v:register.'y'<cr>
ไงล่ะ?
ฉันไม่ชอบพฤติกรรมที่เป็นกลุ่มเริ่มต้นของการคัดลอกข้อความทั้งหมดที่ถูกลบด้วยd
, D
, c
หรือC
ลงในทะเบียนเริ่มต้น
ผมเคยไปรอบ ๆ ได้โดยการทำแผนที่d
การ"_d
, c
การ"_c
และอื่น ๆ
จาก. 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
ใช้สิ่งต่อไปนี้:
xnoremap p pgvy
สิ่งนี้จะเลือกและดึงข้อความที่วางในโหมดภาพอีกครั้ง
แก้ไข: เพื่อให้สามารถใช้งานได้"xp
คุณสามารถทำได้:
xnoremap p pgv"@=v:register.'y'<cr>
v:register
ขยายเป็นนามสกุลรีจิสเตอร์ที่ใช้ในคำสั่งโหมดปกติ
"xp
วิธีนี้จะเขียนทับ@"
ด้วย@x
.
xnoremap p pgv"@=v:register.'y'<cr>
ไม่ได้ผลสำหรับฉัน อย่างไรก็ตามสิ่งนี้ทำ:xnoremap <expr> p 'pgv"'.v:register.'y'
g
? ฉันไม่เคยเห็นมาก่อน
g
คนเดียวไม่ทำอะไรเลย มีคำสั่งแบบขยายหลายปุ่มเช่นz
. ตัวอย่างเช่นgo
ไปที่ n ไบต์ที่ n ในบัฟเฟอร์gj
และgk
ไปที่บรรทัดที่แสดงถัดไปและก่อนหน้า (แตกต่างจากjk
เมื่อมีการรวมบรรทัด) ga
แสดงข้อมูลเกี่ยวกับอักขระใต้เคอร์เซอร์gJ
รวมบรรทัดที่ไม่มีช่องว่างและที่นี่gv
จะคืนค่าการเลือกภาพล่าสุด คุณสามารถใช้:help gv
.
:xnoremap <expr> p 'pgv"'.v:register.'y`>'
ฉันเพิ่ม ``> `` เพื่อกู้คืนตำแหน่งเคอร์เซอร์
ในไฟล์ .vimrc
xnoremap p "_dP
ฉันพบนี้มาจากการตอบสนองในหัวข้อที่คล้ายกัน แต่แหล่งเดิมhttp://vim.wikia.com/wiki/Replace_a_word_with_yanked_text มันกล่าวถึงข้อเสียบางประการ แต่มันก็ใช้ได้ดีสำหรับฉัน
.vimrc.local
ก็โอเคเช่นกัน
โซลูชันของ Luc Hermitte ทำงานได้อย่างมีเสน่ห์ ฉันใช้มันประมาณหนึ่งสัปดาห์หรือมากกว่านั้น จากนั้นฉันก็ค้นพบวิธีแก้ปัญหาจาก. vimrc ของ Steve Loshที่ใช้งานได้ดีถ้า YankRing เป็นส่วนหนึ่งของปลั๊กอิน / กลุ่มผลิตภัณฑ์:
function! YRRunAfterMaps()
" From Steve Losh, Preserve the yank post selection/put.
vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr>
endfunction
ลองใช้สิ่งนี้ใน~/.vimrc
:
xnoremap <expr> p 'pgv"'.v:register.'y'
xnoremap
หมายความว่านี่เป็นVisual
โหมดเท่านั้นไม่ใช่Visual + Select
โหมด
<expr>
หมายความว่า{rhs}
การxnoremap {lhs} {rhs}
ตั้งค่านั้นได้รับการประเมินเป็นนิพจน์
ในกรณีนี้นิพจน์ของ'pgv"'.v:register.'y'
เราใช้.
สำหรับการเรียงต่อกัน
v:register
ได้รับการประเมินไปยังรีจิสเตอร์ที่ใช้ระหว่างการทำแผนที่
ผลมาจากการ"xp
ที่จะประเมินผลpgv"xy
ที่x
เป็นทะเบียน
ฉันได้รับคำตอบสำหรับคำถาม stackoverflow นี้: Vim - การแมปด้วยคำนำหน้า register ที่เป็นทางเลือก ร่วมกับคำตอบของBenoit ในหน้านี้
ฟังก์ชั่นของ Luc ทำงานได้ดีสำหรับฉันหลังจากที่ฉันทำการเปลี่ยนแปลงเพื่อรองรับความจริงที่ว่าฉันมีคลิปบอร์ด = ชุดที่ไม่มีชื่อ:
function! RestoreRegister()
let @" = s:restore_reg
if &clipboard == "unnamed"
let @* = s:restore_reg
endif
return ''
endfunction
clipboard=unnamedplus
นี้จะต้องมีแทน@+
@*
Luc Hermitte ทำเคล็ดลับ! ดีจริงๆ. นี่คือวิธีแก้ปัญหาของเขาที่ใส่ฟังก์ชันสลับเพื่อให้คุณสามารถสลับไปมาระหว่างพฤติกรรมปกติและการใส่ไม่แทนที่ลงทะเบียน
คำสั่งคุณสลับพฤติกรรม
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
แทนvnoremap <silent> <expr> p p
การเขียนโปรแกรมเทปพันท่อ แต่ใช้ได้กับฉัน:
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<
ลอง -
:set guioptions-=a
:set guioptions-=A