mirror of
https://github.com/wassname/nvatom.git
synced 2026-09-10 12:21:11 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5f7ba7b75 | ||
|
|
da888fa461 | ||
|
|
97830b31db | ||
|
|
a06e0127c2 | ||
|
|
cfd9dcef85 | ||
|
|
ca6f9e76a3 | ||
|
|
5e44098ae3 | ||
|
|
a3f5d445c0 | ||
|
|
abb7339a6e | ||
|
|
4ddc133920 | ||
|
|
bca1646f8f | ||
|
|
40e785ef57 | ||
|
|
273d506f38 | ||
|
|
09d0efc06f | ||
|
|
4dd0b518aa | ||
|
|
bdf384f158 | ||
|
|
c2db598f17 | ||
|
|
1e1aa06e3c | ||
|
|
8384b81a04 | ||
|
|
ef3fb73c88 | ||
|
|
6c9752ae25 | ||
|
|
bb80f5e203 | ||
|
|
5f26638a78 |
@@ -1,3 +1,15 @@
|
||||
## 0.5.0
|
||||
- Add `useLunrPipeline` feature
|
||||
- Improve autoselect/autocomplete logic
|
||||
- Fix a bug that autocomplete feature does not work
|
||||
|
||||
## 0.4.0
|
||||
- Rename `notational-velocity` to `nvatom`
|
||||
- Copy `notational-velocity` settings/notes on initialization
|
||||
|
||||
## 0.3.0
|
||||
- Fix the bug that the default note directory is within packages directory. If it happens, it **deletes** all of existing notes. If you read this before updating the package, please check your note directory before updating it.
|
||||
|
||||
## 0.2.0
|
||||
- Use DocQuery
|
||||
- Introduce autosave features
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# Notational Velocity for Atom
|
||||
|
||||
*`notational-velocity` package is renamed to `nvatom` package due to a fatal bug. For more info, refer [migration section](#migration).*
|
||||
|
||||
[![Build Status][3]][4]
|
||||
|
||||
[Notational Velocity][1] is an application that stores and retrieves notes.
|
||||
@@ -26,13 +28,13 @@ We do believe Notational Velocity is the precursor of the famous note-taking app
|
||||
|
||||
## Settings
|
||||
|
||||
To configure your note directory, set `notational-velocity.directory`:
|
||||
To configure your note directory, set `nvatom.directory`:
|
||||
|
||||
* Open your `~/.atom/config.cson` file from the menu: *Atom > Open Your Config*
|
||||
* Append the following lines:
|
||||
|
||||
```cson
|
||||
'notational-velocity':
|
||||
'nvatom':
|
||||
directory: '/path/to/your/notes'
|
||||
```
|
||||
|
||||
@@ -52,9 +54,17 @@ You can also override `cmd-l` if you want to keep your muscle memory from Notati
|
||||
'atom-text-editor':
|
||||
'cmd-l': 'unset!'
|
||||
'atom-workspace':
|
||||
'cmd-l': 'notational-velocity:toggle'
|
||||
'cmd-l': 'nvatom:toggle'
|
||||
```
|
||||
|
||||
## Migration
|
||||
|
||||
v0.1.0 under published package name `notational-velocity` had a fatal bug that sets the default value of its note directory under package directory. In that case, all notes are deleted once the user updates the package, since package directory is overwritten when the user. For more information, refer [#25][6].
|
||||
|
||||
To resolve this problem, we renamed our package name to `nvatom`. Users who have the old `notational-velocity` need to **install `nvatom` package first**, activate the package to automatically migrate the existing notes, and then delete `notational-velocity` package.
|
||||
|
||||
Since keymaps overlap with `notational-velocity`, follow the menu *Packages > nvAtom > Toggle* to activate this package.
|
||||
|
||||
## References
|
||||
|
||||
- [Notational Velocity](http://notational.net/)
|
||||
@@ -66,6 +76,7 @@ You can also override `cmd-l` if you want to keep your muscle memory from Notati
|
||||
|
||||
[1]: http://notational.net/
|
||||
[2]: http://daringfireball.net/projects/markdown/syntax
|
||||
[3]: https://travis-ci.org/seongjaelee/notational-velocity.svg?branch=master
|
||||
[4]: https://travis-ci.org/seongjaelee/notational-velocity
|
||||
[3]: https://travis-ci.org/seongjaelee/nvatom.svg?branch=master
|
||||
[4]: https://travis-ci.org/seongjaelee/nvatom
|
||||
[5]: https://cloud.githubusercontent.com/assets/948301/7246990/2e2b4c6e-e7b9-11e4-93b0-57954e011e81.gif
|
||||
[6]: https://github.com/seongjaelee/nvatom/issues/25
|
||||
|
||||
@@ -8,4 +8,4 @@
|
||||
# For more detailed documentation see
|
||||
# https://atom.io/docs/latest/advanced/keymaps
|
||||
'atom-workspace':
|
||||
'alt-cmd-l': 'notational-velocity:toggle'
|
||||
'alt-cmd-l': 'nvatom:toggle'
|
||||
|
||||
@@ -2,19 +2,19 @@ path = require 'path'
|
||||
fs = require 'fs-plus'
|
||||
_ = require 'underscore-plus'
|
||||
{$, $$, SelectListView} = require 'atom-space-pen-views'
|
||||
DocQuery = require 'DocQuery'
|
||||
DocQuery = require 'docquery'
|
||||
|
||||
module.exports =
|
||||
class NotationalVelocityView extends SelectListView
|
||||
initialize: (state) ->
|
||||
@initializedAt = new Date()
|
||||
super
|
||||
@addClass('notational-velocity from-top overlay')
|
||||
@rootDirectory = atom.config.get('notational-velocity.directory')
|
||||
@addClass('nvatom from-top overlay')
|
||||
@rootDirectory = atom.config.get('nvatom.directory')
|
||||
if !fs.existsSync(@rootDirectory)
|
||||
throw new Error("The given directory #{@rootDirectory} does not exist. "
|
||||
+ "Set the note directory to the existing one from Settings.")
|
||||
@prevFilterQuery = ''
|
||||
@skipPopulateList = false
|
||||
@prevCursorPosition = 0
|
||||
@documentsLoaded = false
|
||||
@docQuery = new DocQuery(@rootDirectory, {recursive: true})
|
||||
@@ -28,27 +28,41 @@ class NotationalVelocityView extends SelectListView
|
||||
@populateList() if @documentsLoaded
|
||||
@docQuery.on "removed", (fileDetails) =>
|
||||
@populateList() if @documentsLoaded
|
||||
if !atom.config.get('nvatom.enableLunrPipeline')
|
||||
@docQuery.searchIndex.pipeline.reset()
|
||||
|
||||
selectItem: (filterQuery) ->
|
||||
if filterQuery.length == 0
|
||||
@prevCursorPosition = 0
|
||||
return null
|
||||
|
||||
titleItem = @docQuery.search(filterQuery)[0]
|
||||
|
||||
# If title item is not null, auto-fill the search panel.
|
||||
# But we don't want to fill it when deleting.
|
||||
isCursorProceeded: ->
|
||||
editor = @filterEditorView.model
|
||||
currCursorPosition = editor.getCursorBufferPosition().column
|
||||
if titleItem != undefined && @prevCursorPosition < currCursorPosition
|
||||
@prevFilterQuery = titleItem.title
|
||||
editor.setText(filterQuery + titleItem.title.slice(filterQuery.length))
|
||||
editor.selectLeft(titleItem.title.length - filterQuery.length)
|
||||
isCursorProceeded = @prevCursorPosition < currCursorPosition
|
||||
@prevCursorPosition = currCursorPosition
|
||||
return isCursorProceeded
|
||||
|
||||
return titleItem
|
||||
selectItem: (filteredItems, filterQuery) ->
|
||||
isCursorProceeded = @isCursorProceeded()
|
||||
|
||||
for item in filteredItems
|
||||
if item.title.match(///^#{filterQuery}$///i) != null
|
||||
# autoselect
|
||||
n = filteredItems.indexOf(item) + 1
|
||||
@selectItemView(@list.find("li:nth-child(#{n})"))
|
||||
return
|
||||
|
||||
for item in filteredItems
|
||||
if item.title.match(///^#{filterQuery}///i) != null && isCursorProceeded
|
||||
# autocomplete
|
||||
@skipPopulateList = true
|
||||
editor = @filterEditorView.model
|
||||
editor.setText(filterQuery + item.title.slice(filterQuery.length))
|
||||
editor.selectLeft(item.title.length - filterQuery.length)
|
||||
|
||||
# autoselect
|
||||
n = filteredItems.indexOf(item) + 1
|
||||
@selectItemView(@list.find("li:nth-child(#{n})"))
|
||||
|
||||
filter: (filterQuery) ->
|
||||
if filterQuery == "" || filterQuery == undefined
|
||||
return @docQuery.documents
|
||||
return @docQuery.search(filterQuery)
|
||||
|
||||
getFilterKey: ->
|
||||
@@ -75,8 +89,8 @@ class NotationalVelocityView extends SelectListView
|
||||
@div class: 'secondary-line', "#{content}"
|
||||
|
||||
confirmSelection: ->
|
||||
item = @getSelectedItem()
|
||||
filePath = null
|
||||
item = @getSelectedItem()
|
||||
filePath = null
|
||||
sanitizedQuery = @getFilterQuery().replace(/\s+$/, '')
|
||||
calculatedPath = path.join(@rootDirectory, sanitizedQuery + '.md')
|
||||
if item?
|
||||
@@ -115,15 +129,15 @@ class NotationalVelocityView extends SelectListView
|
||||
hide: ->
|
||||
@panel?.hide()
|
||||
|
||||
getFilterQuery: ->
|
||||
editor = @filterEditorView.model
|
||||
fullText = editor.getText()
|
||||
selectedText = editor.getSelectedText()
|
||||
return fullText.substring(0, fullText.length - selectedText.length)
|
||||
|
||||
populateList: ->
|
||||
filterQuery = @getFilterQuery()
|
||||
filteredItems = null
|
||||
if filterQuery == "" || filterQuery == undefined
|
||||
filteredItems = @docQuery.documents
|
||||
else
|
||||
filteredItems = @filter(filterQuery)
|
||||
|
||||
selectedItem = @selectItem(filterQuery)
|
||||
filteredItems = @filter(filterQuery)
|
||||
|
||||
@list.empty()
|
||||
if filteredItems.length
|
||||
@@ -135,16 +149,12 @@ class NotationalVelocityView extends SelectListView
|
||||
itemView.data('select-list-item', item)
|
||||
@list.append(itemView)
|
||||
|
||||
if selectedItem
|
||||
n = filteredItems.indexOf(selectedItem) + 1
|
||||
@selectItemView(@list.find("li:nth-child(#{n})"))
|
||||
@selectItem(filteredItems, filterQuery)
|
||||
|
||||
else
|
||||
@setError(@getEmptyMessage(@docQuery.documents.length, filteredItems.length))
|
||||
|
||||
schedulePopulateList: ->
|
||||
# We can skip it when we are just moving the position of the cursor.
|
||||
currFilterQuery = @getFilterQuery()
|
||||
if @prevFilterQuery != currFilterQuery
|
||||
if !@skipPopulateList
|
||||
super
|
||||
@prevFilterQuery = currFilterQuery
|
||||
@skipPopulateList = false
|
||||
|
||||
@@ -8,12 +8,17 @@ module.exports =
|
||||
title: 'Note Directory'
|
||||
description: 'The directory to archive notes'
|
||||
type: 'string'
|
||||
default: process.env.ATOM_HOME + '/packages/notational-velocity/notebook'
|
||||
default: path.join(process.env.ATOM_HOME, 'nvatom-notes')
|
||||
enableLunrPipeline:
|
||||
title: 'Enable Lunr Pipeline'
|
||||
description: 'Lunr pipeline preprocesses query to make search faster. However, it will skip searching some of stop words such as "an" or "be".'
|
||||
type: 'boolean'
|
||||
default: true
|
||||
|
||||
notationalVelocityView: null
|
||||
|
||||
activate: (state) ->
|
||||
@rootDirectory = fs.realpathSync(atom.config.get('notational-velocity.directory'))
|
||||
@rootDirectory = @ensureNoteDirectory()
|
||||
|
||||
# Events subscribed to in atom's system can be easily cleaned up with a
|
||||
# CompositeDisposable
|
||||
@@ -21,7 +26,7 @@ module.exports =
|
||||
|
||||
# Register command that toggles this view
|
||||
@subscriptions.add atom.commands.add 'atom-workspace',
|
||||
'notational-velocity:toggle': => @createView(state).toggle()
|
||||
'nvatom:toggle': => @createView(state).toggle()
|
||||
|
||||
handleBeforeUnload = @autosaveAll.bind(this)
|
||||
window.addEventListener('beforeunload', handleBeforeUnload, true)
|
||||
@@ -60,3 +65,46 @@ module.exports =
|
||||
|
||||
autosaveAll: ->
|
||||
@autosave(paneItem) for paneItem in atom.workspace.getPaneItems()
|
||||
|
||||
ensureNoteDirectory: ->
|
||||
noteDirectory = atom.config.get('nvatom.directory')
|
||||
packagesDirectory = path.join(process.env.ATOM_HOME, 'packages')
|
||||
defaultNoteDirectory = path.join(packagesDirectory, 'nvatom', 'notebook')
|
||||
|
||||
if noteDirectory.startsWith(packagesDirectory)
|
||||
throw new Error('Note directory #{noteDirectory} cannot reside within atom packages directory. Please change its value from package settings.')
|
||||
|
||||
# Initialize note directory.
|
||||
if !fs.existsSync(noteDirectory)
|
||||
@tryMigrateFromNotationalVelocity()
|
||||
noteDirectory = atom.config.get('nvatom.directory')
|
||||
if !fs.existsSync(noteDirectory)
|
||||
fs.makeTreeSync(noteDirectory)
|
||||
fs.copySync(defaultNoteDirectory, noteDirectory)
|
||||
|
||||
return fs.realpathSync(noteDirectory)
|
||||
|
||||
tryMigrateFromNotationalVelocity: ->
|
||||
prevNoteDirectory = atom.config.get('notational-velocity.directory')
|
||||
currNoteDirectory = atom.config.get('nvatom.directory')
|
||||
packagesDirectory = path.join(process.env.ATOM_HOME, 'packages')
|
||||
defaultNoteDirectory = path.join(packagesDirectory, 'nvatom', 'notebook')
|
||||
|
||||
# notational-velocity does not exist.
|
||||
if prevNoteDirectory == undefined
|
||||
return
|
||||
|
||||
atom.notifications.addInfo('Migrating from notational-velocity package...')
|
||||
|
||||
if !fs.existsSync(prevNoteDirectory)
|
||||
atom.notifications.addError('notational-velocity.directory #{prevNoteDirectory} does not exists. Migration process is failed.')
|
||||
return
|
||||
|
||||
if prevNoteDirectory.startsWith(packagesDirectory)
|
||||
fs.makeTreeSync(currNoteDirectory)
|
||||
fs.copySync(prevNoteDirectory, currNoteDirectory)
|
||||
else
|
||||
if path.join(process.env.ATOM_HOME, 'nvatom-notes') == currNoteDirectory
|
||||
atom.config.set('nvatom.directory', prevNoteDirectory)
|
||||
|
||||
atom.notifications.addInfo('Finished migration.')
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
{
|
||||
'label': 'Packages'
|
||||
'submenu': [
|
||||
'label': 'Notational Velocity'
|
||||
'label': 'nvAtom'
|
||||
'submenu': [
|
||||
{
|
||||
'label': 'Toggle'
|
||||
'command': 'notational-velocity:toggle'
|
||||
'command': 'nvatom:toggle'
|
||||
}
|
||||
]
|
||||
]
|
||||
|
||||
+6
-6
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "notational-velocity",
|
||||
"name": "nvatom",
|
||||
"main": "./lib/notational-velocity",
|
||||
"version": "0.2.0",
|
||||
"version": "0.6.0",
|
||||
"private": true,
|
||||
"contributors": [
|
||||
"Seongjae Lee <seongjae@gmail.com>",
|
||||
@@ -10,17 +10,17 @@
|
||||
],
|
||||
"description": "Notational Velocity for Atom",
|
||||
"activationCommands": {
|
||||
"atom-workspace": "notational-velocity:toggle"
|
||||
"atom-workspace": "nvatom:toggle"
|
||||
},
|
||||
"repository": "https://github.com/seongjaelee/notational-velocity",
|
||||
"repository": "https://github.com/seongjaelee/nvatom",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"atom": ">0.50.0"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/seongjaelee/notational-velocity/issues"
|
||||
"url": "https://github.com/seongjaelee/nvatom/issues"
|
||||
},
|
||||
"homepage": "https://github.com/seongjaelee/notational-velocity",
|
||||
"homepage": "https://github.com/seongjaelee/nvatom",
|
||||
"dependencies": {
|
||||
"atom-space-pen-views": "^2.0.3",
|
||||
"chokidar": "^1.0.5",
|
||||
|
||||
@@ -1,32 +1,49 @@
|
||||
# Use the command `window:run-package-specs` (cmd-alt-ctrl-p) to run specs.
|
||||
#
|
||||
# To run a specific `it` or `describe` block add an `f` to the front (e.g. `fit`
|
||||
# or `fdescribe`). Remove the `f` to unfocus the block.
|
||||
path = require 'path'
|
||||
|
||||
describe "NotationalVelocity", ->
|
||||
defaultDirectory = atom.config.get('notational-velocity.directory')
|
||||
describe "nvAtom", ->
|
||||
defaultDirectory = atom.config.get('nvatom.directory')
|
||||
activationPromise = null
|
||||
workspaceElement = null
|
||||
|
||||
beforeEach ->
|
||||
workspaceElement = atom.views.getView(atom.workspace)
|
||||
activationPromise = atom.packages.activatePackage('notational-velocity')
|
||||
atom.config.set('notational-velocity.directory', 'testdata')
|
||||
activationPromise = atom.packages.activatePackage('nvatom')
|
||||
atom.config.set('nvatom.directory', 'testdata')
|
||||
|
||||
afterEach ->
|
||||
atom.config.set('notational-velocity.directory', defaultDirectory)
|
||||
atom.config.set('nvatom.directory', defaultDirectory)
|
||||
|
||||
describe "when the notational-velocity:toggle event is triggered", ->
|
||||
describe "when the nvatom:toggle event is triggered", ->
|
||||
it "attaches and then detaches the view", ->
|
||||
expect(workspaceElement.querySelector('.notational-velocity')).not.toExist()
|
||||
expect(workspaceElement.querySelector('.nvatom')).not.toExist()
|
||||
|
||||
# This is an activation event, triggering it will cause the package to be
|
||||
# activated.
|
||||
atom.commands.dispatch workspaceElement, 'notational-velocity:toggle'
|
||||
# This is an activation event, triggering it will cause the package to be activated.
|
||||
atom.commands.dispatch workspaceElement, 'nvatom:toggle'
|
||||
|
||||
waitsForPromise ->
|
||||
activationPromise
|
||||
|
||||
runs ->
|
||||
expect(workspaceElement.querySelector('.notational-velocity')).toExist()
|
||||
atom.commands.dispatch workspaceElement, 'notational-velocity:toggle'
|
||||
expect(workspaceElement.querySelector('.nvatom')).toExist()
|
||||
atom.commands.dispatch workspaceElement, 'nvatom:toggle'
|
||||
|
||||
it "checks if we banned the default directory under packages directory", ->
|
||||
atom.notifications.clear()
|
||||
|
||||
waitsForPromise ->
|
||||
atom.packages.activatePackage('notifications')
|
||||
|
||||
runs ->
|
||||
noteDirectoryUnderPackageDirectory = path.join(process.env.ATOM_HOME, 'packages', 'nvatom', 'notebook')
|
||||
atom.config.set('nvatom.directory', noteDirectoryUnderPackageDirectory)
|
||||
|
||||
# This is an activation event, triggering it will cause the package to be activated.
|
||||
atom.commands.dispatch workspaceElement, 'nvatom:toggle'
|
||||
|
||||
waitsForPromise ->
|
||||
activationPromise
|
||||
|
||||
runs ->
|
||||
notificationContainer = workspaceElement.querySelector('atom-notifications')
|
||||
notification = notificationContainer.querySelector('atom-notification.fatal')
|
||||
expect(notification).toExist()
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
// for a full listing of what's available.
|
||||
@import "ui-variables";
|
||||
|
||||
.notational-velocity {
|
||||
.nvatom {
|
||||
li {
|
||||
text-overflow: ellipsis;
|
||||
overflow-x: hidden;
|
||||
|
||||
Reference in New Issue
Block a user