Làm một plugin hoặc mã hóa này trong vimscript có vẻ hơi nặng. Tôi tin vào một vim không có plugin và bố cục tốt với các công cụ bên ngoài.
Đây là lệnh 1 lần, dựa trên user2571881, hoạt động ngay cả khi bộ đệm chưa được lưu.
:%!awk -F '|' '{print; sum+=$4}; END {print "Total: "sum}'
Nếu bạn muốn lưu lệnh này để sử dụng trong tương lai, bạn có thể muốn đặt tên cho nó:
:command! -range=% -nargs=1 SumColumn <line1>,<line2>!awk -F '|' '{print; sum+=$('<args>' + 1)} END {print "Total: "sum}'
Nó hoạt động với lựa chọn trực quan. Nếu bạn chọn một vài hàng và chuyển sang chế độ lệnh, vim sẽ thêm tiền tố vào lệnh của bạn :'<,'>
, đó là phạm vi dòng cho lựa chọn trực quan. Vì vậy, bạn có thể chạy:
:'<,'>SumColumn 3
và nó sẽ chỉ tổng cột thứ 3 của các hàng được chọn. Theo mặc định, phạm vi là %
, vì vậy
:SumColumn 3
sẽ tổng hợp cột thứ 3 của tất cả các dòng.
EDIT: Nếu bạn muốn có thể chỉ định các dấu tách trường khác và mặc định cột được tính đến cột cuối cùng, bạn có thể bao gồm lệnh trong bash
và xử lý các đối số với nó, như sau:
:command! -range=% -nargs=* SumColumn <line1>,<line2>!bash -c 'awk -F ${2:-|} "{print; sum+=\$(${1:-NF - 2} + 1)} END {print \"Total: \"sum}"' sumcolumn <args>
Hiện nay,
:SumColumn
sẽ đếm cột cuối cùng của bảng có "|" dải phân cách
:SumColumn 3
sẽ đếm cột thứ 3 của bảng có "|" dải phân cách trường và
:SumColumn 3 +
sẽ đếm cột thứ 3 của bảng có dấu phân cách trường "+".