Автозапуск Vim с помощью Vexplore и терминала

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
$ 
1
05.06.2019, 18:57
1 ответ

Вместо этого используйте эту автокоманду:

autocmd VimEnter *
    \ Vexplore |
    \ execute "wincmd l" |
    \ rightbelow term bash

При этом вся последовательность будет выполнена один раз при входе в Vim. Я использую продолжение строки (, последующие строки начинаются с обратной косой черты )и штрихов для запуска нескольких команд. Заметьте также, что autocmdзапускает Ex-команды, поэтому предшествующие команды с :на самом деле не нужны.

Первая команда откроет окно NERDTree слева, как и ожидалось.

Во-вторых, wincmd lпереместится в окно справа (см.:help :wincmd). Это шаг, отсутствующий в вашей попытке, что приводит к тому, что следующий шаг разделяет NERDTree, а не главное окно. wincmdдолжен выполняться внутри execute, потому что в противном случае он попытается интерпретировать следующий за ним |, который перестанет работать как разделитель.

Наконец, последняя команда открывает терминал, используя явноеrightbelow(см. :help :rightbelow), чтобы открыть это разделение внизу. Вот и все!

0
28.04.2021, 23:32

Теги

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