откройте vim из системной команды C

#c #shell #vim

#c #оболочка #vim

Вопрос:

Я новичок в C.

Я видел system() fork() и execv() прочее, но я не думаю, что это то, что мне нужно (или они просто не работают).

Я просто хочу, чтобы моя программа на C немедленно открыла vim с указанием пути к файлу для редактирования, затем я могу выйти из vim, и программа продолжит работу, в моем случае она просто завершится.

Подумайте, например git commit , он открывает vim для меня, а затем, когда я сохраняю выхожу, он отправляет коммит.

Есть какие-нибудь идеи?

Комментарии:

1. system() звучит уместно, если вы согласны с тем, что ваша программа заблокирована во время vim выполнения

2. Поскольку вы упомянули git, github.com/git/git/blob/master/commit.c

3. Что пошло не так при попытке использовать system или любую из упомянутых вами функций? system , или какая-то форма fork exec* wait* будет работать просто отлично. В нынешнем виде это не очень подходящий вопрос для SO (нет кода, нет попыток). Сначала вы должны попытаться решить проблему и задавать вопросы, когда вы действительно застряли.

4. эй, ребята, спасибо за эти комментарии — я просто неправильно использовал system() ! Спасибо за эту ссылку на github и все, я ценю это, ребята

5. Можете ли вы опубликовать свое решение ниже для других людей, которые ищут ответ в будущем?

Ответ №1:

System(3) выполнит работу, но имейте в виду, что если вы вызовете свою программу с перенаправлением ввода / вывода не на терминал, это распространится на выполнение vim , и оно не будет работать.

vim(3) требуется, чтобы ввод и вывод были направлены на линию терминала, он не может работать с перенаправленным вводом, поэтому лучшим способом его вызова должно быть (with system() ):

 system("/usr/bin/vim file </dev/tty >/dev/tty");
 

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

Ответ №2:

system() это то, что я искал, я использовал его неправильно, но это просто, просто используйте:

 system("vim path/to/file.txt");
 

откроет vim текущего направления и будет работать, как ожидалось (например git commit )