Есть ли способ показать вывод последней команды в vim? - PullRequest
42 голосов
/ 17 апреля 2011

Когда я запускаю команду оболочки, она просит ввести ENTER в конце, и как только вы это сделаете, вывод будет скрыт.Есть ли способ увидеть это снова без повторного запуска команды?

Также некоторые внутренние команды, такие как make, также запускают внешние команды, и они даже не останавливаются для ENTER, поэтому, если у меня возникает ошибка вВ настройках моего «компилятора» команда мигает на экране слишком быстро, чтобы ее увидеть.Как мне увидеть команду и ее вывод?(быстрое исправление пусто)

ОБНОВЛЕНИЕ

Вывод ОПРЕДЕЛЕННО все еще там.по крайней мере на терминале vim.если я наберу

:!cat

, результат предыдущей команды все еще там.проблема в том, что а) это похоже на хак, я ищу правильный способ vim б) он не работает в gui vim

Ответы [ 9 ]

55 голосов
/ 27 сентября 2012

просто введите:!или вы можете попробовать SingleCompile

35 голосов
/ 22 апреля 2011

Установка vim в фоновом режиме обычно работает для меня (нажмите Ctrl + Z).

Это покажет вам оболочку, из которой вы запустили vim, и в моем случае я могу видеть вывод всех команд, которые я запустил в vim через ":! Somecommand".

Предполагается, что вы запускали vim из оболочки, а не из графического интерфейса (gvim).

23 голосов
/ 17 апреля 2011

Перед выполнением команды вы можете перенаправить вывод в файл, регистр, выделение, буфер обмена или переменную. Для меня перенаправление в регистр является наиболее практичным решением.

Чтобы начать перенаправление на регистрацию a, используйте

:redir @a

Затем вы запускаете свои команды, скажем

:!ls -l

И конец перенаправления с

:redir END

Вот и все, регистр a теперь содержит выходные данные перенаправленных команд. Вы можете просмотреть его с помощью :reg a или поместить в буфер с помощью "ap, как вы обычно делаете с регистром.

Прочтите справку для :redir, чтобы узнать больше о различных способах перенаправления.


Через несколько месяцев я нашел файл справки, который может заинтересовать вас: messages.txt .

Хотя и неполно, это очень помогает. Существует команда (новая для меня) под названием g<, которая отображает последнее данное сообщение, но, видимо, только сообщения Vim, например [No write since last change].

Во-первых, я предлагаю вам взглянуть в ваших настройках на 'shm' и попытаться сделать вывод ваших команд более постоянным (чаще всего появляется "Hit ENTER"). Затем проверьте, помогает ли этот файл справки :-) Я не смог заставить его работать на 100%, но это был большой прогресс.

7 голосов
/ 19 апреля 2011

Я обычно выхожу в оболочку, используя :sh, и это покажет вам вывод всех команд, которые были выполнены и не перенаправлены на вывод.

Просто закройте оболочку, и вы вернетесьвнутри vim.

2 голосов
/ 08 марта 2017

Почему я больше не пользуюсь :!, и какова альтернатива

Я узнаю :! из выбранного в настоящее время ответа (и я проголосовал за него). Он работает в том смысле, что показывает предыдущий экран.

Однако на днях я узнаю еще один совет по использованию :!! для повторного запуска последней команды (что, кстати, очень полезно, когда вы находитесь в edit-test-edit-test -... цикл). И затем я понимаю, что использование :! каким-то образом имеет побочный эффект забвения последней команды, поэтому будущее :!! не будет работать. Это не круто.

Я не понимаю этого, пока не углублюсь в документацию vim .

:! {cmd} Выполнить {cmd} с оболочкой.

Любое '!' в {cmd} заменяется предыдущим внешняя команда

