class Reline::Unicode

def self.vi_backward_word(line, byte_pointer)

def self.vi_backward_word(line, byte_pointer)
  width = 0
  byte_size = 0
  while 0 < (byte_pointer - byte_size)
    size = get_prev_mbchar_size(line, byte_pointer - byte_size)
    mbchar = line.byteslice(byte_pointer - byte_size - size, size)
    if mbchar =~ /\S/
      if mbchar =~ /\w/
        started_by = :word
      else
        started_by = :non_word_printable
      end
      break
    end
    width += get_mbchar_width(mbchar)
    byte_size += size
  end
  while 0 < (byte_pointer - byte_size)
    size = get_prev_mbchar_size(line, byte_pointer - byte_size)
    mbchar = line.byteslice(byte_pointer - byte_size - size, size)
    case started_by
    when :word
      break if mbchar =~ /\W/
    when :non_word_printable
      break if mbchar =~ /[\w\s]/
    end
    width += get_mbchar_width(mbchar)
    byte_size += size
  end
  [byte_size, width]
end