如何将ex命令的输出重定向或管道输出到当前缓冲区或文件中?
例如,我想将所有寄存器的内容读入当前缓冲区,在ex模式下使用:registers
显示。
答案 0 :(得分:35)
:redir >name_of_registers_file
:registers
:redir END
:r name_of_registers_file
:help redir
最后一个命令非常有用,因为有很多重定向选项:变量,寄存器,如何追加,进一步的聚宝盆。
我仍然觉得它很奇怪并且很烦人,因为它使用了END,但是因为redir
之后的所有其他内容都必须以非单词字符开头,所以至少它并不含糊。
PS AFAIK(在这种情况下相当远)没有办法直接将其读入缓冲区:您必须先将它存储在寄存器或变量中。请查看帮助以了解如何执行此操作的各种选项。
PPS 如果您确实希望使用变量-maybe将其封装在函数中并避免破坏寄存器或全局变量 - 您必须转换要写入的多行字符串将变量放入列表中。 EG
:call append( '.', split(variable_you_redirected_to, "\n") )
否则(如果你只做append('.',var)
)你最终会得到^ @(nulls)而不是换行符,因为vimscript用来表示String变量中的换行符。
编辑:正如@Bill Odom所提到的,使用:put =variable_you_redirected_to
比复杂的append()
表达式容易得多。谢谢,比尔!
我写了snippet来使这些东西更方便。它声明了一个函数Redir(command, target)
和一个命令R
。
该命令将最后一系列非空格字符解析为重定向目标,并将其传递给函数,该函数使用样板将命令输出重定向到重定向目标。
该命令是R
之后和最后一个空格之前的所有内容。
EG
" Store the vim buffer list in buffer_list.txt
:R ls >buffer_list.txt
" Store error messages emitted by a function being debugged
" in the 'unnamed register'
:R call FunctionBeingDebugged() @">
这有一些限制:例如,您将无法写入包含空格的文件名。这样做的好处是你不必引用你的命令。我已将它发布在gist.github.com上,如果我最终改进它,我会尽力保持更新。或者你可以自己分叉< / noeuphemism>!
无论如何,该代码段可用here。它可以放入.vimrc文件或〜/ .vim / plugins中的文件中。
答案 1 :(得分:26)
@intuited是对的; redir
命令就是你想要的。像这样的单行将把:registers
的输出插入当前缓冲区:
redir => m | silent registers | redir END | put=m
然而,这并不是你想要经常打字的东西,而且它并不完全适合关键地图。我发现自己经常这样做,所以我写了一个函数和一些命令来使它更容易。作为奖励,我现在可以将命令输出发送到新窗口或新选项卡,就像将其插入当前缓冲区一样简单。这是代码(最后有一些命令示例):
" redir_messages.vim
"
" Inspired by the TabMessage function/command combo found
" at <http://www.jukie.net/~bart/conf/vimrc>.
"
function! RedirMessages(msgcmd, destcmd)
"
" Captures the output generated by executing a:msgcmd, then places this
" output in the current buffer.
"
" If the a:destcmd parameter is not empty, a:destcmd is executed
" before the output is put into the buffer. This can be used to open a
" new window, new tab, etc., before :put'ing the output into the
" destination buffer.
"
" Examples:
"
" " Insert the output of :registers into the current buffer.
" call RedirMessages('registers', '')
"
" " Output :registers into the buffer of a new window.
" call RedirMessages('registers', 'new')
"
" " Output :registers into a new vertically-split window.
" call RedirMessages('registers', 'vnew')
"
" " Output :registers to a new tab.
" call RedirMessages('registers', 'tabnew')
"
" Commands for common cases are defined immediately after the
" function; see below.
"
" Redirect messages to a variable.
"
redir => message
" Execute the specified Ex command, capturing any messages
" that it generates into the message variable.
"
silent execute a:msgcmd
" Turn off redirection.
"
redir END
" If a destination-generating command was specified, execute it to
" open the destination. (This is usually something like :tabnew or
" :new, but can be any Ex command.)
"
" If no command is provided, output will be placed in the current
" buffer.
"
if strlen(a:destcmd) " destcmd is not an empty string
silent execute a:destcmd
endif
" Place the messages in the destination buffer.
"
silent put=message
endfunction
" Create commands to make RedirMessages() easier to use interactively.
" Here are some examples of their use:
"
" :BufMessage registers
" :WinMessage ls
" :TabMessage echo "Key mappings for Control+A:" | map <C-A>
"
command! -nargs=+ -complete=command BufMessage call RedirMessages(<q-args>, '' )
command! -nargs=+ -complete=command WinMessage call RedirMessages(<q-args>, 'new' )
command! -nargs=+ -complete=command TabMessage call RedirMessages(<q-args>, 'tabnew' )
" end redir_messages.vim
答案 2 :(得分:17)
:redir @a
:registers
:redir END
"ap
:redir @a
将此处的所有邮件重定向到名为a
的注册。您可以使用要捕获其输出的命令(在您的情况下为:registers
)来执行此操作。 :redir END
结束重定向。 "ap
表示"a
使用名为a
的寄存器,p
将所选寄存器的内容放入当前缓冲区。
有关详细信息,请参阅 Vim Tips Wiki 中的Capture ex command output: - )
答案 3 :(得分:4)
只要您可以保存当前缓冲区并且可以将消息附加到当前文件的末尾,就没有必要使用临时变量。
来自Vim文档:
:redi[r] >> {file} Redirect messages to file {file}. Append if {file}
already exists. {not in Vi}
http://vimdoc.sourceforge.net/htmldoc/various.html#:redir
因此,要将来自:registers
的消息附加到当前文件的底部,请执行以下操作:
:write | redir >> % | silent registers | redir END | edit
:write
该文件,以便任何更改都不会丢失%
,即当前文件的名称。:registers
命令。END
重定向到该文件。:edit
该文件可以查看新的更改。您还可以强制截断当前文件并将其替换为输出消息:
:redir! > % | silent registers | redir END | edit!
但那可能不是你想要做的。
答案 4 :(得分:4)
此外,:h :redir
:
...要获得一个命令的输出| execute()|功能可以使用。
e.g。
put = execute('scriptnames')
put = execute('filter /vimfiles/ scriptnames')
答案 5 :(得分:3)
不幸的是我没有代表,所以我不能将此作为对Francis Niu&#39;的评论添加。
execute()
函数看起来是实现此目的的最简单方法,并且已添加到 vim 8 中。
在vim&#39; github上的新/扩展功能中列出。 version8.txt