Подтвердить что ты не робот

Почему команда d {motion} не соответствует команде {motion} в Vim?

Эксперимент 1

  • Откройте Vim и вставьте в буфер только следующую строку текста.

    hello world
    

    Другими словами, нажмите i, введите hello world и нажмите Esc.

  • Нажмите 0, чтобы поместить курсор в первый символ первой строки.

  • Нажмите e. Курсор перемещается в o.
  • Нажмите 0, чтобы снова поместить курсор в первый символ первой строки.
  • Нажмите d e. Вы увидите, что символы от h до o были удалены. Остается только следующий текст.

     world
    

Эксперимент 2

  • Откройте Vim и вставьте в буфер только следующую строку текста.

    hello world
    

    Другими словами, нажмите i, введите hello world и нажмите Esc.

  • Нажмите 0, чтобы поместить курсор в первый символ первой строки.

  • Нажмите w. Курсор перемещается в w.
  • Нажмите 0, чтобы снова поместить курсор в первый символ первой строки.
  • Нажмите d w. Вы увидите, что символы от h до были удалены. Остается только следующий текст.

    world
    

    Однако я ожидал, что все от h до w будет удалено, и останется только следующий текст.

    orld
    

Вопрос

Сначала позвольте мне процитировать :help d ниже.

                                                        *d*
["x]d{motion}           Delete text that {motion} moves over [into register
                        x].  See below for exceptions.

В эксперименте 1 движение из-за e переместилось с h на o и, конечно же, было удалено все: от h до o (включая h и o).

В эксперименте 2 движение из-за w переместилось от h в w, но все от h до w (включая h и w) не было удалено. Почему?

Ниже описывается поведение d w, d e и d b.

Command    Deletes character under the    Deletes character under the
           initial cursor position?       final cursor position?
-------    ---------------------------    ---------------------------
dw         Yes                            No
de         Yes                            Yes
db         No                             Yes

Почему поведение трех команд непоследовательно?

4b9b3361

Ответ 1

de разрезает все, начиная от и включая символ под курсором до и, включая последний символ мира, e является инклюзивным движением.

dw разрезает все, начиная с и, включая символ под курсором до и исключая следующее слово, w - это исключительное движение.

Ответ на ваш вопрос не в :help d (de и dw отлично согласуются с ним), но в :help e и :help w (e и w не нужно работайте одинаково, потому что, как гласит документ, один является инклюзивным, а другой эксклюзивным).

Всегда помните, что все в Vim о композитоспособности: de не de, а d применяется к e.

Ответ 2

Ответ на ваш вопрос можно найти с помощью :h exclusive:

A character motion is either inclusive or exclusive.  When inclusive, the
start and end position of the motion are included in the operation. When 
exclusive, the last character towards the end of the buffer is not
included.

Вы можете проверить, используя :h word-motions, какие движения включены (например, e) и которые являются эксклюзивными (например, w). Для использования движений просто для перемещения курсора это не имеет значения, но при использовании их в режиме оператор-pendig.

Обратите внимание, что это никоим образом не относится к Vim, эти семантики были определены с помощью оригинального Vi.

Ответ 3

это происходит потому, что движение w равно exclusive motion, но e равно inclusive one.

см

:h w
:h e

и

:h exclusive

Ответ 4

В соответствии с документацией Vim, вы можете использовать v после оператора, чтобы переключить исключительную включающую природу символьного движения:

Если движение уже было посимвольным, включите/исключите. Это может быть использовано для создания эксклюзивного движения включительно и эксклюзивного движения включительно.

Возьмите приведенный выше текст hello world в качестве примера (| укажите положение курсора):

|hello world

vw превратит движение w в инклюзивное, так что после dvw текст станет:

orld

ve повернет e движение в эксклюзивной, так что после dve, текст будет выглядеть так:

o world