-1

我想改变我做笔记的习惯。

我想添加YYYYmmddHHiiss.txt一个目录中命名的文件并以这种方式启动它们:

=Call somebody (title of my note)
@work (context of my note)
!todo (type of the note, I'll use !inbox, !todo, !waiting, !someday and !reference, each one his habit)
#project_name
#call
#Name of the person
#other tags if needed...

Details...

我想要的是:

  • 使用 Vim(没有插件,只有内置功能;没有外部程序;在我的个人 vimrc 中只有一些自动命令、映射和函数)
  • 将我所有的笔记保存在一个目录中,相信 Vim 和我的标签可以找到我需要的东西。
  • 使用此类命令开始使用此系统,:GtdGrep如果我需要更多命令,请稍后考虑。

模型

:GtdGrep !todo @work
:GtdGrep !inbox
:GtdGrep @waiting @home
:GtdGrep !todo @work #this_project
:GtdGrep #name_of_a_co-worker #this_project

现在我已经向您介绍了我的需求,我可以开始描述我的问题了^^ 我想创建 :GtdGrep 命令背后的函数,但是有很多东西我无法收集...这是我的草稿。

let gtd_dir=expand($HOME)."/Desktop/notes"

function! GtdGrep(...)
    execute "silent! vimgrep /\%<10l".join(a:000, "\\_.*")."/j ".gtd_dir."/**"
    execute "copen"
endfunction
command! -nargs=* GtdGrep call GtdGrep(<f-args>)
  1. 如何限制第一个空行之前的搜索?我设法使用正则表达式在前 9 行中查找我的标签,仅此\%<10l而已。
  2. 无论标签在文件中的位置如何,如何查找我的标签?我刚刚成功地使用\_.*用于行返回的正则表达式在几行上执行了 grep。
  3. 锦上添花的是 quickfix 窗口上的显示集中在我的笔记的标题部分(在 之后/^=)。我认为 a 是可能的,^=\zs.*\ze但对我来说,一个 vimgrep 就太多了!

编辑

我通过对以前的结果执行连续 vimgrep 来解决我的“AND”vimgrep 问题。这是一个很好的解决方案吗?

let gtd_dir=expand($HOME)."/Desktop/notes"

function! GtdGrep(...)
    let dest = g:gtd_dir."/**"
    for arg in a:000
        execute "silent! vimgrep /^".arg."$/j ".dest
        let dest = []
        let results = getqflist()
        if empty(results)
            break
        else
            for res in results
                 call add(dest, bufname(res.bufnr))
            endfor
            let dest = join(dest, ' ')
        endif
    endfor

    " Last vimgrep to focus on titles before displaying results
    let results = getqflist()
    if !empty(results)
        echom dest
        execute "silent! vimgrep /\\%<10l^=.*/j ".dest
        execute "copen"
    else
        echom "No results"
    endif
endfunction
command! -nargs=* GtdGrep call GtdGrep(<f-args>)

我想将 vimgrep 限制在第一个空白行之前的行上,但我没有成功做到这一点。任何想法?

4

1 回答 1

0

首先,如果您使用动态字符串作为模式,您应该知道风险。例如,您的 project_name 包含[].*()...

你可以尝试的是,构建这个命令:

vimgrep '/\%<10l\(foo\|bar\|blah\|whatever\)' path/*
于 2017-01-02T10:42:36.627 回答