我想实现Niklas Luhmann's Zettelkasten的宽松版本 在Vim。他的方法的核心是继续当前的注释片段 注意或Brahch从它,引入一个略有不同的主题或 概念。在音符名称中,字母表示分支和数字 表示继续。像这样:
note100
note101
note101a # branches off from note100 (related topic)
note101b # also branches off from note100 (related topic)
note101b01 # continues note101b (same topic)
note101b02 # also continues note101b (same topic)
note101c
note102
要在Vim中实现这一点,我需要新文件 自动枚举的名称,可以是“延续”或 当前缓冲区中注释的“分支”。作为一个非编码器在Vimscript中做出第一个“真正的”步骤,这就是我使用分支笔记功能的地方:
function! ZettelkastenNewBranchingNote()
let b:current_note_name = expand('%:t:r')
let b:new_branching_note = call(BranchingFunctionThatReturnsNewNoteName)
silent execute 'edit' b:new_branching_note
echomsg 'New branching note ' b:new_branching_note 'created.'
endfunction
BranchingFunctionThatReturnsNewNoteName()
应该采取
b:current_note_name
并使用自动字母(!)进行扩展
index(按字母顺序向上计数)。我怎么能做到这一点?
另外,对于我的新续注释功能:我怎么能用数字
从当前文件名的最后一个数字部分向上计数? (例如100a01 > 100a02
。)
感谢您的任何建议!
(有点相关,here 建议使用Nexus插件,但我更喜欢保留我的脚本 自包含的。)
答案 0 :(得分:2)
您提供了大量的上下文(这很棒),但是对所需的算法很有帮助。对我来说,它看起来像这样:如果当前文件以字母结尾,增加它,否则(它是一个数字),附加a
以开始按字母顺序排列。
使用正则表达式在Vim中完成检查; \a
是[A-Za-z]
的缩写形式(您也可以写[[:alpha:]]
;是的,它是灵活的),$
锚定到最后这个名字:
if b:current_note_name =~ '\a$'
...
使用matchstr()
提取最后一个字符。
let lastAlpha = matchstr(b:current_note_name, '\a$')
if lastAlpha ==? 'z'
" TODO: Handle overflow
endif
要“增加”字母字符,请先将其转换为数字,然后再增加,然后返回:
let newAlpha = nr2char(char2nr(lastAlpha) + 1)
要替换,请使用substitute()
,再次使用相同的正则表达式。
let b:new_branching_note = substitute(b:current_note_name, '\a$', newAlpha, '')
追加很简单:
else
let b:new_branching_note = b:current_note_name . 'a'
endif