मैं इस तरह यह करना चाहते हैं:
:%s/\v(foo|bar)/\={'foo':'bar','bar':'foo'}[submatch(0)]/g
लेकिन वह बहुत ज्यादा टाइपिंग है, तो मैं ऐसा करने चाहते हैं:
function! Mirror(dict)
for [key, value] in items(a:dict)
let a:dict[value] = key
endfor
return a:dict
endfunction
function! S(number)
return submatch(a:number)
endfunction
:%s/\v(foo|bar)/\=Mirror({'foo':'bar'})[S(0)]/g
लेकिन वह अभी भी दो बार foo
और bar
टाइपिंग तो मैं कुछ इस तरह करते हैं चाहते हैं की आवश्यकता है: आप परिसीमक में पारित करने के लिए है
function! SwapWords(dict, ...)
let words = keys(a:dict) + values(a:dict)
let words = map(words, 'escape(v:val, "|")')
if(a:0 == 1)
let delimiter = a:1
else
let delimiter = '/'
endif
let pattern = '\v(' . join(words, '|') . ')'
exe '%s' . delimiter . pattern . delimiter
\ . '\=' . string(Mirror(a:dict)) . '[S(0)]'
\ . delimiter . 'g'
endfunction
:call SwapWords({'foo':'bar'})
यदि आपके शब्दों में से एक एक /
होता है, आप जो पता अपने शब्दों से कोई भी शामिल है,
:call SwapWords({'foo/bar':'foo/baz'}, '@')
.eg यह भी एक ही बार में शब्द के कई जोड़े स्वैप करने के लिए सक्षम होने का लाभ है।
:call SwapWords({'foo':'bar', 'baz':'quux'})
स्रोत
2010-08-26 20:12:48
आप सुपरयूसर.com पर इस प्रश्न को भी आजमा सकते हैं। – janmoesen
यह एक अच्छा सवाल है - कोई यह आसान सोचता है ... मुझे लगता है कि कोई ऐसा फ़ंक्शन लिख सकता है जो दो पैरामीटर स्वीकार करता है और आपके लिए तीन चरणों के माध्यम से जाता है, लेकिन मुझे एक त्वरित वेब खोज के साथ ऐसा फ़ंक्शन ढूंढने की भी उम्मीद है । – Jay
यदि आपकी फ़ाइल में "string_c" पहले से मौजूद है तो यह दृष्टिकोण विफल हो जाएगा। यह ठीक है अगर आप एक इंसान हैं और एक शब्द चुन सकते हैं जो आप जानते हैं कि आपकी फाइल में नहीं है, लेकिन एक अच्छा मध्यस्थ शब्द अनुमान लगाने के लिए एक समारोह को पढ़ना अधिक कठिन होगा। एक पास में ऐसा करने के लिए बेहतर है। –