В Sublime выборки представлены в виде списка экземпляров класса Region
, который, по сути, представляет собой пару смещений файла в файле. В частности, каждое число представляет собой число символов с начала файла, поэтому первый символ находится в позиции 0
, второй - в позиции 1
, ии т. д.
Диапазон выбора всегда начинается от первого значения до второго;если оба значения одинаковы, то выбор является обычной кареткой (то есть без видимого выбора);в противном случае это диапазон символов, который охватывает выбор. Также возможно, что второе число будет меньше первого, что означает, что выбор «назад». Во всех случаях второе значение - это место, где каретка в данный момент находится для этого выбора.
Важное отличие здесь заключается в том, что смещение составляет символов ;независимо от того, является ли кодировка нижележащего текста одним байтом на символ, двумя байтами на символ или даже чем-то вроде UTF-8, где некоторым символам требуется более одного байта для кодирования, позиция всегда представляется в символы .
Другая важная вещь, которую следует иметь в виду, - это то, что существуют разные стили завершения строки;в частности, Linux использует перевод строки, в то время как Windows использует комбинацию возврата каретки + перевода строки (2 символа). Независимо от ограничителей строки в файле, Sublime всегда нормализуется до одного символа для каждого ограничителя строки для согласованности (например, плагинам не нужно заботиться).
Итак, чтобы изменить положение символав строку / столбец необходимо знать кодировку файла и тип терминатора строки, чтобы вы могли правильно интерпретировать символы, а затем подсчитывать символы в исходных данных по одному, увеличивая номер строки на 1 (и сбрасываястолбец в 0) каждый раз, когда вы сталкиваетесь с ограничителем строки.
Это то, что делает метод view.rowcol()
в API, вообще говоря;внутренняя реализация, скорее всего, использует преимущество предварительно рассчитанной строчной информации, например, на основе структуры данных в памяти.
Информация обо всех упомянутых выше классах может быть найдена в Документации Sublime API