diff --git a/lib/view-models/view-model.coffee b/lib/view-models/view-model.coffee index b9da1695..afca11f6 100644 --- a/lib/view-models/view-model.coffee +++ b/lib/view-models/view-model.coffee @@ -5,7 +5,7 @@ class ViewModel {@editor, @vimState} = @operation @view = new VimNormalModeInputElement().initialize(this, atom.views.getView(@editor), opts) @editor.normalModeInputView = @view - @vimState.onDidFailToCompose => @view.remove() + @vimState.onDidFailToCompose => @view.safeRemove() confirm: (view) -> @vimState.pushOperations(new Input(@view.value)) diff --git a/lib/view-models/vim-normal-mode-input-element.coffee b/lib/view-models/vim-normal-mode-input-element.coffee index 23717531..111cbe18 100644 --- a/lib/view-models/vim-normal-mode-input-element.coffee +++ b/lib/view-models/vim-normal-mode-input-element.coffee @@ -57,7 +57,16 @@ class VimNormalModeInputElement extends HTMLDivElement if @panel? @panel.destroy() else - this.remove() + @safeRemove() + + safeRemove: -> + # A combination of @confirm, the blur event (@cancel), and @viewModel's + # onDidFailToCompose handler can result in redundant calls to remove this + # element. Only call this.remove on the first such request + return if @removed + @removed = true + this.remove() + module.exports = document.registerElement("vim-normal-mode-input"