Vim:为当前文件名添加自动字母和/或数字索引?

时间:2013-12-08 19:26:28

标签: vim numbers sequence

我想实现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插件,但我更喜欢保留我的脚本 自包含的。)

1 个答案:

答案 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