После копирования визуального выделения на клавиатуру вернитесь в исходное местоположение.

18

Мой курсор находится в середине абзаца, когда я вдруг решил, что мне нужно скопировать этот абзац:

Начало

Поэтому я набираю, vipчтобы выбрать абзац визуально:

выбранный

Теперь я нажимаю, cmd+Cчтобы скопировать в буфер обмена (это может отличаться в вашей системе, но не должно относиться к основному вопросу моего поста), что оставляет мой курсор в начале абзаца:

окончательный

а не желаемая позиция, которая была там, где я был.

Обратите внимание, что та же проблема возникает при дергании выбора не визуально с yip.

Мне бы хотелось, чтобы поведение по умолчанию было «возвращение в исходное положение курсора» после выполнения действий выделения / копирования, подобных этой. Есть ли конфигурация, которая делает это возможным?

Ион
источник
11
Да, я тоже нахожу это раздражающим. Я просто использую метки для этой цели: mm "+yap `m(Обратите внимание, что "+yоткликается в буфер обмена вашей системы)
fruglemonkey
3
Я считаю, что было бы полезно разместить курсор в начале или в конце рваной зоны. В конце концов, что я могу теперь сделать, с дерганным текстом и курсором внутри него? Сейчас нет смысла делать вставку / вставку. Но, если я хочу сделать это позже, это значит, что я мог бы также дергать позже ... возможно, то, что вам нужно сейчас, это просто знак.
VanLaser

Ответы:

14

Возможное решение - использовать прыжки:

Перед тем, как дернуть или визуально выбрать, вы можете установить новый прыжок, к которому вы сможете получить доступ после перемещения курсора. Для этого используйте m`.

Затем после того, как ваш курсор переместился из-за янки, используйте ctrloдля возврата назад в список переходов. Также вы можете увидеть список доступных переходов с помощью :jumpsи перемещаться по этому списку с помощью ctrloиctrli

Подводя итог вашего рабочего процесса будет:

  • m`
  • yip
  • ctrlo

Поскольку использование m` устанавливает метку, вы можете перейти к ней с помощью ``вместо ctrlo.

Вы можете прочитать :h mark-motionsи :h :jumpsдля получения дополнительной информации.

statox
источник
Мне это нравится. Есть ли способ заставить одинарную кавычку вести себя как обратный удар вообще при прыжке? одиночную кавычку легче набирать, и обычно я хочу перейти к правильной позиции столбца, а также к правой строке ...
Иона
1
@Jonah, я карту <leader>'быть `, которая работает очень хорошо для меня. (Я использую в <space>качестве моего лидера.)
Нумери говорит, что восстановите Монику
@Jonah: Как сказал Нумери, картирование может быть хорошим решением, иначе, если вы хотите избавиться от backtick, вы можете посмотреть :h 'langmap'. Я не говорю, что это идеальное решение, но, возможно, оно может быть интересным для вас.
statox
@Johah, я на самом деле меняю одинарную кавычку и возвращаю тик, используя noremap ' ` noremap ` '... Это в моем vimrc и прекрасно работает
Нико Беллик
10

Вы можете избежать перемещения курсора с помощью:

:'{,'}y

См :help range, :help mark-motionsи :help :y.

romainl
источник
1
Приятно знать, но это то, что вы на самом деле делаете? Кажется, что набрав 8 клавиш с двумя скобками, это сложнее, чем решения для отметки
Jonah
Это то, что я бы сделал, если бы я был на вашем месте. Но у меня нет проблем с поведением, которое вы описываете, поэтому я на самом деле этого не делаю.
Romainl
2
@Jonah У вас еще есть возможность создать карту. Нечто подобное :nmap <key> :'{,'}y<CR>должно делать работу.
statox
10

Мой курсор находится в середине абзаца

Если вы только что отредактировали его, самое простое решение - набрать текст, g ;который поместит курсор на последнюю позицию редактирования.

И если вы не редактировали абзац, вы можете выполнить простую операцию замены с тем же символом, на котором вы находитесь (например h, вы набираете rh), чтобы вызвать «событие» редактирования без какого-либо редактирования.

Al.G.
источник
2
+1: я всегда использовал '., но может быть очень полезно перемещаться между последними изменениями с помощью g;и g,.
mMontu
2
Есть ли версия, g;которая приведет вас к правильному положению столбца?
Иона
@ Джона, это поведение по умолчанию. Разве это не работает для вас? Это всегда приводит меня к правильному положению столбца и строки.
Ал.Г.
4

ВИМ-EasyClip плагин имеет настройки для этого:

g:EasyClipPreserveCursorPositionAfterYank- По умолчанию 0 (т.е. отключено). Поведение Vim по умолчанию состоит в том, чтобы поместить курсор в начало рваного текста, что согласуется с другими движениями. Однако, если вы предпочитаете, чтобы положение курсора оставалось неизменным при выполнении янки, включите эту опцию.

Для меня немного стоит установить весь плагин только для этой небольшой функции, поэтому я предпочитаю использовать метки согласно моему комментарию.

fruglemonkey
источник
0

Расширяя ответ А.Г., мы можем перейти в нужное место без редактирования. Решение есть gi. Мы достигнем той же позиции, в которой мы были в режиме последней вставки ранее.

  • Вы находитесь в середине абзаца.
  • переключиться в режим вставки.
  • переключиться в нормальный режим.
  • нажмите vip.
  • нажмите gi.
  • переключиться в нормальный режим. ( giоставит нас, чтобы вставить режим)

Если мы хотим перейти в начало или конец выделенного текста.

 :help v_o 

Когда вы дергаете выделенный текст, вы также вернетесь в обычный режим и можете сохранить или не сохранить исходное положение курсора.

  1. Если вы начнете выделять курсор с более высокой позиции на нижнюю (от номера строки-столбца до номера строки-столбца выше), при нажатии вы сохраните исходную позицию курсора. y
  2. Курсор останется в текущей позиции, если выделение начнется с более низкой позиции курсора.

Возврат к исходному положению после восстановления:
gv чтобы получить предыдущее выделение.

Теперь вы можете переключаться между исходным и текущим местоположением в визуальном режиме с помощью клавиши
oили O.

Номер строки и столбца строки состояния поможет узнать точное положение курсора.
Документация:

:help visual-change
vusan
источник
Это не работает, vipкогда курсор начинается в середине абзаца.
Энтони
О, да, я этого не заметил, сейчас я отредактирую свой ответ, а не удалю его.
Вусан
@Antony Теперь это также работает для vipпроверки моего редактирования.
Вусан