Before:
Now:
Unchanged: once you set the notes directory it gets remembered for future runs.
Now the Readme is a lot simpler.
I tried to make migrating simpler, but this is complicated enough (see Manual_tests.md)
RVVRBJFNEHF3WRQARNVTXM75PLL4UKJZISPWPK45D6TVY45VVOTAC
5LKWSVI6U5CCZBDFBU2I3O5VOCK42UNVQXEVO5RT2JYOQQL44HWAC
JML3NG2GN4MSJQMLHTAT2UPP4IVI3K3CT6UPJ6L3JDLVF5FZTYXAC
JVS7DDA3I6U4KDZWVXNZKNLHPVTC7BXW6XU3F6DOVCMYWWDSNCAAC
MN7IONOTMGWYZUFBYK3VJLYT4ZQ37ZFEAFO7IJ3AB6NXPKDY7PMAC
7XHWKCCOIFTF2PP474A4QYFYB3BV52OXOCHFW3IJ7XL5K3LJT5CAC
3GIZSN7R6TDB6KD5H3CASDDCEPDJAQ733GNYSPZBJCF7RQQWU3ZQC
ZMVYETQRAHLO4YLBK5EPJRZ4GUZTPLHVGDCIZSRVYT25V25KB4WQC
R3GR4I6O26PQF7F432CVDP4A4GA5542O3RWYHUTJSX6JMHFT3X5QC
NUD7IIPNBTI2VXS643AEZ4MOS5USTHQWKGUKD5CYCK5ZTJN4FP5QC
E3E3ICCK4FPJCEMRNRWJ7WZYZ6SBGDRVYWNXG5CFBBDF2XZTZH2QC
ZZOKGOFBNESTYQPZW6ODBMC2C75UL4DYMSKVTUMOWVZW4UMNO4FAC
JMUE7GSN6QDQZ6NDRB55MRJMKJN6LBD6MVQPKROYPDOIXM7I3XNQC
KKMFQDR43ZWVCDRHQLWWX3FCWCFA3ZSXYOBRJNPHUQZR2XPKWULAC
UAX3KJOIN3XBSLKP4IAWAWSCI3DLDKF22A6HRMGA4FHY3AS2QRVAC
I5AZCCITRO63LNWJRME5S4VV4BSSRBHCN7S2WBRZUPMLLPMYVHAAC
M725FAFL7GBGMKYRFR7BB62PMNFKDIJKJPPT2MIGP76WVS6CS3MAC
74C6RCXRROHRH6AYCDWZF4EBNLI6OZGUXZKPOF6RFK222GHBHNDQC
53LXFA2O4DZ2GJ7GC6M3FUUNFJ5MOKSUJ74XU2YNLO3HSOEASSXAC
WUJMPZPGPNVLBHEBVYTLSYWFOPEYVQJOPK45RFD576HTLG3NFCTAC
LEP7X3CT5H7NRQOBIAKQU32QLQQWLBURBNTR2YZUYL53C5BRAM6QC
GR4RROJFJOGM2WLQSVK5R5UYD7IK6ITF6UP5RVHAHD3J4OFJWGCAC
Q3HD3NQ6VOHEXHBSMQ5QDLKUH4OU2OJDMR3UXVOTB65IUUFJ2FCAC
QZN342OJIIASLEFTR2V33NGDL5DKSE3TZBBYJHJ3L5KZI7Q22GHQC
J342XUAARPIMSQMB4ZFV5NFTYBOYKPSB52M2LDLZ7AZQ3IJ6K2QAC
AHOO2ILEJWTPCYHJH26WAF7A4YYVMHFX4UWHSAAAMHI73TSQZ6CAC
TXI6GSQDOUHU4DWQTCMLVVCA2YSIAUZJWSFMH22QPO3W4NGNRF5AC
GFXWHTE6POBIOBUMRAWD5QS22JEO52EF4VTLMB4CDK4RLSCK7HCAC
2CK5QI7WA7M4IVSACFGOJYAIDKRUTZVMMPSFWEJTUNMWTN7AX4NAC
OTIBCAUJ3KDQJLVDN3A536DLZGNRYMGJLORZVR3WLCGXGO6UGO6AC
SV6XYVDLBZ5STTTRCNOR32WLAPGBL5CHAZIFB3YSZ3XZQV4WX6EAC
P2PODHT74V3R3IKCSMOQOIAZBBEK5ZGTLWMDDBXO7XNVX5FPSNJQC
VHQCNMARPMNBSIUFLJG7HVK4QGDNPCGNVFLHS3I4IGNVSV5MRLYQC
SPNMXTYRSNPNQJNBTYDZSHYDZVZRPM4LI5QX7GR2TLTC6SPJX4DAC
UCFOE6KJM4USAO3SATXQQQBF3H6ERZCEWIKTYYYSLJK5TASKZOVAC
KXIWX3X5UH6PSNOYDBYBAHKQZAQJIDHNSDWSIZREGOE6HLS26DBQC
NVN2C2LYZ5OMLVJJLXBMPE6CZTDQB2DNS3PIOQC4CKVNUV3C5AXAC
IOYWCTDEHO4GHC777JYUODJSSHL2SJWYTUG5PQPZOG5HEVR6XXYQC
KAGFSWJCTX7VM7G6FHDYK2B2TRPWYVF337SLQVLOVHHOR7U5PMKQC
UZ5PQQVLC4HLTXEUPRD4NCKU5VR4JCVZKN7BQMVPFADLYI4W3PRAC
GQBUV2XOMEPMTXMPCBQWGGIUXGQDX77VTGPFIG6YT7G64ASOYHXQC
5O356ZWY6DCM3Y6VFZPYQY5AIHIN6JGZDGLXU5DL6LWTFNDDFPFQC
CVK6T5OZZPWGWZ4E2QQZKCOWZPC25EDWXZWLLTPBDDRGEQGADKNAC
C6XYHFVEEI4B7SHF5KIPSBOBLVWGODZS56JAIOUKQPRC4FAUSJAQC
25GIWMASSPUME4NGCHWBHJDN5FOZVFTWZZFOZ2ZP5YHCKZOY6GJAC
J3YDSRMTV44CILD443Y36LHYII2ZI43DFAWJZG6PERP35DEVYXRQC
D7D6T2F3FRMONF627F2NV227T5KTZ4FOHZKROEIIA236U7FVASTQC
FJQM2HAOV7J5263GOEBH4Y55Q2WGKU6ZE5AQ7MMLFHWYAYUP7INQC
WRW43ITLCVJQ37KYCE4YKIW5XGRD2Q6XVLCPSH6M2YBRKSQVQ5CQC
OOUCNHXBSUYBBBMBWWJZX3CRPXI2KNQWO24UJOO3IYORXK2MLAJQC
RMJWZNWEUBCMCSB6D77IZHHBKSEKU66RJPOV6773GGHBATNF42IQC
DFO5SFDTU6GR5XQ4X5U6I2BENQNQP3M4EUUQ2E2DQEB3YQYS2WIAC
5MRLKZV574TCMNL5APG4XCHPK6CB36BI6KV3HMXOGD47WB5VKPTAC
V6JHPHYNDGOBF3OKHPYJ6IQEU5PSLWNUCQBGVW4TG7TYL6OLF3QAC
D4FEFHQCSILZFQ5VLWNXAIRZNUMCDNGJSM4UJ6T6FDMMIWYRYILQC
GX7JGZVXVYD2Y3PJFO4QFVGE3MN4CUKY7T2NTFVNPIBP2P3BUAUAC
FS2ITYYHBLFT66YUC3ENPFYI2HOYHOVEPQIN7NQR6KF5MEK4NKZAC
PNBKVYZ4ANUAZNQN6KEWYNDF7552ROZPNAPRJE7Q6O7ZZJMJ3S3QC
4X37LWXMH24S6LICL3MZKUKOTWHMS3SYOSVL2KEYEUCYLANYRPFAC
J32JEWUVJO4QPIOXUQ2LI7PYYCTRSKW7247Y2IQZWU3ZB2UJZIZQC
CAVPW3NGOW5IENWZ56A6EZF2FPDE3OP4CORT4RN6SNLMFTBLYZMQC
ZAONCLY6WLSTD2H5KY73V532GRKSEV2XPOGTKHR6EAQDAVXYISMAC
2LZV4KUM5L44MKTGJA7IPSJPXRPDYCKHM63OHJIGIJNNA7UC2FMQC
BJ5X5O4ACBBJ56LRBBSTCW6IBQP4HAEOOOPNH3SKTA4F66YTOIDAC
Directory = 'data/'
Directory = nil
Directory_error = nil -- Any error encountered while determining Directory. If this is ever set, the app will do nothing but display it. (We can't rely on 'error' for that because we don't want to open up the sources in that situation.)
end
if #arg > 0 then
Directory = arg[1]
print('setting Directory from commandline: '..arg[1])
if Directory:sub(#Directory,#Directory) ~= '/' then
Directory = Directory..'/'
end
print('Directory is now '..Directory)
end
if Directory == nil then
print('setting Directory_error')
if Settings == nil then
Directory_error =
"Please run pensieve.love once from a terminal window and specify the\n"..
"location of your notes. The location will be remembered in future.\n"..
"Thank you! If all goes well, you won't see this message ever again."
else
Directory_error =
"Please perform a one-time migration for your notes:\n"..
"\n"..
"* (optional) Move any existing notes in "..App.save_dir.."data\n"..
" or similar locations to your preferred location.\n"..
"\n"..
"* (optional) Move any existing "..App.save_dir.."config\n"..
" file _inside_ your notes directory to preserve any prior state\n"..
" of your note-taking surface (open columns, etc.).\n"..
"\n"..
"* Please run pensieve.love once from a terminal window and specify the\n"..
" location of your notes as an absolute path. This location will be\n"..
" remembered in future.\n"..
"\n"..
"Thank you! If all goes well, you won't see this message ever again."
end
return
Display_settings.column_width = Settings.column_width
for _,column_name in ipairs(Settings.columns) do
create_column(column_name)
end
function run.load_more_settings_from_notes_directory()
local f = App.open_for_reading(Directory..'config')
if f then
local directory_settings = json.decode(f:read())
f:close()
Display_settings.column_width = directory_settings.column_width
for _,column_name in ipairs(directory_settings.columns) do
create_column(column_name)
end
Cursor_pane.col = directory_settings.cursor_col
Cursor_pane.row = directory_settings.cursor_row
Display_settings.x = directory_settings.surface_x
Display_settings.y = directory_settings.surface_y
else
-- initialize surface with a single column
command.recently_modified()
if Settings == nil then Settings = {} end
Settings.x, Settings.y, Settings.displayindex = App.screen.position()
assert(Directory_error == nil) -- this will go into an infinite loop if handle_error ever tries to save settings
-- side effect: save notes-related settings inside Directory
local f = App.open_for_writing(Directory..'config')
assert(f)
f:write(json.encode({
columns=column_names,
column_width=Display_settings.column_width,
cursor_col=Cursor_pane.col,
cursor_row=Cursor_pane.row,
surface_x=Display_settings.x,
surface_y=Display_settings.y,
}))
if Settings == nil then Settings = {} end
Settings.x, Settings.y, Settings.displayindex = App.screen.position()
local success, errmsg = love.filesystem.append(outfilename, 'interrupted at '..Display_settings.search_all_progress_indicator..'\n')
local success, errmsg = append_to_file(outfilename, 'interrupted at '..Display_settings.search_all_progress_indicator..'\n')
This will read the notes from the `data.sample/` directory in this repo to
give you a flavor for what the app is like.
From here on out, restarting pensieve.love will open the same directory.
Run again from a terminal if you ever want to switch to a new directory.
While the sample gives you stuff to browse, don't use it to write any real
notes. LÖVE limits what directories apps can list files from (which is great
for privacy), but has some confusing rules around them. Each app can only
write to files under a single directory, the app's _save directory_
([love.filesystem.getSaveDirectory()](https://love2d.org/wiki/love.filesystem.getSaveDirectory)).
In addition, reads will also fall back to read from the repo directory,
enabling the sample experience. However, edits you make will not modify the
`data.sample/` directory in this repo. Your notes will fragment between two
directories, which can get confusing.
To create your own directory of notes, run without an argument:
```
love .
```
pensieve.love will then create a `data/` directory in the app's save directory
as above. Confusing location, but everything will be in one place.
- start out with a non-default data set; default config file and data directory don't get clobbered
- start out with a non-default data set and switch to editor and press ctrl+k to clear logs; default config file and data directory don't get clobbered
Load directory:
- clear save dir, run, you get an error message telling you to specify a directory for notes
- quit works
- create an empty config file, run, you get an error message telling you to migrate your existing notes directory
- quit works
- clear save dir, run with a dir argument that doesn't exist; app creates dir and opens up with no data
- quit works
- on quit, app creates 'config' file within the dir
- clear save dir, run with a dir argument that exists and contains no 'config'; app opens up
- quit works
- on quit, app creates 'config' file within the dir
- run with a dir argument of '/' (that you don't have access to)
?? app should either throw an error or save data you put in _somewhere_
- run app from terminal with a dir argument; the app uses settings from 'config' inside that directory
- quit works
- run app from terminal with a dir argument, hit C-w; the app switches to source editor
- app has a config with a `data_directory` key, run app from terminal with a dir argument; app opens up with new data directory
- on quit, app saves the new data directory to the `data_directory` key