You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:18:14