मैंने एक ऑपरेटर मैपिंग को परिभाषित किया है जो पाठ का एक क्षेत्र लेता है, फिर एक इनपुट स्ट्रिंग के लिए पूछता है और फिर एक तर्क के रूप में इनपुट स्ट्रिंग का उपयोग करके टैब्यूलर के साथ क्षेत्र को संरेखित करता है। यह अच्छी तरह से काम करता है।
मैंने इसे एक नए ऑपरेटर को परिभाषित करने में मदद करने के लिए विम-ऑपरेटर-उपयोगकर्ता का उपयोग करके इसे इस तरह से लागू किया है :
map \aa <Plug>(operator-align)
call operator#user#define('align', 'Align')
function! Align(motion_wiseness)
let expr = input("align: ")
if len(expr) != 0
execute "'[,']Tabularize /".expr
endif
endfunction
function! Getchar()
let c = getchar()
if c =~ '^\d\+$'
let c = nr2char(c)
endif
return c
endfunction
फिर मुझे आश्चर्य हुआ कि क्या मैं नियमित अभिव्यक्ति में प्रवेश करने के दौरान इसे मक्खी पर अपडेट कर सकता हूं। वर्तमान दृष्टिकोण के साथ समस्या यह है कि यदि आपको सही अभिव्यक्ति का उपयोग नहीं करना है तो आपको पूर्ववत करना होगा और फिर से करना होगा।
संवादात्मक प्रयास के लिए, मैंने इसे बनाया:
map \== <Plug>(operator-align-interactive)
call operator#user#define('align-interactive', 'AlignInteractive')
function! AlignInteractive(motion_wiseness)
let prompt = "Align: "
echon prompt
let expr = ""
let c = Getchar()
" CR has to be checked for separately as it acts as putting the cursor back to zero position
while c != "\<Esc>" && c != "\<CR>"
if c == "\<BS>"
if len(expr) != 0
let expr = expr[0:-2]
echon "\<CR>".substitute(expr, ".", " ", "g")
echon "\<CR>".prompt.expr
endif
else
let expr .= c
echon c
let cmd = "'[,']Tabularize /".expr
execute cmd
endif
let c = Getchar()
endwhile
endfunction
यह काम करना चाहिए, लेकिन मेरे द्वारा दर्ज किए जाने से पहले संरेखण नहीं किया जाता है, अर्थात जब मैंने इनपुट में प्रवेश किया है, तो प्रभावी रूप से अर्थ है कि यह उसी तरह काम करता है जैसे कि गैर-संवादात्मक फ़ंक्शन। मुझे आश्चर्य है कि यदि समस्या एक ऑपरेटर के निष्पादन के दौरान स्क्रीन / सामग्री को अपडेट नहीं करने जैसी कुछ हो सकती है, उसके बाद ही।
समस्या की सराहना की जा सकती है पर कोई विचार!