фильтры энергии и stdout/stderr

Когда я использую: %! выполнять содержание файла через фильтр и сбои фильтра (это возвращает другой код, чем 0) и печатает сообщение об ошибке к stderr, я заменил свой файл этим сообщением об ошибке. Существует ли способ сказать энергии пропускать фильтрацию, если фильтр возвращает код состояния, который указывает на ошибку, и/или проигнорируйте, производит записи программы фильтра к stderr?

Существуют случаи, где Вы хотите свой файл к замененному выводом фильтра, но чаще всего это поведение является неправильным. Конечно, я могу просто отменить фильтрацию с одним нажатием клавиши, но это не оптимально.

Также у меня есть подобная проблема при записи пользовательского сценария энергии, чтобы сделать фильтрацию. У меня есть сценарий, который называет программу фильтра с системой () и заменяет файл в буфере с его выводом, но там, кажется, не способ обнаружить если строки, возвращенные системой (), где записано в stdout или в stderr. Существует ли способ сказать им независимо в сценарии энергии?

9
задан ahe 4 April 2010 в 19:59
поделиться

3 ответа

Вы можете использовать Python, чтобы различать stdout и stderr:

python import vim, subprocess
python b=vim.current.buffer
python line=vim.current.range.start
python p=subprocess.Popen(["command", "argument", ...], stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
python returncode=p.poll()
python if not returncode: b.append(("STDOUT:\n"+p.stdout.read()+"\nSTDERR:\n"+p.stderr.read()).split("\n"), line)
3
ответ дан 4 December 2019 в 21:49
поделиться

:! {Cmd} Выполняет {cmd} с оболочкой и устанавливает v: shell_error .

Если вам случится настроить сопоставления для вызова ваших фильтров, вы можете сделать что-то вроде следующего:

function! UndoIfShellError()
    if v:shell_error
        undo
    endif
endfuntion

nmap <leader>filter :%!/path/to/filter<CR>:call UndoIfShellError()<CR>
5
ответ дан 4 December 2019 в 21:49
поделиться

В качестве альтернативы можно было бы запустить команду фильтра, например, для изменения файла на диске.

Например, для gofmt (www.golang.org) у меня есть следующие сопоставления:

map <f9> :w<CR>:silent !gofmt -w=true %<CR>:e<CR>
imap <f9> <ESC>:w<CR>:silent !gofmt -w=true %<CR>:e<CR>

Пояснение: : w - сохранить файл : silent - не нажимать ввод в конце % - передает файл в gofmt -w = true - указывает gofmt выполнить обратную запись в файл : e - указывает vim перезагрузить измененный файл

1
ответ дан 4 December 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: