mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-10-31 21:11:30 +08:00 
			
		
		
		
	chore(code): support multiple selections in tab
This commit is contained in:
		
							parent
							
								
									4bac03570c
								
							
						
					
					
						commit
						8d18823608
					
				| @ -1,4 +1,5 @@ | |||||||
| import { indentLess, indentMore } from "@codemirror/commands"; | import { indentLess, indentMore } from "@codemirror/commands"; | ||||||
|  | import { EditorSelection, type ChangeSpec } from "@codemirror/state"; | ||||||
| import type { KeyBinding } from "@codemirror/view"; | import type { KeyBinding } from "@codemirror/view"; | ||||||
| 
 | 
 | ||||||
| const smartIndentWithTab: KeyBinding[] = [ | const smartIndentWithTab: KeyBinding[] = [ | ||||||
| @ -7,33 +8,39 @@ const smartIndentWithTab: KeyBinding[] = [ | |||||||
|         run({ state, dispatch }) { |         run({ state, dispatch }) { | ||||||
|             const { selection } = state; |             const { selection } = state; | ||||||
| 
 | 
 | ||||||
|             for (const range of selection.ranges) { |             // Handle selection indenting normally
 | ||||||
|                 if (!range.empty) { |             if (selection.ranges.some(range => !range.empty)) { | ||||||
|                     // Allow default behaviour.
 |                 return indentMore({ state, dispatch }); | ||||||
|                     return false; |  | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             const changes = []; | ||||||
|  |             const newSelections = []; | ||||||
|  | 
 | ||||||
|  |             for (let range of selection.ranges) { | ||||||
|                 const line = state.doc.lineAt(range.head); |                 const line = state.doc.lineAt(range.head); | ||||||
|                 const beforeCursor = state.doc.sliceString(line.from, range.head); |                 const beforeCursor = state.doc.sliceString(line.from, range.head); | ||||||
| 
 | 
 | ||||||
|                 if (/^\s*$/.test(beforeCursor)) { |                 if (/^\s*$/.test(beforeCursor)) { | ||||||
|                     // Only whitespace before cursor: indent line
 |                     // Only whitespace before cursor → indent line
 | ||||||
|                     return indentMore({ state, dispatch }); |                     return indentMore({ state, dispatch }); | ||||||
|                 } else { |                 } else { | ||||||
|                     // Insert a tab character
 |                     // Insert a tab character at cursor
 | ||||||
|                     const cursor = range.head; |                     changes.push({ from: range.head, to: range.head, insert: "\t" }); | ||||||
|                     dispatch(state.update({ |                     newSelections.push(EditorSelection.cursor(range.head + 1)); | ||||||
|                         changes: { |                 } | ||||||
|                             from: cursor, |             } | ||||||
|                             insert: "\t" | 
 | ||||||
|                         }, |             if (changes.length) { | ||||||
|                         selection: { anchor: cursor + 1 }, |                 dispatch( | ||||||
|  |                     state.update({ | ||||||
|  |                         changes, | ||||||
|  |                         selection: EditorSelection.create(newSelections), | ||||||
|                         scrollIntoView: true, |                         scrollIntoView: true, | ||||||
|                         userEvent: "input" |                         userEvent: "input" | ||||||
|                     })); |                     }) | ||||||
|  |                 ); | ||||||
|                 return true; |                 return true; | ||||||
|             } |             } | ||||||
|             } |  | ||||||
| 
 | 
 | ||||||
|             return false; |             return false; | ||||||
|         }, |         }, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Elian Doran
						Elian Doran