Где Sublime хранит последнюю позицию курсора ранее открытого файла? - PullRequest
0 голосов
/ 24 октября 2019

Я хочу экспортировать список последних открытых файлов (вкладок) и последнюю позицию курсора для каждого файла в редакторе Sublime . Я могу легко проанализировать файл сеанса с именем Session.sublime_session, расположенный в подпапке установки: <install path>/Data/Local/ (в Windows), чтобы получить имена файлов. Но, глядя в этот файл, нет очевидных номеров строк, которые можно найти. Или я что-то пропустил?

Где хранится последняя позиция курсора?


ОБНОВЛЕНИЕ

Я сейчасобратите внимание, что оно хранится в поле JSON, которое называется selection , и рассчитывается по количеству символов в буфере.

...
"selection":
    [
        [
            4353,
            4353
        ]
    ],
...

Таким образом, теперь возникает вопрос:Как я могу рассчитать номер строки из этого?

Возможно, написав регулярное выражение, которое подсчитывает EOL (\n s) после чтения в X число байтов. (Что если бы использовались разные EOL или usinf UTF-8 против ASCII?)

Ответы [ 2 ]

1 голос
/ 30 октября 2019

В Sublime выборки представлены в виде списка экземпляров класса Region, который, по сути, представляет собой пару смещений файла в файле. В частности, каждое число представляет собой число символов с начала файла, поэтому первый символ находится в позиции 0, второй - в позиции 1, ии т. д.

Диапазон выбора всегда начинается от первого значения до второго;если оба значения одинаковы, то выбор является обычной кареткой (то есть без видимого выбора);в противном случае это диапазон символов, который охватывает выбор. Также возможно, что второе число будет меньше первого, что означает, что выбор «назад». Во всех случаях второе значение - это место, где каретка в данный момент находится для этого выбора.

Важное отличие здесь заключается в том, что смещение составляет символов ;независимо от того, является ли кодировка нижележащего текста одним байтом на символ, двумя байтами на символ или даже чем-то вроде UTF-8, где некоторым символам требуется более одного байта для кодирования, позиция всегда представляется в символы .

Другая важная вещь, которую следует иметь в виду, - это то, что существуют разные стили завершения строки;в частности, Linux использует перевод строки, в то время как Windows использует комбинацию возврата каретки + перевода строки (2 символа). Независимо от ограничителей строки в файле, Sublime всегда нормализуется до одного символа для каждого ограничителя строки для согласованности (например, плагинам не нужно заботиться).

Итак, чтобы изменить положение символав строку / столбец необходимо знать кодировку файла и тип терминатора строки, чтобы вы могли правильно интерпретировать символы, а затем подсчитывать символы в исходных данных по одному, увеличивая номер строки на 1 (и сбрасываястолбец в 0) каждый раз, когда вы сталкиваетесь с ограничителем строки.

Это то, что делает метод view.rowcol() в API, вообще говоря;внутренняя реализация, скорее всего, использует преимущество предварительно рассчитанной строчной информации, например, на основе структуры данных в памяти.

Информация обо всех упомянутых выше классах может быть найдена в Документации Sublime API

0 голосов
/ 02 ноября 2019

С огромной помощью ответов в этом Unix SE вопросе мне удалось соединить что-то, что работает довольно хорошо. Но это зависит как от jq (для windows), так и ( Cygwin ) Bash.

jq-win64.exe -r '.windows[]|.groups[].sheets[]| "\(.file):\(.settings.selection[0][0])"' Session.sublime_session |sort | sed 's/^\/./\/cygdrive\L&\E/'

Затем я использовал это в качестве основы для извлечения количества EOL и использовал это для определения точного номера строки курсора для каждого файла.

Подсказка: используйте head -c <number> <file> | wc -l.

...