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

358
Seltzer

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

0

2 ответа на вопрос

2
Christian Brabandt

В режиме вставки вы можете использовать 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 .

0
Scott

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

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

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

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

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