Does this mean that EACCES could be any of these things? Or less likely all of them?
Любой. Что касается «всех», если есть ошибка обхода пути, как код вообще сможет попробовать другие вещи, такие как «это обычный файл», если у кода нет разрешения на переход к файлу? Кроме того, возврат нескольких ошибок на самом деле не является тем, что C делает по умолчанию (, если только вы не написали какую-то структуру, содержащую список ошибок, а затем указатель на эту структуру каким-то образом возвращается вызывающей стороне, которой затем нужно... и это не так, как написано большинство системных вызовов.)
How can I tell them apart when handling errors from a switch statement?
strerror(errno)
или изящный err(3)
, который, несомненно, в свою очередь вызывает strerror
— это самое большее, что вы получите:
$ cat sirexecsalot.c
#include <err.h>
#include <string.h>
#include <unistd.h>
extern char **environ;
extern int errno;
int main(int argc, char *argv[])
{
int ret;
errno = 0;
if ((ret = execve("/var/tmp/exectest/hullo", ++argv, environ)) == -1)
err(1, "nope (strerr=%s)", strerror(errno));
}
$ make sirexecsalot
cc sirexecsalot.c -o sirexecsalot
$ cat /var/tmp/exectest/hullo
#!/usr/bin/env expect
puts hi
$./sirexecsalot
hi
$ mv /var/tmp/exectest/hullo /var/tmp/exectest/foo
$ mkdir /var/tmp/exectest/hullo
$./sirexecsalot
sirexecsalot: nope (strerr=Permission denied): Permission denied
$ chmod 000 /var/tmp/exectest
$./sirexecsalot
sirexecsalot: nope (strerr=Permission denied): Permission denied
$
Вместо этого используйте эту автокоманду:
autocmd VimEnter *
\ Vexplore |
\ execute "wincmd l" |
\ rightbelow term bash
При этом вся последовательность будет выполнена один раз при входе в Vim. Я использую продолжение строки (, последующие строки начинаются с обратной косой черты )и штрихов для запуска нескольких команд. Заметьте также, что autocmd
запускает Ex-команды, поэтому предшествующие команды с :
на самом деле не нужны.
Первая команда откроет окно NERDTree слева, как и ожидалось.
Во-вторых, wincmd l
переместится в окно справа (см.:help :wincmd
). Это шаг, отсутствующий в вашей попытке, что приводит к тому, что следующий шаг разделяет NERDTree, а не главное окно. wincmd
должен выполняться внутри execute
, потому что в противном случае он попытается интерпретировать следующий за ним |
, который перестанет работать как разделитель.
Наконец, последняя команда открывает терминал, используя явноеrightbelow
(см. :help :rightbelow
), чтобы открыть это разделение внизу. Вот и все!