如何在Vim中隐藏指定字符(制表符)后的行内容并按需单条揭示
在Vim里打造纯文本闪卡系统:隐藏答案+间隔重复方案
我完全懂你想要用纯文本+Vim构建自己闪卡系统的执念——毕竟Unix工具链的灵活性、纯文本的持久力,还有那种完全掌控自己数据的感觉,确实比依赖GUI闪卡软件舒服太多!下面就给你一套完整的实现方案,从基础的答案隐藏/揭示,到扩展间隔重复学习计划,全用Vim和纯文本搞定:
一、核心需求:一键隐藏/揭示当前行答案
最直接的方案是用Vim的折叠功能,默认隐藏每行制表符后的答案,按一键就能切换当前行的显示状态,完全不需要复杂的插件:
1. 配置闪卡文件的折叠规则
把这段代码加到你的~/.vimrc里,或者针对闪卡文件创建单独的文件类型配置(比如~/.vim/ftplugin/flashcards.vim):
" 识别.flash/.cards后缀的文件为闪卡类型 autocmd BufRead,BufNewFile *.flash,*.cards set filetype=flashcards " 设置折叠规则:每行第一个\t之后的内容作为折叠块 setlocal foldmethod=expr setlocal foldexpr=getline('.')[0:match(getline('.'), '\t')] == '' ? 0 : 1 " 默认关闭所有折叠(隐藏答案) setlocal foldlevel=0 " 映射空格键切换当前行的折叠/展开(显示/隐藏答案) nnoremap <buffer> <space> za
2. 怎么用?
- 把你的闪卡保存成
.flash或.cards后缀的文件,每行格式是问题\t答案 - 打开文件后,所有答案都会被自动折叠隐藏,只显示问题
- 光标移到某一行,按空格键就能展开显示答案,再按一次就重新隐藏,完美适配间隔重复的复习流程!
二、扩展:实现简易间隔重复学习计划
既然你需要提前安排复习,我们可以给闪卡加个「下次复习日期」标记,用Vim函数过滤出当天需要复习的内容,还能一键更新复习时间:
1. 调整闪卡格式
在每行开头加一个日期标记,比如:
[2024-10-05] hello\thallo [2024-10-07] from all over the world\taus der ganzen Welt [2024-10-05] unfortunately\tleider ...
2. 一键显示今日需复习的闪卡
在闪卡文件的配置里加这个函数和映射:
function! ShowTodayFlashcards() let l:today = strftime('%Y-%m-%d') " 打开新窗口,只显示今天的闪卡 new setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile call append(0, filter(getline(1, '$'), 'matchstr(v:val, ''^\[\zs\d\{4}-\d\{2}-\d\{2}\]\ze'') == l:today')) endfunction " 按F5快速打开今日闪卡列表 nnoremap <buffer> <F5> :call ShowTodayFlashcards()<CR>
3. 一键更新复习时间
根据你对知识点的记忆程度,设置不同的复习间隔映射:
function! UpdateReviewDate(interval) let l:current_line = getline('.') " 计算新的复习日期(interval是天数) let l:new_date = strftime('%Y-%m-%d', localtime() + a:interval * 86400) " 替换行首的日期标记 let l:new_line = substitute(l:current_line, '^\[\d\{4}-\d\{2}-\d\{2}\]', '[' . l:new_date . ']', '') call setline('.', l:new_line) endfunction " 记忆牢固:3天后复习(按<leader>3) nnoremap <buffer> <leader>3 :call UpdateReviewDate(3)<CR> " 记忆一般:1天后复习(按<leader>1) nnoremap <buffer> <leader>1 :call UpdateReviewDate(1)<CR> " 没记住:今天再复习一次(按<leader>0) nnoremap <buffer> <leader>0 :call UpdateReviewDate(0)<CR>
这样复习完一张闪卡,按对应的按键就能更新下次复习时间,完全实现简易的间隔重复逻辑。
三、为什么纯文本+Unix工具链是最优解
你提到的几个理由我太赞同了:
- 超强的可搜索性:用
grep -r "Germany" ~/flashcards就能快速找到所有和德国相关的闪卡,这种批量处理能力是GUI软件比不了的 - 零依赖编辑:任何文本编辑器都能修改纯文本闪卡,甚至用
sed/awk批量导入、修改闪卡内容都极其方便 - 持久的兼容性:Unix工具和纯文本格式已经存在几十年,而且会一直存在,不用担心某天软件停更或者格式失效
- 极致的轻量化:所有闪卡加起来可能也就几MB,备份起来毫无压力,还能用Git做版本控制,追踪每一次修改
- 技能提升:折腾这些配置的过程,本身就是深入学习Vim和Unix工具链的绝佳机会,以后处理其他文本任务也能得心应手
内容的提问来源于stack exchange,提问作者Bithov Vinu
相关产品推荐
相关产品推荐

