2009-12-02 98 views
4

在vim中有没有办法给出编辑器命令列表?我想执行一系列'全局'命令,并且命令有一些模式。所以我理想地想要生成命令列表(使用正则表达式搜索&替代),然后运行它们,而不必输入每个命令。vim:执行编辑器命令列表

谢谢! 拉夫

+0

您是否试图在函数或脚本内部生成列表,或者文本文件是否足够? – jheddings 2009-12-02 06:00:51

回答

8

(更新:S /缓冲器/寄存器/ G)

如果你可以抽出所有你要运行到寄存器的命令,然后执行寄存器?

http://www.bo.infn.it/alice/alice-doc/mll-doc/linux/vi-ex/node24.html

举例来说,如果你有这样一个文件:

abc 
def 
ghi 
dd 
dd 

然后做

:g/dd/y A 

这洋基与日所有线路,并追加到寄存器

然后,如果您位于文件的第一行,并键入:

@a 

然后2号线现在被删除,文件应该是这样的:

ghi 
dd 
dd 
+0

+1:很好!非常非常很好! – DrAl 2009-12-02 08:22:35

+0

很好的答案。这正是我在找的。谢谢!-Gaurav – user10 2009-12-02 16:56:20

+0

好帖子。我不想看起来很关键,但我很好奇你为什么做了一些事情。更容易记录一个宏?而对于登录注册会不会更容易使用视觉模式,然后抽出而不是搜索你想要抽取的命令?为什么你要注册A而不是(它们结束如果你有一个原因,最好是好奇)最后,当你将文本拷贝到一个寄存器中,而不是一个缓冲区,寄存器就像剪贴板,缓冲区就是你正在编辑的文本 – mmrobins 2009-12-02 21:29:47

1

听起来像是宏给我。谷歌vim宏获取大量有用的信息。基本上

  1. 在命令模式下键入q后面跟着一些其他字母,这将是我们存储宏的寄存器。例如'qw'。
  2. 运行您想要存储以供将来使用的命令。这可以是任何东西,包括正则表达式替换,移动,插入,删除等。
  3. 当你完成了再次打q。您现在已经存储了您的操作以供将来使用。重新运行你刚刚输入的@w(或者你用来保存宏的寄存器的任何字母)。

宏中有很多功能。有时候你想在会话之间保存宏。当我想这样做时,可以通过粘贴刚刚保存的寄存器将宏粘贴到缓冲区中。例如,如果你保存你的宏来注册w,那么输入“wp来粘贴注册表w”(注意这是双引号,而不是两个单引号),当你按下escape或enter键时,你会看到一些有趣的字符。可读的方式写这些喜欢和,但^ [和^ M也将工作

你现在可以将这些行写入一个注册表(我看到有人刚刚发布了一个答案,但有点不同,我会做)在视觉模式下选择文本,然后输入“wy。这将选定的文本放入注册表w中。现在将该寄存器作为宏运行,像以前一样键入@w。

如果是经常使用的东西,可能值得将宏映射到.vimrc中的快捷命令。例如,我的vimrc中有几张地图可以帮助我轻松打开并保存我的文件。的vimrc

" For modifying the .vimrc 
nmap ,e :e $HOME/.vimrc<cr> 
nmap ,s :write!<cr>:source $HOME/.vimrc<cr> 

现在,当我编辑的任何文件,并发现了一个新的宏,我想救我型,E打开我的.vimrc。我粘贴宏,预置一个map语句(根据你所在的模式不同,有不同的地图,如果你感兴趣的话可以有大量的文档来解释这个),并且用.vimrc保存.s也可以获得.vimrc以便我的新映射命令在其他文件中可用,而无需重新启动vim。

+0

正如你所预料的那样,我现在有一个宏,我想跨文件使用,因此想将它保存在我的.vimrc中。所以我打开了我的.vimrc文件,并粘贴了我的宏(“ay)”,然后我创建了如下所示的相应条目: 'nmap,a:%s/0 \ ./ || 0./^Mgg :%s/\(Topic [0-9] * \):/ {| border =“1”style =“float:left;”\ r!colspan =“2”align =“center”|''' 1'''b/^ Mgg:%s/^ \([az] \)/ | - \ r | \ 1/^ Mgg:g/^ $/d^MGo |}^[:g/^ {|/S/^ {|/|} \ r {|/^ Mggdd' 但现在打开任何文件,我得到:检测 出错处理的〜/ .vimrc: 线17: E749:空缓冲区 任何想法?Thx很多! – user10 2010-01-04 08:11:45

+1

我想出了我的地图表达式的问题。我使用的是管道字符而没有用反斜杠转义它。当我手动键入命令时,我不需要转义它,但是当我设置一个宏,显然我需要逃避它(因为否则我第四墨水编辑器将其解释为一个命令的结束和另一个命令的开始 - 对管道操作员的shell的常见解释)。 – user10 2010-01-05 04:53:33

+0

很高兴你知道逃脱角色。有时候会发生这种情况,并且可能会很痛苦。我还没有弄清楚的一件事情是如何在多行中输入这样一个宏,以便可以很好地格式化,甚至可以用注释来解释正在做什么。 – mmrobins 2010-01-06 21:20:58

0

这里是映射到交互方式运行VIM命令:

" run selected vimscript 
vmap <Leader>r "vy:@v<CR> 
" run vimscript line 
nmap <Leader>r "vyy:@v<CR> 

检查VIM帮助:在你的情况

:h :@ 

所以(愚蠢的例子):

:g/line/ 
:g/for/ 
:g/endfor/ 

for line in getline(1, 3) 
    let @a = line 
    @a 
endfor 

将它保存as .vim和:so%

0

“命令”一词在这里有点含糊不清。你也可以使用 执行Ex命令,这些命令使用 :@“ ”,例如用于默认寄存器。当你编写vimscript代码时,例如在你的.vimrc文件中,这个特别有用,并且你想测试函数或映射,以确保他们的工作好。

所以,如果你有一个包含

tabedit http://stackoverflow.com/questions/1830886/vim-executing-a-list-of-editor-commands 
%s/intuited/The King Of Everything/g 
w /tmp/superduperawesome.html 
!/usr/bin/sensible-browser /tmp/superduperawesome.html 

一个缓冲区,你可以使用正常的模式操作

ggyVG:@" 

带来了一个稍微不同的VERSI在此页面上。

它也可以执行一个储存在寄存器中,或在一个变量的代码,使用

:execute @" 

但似乎与此有些怪异的问题:它会停止当它击中评论执行或块的结尾。我没有使用这些问题:@“。