Как я могу перенаправить или передать вывод команды ex в мой текущий буфер или файл?
Например, я хочу прочитать содержимое всех регистров в текущий буфер, который в ex-режиме показан с помощью :registers
.
Как я могу перенаправить или передать вывод команды ex в мой текущий буфер или файл?
Например, я хочу прочитать содержимое всех регистров в текущий буфер, который в ex-режиме показан с помощью :registers
.
: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 использует для представления строк в строковых переменных.
edit: как @Bill Odom упоминает, использование :put =variable_you_redirected_to
намного проще, чем сложное выражение append()
. Спасибо, Билл!
Я написал фрагмент, чтобы сделать этот материал более удобным. Он объявляет функцию Redir(command, target)
и команду R
.
Команда анализирует последнюю серию непространственных символов в качестве цели перенаправления и передает ее функции, которая позволяет шаблону перенаправить вывод команды на цель перенаправления.
Команда - это все после R
и до последнего пробела.
Е.Г.
" 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> !
В любом случае фрагмент доступен здесь. Его можно отбросить в файл .vimrc или в файл в ~/.vim/plugins.
@правильно; команда 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
:redir @a
:registers
:redir END
"ap
:redir @a
перенаправляет все сообщения отсюда в регистр с именем a
. Вы следуете этому с помощью своей команды, выход которой вы хотите захватить (:registers
в вашем случае). :redir END
завершает перенаправление. "ap
означает, что "a
использует регистр с именем a
и p
помещает содержимое выбранного регистра в текущий буфер.
Для получения дополнительной информации см. Вывод команды Capture ex в Wim Tips Wiki: -)
Нет необходимости использовать временную переменную до тех пор, пока вы можете сохранить текущий буфер и согласны с добавлением сообщений в конец текущего файла.
Из документации 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!
Но это, вероятно, не то, что вы хотите сделать.
Кроме того, :h :redir
:
... Чтобы получить вывод одной команды, выполните | execute() | функция может быть использована.
например.
put = execute('scriptnames')
put = execute('filter /vimfiles/ scriptnames')
К сожалению, у меня нет репутации, поэтому я не могу добавить это как комментарий к "Francis Niu".
Функция execute()
выглядит как самый простой способ выполнить это, и она была добавлена в vim 8.
Перечислены в новых/расширенных функциях vim github. version8.txt