写作动机:
我尝试使用Bear,并且效果非常好,所以我想尝试导入存储在Google Keep(而不仅仅是Evernote)中的备忘录
您可以轻松地在任何地方做笔记,粘贴一段代码,在设备之间共享代码,具有适当的搜索功能,并且如果可能的话,可以找到一个不用担心隐私政策(而不是免费)的备忘录应用程序,我想强调服务和政策的连续性)
或Evernote难民日记
印象笔记
https://evernote.com/intl/jp/
我使用多年的Evernote受到文本格式的压力。
记下我的想法并保存大量的博客帖子非常好(足够方便)。
我还想粘贴一段代码,因此我想很多次至少可以使用markdown兼容表示法。
可以使用免费计划的设备数量有限的原因是,如果可以在Mac和iPhone上使用它是很好的,但是没有问题(我没有那种感觉想要转移到付费计划。,由于格式方面的压力)
去年12月,在宣布允许Evernote员工查看用户笔记的规则更改之后,我们决定导出所有数据并退出Evernote。
Kobito
http://kobito.qiita.com/
我曾经整理过计划稍后(在Qiita上)发布的技术信息(偶尔还会发布)
作为带有实时预览的减价编辑器。
我曾经写过这样的文章。
kobitonote.py-将用Kobito编辑的项目同步保存到Evernote
第一天
http://dayoneapp.com/
日记应用。
macOS版本(4800日元),iOS版本(600日元)。
我在macOS(我认为大约是1200日元)和iOS上使用旧版本(Day One Classic)已有大约4年了。
可以使用
降价。
但是,搜索功能(尤其是日语)不够好。 (顺便说一下,我经常搜索"我何时去理发店"之类的信息。)
存储在云中的数据是经过加密的,除非法律要求,否则员工将不会访问加密的文件,这对于暂时的隐私保护来说是令人满意的水平。
同步日记很不错,但是如果我在多个设备上编辑同一条目并且发生冲突,则会被覆盖(而不是留下多个版本),因此当我从另一台设备写日记时,它是新的。操作,例如启动新条目,编写它并在以后进行编辑,或者将日记条目保存为编辑模式而暂时不打开它。
我并不特别喜欢日记应用程序(由于有了这个应用程序,我养成了写日记的习惯),但是搜索功能使它成为备忘录应用程序更进一步。
仅在法律要求的情况下,才对存储在云中的数据进行加密和加密
在第一天就写您的私人笔记(即使没有Evernote)。
备忘录
附加到macOS
Evernote要营救难民或锁定MacOS / iOS / iCloud营地,
macOS随附的备忘录应用程序可以导入Evernote导出文件(.enex)。 (我之所以说它是封闭的,因为备忘录应用程序没有导出功能)
这是操作系统标准,并且可以与iOS上的备忘应用程序同步,这样可以吗?我以为是一会儿。
搜索功能根本不起作用。
笔记太多了吗?不,我可以使用iOS应用搜索,所以我认为并非如此。
无法搜索作为电子备忘录完全没有意义,因此请寻找其他选项。
谷歌Keep
https://keep.google.com/
Google制作的记事应用。与网络浏览器一起使用。
还有一个iOS应用。
我担心备忘录的私密性(*表示未指定私隐将受到保护),但是
正常搜索很方便。
您可以参考Google文档中的备忘录。 (这对于写工具很有用)
熊
http://www.bear-writer.com/
我花了三个月的时间,在第一天(经典)中分离了私人备忘录,并在Google Keep上搜索了备忘录,但昨天我读了这篇文章。
- 熊的应用程序有一个很好的路线。这很有趣,因为我围绕着创新本质做各种事情,例如减价。 --toukubo.com
- "没有"笔记本"的概念。 " --toukubo.com
- 严肃的熊是惊人的。我很喜欢很久以后。作为信息设计,极为优雅。 --toukubo.com
我暂时安装了iOS版本和macOS版本。
首先,设计非常出色。 (您可以从多个主题中选择自己喜欢的主题)
您可以使用自己的格式和文本格式的减价。
可以在备忘录之间创建相互链接(=可以像Wiki一样使用)。
可以导入Evernote导出文件(.enex)。您也可以导入rdf和md。 (似乎您也可以从DayOne导入)
◎导入时需要"转义非自愿标签"选项。因为,如果有#字符,其后的单词将被识别为标签,并且标签列表中将列出数百个无意义的标签。标签是文本的一部分(不是文本属性),因此,如果删除标签(尽管只能从标签列表中一个一个地删除它们),则文本中的标签表示法(您以为它在哪里,例如#! / bin /)sh)被删除。
搜索没有压力。
隐私策略中有一种安全感。
但是,它通常落在同步期间。 (设备间同步需要Pro帐户(每月150日元)。)
我想将Google Keep笔记导入Bear
,这是此条目的主要主题。
从Google Keep导入...尽管不直接从Bear支持,但是可以通过将Google Takeout导出的单个HTML文件转换为markdown来导入。
1 | $ unzip takeout-yyyymmddThhmmssZ-001.zip |
HTML文件(1个文件= 1个备忘录)将在
./Takeout/Keep/下展开,因此通过编写适当的脚本对其进行标记,并将其从Bear导入。
1 | $ python html2md.py dir ./Takeout/Keep |
html2md.py(在家中使用的适当脚本)粘贴在下面供您参考。 (需要单击。您可以自行承担使用风险,也可以根据自己的喜好对其进行编辑或改进。您可以在与HTML文件相同的目录中创建大量md文件(在上述./Takeout/Keep/下例如)Bear不能在导入时选择HTML文件,所以即使您全选,也只能选择md)
html2md.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #!/usr/bin/env python # -*- encoding: utf-8 -*- import click import os import sys from bs4 import BeautifulSoup from datetime import datetime import time def datetime_to_unixtime(dt): assert isinstance(dt, datetime) return time.mktime(dt.timetuple()) def touch(fname, atime=datetime.now(), mtime=datetime.now()): if not os.path.exists(fname): open(fname, 'a').close() os.utime(fname, (datetime_to_unixtime(atime), datetime_to_unixtime(mtime))) def parse(fp): soup = BeautifulSoup(fp, 'lxml') note = soup.find('div', class_='note') title, timestamp, archived, content, labels = None, None, False, None, [] for div in note.find_all('div'): class1 = div['class'][0] if class1 == 'heading': tstr = div.text.strip() timestamp = datetime.strptime(tstr, '%Y/%m/%d %H:%M:%S') # print 'TIMESTAMP (%s)' % timestamp elif class1 == 'archived': archived = True # print '+ARCHIVED' elif class1 == 'title': title = div.text.strip() # print 'TITLE (%s)' % title.encode('utf-8') elif class1 == 'content': contents = [] for content in div.contents: if isinstance(content, unicode): contents.append(content) else: if content.name == 'br': contents.append('\n') else: contents.append(content.text) content = ''.join(contents) # print 'CONTENT', content.encode('utf-8') elif class1 == 'labels': labels = [label.text for label in div.find_all('span', class_='label')] # print 'LABELS', labels else: # print class1, div pass return (title, timestamp, archived, content, labels) @click.group() def cli(): pass def conv(html_path): with open(html_path, 'r') as fp: (title, timestamp, archived, content, labels) = parse(fp) print 'TITLE:', title print 'TIMESTAMP:', timestamp # print 'ARCHIVED:', archived if archived: labels.append('archived') # print content labels.append('keep') print 'LABELS:', ' '.join(['#%s' % label for label in labels]) if html_path.endswith('.html'): md_path = html_path.replace('.html', '.md') else: md_path = html_path + '.md' with open(md_path, 'w') as fp: def _tagify(label): if ' ' in label: return '\\#%s\\#' % label else: return '#%s' % label if title: fp.write(title.encode('utf-8')) fp.write('\n\n') fp.write(content.encode('utf-8')) fp.write('\n') fp.write('%s\n' % ' '.join([_tagify(label.encode('utf-8')) for label in labels])) touch(md_path, atime=timestamp, mtime=timestamp) @cli.command() @click.argument('html-path', type=click.Path('r')) def one(html_path): assert os.path.exists(html_path) conv(html_path) @cli.command() @click.argument('html-dir', type=click.Path('r'), default='.') def dir(html_dir): assert os.path.exists(html_dir) and os.path.isdir(html_dir) for path in os.listdir(html_dir): full_path = os.path.join(html_dir, path) conv(full_path) if __name__ == '__main__': cli() |