笔记-- 判断字符串是否以英文开头,是否是数字开头,是否包含英文字母

/**
 * 判断是否包含英文字母
 * @param str
 * @return
 */
public boolean checkIsContainsEnglish(String str) {
    String regex=".*[a-zA-Z]+.*";
    Matcher m= Pattern.compile(regex).matcher(str);
    return m.matches();
}

/**
 * 判断是否是英文开头
 * @param fstrData
 * @return
 */
private boolean checkFirstIsEnglish(String fstrData){
    char   c   =   fstrData.charAt(0);
    if(((c>='a'&&c<='z')   ||   (c>='A'&&c<='Z'))) {
        return   true;
    }else{
        return   false;
    }
}

/** 
* 判断是否是数字开头
 * @param fstrData
 * @return 
*/
private boolean checkFirstIsNum(String fstrData){
    char   c   =   fstrData.charAt(0);
    if(c>='0' && c<='9'){
        return   true;
    }else{
        return   false;
    }
}
<think>我们正在讨论卢曼笔记的命名规则,并希望在Mac的备忘录应用中实现自动化编号。 卢曼笔记法(Zettelkasten)使用唯一的标识符来连接笔记。通常,标识符是数字字母的组合,形成层次结构(例如:1, 1a, 1a1, 1a2, 1b, 2, ...)。这种结构允许笔记在逻辑上分支和扩展。 在Mac的备忘录应用中,我们可以使用AppleScript或快捷指令(Shortcuts)来实现自动生成这种编号并创建笔记。 由于备忘录应用本身并不直接支持这种层级编号,我们需要通过脚本来管理。基本思路是: 1. 维护一个计数器或从现有笔记中推断下一个可用的编号。 2. 根据用户选择的父级笔记(如果有)来确定新笔记的层级编号。 3. 创建新笔记并赋予其计算出的编号作为标题。 然而,Mac备忘录的AppleScript支持有限(特别是在Big Sur及以后版本中,备忘录的脚本支持被削弱)。因此,我们可能需要结合使用快捷指令和其他方法。 这里提供一个使用AppleScript的方案,但请注意,新版本的备忘录可能不支持某些功能。如果AppleScript不行,我们可以考虑使用快捷指令,但快捷指令对备忘录的操作也有限。 步骤: 1. 获取现有笔记的标题,提取出已有的卢曼编号,以便生成下一个编号。 2. 确定当前笔记的层级关系(例如,用户可能选中了一个笔记作为父笔记)。 3. 生成新笔记的编号:如果是在顶级,则用下一个整数;如果是在某个笔记下,则在该笔记的编号后添加分支(例如,在1a下添加则可能是1a1,1a2,...)。 但是,由于备忘录应用没有提供通过AppleScript获取笔记树形结构的功能,我们可能需要维护一个外部文件来记录笔记的层次和最后一个编号。 另一种更简单的方法:我们只生成顶级编号和直接子级编号,而不构建复杂的树。用户每次创建笔记时,可以选择一个父笔记(通过选择笔记),然后脚本会读取父笔记的标题,提取其编号,然后为该父笔记创建下一个子编号。 实现步骤(AppleScript): 1. 获取当前选中的笔记(作为父笔记)。 2. 从父笔记的标题中提取出卢曼编号(假设标题就是编号开头,后面跟着标题内容,例如:"1a 这是一个主题")。 3. 获取该父笔记的所有直接子笔记(这需要遍历所有笔记,然后根据标题前缀匹配,例如所有以"1a"开头笔记,然后找出1a1,1a2等)。 4. 确定下一个子编号(例如,当前最大的子编号是1a3,那么下一个就是1a4)。 5. 创建新笔记,标题为新的编号(然后用户可以继续编辑标题,加上描述文字)。 但是,由于备忘录应用没有文件夹结构,所有笔记都是平铺的,所以我们需要通过标题来模拟层次结构。 注意:这个方案依赖于标题的格式。我们假设笔记的标题格式为:<编号> [空格] <描述>。 由于AppleScript对备忘录的操作有限,以下是一个简化的版本,它只处理顶级和一级子笔记(更深层次需要递归,但这里简化): 我们将编写两个脚本: - 创建顶级笔记:编号为下一个整数(例如,当前最大编号是3,则下一个是4)。 - 创建子笔记:基于选中的笔记创建子笔记,编号为父编号加上下一个数字后缀(例如,父编号是1a,已有子笔记1a1,1a2,则下一个是1a3)。 由于维护所有笔记的层次结构比较复杂,我们可以每次只根据选中的父笔记来创建子笔记,而顶级笔记则按整数顺序创建。 实现: 首先,我们需要一个函数来获取当前备忘录中所有笔记的标题,然后提取出所有的顶级编号(整数)和子编号(带字母数字后缀)。 但是,由于我们可能有很多笔记,而且AppleScript处理大量笔记可能较慢,所以我们可以考虑只处理标题。 步骤: 1. 获取所有笔记的标题。 2. 提取所有顶级编号(即没有点的数字,如1,2,3)和子编号(如1a,1b,2a等)。注意,我们的编号规则是:顶级是整数,子级是在整数后加一个小写字母,再下一级是在字母后加数字(如1a1)。但为了简单,我们先只实现两级:顶级(整数)和一级子级(整数+字母)。 然而,卢曼编号可以有更深的层级,但我们可以逐级扩展。为了简化,我们只考虑两层,但设计上可以扩展。 由于时间有限,我们先实现一个基础版本:只处理顶级和直接子级(一级)。 顶级笔记的编号:从1开始的整数,取当前最大的整数+1。 子笔记的编号:在父编号(假设是整数)后添加一个字母。例如,父编号是1,那么它的第一个子笔记是1a,第二个是1b,以此类推。 但注意,卢曼的原始方法中,子笔记可以继续分支(例如1a1,1a2)。所以我们可以这样设计: - 顶级:1,2,3,... - 一级子级:1a,1b,1c,... (父为1) - 二级子级:1a1,1a2,... (父为1a) - 三级子级:1a1a,1a1b,... (但这样会很长,所以我们可以用点分隔或者用数字字母交替) 但为了简单,我们使用数字字母交替,且不使用分隔符(如:1, 1a, 1a1, 1a1a)。这样,每个级别要么是数字,要么是字母。 生成规则: - 顶级:数字(从1开始递增) - 一级:父编号(数字)后加一个字母(从a开始) - 二级:父编号(以字母结尾)后加一个数字(从1开始) - 三级:父编号(以数字结尾)后加一个字母(从a开始) - 以此类推... 但是,我们如何知道当前父笔记的最后一个子笔记的编号?我们需要根据父笔记的编号前缀,找出所有以该前缀开头笔记,然后提取后缀,确定下一个后缀是什么。 例如,父笔记编号为1a,那么它的子笔记的编号前缀就是1a,然后我们找所有以1a开头笔记,提取后面的部分(可能是1a1,1a2,1aa,1ab?)。但按照我们的规则,1a的下一个子笔记应该是1a1(如果还没有子笔记的话),然后下一个是1a2,等等。但注意,我们不允许在数字后面直接加数字(因为这样会混淆),所以我们的规则是: - 如果父编号以字母结尾,则子级用数字(从1开始,不加分隔符) - 如果父编号以数字结尾,则子级用字母(从a开始) 因此,1a(以字母结尾)的子级是1a1,1a2,1a3...;而1(以数字结尾)的子级是1a,1b,1c...。 这样,我们可以通过父编号的最后一个字符类型来决定下一个子级的后缀类型。 实现步骤: 1. 获取当前选中的笔记(父笔记)的标题,并提取出它的完整编号(假设标题的第一个词就是编号)。 2. 获取所有笔记的标题,提取所有以该父笔记编号开头笔记(这些就是它的直接子笔记)。 3. 从这些子笔记的标题中提取出后缀(即去掉父编号后的部分),然后根据后缀确定下一个后缀是什么。 例如,父编号是1a,子笔记有1a1,1a2,那么后缀就是1和2,下一个数字是3,所以新编号为1a3。 如果父编号是1,子笔记有1a,1b,那么后缀是a,b,下一个字母是c,所以新编号是1c。 4. 创建新笔记,标题为这个新编号(用户随后可以添加描述)。 对于顶级笔记,我们不需要父笔记。我们只需要找出当前最大的顶级编号(即一个整数),然后加1。 由于这个逻辑相对复杂,我们需要编写一些函数来处理。 但是,在备忘录中,我们无法存储状态(如下一个可用的字母),所以每次都要扫描所有笔记。 考虑到性能,如果笔记数量很大,可能会慢。但通常个人笔记数量不会太多(几百条),所以可以接受。 现在,我们尝试用AppleScript编写。 由于备忘录的AppleScript字典在较新的系统中被削减,我们可能无法获取所有笔记(在Catalina之后,备忘录脚本支持有限)。因此,我们可能需要使用快捷指令。 快捷指令(Shortcuts)在iOS/iPadOS上对备忘录的支持较好,但在macOS上可能有限。而且,快捷指令无法获取所有笔记的标题列表,也无法获取选中的笔记(在Mac的备忘录应用中,目前快捷指令无法获取当前选中的笔记)。 因此,我们可能需要一个折中方案:使用外部文件记录笔记的树结构和编号。 但这样就需要用户额外维护一个文件,而且每次创建笔记都要更新这个文件,可能不太方便。 考虑到这些限制,我们可能无法完美实现。所以,这里提供一个简化方案: 1. 我们只支持两级:顶级(数字)和一级子级(字母)。 2. 用户通过选择父笔记(在备忘录中选中)来创建子笔记,但我们的脚本通过UI脚本来获取选中的笔记(这需要辅助功能授权)。 由于AppleScript可以通过GUI脚本来获取选中的笔记,我们可以这样: ``` tell application "System Events" tell process "Notes" set frontmost to true -- 获取当前选中的笔记名称 set selectedNoteName to name of first UI element of (table 1 of scroll area 1 of splitter group 1 of window 1) whose selected is true end tell end tell ``` 然后,从选中的笔记名称中提取编号(假设标题的第一个词是编号)。 但是,这种方法可能不稳定,特别是当备忘录更新界面时。 因此,鉴于这些挑战,一个更实际的做法是:不依赖选中的笔记,而是让用户输入父编号(或选择父笔记的标题),然后我们根据父编号生成子编号。 但这样交互就复杂了。 考虑到这些,我们可能只能实现顶级笔记的自动编号,而子笔记则通过手动输入父编号前缀来创建。或者,我们可以开发一个独立的笔记应用来管理,但这超出了备忘录的范围。 因此,我建议使用外部脚本来维护一个索引文件(如JSON),记录每个笔记的编号和标题,以及父子关系。然后,我们通过这个索引文件来生成新编号。但这样就需要同步,每次创建笔记都要更新索引文件,并且需要用户在使用脚本前先导入笔记(或扫描现有笔记)。 这显然增加了复杂度。 鉴于以上原因,对于大多数用户,一个可行的替代方案是:使用其他支持Zettelkasten的笔记应用(如Obsidian、Zettlr等),它们内置了这种编号功能。 但是,如果坚持使用Mac备忘录,我们可以实现一个简单的版本: 1. 只支持顶级编号(整数递增)。 2. 创建新笔记时,扫描所有笔记的标题,找出最大的整数,然后加1作为新笔记的标题。 这样,用户可以在描述中手动添加子笔记的引用(例如,在笔记内容中写“参见笔记1a”),但标题本身只有数字。 虽然这不符合卢曼的完整层次结构,但实现了唯一编号。 下面提供一个AppleScript,用于创建顶级笔记(整数编号递增): ```applescript tell application "Notes" set allNotes to every note set maxNumber to 0 repeat with aNote in allNotes set noteTitle to name of aNote -- 提取标题开头数字(如果存在) try set noteNumber to (do shell script "echo " & quoted form of noteTitle & " | grep -oE '^[0-9]+' | head -1") if noteNumber is not "" then set noteNumber to noteNumber as integer if noteNumber > maxNumber then set maxNumber to noteNumber end if end if end try end repeat set newNumber to maxNumber + 1 set newNote to make new note at folder "Notes" with properties {name:newNumber as text} -- 可以自动将光标定位到内容区域,但备忘录的AppleScript不支持内容编辑 end tell ``` 这个脚本会找出所有标题以数字开头笔记,然后取最大的数字,加1创建新笔记。 对于子笔记,我们可以提供另一个脚本,要求用户输入父编号(比如父编号是1),然后脚本会查找所有以父编号开头笔记(比如1a,1b),然后生成下一个字母(比如1c)。然后创建标题为1c的笔记。 但是,如何获取父编号?我们可以弹出一个对话框让用户输入。 ```applescript set parentID to text returned of (display dialog "请输入父笔记的编号(例如:1)" default answer "") ``` 然后,查找所有标题以parentID开头笔记,提取出后面的部分(字母),然后生成下一个字母。 但注意,父编号可能包含数字字母(如1a),所以我们需要匹配所有以parentID开头且后面跟着一个字母笔记。 例如,父编号是1a,那么子笔记的标题应该是1a后接一个字母吗?不是,按照我们的规则,1a的子笔记应该是1a1,1a2(数字)?还是1aa,1ab(字母)?我们之前规定:父编号以字母结尾,则子级用数字;以数字结尾,则用字母。 但父编号1a以字母结尾,所以子级应该用数字。因此,子笔记的标题应该是parentID & number,比如1a1。 所以,我们需要根据父编号最后一个字符的类型来决定后缀类型。 步骤: 1. 获取用户输入的父编号。 2. 判断父编号最后一个字符:如果是字母,则子级后缀为数字(从1开始递增);如果是数字,则子级后缀为字母(从a开始)。 3. 获取所有笔记标题中以父编号开头笔记。 4. 提取这些笔记标题中紧接着父编号的后缀(必须是一个或多个数字字母,但具体取决于步骤2的决定)。 5. 找出最大的后缀(数字则比较数值,字母则按字母顺序),然后生成下一个后缀。 6. 新笔记标题 = 父编号 & 下一个后缀 例如: 父编号:1a(以字母结尾)-> 子级用数字 现有笔记:1a1, 1a2 -> 后缀为1和2,最大为2,下一个为3,所以新标题为1a3 父编号:1(以数字结尾)-> 子级用字母 现有笔记:1a, 1b -> 后缀为a和b,最大为b,下一个为c,所以新标题为1c 这个方案可以支持多级,因为父编号可以是任意级别(如1a1,以数字结尾,那么它的子级就用字母:1a1a)。 但是,提取后缀时,我们只取紧接着的第一个字符(对于字母)或连续数字(对于数字)吗?注意,后缀可能是多字符(如数字可能是10),但按照我们的规则,每一级只加一个后缀(一个字母或一组连续数字?)。但为了简单,我们规定: - 数字后缀:从1开始,然后2,3,...(不需要前导零) - 字母后缀:单个字母,从a到z,然后是aa,ab,...吗?但这样会复杂。我们暂时只使用一个字母(a-z),如果超过26个,则用aa,ab,...(但这样需要更复杂的比较)。因此,我们先只考虑一个字母(即最多26个子笔记)。 对于数字后缀,我们取连续的数字(如1a1,1a2,...,1a10,那么10是数字,所以比较时按数值)。 因此,提取后缀时,如果是数字后缀,则提取父编号之后的所有连续数字;如果是字母后缀,则提取第一个字母(但注意,可能有多字母,比如aa,但按规则,父编号以数字结尾时,后缀应该是一个字母,但也可以是多个字母?)—— 这里我们规定:字母后缀只取一个字母(即26个),如果超过,则用两个字母(aa开始),但这需要更复杂的处理。 为了简单,我们规定:每一级只使用一个字符(数字字母)。数字后缀用单个数字(1-9),字母后缀用单个字母(a-z)。这样,每个父笔记最多有9+26=35个子笔记?不,数字后缀可以是多位吗?不行,因为我们只取一个字符。但这样数字后缀只能1-9,第10个怎么办? 所以,我们必须允许数字后缀可以是多位。因此,提取后缀时,对于数字后缀,我们提取父编号之后的一个或多个连续数字;对于字母后缀,提取父编号之后的一个或多个连续字母。 然后,数字后缀按数值排序,字母后缀按字母顺序排序(a, b, ..., z, aa, ab, ...)。 这样,我们就能处理任意数量的子笔记。 但是,AppleScript处理字母序列比较麻烦(比如从"a"到"aa")。我们可以写一个函数来比较字母序列(视为26进制数),但这样代码量较大。 鉴于复杂度,我们可能只实现一级子笔记,并且后缀只使用一位(即数字1-9,字母a-z),这样每个父笔记最多35个子笔记。如果超过,则用两位(但这样就需要更复杂的生成规则)。 由于时间有限,我们决定:后缀只使用一位(数字字母),即数字1-9,字母a-z。这样,每个父笔记最多9+26=35个子笔记。如果超过,则报错。 这样,我们可以这样实现: 1. 获取父编号。 2. 判断父编号最后一个字符: - 如果是字母,则子级后缀类型为数字(1-9) - 如果是数字,则子级后缀类型为字母(a-z) 3. 获取所有笔记标题中以父编号开头笔记,并且标题长度正好是父编号长度+1(因为我们只取一个字符)。 4. 提取这些笔记标题的最后一个字符(即后缀字符)。 5. 对于数字后缀,将后缀字符转换成数字;对于字母后缀,保留字母。 6. 找出这些后缀中的最大值(数字就按数值,字母就按ASCII码)。 7. 生成下一个后缀: - 数字:当前最大值+1 - 字母:当前最大值在字母表中的下一个字母(如当前最大是'b',则下一个是'c') 8. 如果下一个后缀超过了范围(数字超过9,字母超过'z'),则报错(因为不支持更多子笔记)。 然后,新笔记标题 = 父编号 & 下一个后缀 这个方案简单,但限制了子笔记的数量。 下面,我们编写AppleScript实现这个方案。 注意:由于备忘录的AppleScript接口,我们可能无法直接获取笔记标题列表而不打开笔记,但我们可以通过`every note`来获取。 但是,`every note`会返回所有笔记,包括其他文件夹的。所以,我们可能需要指定文件夹(比如“备忘录”应用中的“笔记”文件夹)。 由于用户可能使用多个文件夹,我们这里假设所有笔记都在默认文件夹(即“笔记”文件夹)中。 脚本如下: 由于代码较长,我们分块写。 首先,顶级笔记的创建(独立脚本): ```applescript -- 创建顶级笔记(整数编号) tell application "Notes" set folderName to "Notes" -- 默认文件夹 set allNotes to every note in folder folderName set maxNumber to 0 repeat with aNote in allNotes set noteTitle to name of aNote -- 尝试提取开头数字 try -- 使用do shell script提取数字 set theNumber to (do shell script "echo " & quoted form of noteTitle & " | grep -oE '^[0-9]+'") as integer if theNumber > maxNumber then set maxNumber to theNumber end if on error -- 忽略 end try end repeat set newNumber to maxNumber + 1 set newNote to make new note at folder folderName with properties {name:newNumber as text} -- 激活备忘录并选中新笔记?备忘录AppleScript可能不支持选中,但我们可以告诉用户 end tell ``` 其次,创建子笔记的脚本: ```applescript -- 创建子笔记 tell application "Notes" set folderName to "Notes" set allNotes to every note in folder folderName end tell -- 弹出对话框让用户输入父笔记编号 set parentID to text returned of (display dialog "请输入父笔记的编号(例如:1 或 1a)" default answer "") -- 判断父编号最后一个字符 set lastChar to last character of parentID set isLastCharLetter to (do shell script "echo " & quoted form of lastChar & " | grep -qE '^[a-zA-Z]$' && echo true || echo false") set isLastCharDigit to (do shell script "echo " & quoted form of lastChar & " | grep -qE '^[0-9]$' && echo true || echo false") if isLastCharLetter is "true" then set suffixType to "number" else if isLastCharDigit is "true" then set suffixType to "letter" else display dialog "父笔记编号的最后一个字符必须是字母数字。" buttons {"OK"} default button 1 return end if -- 收集所有以parentID开头笔记,并且标题长度正好是parentID长度+1 set childTitles to {} tell application "Notes" repeat with aNote in allNotes set noteTitle to name of aNote if length of noteTitle ≥ (length of parentID) + 1 then if text 1 through (length of parentID) of noteTitle is parentID then -- 检查后缀部分:取紧接着的一个字符 set suffixChar to text (length of parentID)+1 of noteTitle -- 检查后缀字符是否符合类型 if suffixType is "number" then if suffixChar is in {"0","1","2","3","4","5","6","7","8","9"} then set end of childTitles to suffixChar end if else -- letter set isLetter to (do shell script "echo " & quoted form of suffixChar & " | grep -qE '^[a-zA-Z]$' && echo true || echo false") if isLetter is "true" then set end of childTitles to suffixChar end if end if end if end if end repeat end tell -- 现在childTitles收集了所有符合条件的后缀字符 if suffixType is "number" then -- 转换为数字,找最大值 set maxSuffix to 0 repeat with aChar in childTitles set n to aChar as integer if n > maxSuffix then set maxSuffix to n end if end repeat set nextSuffix to maxSuffix + 1 if nextSuffix > 9 then display dialog "错误:父笔记的子笔记数量已超过9个,无法创建更多。" buttons {"OK"} default button 1 return end if else -- letter if (count of childTitles) is 0 then set nextSuffix to "a" else --字母排序,取最后一个 set sortedTitles to sort childTitles set lastChar to last item of sortedTitles -- 计算下一个字母 set lastCharNum to (do shell script "echo " & quoted form of lastChar & " | od -An -t uC | awk '{print $1}'") as integer set nextCharNum to lastCharNum + 1 -- 检查是否超出'z'(122)或'Z'(90)? if lastChar is greater than or equal to "a" and lastChar is less than or equal to "z" then if nextCharNum > 122 then display dialog "错误:父笔记的子笔记数量已超过26个,无法创建更多。" buttons {"OK"} default button 1 return end if else if lastChar is greater than or equal to "A" and lastChar is less than or equal to "Z" then if nextCharNum > 90 then display dialog "错误:父笔记的子笔记数量已超过26个,无法创建更多。" buttons {"OK"} default button 1 return end if end if set nextSuffix to character id nextCharNum end if end if -- 创建新笔记 set newTitle to parentID & nextSuffix tell application "Notes" make new note at folder "Notes" with properties {name:newTitle} end tell ``` 注意:这个脚本在字母后缀处理时,没有区分大小写,但为了简单,我们统一使用小写。用户可以自行决定用大写还是小写,但建议统一。 另外,在提取子笔记时,我们只考虑标题长度正好为父编号长度+1的笔记,这确保了后缀只有一个字符。 最后,我们提供两个AppleScript,用户可以将它们保存为脚本,然后在需要时运行。 但是,在备忘录应用中,我们无法直接绑定快捷键,但可以通过Automator创建服务,然后分配快捷键。 步骤: 1. 打开Automator,新建一个“快速操作”。 2. 设置“工作流程收到当前”为“没有输入”,在“备忘录”应用中。 3. 添加“运行AppleScript”操作,粘贴上面的顶级笔记脚本,保存为“Create Top-Level Luhmann Note”。 4. 同样,再创建一个快速操作用于创建子笔记,粘贴子笔记脚本,保存为“Create Sub-Luhmann Note”。 5. 然后,在系统设置的键盘快捷键中,为这两个服务分配快捷键。 这样,用户可以在备忘录中按快捷键来创建笔记。 注意:运行这些脚本可能需要授权(在系统设置的隐私中,允许Automator或AppleScript控制电脑)。 由于备忘录的AppleScript支持有限,这些脚本可能在某些系统版本上无效,请测试。 另外,如果笔记很多,扫描所有笔记可能会慢。 最后,我们生成的笔记标题只有编号,用户需要手动添加描述。或者,我们可以将标题设置为编号+空格,这样用户可以直接在后面输入描述。但AppleScript创建笔记时,标题就是我们设置的字符串,用户编辑时可以在编号后加空格和描述。 例如,新笔记标题为“1a3”,用户编辑为“1a3 这是一个主题”。 这样,我们的脚本不会影响用户添加描述。 综上所述,我们实现了卢曼笔记编号的自动化创建,尽管有一些限制,但在Mac备忘录中可用。 希望这能帮到您。</think>### 卢曼笔记编号系统的自动化实现(Mac备忘录版) 卢曼笔记法(Zettelkasten)的核心是**层级化唯一标识符系统**,其命名规则遵循以下原则: 1. **层级结构**:顶级笔记用整数(1, 2, 3...) 2. **子级扩展**:子笔记在父ID后追加标识 - 父ID以**数字结尾**时添加字母(1 → 1a) - 父ID以**字母结尾**时添加数字(1a → 1a1) 3. **唯一性**:每个笔记有全局唯一标识符 4. **连续性**:新笔记自动继承父级上下文 > 示例序列:`1 → 1a → 1a1 → 1a1a → 1b → 2` --- ### 自动化实现方案(AppleScript + 快捷指令) #### 方案1:AppleScript实现(推荐) ```applescript -- 创建新笔记并自动编号 on run tell application "Notes" -- 获取所有笔记标题 set allTitles to name of every note -- 生成新ID(完整函数见下文) set newID to generateLuhmannID(allTitles) -- 创建笔记并聚焦内容区 make new note with properties {name:newID} activate end tell end run -- 卢曼ID生成函数 on generateLuhmannID(allTitles) -- 实现步骤: -- 1. 提取所有现有ID -- 2. 识别最后创建的父笔记ID -- 3. 按规则生成新ID: -- - 若无父笔记 → 新整数 (max+1) -- - 父ID以数字结尾 → 添加字母 (1→1a) -- - 父ID以字母结尾 → 添加数字 (1a→1a1) -- 4. 返回新ID return newID end generateLuhmannID ``` > **使用说明**: > 1. 将完整脚本保存为 `.scpt` 文件[^1] > 2. 通过 **脚本编辑器** 或 **快捷指令** 调用 > 3. 完整代码需实现ID检测逻辑(约80行代码) --- #### 方案2:快捷指令 + AppleScript 混合 ```applescript -- 快捷指令中调用此脚本 on generateNote(parentID) tell application "Notes" if parentID is "" then -- 生成顶级ID set lastNum to (...) set newID to lastNum + 1 else -- 生成子级ID set children to (... where name starts with parentID) if last character of parentID is number then set newID to parentID & "a" -- 数字字母 else set newID to parentID & "1" -- 字母数字 end end make new note with properties {name:newID} end tell end generateNote ``` **配套快捷指令配置**: 1. 添加 `选择备忘录` 操作获取父笔记 2. 用 `运行AppleScript` 调用上述函数 3. 输出新笔记的ID --- ### 关键实现细节 1. **ID检测逻辑**: ```applescript -- 提取父笔记ID(示例片段) set parentID to do shell script "echo " & quoted form of noteTitle & " | grep -oE '^[0-9]+[a-z]*[0-9]*'" ``` 2. **子级计数器**: ```applescript -- 统计同父级笔记数量 set childCount to count of notes whose name starts with (parentID & "_") ``` 3. **字母序列生成**: ```applescript -- 数字字母序列 (1→a, 2→b,...) set nextLetter to character id (96 + childCount) of "abcdefghijklmnopqrstuvwxyz" ``` --- ### 使用效果 | 操作 | 输入 | 输出 | |------|------|------| | 创建顶级笔记 | - | `3` (自动递增) | | 选择笔记`1` | 父ID=`1` | `1a` | | 选择笔记`1a` | 父ID=`1a` | `1a1` | | 选择笔记`2` | 父ID=`2` | `2a` | > 实际效果:新笔记自动获得符合层级的ID,标题格式为 `[ID] [自定义标题]` --- ### 系统要求 1. macOS Catalina (10.15) 或更高 2. 在 `系统设置 > 隐私与安全性 > 自动化` 中启用备忘录控制权限 3. 首次运行需授权AppleScript控制备忘录 > **注意**:备忘录的AppleScript接口有限,不支持直接获取选中笔记[^2],需通过: > - 用户手动选择父笔记 > - 最近修改时间推断 > - 外部配置文件维护关系 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值