2

vim を使用して to-do リストを管理していますが、ホットキーを設定して次の操作を実行したいと考えています。

  1. カーソルの下の単語を含むすべての行を検索します。世界は常に次のようにフォーマットされたタグです: #mytaghere

  2. これらのすべての行を、含まれている別のタグのアルファベット順に並べ替えます。ここでも、タグは #mytaghere 形式です。たとえば、タグ #priorityA を持つすべての行はアルファベット順に並べられ、タグ #priorityB を持つすべての行の上に配置されます。

  3. これらの行をすべて Vim のクイックフィックス ウィンドウに入力します。

以下を .vimrc ファイルに入れることで、限定バージョン 1 と 3 を実現できました。

map <f2> :vimgrep <cword> % <bar> copen <enter>
set iskeyword=@,48-57,_,192-255,95,35 "lets cword include #s and _s

このセットアップは、カーソルの下の単語に # が含まれている場合は常に失敗し、文字が他の何か (たとえば、 _ ) の場合は常に機能します。生成されるエラーは次のとおりです。 vimgrepで。

また、優先タグで行をソートする方法がわかりません。

助けてくれてありがとう。私はちょうど Vim を学んでいます。この問題を解決できれば、すべての整理に使用できます。

4

2 に答える 2

1

:vimgrepコマンドには次の 2 つの形式があります。

:vim[grep][!] /{pattern}/[g][j] {file} ...
:vim[grep][!] {pattern} {file} ...

には/{pattern}/、実際にはキーワード以外の区切り文字を使用できます。<cword>で始まる場合#、Vim はこれを開始区切り文字として解釈し、終了区切り文字がないために文句を言います。

区切り文字を選択して前後に置き<cword>ます。検索をリテラルにするには\V、現在の単語を使用してエスケープします。これは、式 register を介して挿入されます=

:noremap <f2> :vimgrep /<C-r>='\V'.escape(expand('<cword>'), '/\')<CR>/ % <bar> copen <enter>

ああ、あなたは使うべき:noremapです; これにより、マッピングが再マッピングと再帰の影響を受けなくなります。

于 2013-03-10T12:49:11.967 に答える
0

Ingo Karkat のおかげで、次の解決策を思いつくことができました。

noremap <f2> :vimgrep /<C-r>='\V'.escape(expand('<cword>'), '/\')<CR>/ % <bar> copen <enter>

上記は、カーソルの下のすべてを取得し、クイックフィックス ウィンドウに配置します。

:set modifiable
:sort /.*|.*|/

上記は、ファイル名と行/列情報を無視して、クイック フィックス ウィンドウ内のすべてを並べ替えます。

すべてを一度に行うには (タグ付けされたすべての行を見つけて、それらの行の最初の文字で並べ替えます):

noremap <f2> :vimgrep /<C-r>='\V'.escape(expand('<cword>'), '/\')<CR>/ % <bar> copen <enter> <bar> :set modifiable <enter> <bar> :sort /.*\|.*\|/ <enter>
于 2013-03-10T20:56:15.010 に答える