sublime 在哪里存储先前打开的文件的最后一个光标位置?
Where does sublime store the last cursor position of a previosuly opened file?
我想在 Sublime 编辑器中导出最后打开的文件列表(选项卡)和每个文件的最后光标位置。我可以很容易地解析位于安装子路径中名为 Session.sublime_session
的会话文件:<install path>/Data/Local/
(在 Windows 中),以获取文件名.但是查看该文件,找不到明显的行号。还是我错过了什么?
最后一个光标位置存储在哪里?
更新
我现在看到它存储在名为 selection 的 JSON 字段中,并按字符数计算进入缓冲区。
...
"selection":
[
[
4353,
4353
]
],
...
那么现在的问题就变成了,如何从中计算出行号?
也许可以通过编写一个正则表达式来计算读入 X 个字节后的 EOL(\n
s)。 (如果使用不同的 EOL 或 usinf UTF-8 与 ASCII 会怎样?)
在 Sublime 中,选择被表示为 Region
class 的实例列表,它本质上是文件中的一对文件偏移量。特别地,每个数字是自文件开始以来的 个字符 个数,因此第一个字符位于 0
位置,第二个在位置 1
,依此类推。
选择的范围总是从第一个值到第二个值运行s;如果两个值相同,则选择只是一个普通的插入符(即没有可见的选择);否则它是选择涵盖的字符范围。也有可能第二个数字小于第一个数字,这意味着选择"backwards"。在所有情况下,第二个值是插入符号当前所在的位置。
这里重要的区别是偏移量是个字符;无论底层文本的编码是每个字符一个字节,每个字符两个字节,还是像 UTF-8 那样的编码,其中某些字符需要多个字节进行编码,位置始终以 [ 表示=29=]字符.
另一件要记住的重要事情是,可以存在不同样式的线路终止;特别是 Linux 使用换行,而 Windows 使用回车 return + 换行(2 个字符)的组合。无论文件中的行终止符如何,Sublime 总是规范化为每行终止符一个字符以保持一致性(例如,插件不需要关心)。
所以,为了把一个字符位置变成row/column,你需要知道文件的编码和行结束符类型,这样你才能正确解释字符,然后统计其中的字符一个一个地源数据,每次你 运行 进入行终止符时,行号增加 1(并将列重置为 0)。
一般来说,这就是API中的view.rowcol()
方法所做的;例如,内部实现很可能利用基于内存中数据结构的预先计算的行信息。
上面提到的所有 classes 的信息都可以在 Sublime API Documentation
中找到
在 this 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
.
我想在 Sublime 编辑器中导出最后打开的文件列表(选项卡)和每个文件的最后光标位置。我可以很容易地解析位于安装子路径中名为 Session.sublime_session
的会话文件:<install path>/Data/Local/
(在 Windows 中),以获取文件名.但是查看该文件,找不到明显的行号。还是我错过了什么?
最后一个光标位置存储在哪里?
更新
我现在看到它存储在名为 selection 的 JSON 字段中,并按字符数计算进入缓冲区。
...
"selection":
[
[
4353,
4353
]
],
...
那么现在的问题就变成了,如何从中计算出行号?
也许可以通过编写一个正则表达式来计算读入 X 个字节后的 EOL(\n
s)。 (如果使用不同的 EOL 或 usinf UTF-8 与 ASCII 会怎样?)
在 Sublime 中,选择被表示为 Region
class 的实例列表,它本质上是文件中的一对文件偏移量。特别地,每个数字是自文件开始以来的 个字符 个数,因此第一个字符位于 0
位置,第二个在位置 1
,依此类推。
选择的范围总是从第一个值到第二个值运行s;如果两个值相同,则选择只是一个普通的插入符(即没有可见的选择);否则它是选择涵盖的字符范围。也有可能第二个数字小于第一个数字,这意味着选择"backwards"。在所有情况下,第二个值是插入符号当前所在的位置。
这里重要的区别是偏移量是个字符;无论底层文本的编码是每个字符一个字节,每个字符两个字节,还是像 UTF-8 那样的编码,其中某些字符需要多个字节进行编码,位置始终以 [ 表示=29=]字符.
另一件要记住的重要事情是,可以存在不同样式的线路终止;特别是 Linux 使用换行,而 Windows 使用回车 return + 换行(2 个字符)的组合。无论文件中的行终止符如何,Sublime 总是规范化为每行终止符一个字符以保持一致性(例如,插件不需要关心)。
所以,为了把一个字符位置变成row/column,你需要知道文件的编码和行结束符类型,这样你才能正确解释字符,然后统计其中的字符一个一个地源数据,每次你 运行 进入行终止符时,行号增加 1(并将列重置为 0)。
一般来说,这就是API中的view.rowcol()
方法所做的;例如,内部实现很可能利用基于内存中数据结构的预先计算的行信息。
上面提到的所有 classes 的信息都可以在 Sublime API Documentation
中找到在 this 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
.