سؤال

هل يعرف أحد طريقة للصق منطقة محددة بصريًا دون وضع التحديد في السجل الافتراضي؟

أعلم أنه يمكنني حل المشكلة عن طريق اللصق دائمًا من سجل صريح.لكن الكتابة مؤلمة في الرقبة "سص بدلا من مجرد ص

هل كانت مفيدة؟

المحلول

وسوف "{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، والتي يتوقع تسجيل لتكون الكتابة.

وهذا الرمز هو متاح في برنامج نصي <لأ href = "https://github.com/LucHermitte/lh-misc/blob/master/plugin/repl-visual-no-reg-overwrite.vim" يختلط = " noreferrer "> هناك . أيضا يعرف إنغو Karkat على المساعد حل القضية نفسها.

نصائح أخرى

وأنا لا أحب سلوك همة الافتراضي نسخ عن النص المحذوف مع 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 تتسع لاسم السجل الأخير المستخدمة في أمر الوضع العادي.

في .vimrc بك

xnoremap p "_dP

ولقد وجدت هذا من رد على موضوع مماثل، ولكن كان المصدر الأصلي HTTP: // همة. wikia.com/wiki/Replace_a_word_with_yanked_text . ويذكر بعض السلبيات، إلا أنه يعمل بشكل جيد بالنسبة لي.

وحل لوك Hermitte وتعمل مثل السحر. كنت استخدامه لمدة أسبوع أو نحو ذلك. ثم اكتشفت حل من ستيف Losh في .vimrc الذي يعمل بشكل جيد إذا 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 هو السجل.

لقد ساعدتني الإجابة على سؤال تدفق المكدس هذا: Vim - رسم الخرائط باستخدام بادئة تسجيل اختياريةبالتزامن مع بينواإجابة على هذه الصفحة

وظيفة لوك وعملت بشكل جيد بالنسبة لي بعد أن أجرى تغييرا لدعم حقيقة أن لدي الحافظة = مجموعة لم يكشف عن اسمه:

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction
و

ولوك 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>

والمحاولة -

:set guioptions-=a
:set guioptions-=A
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top