আমি একটি অপারেটর ম্যাপিং সংজ্ঞায়িত করেছি যা পাঠ্যের অঞ্চল নিয়ে যায়, তারপরে একটি ইনপুট স্ট্রিং জিজ্ঞাসা করে এবং তারপরে আর্গুমেন্ট হিসাবে ইনপুট স্ট্রিংটি ব্যবহার করে টেবুলার দিয়ে অঞ্চলটিকে সারিবদ্ধ করে তোলে । এটি দুর্দান্তভাবে কাজ করে।
আমি নতুন অপারেটর সংজ্ঞায়িত করতে সাহায্য করার জন্য ভিআইএম-অপারেটর-ব্যবহারকারীর সাহায্যে এটি এটি প্রয়োগ করেছি :
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
এটি কাজ করা উচিত তবে প্রবেশ প্রবেশের আগে প্রান্তিককরণ করা হয় না, এরপরে আমি ইনপুট প্রবেশ করা শেষ করে, কার্যকরভাবে অর্থাত এটি অ ইন্টারেক্টিভ ফাংশনের মতো একইভাবে কাজ করে। আমি ভাবছি যে সমস্যাটি যদি কোনও অপারেটরের মৃত্যুর সময় কেবল তখনই পর্দা / সামগ্রী আপডেট না করা হয়।
সমস্যা কী হতে পারে সে সম্পর্কে কোনও ধারণা প্রশংসিত!