2014-11-14 4 views
1

Я пытаюсь обращал внимания на список изменений на Vim и у меня возникают проблемы с пониманием следующее поведение:Vim список изменений поведения

В качестве примера я вставить следующий текст:

I like chips and fish. 

Реализованный I у существительных в неправильном порядке, поэтому я хочу получить:

I like fish and chips. 

Начиная со свежим ВИМ, например, не .vimrc (vim -u NONE), это именно то, что я делаю (# только для ехр lanation):

iI like chips and fish.<Esc> # Insert text. Realize I want to switch the words 
Fc       # Jump back to 'chips' 
de       # Delete the word (and put it in anon register) 
ff       # Jump to the 'fish' word 
vep       # Select the word, and paste from anon register 
g;       # Try to jump back to the position where I change 
           # the word 'chips'. It doesn't work and I get: 
E19: Mark has invalid line number 

# To see what is going on i print the change list: 
:changes 
    change line col text 
     2  1 12 I like and chips. 
     1  2 12 -invalid- 
    > 

Мой первый вопрос, почему прыжок не сработал в первую очередь?

Во-вторых, запись в списке изменений не имеет для меня никакого смысла. Как вы видели, я никогда не выходил за линию 1. Почему запись с линией 2?

Im используя Vim 7.4.52

Update: -invalid- кажется ошибкой. Я уже сообщил об этом:

https://code.google.com/p/vim/issues/detail?id=283

+1

Спасибо за четкое объяснение. Это явно ошибка. Я разместил патч (http://article.gmane.org/gmane.editors.vim.devel/48111) в списке рассылки vim_dev. –

+0

Простите, я прочитал ваш комментарий поздно. Просто чтобы вы знали, я сообщил об этом. См. Обновление. –

ответ

1

В умолчанию Vim на Mac OS X (7.3 Обычная версия без графического интерфейса, без исправлений), g; перемещает курсор в c в chips и выход :changes отличается от ваш:

change line col text 
> 0  1 16 I like fish and chops. 

Тот факт, что запоминается только один изменения в соответствии с настоящим пунктом, от :help g;

When two undo-able changes are in the same line and at a column position less 
than 'textwidth' apart only the last one is remembered. This avoids that a 
sequence of small changes in a line, for example "xxxxx", adds many positions 
to the change list. When 'textwidth' is zero 'wrapmargin' is used. When that 
also isn't set a fixed number of 79 is used. Detail: For the computations 
bytes are used, not characters, to avoid a speed penalty (this only matters 
for multi-byte encodings). 

так что все нормально (если немного удивительно).

С достаточно недавнего MacVim (7.4.258), я получаю поведение, которое вы описали для g; и слегка отличается :changes выход («рыба» отсутствует в вашей):

change line col text 
    1  1 16 I like fish and chips. 
> 0  2 16 -invalid- 

Пахнет много как вы обнаружили ошибку, и я настоятельно рекомендую вам сообщить об этом the vim_dev mailing list (если они еще не знают).

+0

Таким образом: 1) Выполнение 'g;' никогда не будет работать, чтобы усвоить то, что я хочу (потому что он будет помнить только последнее изменение в строке). 2) -invalid - это, вероятно, ошибка. Правильно? –

+1

Да, в пределах, описанных в документе, и да. Обратите внимание, что вы можете использовать 'm ' перед прыжком, чтобы произвольно запомнить, откуда вы пришли. – romainl

+0

Я пытался улучшить упражнение на странице 151 из книги Practical Vim, которая делает это, как вы говорите, с отметками перед прыжком. Просто кажется излишним поставить отметку, где уже есть другая отметка (из списка изменений).К сожалению, в документах также есть хорошая рекомендация о сохранении только последнего изменения на линии. –

Смежные вопросы