0

嗨,我有一个包含此内容的文件

 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_customer\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_order\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_to_cart\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_to_wish_list\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE add_transaction\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE clear_cart\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE get_order_contents\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE get_shopping_cart_contents\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE get_wish_list_contents\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE receipt_retrieve\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE remove_from_cart\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE remove_from_wish_list\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE select_categories\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE select_products\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE select_sale_items\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE update_cart\G'
 mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE update_wish_list\G'

我想使用一个函数来执行每一行并替换为命令输出,然后搜索以“mysql”开头的下一行并执行该行..直到文件末尾。

这是我的功能

r !mysql -uroot -ppass sas -e 'SELECT name FROM mysql.proc;'
    normal! gg /name<CR>n
    normal! dd
    %normal! I mysql -uroot -ppass sas -e 'SHOW CREATE PROCEDURE 
    normal! ggdd0 
    %normal A\G'
    normal! gg0
    normal! G
    let lastline = line(".")
    echom lastline 
    normal! gg0
"here is where i want to start
    .!sh
**"back to normal to search**
    normal! /mysql<CR> n 
**"when found execute the line**
    %normal !!sh
    ".!sh
endfunction

这适用于第一行,但我不知道如何做所有的行。我知道我很接近..

4

1 回答 1

2

我不确定你是否真的需要一个函数。

方式1

你能简单地做:

:%!sh

执行整个缓冲区一次?

方式2

例如,如果您的缓冲区中有一些不以 开头的行mysql,并且您不想执行它们,您可以这样做:

:g/^mysql/.!sh

方式3

如果你真的想一个一个地做,就像你在问题中描述的那样,执行并移动到下一个mysql,执行,你可以作为宏来做:

/^mysql<cr>          "search the pattern
gg                   "cursor back to top
qq                   "start recording to q
!!sh<cr>             "run first line as shell command, take output back
n                    "next command line (with pattern)
q                    "stop recording

然后

500@q

如果你有 500 行要执行。

于 2013-07-10T09:50:38.240 回答