def _completion_move(self, p_step, p_size):
        """
        Visually selects completion specified by p_step (positive numbers
        forwards, negative numbers backwards) and inserts it into edit_text.

        If p_step results in value out of range of currently evaluated
        completion candidates, list is rewinded to the start (if cycling
        forwards) or to the end (if cycling backwards).
        """
        current_position = self.completion_box.focus_position

        try:
            self.completion_box.set_focus(current_position + p_step)
        except IndexError:
            position = 0 if p_step > 0 else len(self.completion_box) - 1
            self.completion_box.set_focus(position)

        maxcols, = p_size
        size = (maxcols, self.completion_box.height)
        self.completion_box.calculate_visible(size)

        candidate = self.completion_box.focus.original_widget.text
        self.insert_completion(candidate)
Visually selects completion specified by p_step (positive numbers
        forwards, negative numbers backwards) and inserts it into edit_text.

        If p_step results in value out of range of currently evaluated
        completion candidates, list is rewinded to the start (if cycling
        forwards) or to the end (if cycling backwards).