Как предотвратить появление новой строки в Vim при использовании:r! Date и других команд оболочки?

Большую часть времени, когда я вставляю дату, я пытаюсь сделать это в середине строки. По умолчанию это выглядит как :r! Аромат вставки всегда помещает результат в новую строку. Это имеет некоторый смысл для меня, так как большинство команд оболочки выводят символ новой строки перед отображением результата команды, и это, безусловно, предпочтительнее в терминале. В случае обстрела из Vim для крошечной команды, как date +%xЭто не мое предпочтительное поведение. Как мне обойти это?

2 ответа

Решение

В режиме вставки вы можете использовать Ctrl-R=, чтобы вставить выражение в текущую позицию курсора.

Вы можете использовать, например, system() функция, к сожалению, это решает только половину проблемы, так как вывод system() к нему всегда будет добавлен хотя бы последний разрыв строки, поэтому он прервет строку после ввода. Для решения, как избежать тех окончательных разрывов строк в system() случай, посмотрите на этот ответ на мой vi.stackexchange.

(например, вы можете использовать Ctrl-R= systemlist ('date') [0]Enter).


Альтернативный способ вставки даты в текущей позиции курсора - использовать Ctrl-R= strftime ('% c').Enter

Ctrl-R= использует регистр выражений для вставки содержимого. Вы можете узнать больше с :help i_ctrl-r или просмотрите документацию в appspot.

Я считаю, что проблема не столько в том, что команды оболочки обычно заканчиваются переводом строки, но в том, что read является линейно-ориентированной командой (т.е. командой ex). Он присутствовал в оригинальной версии edв 1970-х годах, до :r!command существовал, и обычным случаем использования было чтение ряда строк (например, функции C или абзаца текста) из одного файла в другой. Большинство пользователей хотели бы вставлять их как новые, отдельные строки большую часть времени.

Вы можете проверить / продемонстрировать это, выполнив :r!printf Tuesday, Хотя printf Tuesday команда не записывает новую строку (так как вы не указали \n), ты получишь Tuesday на линии все само по себе.

Возможно, самый простой обходной путь - этоввести i (Esc, чтобы разорвать текущую строку),- или k, чтобы вернуться наверх, а затем выполнить :r!command, а затем J к Join линии снова вместе. Если это то, что вы делаете очень часто, может быть полезно сопоставить макрос для этого.

Раскрытие: я знаю vi довольно хорошо, но есть много вещей в vim что я не узнал. Там может быть более простой способ сделать это в vim,

Другие вопросы по тегам