隐藏vim中的文本段以用于外部命令

时间:2014-01-23 21:16:56

标签: vim

我正试图在vim中创建类似ncurses的菜单外观。
每行应该有两个字段:标题,命令
我从stdin读取输入,格式如下: title 命令:命令

item 1 COMMAND: echo hey
item 2 COMMAND: ls /
item 3 COMMAND: some-other-command

我想只显示标题,如下:

item 1
item 2
item 3

但是我希望能够运行这一行的命令,如下所示:

:.w !exec $(sed -r 's/COMMAND: (.*)/\1/')

但是我无法隐藏“COMMAND:...”部分 我怎样才能做到这一点? vim不适合这样的冒险吗?

谢谢...

2 个答案:

答案 0 :(得分:1)

首先需要注意的是,:exec不支持[range],也就是说,你不能:% exec !whatever

如果我理解你正确,你想要对你的例子中的每一行,选择行的一部分,COMMAND:之后的文本作为外部shell命令,并执行它。

您可以尝试以下命令:

exec '!'.substitute(getline('.'),'.*COMMAND: ','','g')

要在所有线路上应用它,您可以考虑使用宏,这很容易。不要把sed放进去,这没什么用。

如果您想首先执行cmd,然后修改该行,请删除COMMAND:.. part,您可以在:s后链接exec ...

exec '!'.substitute(....)|s/COMMAND:.*//

答案 1 :(得分:1)

以下是如何完成您原定的目标。有很多选择,但我个人使用Unite插件。

安装Unite

vimrc中添加以下内容也可以看到:

let g:unite_source_menu_menus = {}


let g:unite_source_menu_menus.filters = {
\'description' : 'Text filters',
\'command_candidates' : [
\  ["Remove empty lines"           , 'v/./d'],
\  ["Remove empty lines  [v]"      , "'<,'>v/./d"],
\  ['Condense empty lines'         , '%s/\n\{3,}/\r\r/e'],
\  ['Remove trailing white space'  , '%s/\s\+$//' ],
\  ['',''],
\]}

let g:unite_source_menu_menus.git = {
\ 'description' : 'Git commands (Fugitive)',
\ 'command_candidates' : [
\  ['git status       (Fugitive)                               '  , 'Gstatus'],
\  ['git diff         (Fugitive)                               '  , 'Gdiff'],
\  ['git commit       (Fugitive)                               '  , 'Gcommit'],
\  ['git cd           (Fugitive)                               '  , 'Gcd'],
\  ['',''],
\  ['git view file    (gitv)                                   '  , 'Gitv!'],
\  ['git view all     (gitv)                                   '  , 'Gitv'],
\]}

let g:unite_source_menu_menus.myhelp = {
\'description' : 'Interesting help topics',
\'command_candidates' : [
\  ['Executing shell commands in a window', 'h shell-window'],
\  ['File Searching and **', 'h starstar'],
\  ['Local directory .vimrc', "h 'exrc'"]
\]}

noremap <silent> sm  :<C-u>Unite -no-start-insert -quick-match -buffer-name=menu menu<CR>

您可以使用sm启动菜单。您可以更改菜单选项,还可以使用命令执行,编辑,添加书签和执行其他任务。可以选择过滤项目并使用模糊搜索引擎。 Unite是令人难以置信的令人难以置信的插件,还有许多其他好处。

另一种选择是使用Forms插件。

至于自定义解决方案,这是一个快速的想法:

给定文件awesome.menu

item 11 COMMAND: echo 'hey'
item 2 COMMAND: !ls /
item 3 COMMAND: version

您可以使用以下功能。

fu! Menu()

    let g:menu_bg = synIDattr(hlID('Normal'), 'bg#')
    let g:menu_fg = synIDattr(hlID('Normal'), 'fg#')
    let g:menu_s = 1

    exe 'highlight MyMenu guifg=' g:menu_fg
    match MyMenu /COMMAND:.*/
    nn <buffer> <space> :let g:menu_s = !g:menu_s<cr>:exe 'highlight MyMenu guifg=' . '<c-r>=g:menu_s ? g:menu_fg : g:menu_bg<cr>'<cr>
    nn <buffer> <cr> :exe substitute(getline('.'),'.*COMMAND: ','','g')<cr>

    norm <space>

    echo 'Menu Loaded'
endf


au BufCreate *.menu call Menu()

如果您在vimrc中添加上述代码然后加载awesome.menu,您的命令文本将被隐藏,您可以使用“space”切换其可见性并“输入”以执行它。