Я часто редактирую файл локально, а затем копирую и вставляю его в удаленный сеанс SSH внутри сеанса vi.
Первый шаг — удалить все содержимое, выполнив следующие действия:
9999dd
Что удалит до 9999 строк файла.
Теперь каким-то образом версия vi на определенной машине с Ubuntu, работающей под управлением 14.04 LTS, ведет себя по-другому: она не допускает выполнение указанной выше команды, если файл на самом деле не содержит по крайней мере 9999 строк.
Как мне снова включить прежнее /привычное поведение, при котором все строки во всем файле будут стерты, если N (в данном случае 9999) превысит количество строк файла?
ОБНОВЛЯТЬ Я ценю ответы, которые приходят дляальтернативаметоды достижения этого. Однако это не объясняет, почему/как/когда поведение изменилось (я успешно использовал Ndd в течение многих лет. Возможно, это не оптимальный способ. Но он работает - в том числе на Ubuntu - различных версиях, Centos, OS/X).
Еще одно обновление ":" в начале было удалено: мы в обычном режиме. Это ВСЕ ЕЩЕ НЕ РАБОТАЕТ в этом конкретном экземпляре редактора/vi - тогда как это работает, скажем, с 99dd (так как файл содержит > 99 строк), а также выполнение того же действия 9999dd работает в других экземплярах.
решение1
@javadba, попробуй:set nocompatible
Разница между этими двумя типами поведения, по-видимому, зависит от того, находится ли глобальное поведение :set nocompatible
у меня ~/.vimrc
или где-либо еще./etc/vim/vimrc
Если я :set nocompatible
тогда я могу использовать :9999
вместо того :$
, чтобы перейти к концу небольшого файла, и я могу обойтись без таких вещей, как 9999dd
. Если у меня естьнет :set nocompatible
затем ничего не происходит, когда я пытаюсь 9999dd
, и я получаю ошибку, E16: Invalid range
когда я пытаюсь :9999
перейти в конец файла.
решение2
То, что вы пытаетесь сделать (использовать недопустимый диапазон в командном режиме), никогда не работало. Это не работает в 7.2.445 (Debian 6), 7.2.411 (CentOS 6.6), 7.3.429 (Ubuntu 12.04), 7.4.683 (Ubuntu 14.04, PPA).
Думаю, вы перепутали его с 99999dd
, который действителен в обычном режиме, поскольку N здесь — это не номер строки, а количество повторений действия — обратите внимание на отсутствие :
.
Действительно, в документации об этом говорится следующее:
Line numbers may be specified with: :range E14 {address}
{number} an absolute line number
....
The {number} must be between 0 and the number of lines in the file. When
using a 0 (zero) this is interpreted as a 1 by most commands. Commands that
use it as a count do use it as a zero (:tag, :pop, etc). Some commands
interpret the zero as "before the first line" (:read, search pattern, etc).
Если вы хотите удалить все строки и хотите использовать для этого командный режим, то:
:%d
Или, используядиапазоны:
:0,$d
Если вы не хотите использовать командный режим:
ggdG
Ни в том, ни в другом случае не следует использовать странные числа для диапазона.