Как получить (автоматический) столбец переноса ↔ ширина представления в столбцах?

#python #sublimetext3 #sublime-text-plugin

#python #sublimetext3 #sublime-text-plugin

Вопрос:

Я хотел бы получить столбец, в котором текст будет заключен в «автоматическую» ширину переноса слов. Другими словами, мне нужна ширина текстового окна в столбцах. Я пробовал следующий код, однако window_to_text метод, похоже, возвращает 0 независимо от его ввода…

 max_size = ex_view.viewport_extent()
max_size = (max_size[0] - 5, 1)
print(str(ex_view.rowcol(ex_view.window_to_text(max_size))[0]))
 

Ответ №1:

Главное, что вас беспокоит здесь, это то, что метод API view.window_to_text() сообщает вам, основываясь на конкретной позиции окна, на какой текст point это ссылается, но текст point не такой, как вы думаете (или, скорее, не считается так, как вы думаете).

Содержимое буфера отображается API в виде одной длинной строки, длина которой представляет количество отображаемых символов, а a point — смещение в этой строке. Так, например, если буфер содержит текст «Привет», допустимый points диапазон текста от 0 до 4 включительно.

Поскольку view.window_to_text() он должен возвращать текстовую точку в диапазоне 0-4 (в этом примере), он определяет, какой символ ближе всего к этой позиции. Например, позиция справа от крайнего правого символа в строке возвращает точку, которая представляет последний символ в строке, а позиция, которая находится ниже всего содержимого в файле, возвращает последний символ в файле.

Чтобы использовать этот метод для определения ширины буфера (или высоты, если на то пошло), вам нужно будет протестировать, добавив в буфер достаточно текста, чтобы убедиться, что под указанной вами позицией есть текст, что, вероятно, не то, что вы хотите.

Чтобы вычислить, насколько велика область просмотра для a view в символах в общем смысле, вам нужно использовать view.em_width() и view.line_height() , которые сообщают вам ширину и высоту символа в dip соответственно. Исходя из этого, вы можете легко точно рассчитать, сколько столбцов и строк в настоящее время потенциально видны:

 >>> view.em_width()
10.0
>>> view.line_height()
22.0
>>> view.viewport_extent()
(1215.0, 775.0)
>>> 1215 // 10
121
>>> 775 // 22
35
 

Комментарии:

1. Я попытался добавить текст, который превышает последний столбец в первой строке буфера, а затем вызвать print(str(view.rowcol(view.window_to_text(max_size))[0])) max_size = view.viewport_extent(); max_size = (max_size[0] - 5, 5) значение в консоли, и результат по-прежнему равен 0. Вы знаете, почему?