text-selected.ts 908 B

12345678910111213141516171819202122232425262728293031323334
  1. import { StateEffect } from '@codemirror/state'
  2. import { EditorView, ViewPlugin } from '@codemirror/view'
  3. export const textSelectedEffect = StateEffect.define<EditorView>()
  4. export const textSelected = ViewPlugin.define(view => {
  5. function mouseUpListener() {
  6. if (!view.state.selection.main.empty) {
  7. view.dispatch({
  8. effects: textSelectedEffect.of(view),
  9. })
  10. }
  11. }
  12. function keyUpListener(event: KeyboardEvent) {
  13. if (
  14. (event.shiftKey || event.key === 'Meta') &&
  15. !view.state.selection.main.empty
  16. ) {
  17. view.dispatch({
  18. effects: textSelectedEffect.of(view),
  19. })
  20. }
  21. }
  22. view.dom.addEventListener('mouseup', mouseUpListener)
  23. view.dom.addEventListener('keyup', keyUpListener)
  24. return {
  25. destroy() {
  26. view.dom.removeEventListener('mouseup', mouseUpListener)
  27. view.dom.removeEventListener('keyup', keyUpListener)
  28. },
  29. }
  30. })