如何在选中多行内容后,把它们直接转换成一个 callout

大佬们好,我现在有一个需求,就是选中一段内容(可能有很多行,包括了列表啊、代码块什么的),然后通过一个命令,把它们转换成一个 callout,请问有什么解决方案吗?

我个人的想法,分解一下需求就两点:

  • 选中内容的第一行,在行首添加 >[!xxx][space]
  • 其余行在行首添加 >

求问大家,有什么插件或者快捷操作能实现这个需求吗?

1 个赞

Keyshots 第三方插件. 有支援CALLOUT 輸入 還附圖示
你可以參考一下
我自己是有 tp.file.selection 寫一個類似你說的功能
就是輸入 自訂的模板快捷鍵 會把你選取的文字前後加你自訂的文字
只有選取文字執行這個模板才有用 自己改一下 tR 這段

tR += prefix + “python\n" + result + "\n" + prefix + "”;

<%*
// 假設 tpContent 是您從 tp.file.selection() 獲得的內容
let content = tp.file.selection();

// 檢查選定內容是否為空
if (content.trim().length > 0) {
    // 定義選項列表
    let options = ["不加", "加>", "加>>"];

    // 定義當用戶選擇一個選項時的行為
    async function choosePrefix() {
        let choice = await tp.system.suggester(options, options, {placeholder: "選擇如何處理文本:"});
        return choice;
    }

    // 獲取用戶選擇的選項
    let userChoice = await choosePrefix();

    // 根據用戶的選擇處理文本
    let prefix = "";
    switch(userChoice) {
        case "不加":
            prefix = "";
            break;
        case "加>":
            prefix = "> ";
            break;
        case "加>>":
            prefix = ">> ";
            break;
    }

    // 將內容按行分割,並對每一行進行處理
    let processedLines = content.split("\n").filter(line => line.trim().length > 0).map(line => prefix + line);

    // 將處理後的行數組轉換回字符串,並用換行符連接
    let result = processedLines.join("\n");

    // 在結果前添加帶有前缀的 "```python\n",在結果後添加 "\n```",並將結果添加到 tR
    tR += prefix + "```python\n" + result + "\n" + prefix + "```";
} 
// 如果選定內容為空,不執行任何操作
-%>
2 个赞

感谢大佬的回复!

参考您的实现,以下代码已实现我的需求:

<%*
// 假設 tpContent 是您從 tp.file.selection() 獲得的內容 
let content = tp.file.selection(); 
// 檢查選定內容是否為空 
if (content.trim().length > 0) { 
	// 定義選項列表 
	let options = ["NOTE", "FAQ", "BUG", "TIP", "INFO", "DANGER", "TODO", "EXAMPLE", "TLDR", "SUCCESS", "WARNING", "FAILURE", "QUOTE"]; 
	// 定義當用戶選擇一個選項時的行為 
	async function choosePrefix() { 
		let choice = await tp.system.suggester(options, options, {placeholder: "callout type:"}); 
		return choice; 
	}
	// 獲取用戶選擇的選項 
	let userChoice = await choosePrefix(); 
	// 根據用戶的選擇處理文本 
	let firstLinePrefix = ">[!" + userChoice + "] "
	let otherLinePrefix = "> "; 
	
	// 將內容按行分割,並對每一行進行處理 
	// let processedLines = content.split("\n").filter(line => line.trim().length > 0).map(line => prefix + line); 
	const lines = content.split('\n'); // 按行分割
	const processedLines = [];

	for (let i = 0; i < lines.length; i++) {
	    const line = lines[i].trim();
		if (line !== '') {
			const prefix = i === 0 ? firstLinePrefix : otherLinePrefix;
			processedLines.push(prefix + line);
		}
	}

	// 將處理後的行數組轉換回字符串,並用換行符連接 
	let result = processedLines.join("\n"); 
	// 在結果前添加帶有前缀的 "```python\n",在結果後添加 "\n```",並將結果添加到 tR 
	tR += result; 
} 
// 如果選定內容為空,不執行任何操作 
-%>
1 个赞

打开 快捷键 设置,并搜索 插入标注。设置其快捷键,例如 Ctrl+.
使用时选中要转换的部分,用快捷键就好了。
缺点:转换成 callout 后,默认为 !NOTE。需要其他格式还得再鼠标右键切换。

2 个赞

感谢回复,也是一个可选的方案,不过是把选中的部分全部作为 callout 的内容了,不会把第一行作为 callout 的标题

1 个赞

我剛又裝了一下 KeyShots 裡面的
better insert callout
也應該可以滿足你的需求
習慣就好

1 个赞

admonition 插件