@@ -46,7 +46,7 @@ export default class VimrcPlugin extends Plugin {
4646 private editorMode : 'cm5' | 'cm6' = null ;
4747 private initialized = false ;
4848
49- private lastYankBuffer = new Array < string > ( 0 ) ;
49+ private lastYankBuffer : string [ ] = [ "" ] ;
5050 private lastSystemClipboard = "" ;
5151 private yankToSystemClipboard : boolean = false ;
5252 private currentKeyChord : any = [ ] ;
@@ -92,19 +92,26 @@ export default class VimrcPlugin extends Plugin {
9292 console . log ( 'Vimrc plugin: using CodeMirror 5 mode' ) ;
9393 }
9494
95- this . registerDomEvent ( document , 'click' , ( ) => {
96- this . captureYankBuffer ( ) ;
97- } ) ;
98- this . registerDomEvent ( document , 'keyup' , ( ) => {
99- this . captureYankBuffer ( ) ;
100- } ) ;
101- this . registerDomEvent ( document , 'focusin' , ( ) => {
102- this . captureYankBuffer ( ) ;
95+ await this . registerYankEvents ( activeWindow )
96+ this . app . workspace . on ( "window-open" , ( workspaceWindow , w ) => {
97+ this . registerYankEvents ( w )
10398 } )
10499
105100 this . initialized = true ;
106101 }
107102
103+ registerYankEvents ( win : Window ) {
104+ this . registerDomEvent ( win . document , 'click' , ( ) => {
105+ this . captureYankBuffer ( win ) ;
106+ } ) ;
107+ this . registerDomEvent ( win . document , 'keyup' , ( ) => {
108+ this . captureYankBuffer ( win ) ;
109+ } ) ;
110+ this . registerDomEvent ( win . document , 'focusin' , ( ) => {
111+ this . captureYankBuffer ( win ) ;
112+ } )
113+ }
114+
108115 async onload ( ) {
109116 await this . loadSettings ( ) ;
110117 this . addSettingTab ( new SettingsTab ( this . app , this ) )
@@ -445,25 +452,34 @@ export default class VimrcPlugin extends Plugin {
445452
446453 }
447454
448- captureYankBuffer ( ) {
449- if ( this . yankToSystemClipboard ) {
450- let currentBuffer = this . codeMirrorVimObject . getRegisterController ( ) . getRegister ( 'yank' ) . keyBuffer ;
451- if ( currentBuffer != this . lastYankBuffer ) {
452- if ( this . lastYankBuffer . length > 0 && currentBuffer . length > 0 && currentBuffer [ 0 ] ) {
453- navigator . clipboard . writeText ( currentBuffer [ 0 ] ) ;
454- navigator . clipboard . readText ( ) . then ( ( value ) => { this . lastSystemClipboard = value ; } ) ;
455- }
456- this . lastYankBuffer = currentBuffer ;
457- return ;
455+ async captureYankBuffer ( win : Window ) {
456+ if ( ! this . yankToSystemClipboard ) {
457+ return
458+ }
459+
460+ const yankRegister = this . codeMirrorVimObject . getRegisterController ( ) . getRegister ( 'yank' )
461+ const currentYankBuffer = yankRegister . keyBuffer ;
462+
463+ // yank -> clipboard
464+ const buf = currentYankBuffer [ 0 ]
465+ if ( buf !== this . lastYankBuffer [ 0 ] ) {
466+ await win . navigator . clipboard . writeText ( buf ) ;
467+ this . lastYankBuffer = currentYankBuffer
468+ this . lastSystemClipboard = await win . navigator . clipboard . readText ( )
469+ return
470+ }
471+
472+ // clipboard -> yank
473+ try {
474+ const currentClipboardText = await win . navigator . clipboard . readText ( )
475+ if ( currentClipboardText !== this . lastSystemClipboard ) {
476+ yankRegister . setText ( currentClipboardText ) ;
477+ this . lastYankBuffer = yankRegister . keyBuffer ;
478+ this . lastSystemClipboard = currentClipboardText ;
458479 }
459- let currentClipboard = navigator . clipboard . readText ( ) . then ( ( value ) => {
460- if ( value != this . lastSystemClipboard ) {
461- let yankRegister = this . codeMirrorVimObject . getRegisterController ( ) . getRegister ( 'yank' )
462- yankRegister . setText ( value ) ;
463- this . lastYankBuffer = yankRegister . keyBuffer ;
464- this . lastSystemClipboard = value ;
465- }
466- } )
480+ } catch ( e ) {
481+ // XXX: Avoid "Uncaught (in promise) DOMException: Document is not focused."
482+ // XXX: It is not good but easy workaround
467483 }
468484 }
469485
0 commit comments