В Vim я могу отформатировать целый файл и закончить курсором там, где он начался? - PullRequest
2 голосов
/ 30 октября 2009

Я настроил это отображение в моем .vimrc, и он прекрасно работает ...

" Auto indent entire file
nmap <C-f> gg=G
imap <C-f> <ESC>gg=G

Однако после операции курсор переместился в строку 1, столбец 1.

Есть ли способ сделать это так, чтобы, если я где-то находился в середине файла, курсор оставался там, где он есть?

Ответы [ 5 ]

5 голосов
/ 30 октября 2009

Конечно, используйте отметки (:help mark):

nmap <C-f> mtgg=G't
imap <C-f> <ESC><C-f>

Перед выполнением gg=G текущая позиция курсора сохраняется в метке t. После операции 't возвращается к отметке.

4 голосов
/ 30 октября 2009

Ctrl + O подходит для перехода по списку переходов. '' вернет вас к последней строке в списке переходов (или `` , чтобы вернуться к последней строке и колонка).

К сожалению, текстового объекта "весь буфер" не существует, поэтому gg=G требует перемещения на две позиции назад в списке переходов.

2 голосов
/ 30 октября 2009

Приведенное выше решение Брайана будет работать для макроса, но в качестве хорошего совета обратите внимание, что Ctrl + O перейдет к предыдущей позиции курсора в списке переходов. Поэтому, если вы когда-либо выполняете операцию, которая удаляется, вы можете вернуться к предыдущей позиции.

2 голосов
/ 30 октября 2009

Почему бы не использовать ma, чтобы отметить текущую позицию в буфере a, а после преобразования использовать `` a (i.e. backtick + a`) для возврата в эту позицию? Вот статья об использовании меток для перемещения.

0 голосов
/ 05 декабря 2011

Как писал jamessan, Ctrl + o возвращается к последнему положению в списке переходов. После вызова gg = G это должно быть вызвано дважды.

Таким образом, вы можете использовать отображение без меток:

map <silent> <C-f> gg=G<C-o><C-o>
imap <silent> <C-f> <Esc> gg=G<C-o><C-o>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...