:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update
但是我不想使用args
,而是更喜欢通过Ack进行搜索,然后在找到的所有文件中进行替换。有没有类似于argdo
命令的方法可以实现呢?
我决定在Vim之外使用ack
和perl
来解决这个问题,这样我就可以使用更强大的Perl正则表达式而不是GNU子集。你可以将它映射到你的.vimrc
中的一个按键。
ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'
ack
ack是一个强大的命令行工具,结合了grep
、find
和完整的Perl正则表达式(不仅仅是GNU子集)。它完全由Perl编写,速度快,支持高亮匹配,可在Windows上运行,并且比传统的命令行工具更加友好。在Ubuntu上安装它可以使用sudo apt-get install ack-grep
命令。
xargs
xargs是一个古老的Unix命令行工具。它从标准输入中读取项并执行指定的命令,然后将从标准输入读取的项目附加到命令末尾。因此,通过ack
生成的文件列表被追加到perl -pi -E 's/pattern/replacement/g'
命令的末尾。
perl -pi -E
Perl是一种编程语言。
-p
选项使Perl在程序周围创建一个循环,该循环遍历文件名参数。
-i
选项使Perl原地编辑文件。你可以修改这个选项以创建备份。
-E
选项使Perl执行指定作为程序的一行代码。在我们的例子中,程序只是一个Perl正则表达式替换。
有关Perl命令行选项的更多信息,请参见perldoc perlrun
。有关Perl的更多信息,请参见http://www.perl.org/。
现在,Vim有一个新命令cdo
,可以将给定命令运行到快速修复列表的每一行。
因此,您可以使用
:Ack pattern
:cdo s/pattern/newpattern/g
:cdo
命令时都会出现 not an editor command
的错误提示,有什么想法吗? - ohhh+listcmds
功能的 Vim。这是否可以解释缺失的命令? - rools我不认为有内置的方法可以做到这一点,但是制作一个应该很容易。
你需要做的是创建一个调用自定义函数的命令。该函数应该使用getqflist()
函数获取快速修复列表中的所有条目,并使用exe
执行相关操作。请注意传递参数时要小心!
" Define a command to make it easier to use
command! -nargs=+ QFDo call QFDo(<q-args>)
" Function that does the work
function! QFDo(command)
" Create a dictionary so that we can
" get the list of buffers rather than the
" list of lines in buffers (easy way
" to get unique entries)
let buffer_numbers = {}
" For each entry, use the buffer number as
" a dictionary key (won't get repeats)
for fixlist_entry in getqflist()
let buffer_numbers[fixlist_entry['bufnr']] = 1
endfor
" Make it into a list as it seems cleaner
let buffer_number_list = keys(buffer_numbers)
" For each buffer
for num in buffer_number_list
" Select the buffer
exe 'buffer' num
" Run the command that's passed as an argument
exe a:command
" Save if necessary
update
endfor
endfunction
你可以这样使用ack
:args `ack -l User app/`
:argdo %s/, :expire.*)/)/ge | update
或使用ag
:args `ag -l User app/`
:argdo %s/, :expire.*)/)/gec | w
我使用MacVim(在终端中激活为mvim
)。我将ack
的结果传输到mvim
:
mvim -f $(ack -l $@)
bufdo
进行搜索/替换::bufdo %s/SEARCH/REPLACE/gce | update
-E
开关来运行perl
?我看不出任何特性的用途。 - Gilles Quénot-l
的文件,否则它会为我抛出错误,就像这样:ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'
。 - jpadvo