1

次のような todo ファイル (todo.txt) があるとします。

  • Foo プロジェクトについて Tom に電話する
  • Bar プロジェクトの概要を完成させ、Thomas に送信します
  • スーザンに私とトムに Foo プロジェクトの予報を送ってもらいます

これらのタスクを記述し、Vim で各行に対応するカテゴリ (個人の場合は @、プロジェクトの場合) を追加できるようにしたいと考えています。

Tom (または Thomas) は @Tom を生成し、Susan は @Susan を生成し、Foo は &Foo と Bar &Bar を生成する必要があります。

したがって、結果は次のようになります。

  • Foo プロジェクトについて Tom に電話する @Tom &Foo
  • Bar プロジェクトの概要を完成させ、Thomas @Tom &Bar に送信します。
  • スーザンに私とトムに Foo プロジェクトの予報を送ってもらいます @Susan @Tom & Foo

Dictionary を作成しました:

let dictodo = {'Tom': "@Tom", 'Thomas': "@Tom", 'Susan': "@Susan", 'Foo': "&Foo", 'Bar': "&Bar",}

新しいタスクを作成し、この特定のファイルで挿入モードを終了するたびに、自動コマンドで関数を起動するにはどうすればよいですか (:autocmd InsertLeave todo.txt :call Filltodo() ?)

1)行のさまざまな単語でリストを作成します:私は思います

let words = split(getline('.'), '\W\+')

2) このリストで dictodo 辞書をブラウズします

3) 辞書で対応する単語 (2 の結果) を行末に追加しますか? 私は考えます

call setline(line('.'), getline('.') . ' ' . result)

1) と 3) の解決策を間違えていない場合、2) が欠落している部分です (keyvar を試しましたが失敗しました)。

4

3 に答える 3

3

この関数のようなもの:

function! AddCat(pairs)
  let lines = []
  for line in getline(1,'$')
    let pairs = copy(a:pairs)
    let words = split(line, '\W\+')
    let cats = []
    " Looks for a category for every word and add it only once.
    call map(words,
          \'has_key(pairs, v:val) && index(cats, pairs[v:val]) == -1'
          \ . '? add(cats, pairs[v:val])'
          \ . ': ""')
    " Add the categories if non-empty.
    call add(lines, join([line]+cats))
  endfor
  call setline(1, lines)
endfunction

Define your pairs:

let dictodo = {'Tom': "@Tom", 'Thomas': "@Tom", 'Susan': "@Susan", 'Foo': "&Foo", 'Bar': "&Bar",}

そして、次のように呼び出します。

:call AddCat(dictodo)

注: @ZyXの答えは私のものよりもはるかに理解しやすく、私も彼の提案を使用しました。自分で行って見てください。

于 2012-09-27T12:31:36.877 に答える
2
function! s:AppLine(pairs, line)
    let pairs=copy(a:pairs)
    let r=a:line
    for word in split(a:line, '\W\+')
        if has_key(pairs, word)
            let tag=remove(pairs, word)
            call filter(pairs, 'v:val isnot# tag')
            let r.=' '.tag
        endif
    endfor
    return r
endfunction
function! AddCat(pairs)
    return setline('.', s:AppLine(a:pairs, getline('.')))
endfunction

使用法:

%call AddCat(dictodo)
于 2012-09-27T14:49:18.230 に答える
-1

辞書の代わりにリストを使用する必要があると思います。

この迅速で素朴な関数は、質問で提供した構成要素に基づいて、必要なことを行うようです。ただし、注意してください: 変数のスコープが正しく設定されておらず、既にいくつかのタグが配置されているかどうかをチェックしません。

function! TidyTodo()
  let listodo = [['Tom','@Tom'],['Thomas','@Tom'],['Susan','@Susan'],['Foo','&Foo'],['Bar','&Bar']]
  let words = split(getline('.'), '\W\+')
  let appendix = ''
  for word in words
    for item in listodo
      if word == item[0]
        let appendix = appendix . ' ' . item[1]
      endif
    endfor
  endfor
  call setline(line('.'), getline('.') . appendix)
endfunction
于 2012-09-27T12:35:14.663 に答える