Как получить длину текущей строки (или смещение конца строки) в плагине Gedit - PullRequest
3 голосов
/ 18 ноября 2011

В плагине Gedit, написанном на Python, я могу получить смещение начала текущей строки с помощью

document = window.get_active_document()
offset = document.get_iter_at_mark(document.get_insert())

Как я могу получить смещение конца этой же строки?Сейчас я использую обходной путь: я получаю смещение следующей строки и вычитаю из нее смещение желаемой строки и вычитаю 1 (с особым случаем, обработанным для последней строки).Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 03 января 2012

Немного поздно, я знаю, но лучше поздно, чем никогда.Я использую gedit 3.2.3, и я не знаю, насколько эти вещи меняются от одной версии к другой, но это работает для меня:

line_types = {"cr-lf": '\r\n',
              "lf": '\n',
              "cr": '\r'}
document = window.get_active_document()
newline = line_types[document.get_newline_type().value_nick]
insert_mark = document.get_insert()
offset = document.get_iter_at_mark(insert_mark)
line = offset.get_line()
# we subtract 1 because get_chars_in_line() counts the newline character
# there is a special case with the last line if it doesn't have a newline at the end
# we deal with that later
line_length = offset.get_chars_in_line() - len(newline)
end_of_line = document.get_iter_at_line_offset(line, line_length)
if end_of_line.get_char() != newline[0]:
    end_of_line = document.get_iter_at_offset(end_of_line.get_offset()+len(newline))
# if the above code is correct this should select from the current insert point
# to the end of line
document.move_mark(insert_mark, end_of_line)

Редактировать 1: Не учитывал случай, когдафайл не был прерван символом новой строки

Редактировать 2: Учет различных определений конца строки

PS: является ли это или ваше текущее решение «чище» или «лучше»,Я не знаю, я думаю, это субъективно.

...