Курсор-движение после движения $
Я играю в отличную игру под названием VIM adventures (изображения из которой приведены ниже). Вопрос из игры, но он также воспроизводится в VIM, так что это то место, которое я задаю.
Предположим, вы находитесь внутри normal mode, стоите на какой-то линии nи колонне m. Если вы нажмете клавишу j, ваша позиция станет строкой n+1и той же колонкой m. Если в строке n+1меньше столбцов, чем m, скажем o, вы попали в столбец o. Снова нажмите j. Вы перемещаетесь в строку n+2, в столбец m( такая же проверка, как и раньше). Видите, колонка, с которой вы начали m, запоминается. Это можно увидеть на первом изображении с красными линиями, обозначающими jдвижение.
Однако, если вы находитесь внутри normal modeи нажимаете клавишу $, вы перемещаетесь в конец текущей строки. Теперь рассмотрим ту же последовательность движений, которая описана в предыдущем абзаце. Каждое движение jперемещает вас к последнему символу в этой строке. mне запоминается в этом случае. Это видно на втором изображении. При первом нажатии $курсор помещается в конец первой строки. Затем, нажав несколько jдвижений, каждое приземлится курсором на конец строки, игнорируя то m, что было запомнено в первом абзаце.
Я не могу найти этого ни в одной документации по VIM. Не могли бы вы объяснить мне, как работает этот механизм запоминания, или указать мне часть документации, которая это объясняет?
Ответы
Действительно, в документации самой $команды нет прямых ссылок на это поведение .
Документация g$движения фактически относится к этому поведению, объясняя, чем g$отличается от $:
Отличается от того,
$когда последний символ строки отсутствует на экране или когда используется счетчик. Кроме того, вертикальные движения удерживают столбец, а не до конца строки.
Помимо документации, вы можете взглянуть на то, как Vim на самом деле реализует отслеживание столбцов, поскольку такие функции, как getcurpos()экспорт этой информации как атрибут curswant:
curswantНомер является предпочтительными колонками при перемещении курсора по вертикали.
(Вы также найдете атрибут curswant в Dict, возвращаемом winsaveview().)
Например, если вы переместились горизонтально по длинной строке к столбцу 24, а затем по вертикали к строке, содержащей только 17 столбцов, вы увидите следующее:
: echo getcurpos () [0, 39, 17 , 0, 24 ]
Итак, вы можете видеть, что вы находитесь в столбце 17, но «curswant» - это столбец 24, и Vim перейдет к столбцу до 24, если в строке достаточно столбцов.
После того, как вы нажмете $и еще раз посмотрите на getcurpos()результат, вы увидите:
: echo getcurpos () [0, 39, 17, 0, 2147483647 ]
Итак, вы увидите, что Vim реализует такое $поведение, задав для curswant очень большое число, которое является наибольшим числом столбцов, которое Vim может хранить в одной строке.
(На самом деле это число 2 31 - 1, что является максимальным положительным целым числом, которое вы можете сохранить в подписанном intвиде на языке C.)