Когда я использую: %! выполнять содержание файла через фильтр и сбои фильтра (это возвращает другой код, чем 0) и печатает сообщение об ошибке к stderr, я заменил свой файл этим сообщением об ошибке. Существует ли способ сказать энергии пропускать фильтрацию, если фильтр возвращает код состояния, который указывает на ошибку, и/или проигнорируйте, производит записи программы фильтра к stderr?
Существуют случаи, где Вы хотите свой файл к замененному выводом фильтра, но чаще всего это поведение является неправильным. Конечно, я могу просто отменить фильтрацию с одним нажатием клавиши, но это не оптимально.
Также у меня есть подобная проблема при записи пользовательского сценария энергии, чтобы сделать фильтрацию. У меня есть сценарий, который называет программу фильтра с системой () и заменяет файл в буфере с его выводом, но там, кажется, не способ обнаружить если строки, возвращенные системой (), где записано в stdout или в stderr. Существует ли способ сказать им независимо в сценарии энергии?
Вы можете использовать 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)
:! {Cmd}
Выполняет {cmd}
с оболочкой и устанавливает v: shell_error
.
Если вам случится настроить сопоставления для вызова ваших фильтров, вы можете сделать что-то вроде следующего:
function! UndoIfShellError()
if v:shell_error
undo
endif
endfuntion
nmap <leader>filter :%!/path/to/filter<CR>:call UndoIfShellError()<CR>
В качестве альтернативы можно было бы запустить команду фильтра, например, для изменения файла на диске.
Например, для 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 перезагрузить измененный файл