Planning is about doing commitment and about splitting committed user stories to tasks.
have a planning session with him after he is back.
Definitely no. Planning session after he is back doesn't make sense because commitment had to be already done.
have a planning session with him before he goes on annual leave i.e. before sprint planning.
Definitely no. There should be no planning when current sprint is not completed = result of current sprint is unknown and nobody knows if all user stories will be completed and customer will be satisfied with them on review.
don't schedule him for any task and assign him on non sprint tasks e.g. spikes etc
Definitely no. He will be back and his capacity should be used for sprint target.
have his peers plan on his behalf during sprint planning and absent person can then add tasks when he is back and if he cannot do all the work he can descope.
This is correct. The team does commitment - not particular team member. Team commits to set of user stories because they know their velocity and based on their professional guess they can modify commitment for the next sprint based on available capacity. There should be no tasks assigned to single developer upfront. Developers should be cross functional even it is not always possible, they should still be able to at least split user story to tasks. There can be problem with estimating tasks but in my opinion it is not needed at all.
have him sit with another developer and do pair programming for a while.
Definitely no. Pair programming should be covered by velocity itself. If you don't count with developer it is same like saying that he will be away whole sprint. Why should customer pay time of developer who did nothing during the sprint?