2

我正在使用 vim 管理待办事项列表,并想设置一个热键来执行以下操作:

  1. 查找包含光标下单词的所有行。世界总是一个标签,格式为:#mytaghere

  2. 按其中包含的另一个标签按字母顺序对所有这些行进行排序。该标签再次采用#mytaghere 格式。例如,所有带有标签#priorityA 的行都将按字母顺序排列并放置在所有带有标签#priorityB 的行之上,依此类推。

  3. 将所有这些行放入 Vim 的 quickfix 窗口。

通过将以下内容放入我的 .vimrc 文件中,我设法实现了 1 和 3 的有限版本:

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

每当光标下的单词包含 # 时,此设置就会失败,并且只要字符是其他字符(例如 _ ),它就会起作用。产生的错误是:“E682:无效的搜索模式或分隔符”,看起来像 # 正在干扰与 vimgrep。

另外,我不知道如何按优先级标签对行进行排序。

提前感谢您的帮助。我只是在学习 Vim,如果我能解决这个问题,我就可以将它用于我所有的组织工作。

4

2 回答 2

1

:vimgrep命令有两种形式:

: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>

以上将把光标下的所有内容放入quickfix窗口。

: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 回答