我正试图在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不适合这样的冒险吗?
谢谢...
答案 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”切换其可见性并“输入”以执行它。