feat(web): improve list auto-completion and tag insertion UX (#5240)

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Johnny 2025-11-09 01:26:29 +08:00 committed by GitHub
parent e8b0273473
commit a2ccf6b201
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 4 deletions

View File

@ -43,9 +43,9 @@ const TagSuggestions = observer(({ editorRef, editorActions }: TagSuggestionsPro
return items.filter((tag) => tag.toLowerCase().includes(searchQuery));
},
onAutocomplete: (tag, word, index, actions) => {
// Replace the trigger word with the complete tag
// Replace the trigger word with the complete tag and add a trailing space
actions.removeText(index, word.length);
actions.insertText(`#${tag}`);
actions.insertText(`#${tag} `);
},
});

View File

@ -52,8 +52,28 @@ export function useListAutoCompletion({ editorRef, editorActions, isInIME }: Use
if (listInfo.type) {
event.preventDefault();
const continuation = generateListContinuation(listInfo);
actions.insertText("\n" + continuation);
// Check if current list item is empty (GitHub-style behavior)
// Extract the current line
const lines = contentBeforeCursor.split("\n");
const currentLine = lines[lines.length - 1];
// Check if line only contains list marker (no content after it)
const isEmptyListItem =
/^(\s*)([-*+])\s*$/.test(currentLine) || // Empty unordered list
/^(\s*)([-*+])\s+\[([ xX])\]\s*$/.test(currentLine) || // Empty task list
/^(\s*)(\d+)[.)]\s*$/.test(currentLine); // Empty ordered list
if (isEmptyListItem) {
// Remove the empty list marker and exit list mode
const lineStartPos = cursorPosition - currentLine.length;
actions.removeText(lineStartPos, currentLine.length);
actions.insertText("\n");
} else {
// Continue the list with the next item
const continuation = generateListContinuation(listInfo);
actions.insertText("\n" + continuation);
}
}
};