ฉันได้กำหนดการแมปโอเปอเรเตอร์ซึ่งใช้พื้นที่ของข้อความจากนั้นขอสตริงการป้อนข้อมูลจากนั้นจัดพื้นที่กับTabularโดยใช้สตริงอินพุตเป็นอาร์กิวเมนต์ มันทำงานได้เป็นอย่างดี
ฉันได้ดำเนินการเช่นนี้โดยใช้vim-operator-userเพื่อช่วยกำหนดผู้ประกอบการใหม่:
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
มันควรจะทำงานได้ แต่การจัดตำแหน่งไม่ได้ทำก่อนที่ฉันจะกดนั่นคือหลังจากฉันเสร็จสิ้นการป้อนข้อมูลหมายความว่ามันทำงานในลักษณะเดียวกับฟังก์ชั่นที่ไม่มีการโต้ตอบ ฉันสงสัยว่าปัญหาอาจเป็นสิ่งที่หน้าจอ / เนื้อหาไม่ได้รับการปรับปรุงในระหว่างการดำเนินการตัวดำเนินการเพียงหลังจากนั้น
ความคิดเห็นใด ๆ เกี่ยวกับปัญหาที่อาจได้รับการชื่นชม!