Внезапно все начинает обретать смысл. Давайте рассмотрим это в следующей последовательности:

  1. Предполагается, что вы сначала запустите :!make foo bar baz tons of parameters и увидите его вывод, а затем вернетесь к vim.
  2. Теперь вы можете запустить :!!, вторая ! будет заменена предыдущей внешней командой, так что вы запустите make foo bar baz tons of parameters еще раз.
  3. Теперь, если вы запустите :!, vim все равно будет обрабатывать его как «запуск (новой) внешней команды», просто команда оказывается ПУСТОЙ. Так что это равносильно тому, что вы вводите пустую команду (т.е. нажимаете клавишу ВВОД один раз внутри обычной оболочки). Переключив экран в оболочку, вы получите шанс увидеть предыдущий экран. Вот и все.
  4. Теперь, если вы запустите :!!, vim повторит предыдущую команду, но на этот раз предыдущая команда будет пустой командой. Вот почему ваш vim теряет память на make foo bar baz tons of parameters, так что в следующий раз вы захотите набрать их снова.

Итак, следующий вопрос будет, есть ли какая-либо другая «команда чистого vim», чтобы показать только предыдущий вывод оболочки, не испортив память последней команды? Я не знаю. Но теперь я согласен с использованием CTRL + Z , чтобы перевести vim в фоновый режим, поэтому отображает консоль оболочки с выводом предыдущей команды, а затем я набираю fg и ENTER. чтобы переключиться обратно на vim. Кстати, для решения CTRL+Z на самом деле требуется на один ход меньше клавиши, чем для решения :! (для этого требуется shift + ; shift + 1 ENTER для отображения экрана команд и ENTER для возврата).

2 голосов
/ 08 октября 2014

возможно, парни забыли о: r

r !ls ~/

Поместите это, где мой курсор:

bug_72440.html
bug_72440.vim
Desktop
dmtools
Docear
docear.sh
Documents
Downloads
examples.desktop
index.html
linux_home
Music
Pictures
Public
Templates

Простой ты мог бы избавиться от нового текста после того, как я дернул его или что-то еще;

2 голосов
/ 28 августа 2012

Прокрутка вверх (проверено на iTerm 2). Примечание: это может не работать в зависимости от конфигурации vim ..

Пример: я собираюсь запустить !rspec --color % из моегоvim.

enter image description here

Буфер заполнен выводом.

enter image description here

Теперь, после нажатия ENTER, вы можетепрокрутите вверх, чтобы увидеть предыдущий вывод.

enter image description here

1 голос
/ 28 апреля 2013

Найден этот скрипт - который откроет новую вкладку

function! s:ExecuteInShell(command)
  let command = join(map(split(a:command), 'expand(v:val)'))
  let winnr = bufwinnr('^' . command . '$')
  silent! execute  winnr < 0 ? 'botright new ' . fnameescape(command) : winnr . 'wincmd w'
  setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number
  echo 'Execute ' . command . '...'
  silent! execute 'silent %!'. command
  silent! execute 'resize ' . line('$')
  silent! redraw
  silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w'''
  silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>'
  echo 'Shell command ' . command . ' executed.'
endfunction
command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShell(<q-args>)

Вставьте его в свой .vimrc Он работает и на GUI VIM ..

Пример использования -: Shellсделать

0 голосов
/ 15 сентября 2011

Такие команды, как make, сохраняют свои выходные данные в /tmp/vsoMething.Кажется, для параметра errorfile задан файл, поддерживающий список быстрых исправлений / местоположений.Если вы хотите, чтобы вывод был где-то конкретным, см. makeef.Вы можете открыть текущий файл ошибок следующим образом:

:edit <C-r>=&errorfile<CR>

(К сожалению, похоже, что это не работает для :grep.)


redir не имеетбыть утомительнымСмотрите этот плагин для его упрощения.(У меня есть скрипты ftdetect и ftplugin , чтобы буфер вывода не был поддержан файлом.)


Вы видите вывод на терминале при вводе:!cat из-за вашего терминала, а не vim.Вы бы увидели то же самое, если бы использовали Ctrl - z , который приостанавливает работу vim, поэтому vim ничего не делает активно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...