autosave.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. const fs = require('fs')
  2. const {CompositeDisposable, Disposable} = require('atom')
  3. const {dontSaveIf, shouldSave} = require('./controls')
  4. module.exports = {
  5. subscriptions: null,
  6. provideService () {
  7. return {dontSaveIf}
  8. },
  9. activate () {
  10. this.subscriptions = new CompositeDisposable()
  11. const handleBlur = event => {
  12. if (event.target === window) {
  13. this.autosaveAllPaneItems()
  14. } else if (event.target.matches('atom-text-editor:not(mini)')) {
  15. return this.autosavePaneItem(event.target.getModel())
  16. }
  17. }
  18. window.addEventListener('blur', handleBlur, true)
  19. this.subscriptions.add(new Disposable(() => window.removeEventListener('blur', handleBlur, true)))
  20. this.subscriptions.add(atom.workspace.onDidAddPaneItem(({item}) => this.autosavePaneItem(item, true)))
  21. this.subscriptions.add(atom.workspace.onWillDestroyPaneItem(({item}) => this.autosavePaneItem(item)))
  22. },
  23. deactivate () {
  24. this.subscriptions.dispose()
  25. return this.autosaveAllPaneItems()
  26. },
  27. autosavePaneItem (paneItem, create = false) {
  28. if (!atom.config.get('autosave.enabled')) return
  29. if (!paneItem) return
  30. if (typeof paneItem.getURI !== 'function' || !paneItem.getURI()) return
  31. if (typeof paneItem.isModified !== 'function' || !paneItem.isModified()) return
  32. if (typeof paneItem.getPath !== 'function' || !paneItem.getPath()) return
  33. if (!shouldSave(paneItem)) return
  34. try {
  35. const stats = fs.statSync(paneItem.getPath())
  36. if (!stats.isFile()) return
  37. } catch (e) {
  38. if (e.code !== 'ENOENT') return
  39. if (!create) return
  40. }
  41. const pane = atom.workspace.paneForItem(paneItem)
  42. let promise = Promise.resolve()
  43. if (pane) {
  44. promise = pane.saveItem(paneItem)
  45. } else if (typeof paneItem.save === 'function') {
  46. promise = paneItem.save()
  47. }
  48. return promise
  49. },
  50. autosaveAllPaneItems () {
  51. return Promise.all(
  52. atom.workspace.getPaneItems().map((paneItem) => this.autosavePaneItem(paneItem))
  53. )
  54. }
  55. }