Как предотвратить появление новой строки в 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
,