[英]Hide text segments in vim for use in external commands
我试图在vim中创建一些像ncurses一样的菜单外观。
每行应该有两个字段:title,command
我从stdin读取输入,格式为: title COMMAND: command
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不适合这样的冒险吗?
谢谢...
你需要注意的第一件事是:exec
不支持[range]
,也就是说,你不能:% exec !whatever
如果我理解你正确,你想要对你的例子中的每一行,选择行的一部分, COMMAND:
之后的文本COMMAND:
作为外部shell命令,并执行它。
您可以尝试以下命令:
exec '!'.substitute(getline('.'),'.*COMMAND: ','','g')
要在所有线路上应用它,您可以考虑使用宏,这很容易。 不要把sed
放入,它没有多大帮助。
如果你想首先执行cmd,然后修改该行,删除COMMAND:.. part,你可以在exec ...
之后链接一个:s
exec ...
:
exec '!'.substitute(....)|s/COMMAND:.*//
以下是如何完成您最初的目标。 有很多选择,但我个人使用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”来切换它的可见性并“输入”来执行它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.