2017-01-02 44 views
-1

我想以筆記記錄的方式改變我的習慣。以GTD方式使用Vim

我想在一個目錄下添加名爲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(無插件,只是內置功能;沒有外部程序;只有幾個autocmd,映射和我的personnal 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. 如何抑制第一空行前的搜索?我設法使用正則表達式\%<10l在前9行中查找我的標籤,但就是這樣。
  2. 如何查找我的標籤,無論他們在文件中的位置?我剛剛成功地用\_.*正則表達式對線進行了幾行回覆。
  3. 蛋糕上的結冰將會是quickfix窗口上的顯示重點放在筆記的標題部分(在/^=之後)。我認爲這可能是^=\zs.*\ze,但對於我來說,在單個vimgrep中是太多了!

編輯

我通過以前的結果做連續使用vimgrep解決我的 「和」 使用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但我沒有成功做到這一點。任何想法?

回答

0

首先,如果您使用動態字符串作爲模式,您應該知道風險。例如。您PROJECT_NAME包含[].*()...

什麼,你可以嘗試的,建設這個命令:

vimgrep '/\%<10l\(foo\|bar\|blah\|whatever\)' path/* 
+0

您的評論對我的搜索模式是明智的。理想情況下,我想有可能在函數的參數中使用regexp。您提交的vimgrep命令用於搜索foo或bar或blah或其他任何內容。我需要的是建立一個AND正則表達式,在第一行看,任何順序的任何條款。任何想法來提高你的正則表達式?我在幾行('\ _。*')或任何順序('(?=。* foo)(?=。* bar)')中找到了一些線索,但不能同時搜索:/ –