diff --git a/docs/src/demos/Experiments/Commands/CommandsList.vue b/docs/src/demos/Experiments/Commands/CommandsList.vue
new file mode 100644
index 00000000..3c72c13f
--- /dev/null
+++ b/docs/src/demos/Experiments/Commands/CommandsList.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
diff --git a/docs/src/demos/Experiments/Commands/commands.js b/docs/src/demos/Experiments/Commands/commands.js
new file mode 100644
index 00000000..3bf67dff
--- /dev/null
+++ b/docs/src/demos/Experiments/Commands/commands.js
@@ -0,0 +1,25 @@
+import { Extension } from '@tiptap/core'
+import Suggestion from '@tiptap/suggestion'
+
+export default Extension.create({
+ name: 'mention',
+
+ defaultOptions: {
+ suggestion: {
+ char: '/',
+ startOfLine: true,
+ command: ({ editor, range, attributes }) => {
+ attributes.command({ editor, range })
+ },
+ },
+ },
+
+ addProseMirrorPlugins() {
+ return [
+ Suggestion({
+ editor: this.editor,
+ ...this.options.suggestion,
+ }),
+ ]
+ },
+})
diff --git a/docs/src/demos/Experiments/Commands/index.vue b/docs/src/demos/Experiments/Commands/index.vue
new file mode 100644
index 00000000..57a7da2b
--- /dev/null
+++ b/docs/src/demos/Experiments/Commands/index.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
diff --git a/docs/src/docPages/api/commands.md b/docs/src/docPages/api/commands.md
index 7b9e68db..0103e3f0 100644
--- a/docs/src/docPages/api/commands.md
+++ b/docs/src/docPages/api/commands.md
@@ -175,6 +175,7 @@ Have a look at all of the core commands listed below. They should give you a goo
| Command | Description |
| --------------------- | --------------------------------------- |
| .blur() | Removes focus from the editor. |
+| .deleteRange() | Delete a given range. |
| .deleteSelection() | Delete the selection, if there is one. |
| .focus() | Focus the editor at the given position. |
| .scrollIntoView() | Scroll the selection into view. |
diff --git a/docs/src/docPages/experiments.md b/docs/src/docPages/experiments.md
index 774263f0..1c0d8d84 100644
--- a/docs/src/docPages/experiments.md
+++ b/docs/src/docPages/experiments.md
@@ -6,3 +6,4 @@ Congratulations! You’ve found our secret playground with a list of experiments
* [Comments](/experiments/comments)
* [CharacterLimit](/experiments/character-limit)
* [Color](/experiments/color)
+* [Commands](/experiments/commands)
diff --git a/docs/src/docPages/experiments/commands.md b/docs/src/docPages/experiments/commands.md
new file mode 100644
index 00000000..62c1593d
--- /dev/null
+++ b/docs/src/docPages/experiments/commands.md
@@ -0,0 +1,5 @@
+# Commands
+
+⚠️ Experiment
+
+
diff --git a/packages/core/src/commands/deleteRange.ts b/packages/core/src/commands/deleteRange.ts
new file mode 100644
index 00000000..8c2d721e
--- /dev/null
+++ b/packages/core/src/commands/deleteRange.ts
@@ -0,0 +1,14 @@
+import { Command, Range } from '../types'
+
+/**
+ * Delete a given range.
+ */
+export const deleteRange = (range: Range): Command => ({ tr, dispatch }) => {
+ const { from, to } = range
+
+ if (dispatch) {
+ tr.delete(from, to)
+ }
+
+ return true
+}
diff --git a/packages/core/src/extensions/commands.ts b/packages/core/src/extensions/commands.ts
index 117b5708..2c267821 100644
--- a/packages/core/src/extensions/commands.ts
+++ b/packages/core/src/extensions/commands.ts
@@ -4,6 +4,7 @@ import * as clearContent from '../commands/clearContent'
import * as clearNodes from '../commands/clearNodes'
import * as command from '../commands/command'
import * as createParagraphNear from '../commands/createParagraphNear'
+import * as deleteRange from '../commands/deleteRange'
import * as deleteSelection from '../commands/deleteSelection'
import * as exitCode from '../commands/exitCode'
import * as extendMarkRange from '../commands/extendMarkRange'
@@ -52,6 +53,7 @@ export const Commands = Extension.create({
...clearNodes,
...command,
...createParagraphNear,
+ ...deleteRange,
...deleteSelection,
...exitCode,
...extendMarkRange,