2014-01-23 91 views
0

我想在vim中創建一些類似ncurses的菜單出現。
每一行都應該有兩個字段:標題,命令
我讀了從標準輸入,格式如下:標題命令:命令在vim中隱藏文本段用於外部命令

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/') 

但我一直無法隱藏「命令:...」部分。
我該如何做到這一點?
vim不適合這種冒險嗎?

謝謝你......你需要照顧是

回答

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。您可以更改菜單選項,並且可以執行,編輯,書籤和使用命令執行其他任務。有一個選項來過濾項目並使用模糊搜索引擎。 團結是令人難以置信的真棒插件與許多其他好處。

另一種選擇是使用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,命令文本將被隱藏,你可以用「空格」鍵切換它的可視性和「輸入」來執行它。

1

第一件事,:exec不支持[range],那就是,你不能:% exec !whatever

如果我理解你的權利,你需要爲每個在你的例子中,選擇部分行,將COMMAND:之後的文本作爲外部shell命令,並執行它。

你可以試試這個命令:

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

要它適用於所有的線,你可以考慮使用宏,這是很容易的。不要把sed放在裏面,它沒有什麼幫助。

如果你想先執行cmd,然後修改行,刪除命令:..一部分,你可以鏈:sexec ...

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