2013-03-10 60 views
2

我使用vim来管理待办事项列表,并想设置一个热键做到以下几点:如何设置Vim来搜索并排序包含特定字符串的所有行?

  1. 查找包含光标下的字行。世界总是一个格式为:#mytaghere

  2. 按照其中包含的其他标记的字母顺序排列所有这些行。标签又是#mytaghere格式。例如,标签#priorityA的所有行都将按照字母顺序排列,并放置在标签为#priorityB的所有行上,依此类推。

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

我设法通过把以下到我的.vimrc文件来实现的1和3限量版本:

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

每当光标下的单词包含#这种设置失败,只要字符是别的东西(例如,一个_),它就会工作。产生的错误是:“E682:无效的搜索模式或分隔符”,这看起来像#正在干扰vimgrep。

此外,我想不出如何按优先级标签排序行。

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

+0

这可能是最好的周围使用使用vimgrep模式分隔符,':使用vimgrep/ /% ...'。另外,':sort //'可能在这里使用。 – glts 2013-03-10 08:12:20

+0

vim.org上有很多todo插件。你有尝试过吗? – romainl 2013-03-10 09:32:22

+0

我看过几个不同的插件,以及一些不同的专有程序。然而,我真正需要的是能够搜索标签并对结果进行排序。我可以更简单地让我的解决方案更好。 – user2153281 2013-03-10 19:30:19

回答

1

:vimgrep命令有两种形式:

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

对于/{pattern}/,实际上任何非关键字分隔符可被使用。当您的<cword>#开头时,Vim将此解释为起始分隔符,然后抱怨,因为没有结束分隔符。

选择一个分隔符并将其放在<cword>;让搜索文字,使用\V和逃避当前的单词,现在虽然插入表达注册=

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

哦,you should use :noremap;它使映射免于重映射和递归。

+0

非常感谢您的帮助!这可以完美地找到我的所有标签并将它们放入quickfix窗口中。现在我只是坚持如何对它们进行排序。使用:按行号进行排序,因为这是在文件名后面的quickfix窗口行中列出的第一行: Dropbox/todo.txt | 100 col 34 |实际要排序的行是 所以我试图定义一个范围来排除第二个|之后的所有内容,但是我的范围定义都没有工作 – user2153281 2013-03-10 20:05:36

+0

quickfix窗口是特殊的,你不能像修改另一个缓冲区那样修改它。不过,您可以使用getqflist()和setqflist()函数获取和操作这些项目。 – 2013-03-10 20:16:18

+0

但是,在运行'set modifiable'然后'sort'之后,列表本身按照错误的文本进行排序。它甚至询问当我试图关闭缓冲区时是否要保存。 换句话说,我想我问的是如何使用'排序'的方式,忽略anyFileNameHere.txt | anyTextHere | – user2153281 2013-03-10 20:22:46

0

由于英戈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> 
相关问题