Po skopiowaniu zaznaczenia wizualnego na klawiaturę wróć do oryginalnej lokalizacji

18

Mój kursor znajduje się w środku akapitu, gdy nagle postanawiam skopiować ten akapit:

początek

Więc piszę, vipaby wybrać akapit wizualnie:

wybrany

Teraz nacisnę, cmd+Caby skopiować do schowka (może się to różnić w twoim systemie, ale nie powinno to być istotne w przypadku głównego pytania mojego postu), co pozostawia mój kursor na początku akapitu:

finał

zamiast pożądanej pozycji, czyli tam, gdzie była, kiedy zaczynałem.

Zauważ, że ten sam problem występuje, gdy szarpanie zaznaczenia nie jest wizualnie yip.

Chciałbym, aby domyślnym zachowaniem było „powrót do pierwotnej pozycji kursora” po wykonaniu takich czynności wyboru / kopiowania. Czy istnieje konfiguracja, która to umożliwia?

Jonasz
źródło
11
Tak, to też mnie denerwuje. Po prostu używam w tym celu znaków: mm "+yap `m(Zauważ, że "+yszarpnie się do twojego schowka systemowego)
fruglemonkey
3
Uważam, że użyteczne jest umieszczenie kursora na początku lub na końcu szarpanej strefy. W końcu co mogę teraz zrobić z szarpanym tekstem i kursorem w środku? Teraz nie ma większego sensu wykonywanie operacji wstawiania / wklejania. Ale jeśli chcę to zrobić później, oznacza to, że mógłbym również szarpać później ... może to, czego teraz potrzebujesz, to tylko znak.
VanLaser,

Odpowiedzi:

14

Możliwym rozwiązaniem jest użycie skoków:

Przed szarpnięciem lub wizualnym wyborem możesz ustawić nowy skok, do którego będziesz mieć dostęp po przesunięciu kursora. Aby to zrobić, użyj m`.

Następnie po przesunięciu kursora z powodu zaciągnięcia użyj przycisku, ctrloaby przejść z powrotem na listę skoków. Możesz także zobaczyć listę dostępnych skoków za pomocą :jumpsi nawigować po tej liście za pomocą ctrloictrli

Podsumowując, Twój przepływ pracy byłby następujący:

  • m`
  • yip
  • ctrlo

Używając m` ustawia znak, możesz przeskoczyć do niego za pomocą ``zamiast ctrlo.

Możesz przeczytać :h mark-motionsi :h :jumpsuzyskać więcej informacji.

statox
źródło
Lubię to. Czy istnieje sposób na to, aby pojedynczy cytat zachowywał się jak zwrot w ogóle podczas skoku? pojedynczy cytat jest łatwiejszy do wpisania, i zwykle chcę przeskoczyć do właściwej pozycji kolumny, a także do właściwej linii ...
Jonah
1
@Jonah, mapuję, <leader>'aby być `, co działa całkiem dobrze dla mnie. (Używam <space>jako mojego lidera.)
Numeri mówi Przywróć Monikę
@Jonah: Jak powiedział Numeri, mapowanie może być dobrym rozwiązaniem, w przeciwnym razie, jeśli chcesz pozbyć się backsticka, możesz rzucić okiem :h 'langmap'. Nie twierdzę, że jest to idealne rozwiązanie, ale może być dla Ciebie interesujące.
statox
@Johah, właściwie zamieniłem pojedynczy cudzysłów i tykaj wstecz używając noremap ' ` noremap ` '... To jest w moim vimrc i działa świetnie
Niko Bellic
10

Możesz uniknąć poruszania kursorem:

:'{,'}y

Zobacz :help range, :help mark-motionsoraz :help :y.

romainl
źródło
1
Miło wiedzieć, ale czy to jest to, co faktycznie robisz? Wydaje się, że wpisanie 8 kombinacji klawiszy z dwoma nawiasami sprawia, że ​​jest to trudniejsze niż rozwiązania markowe
Jonah
Tak bym zrobił, gdybym był na twojej pozycji. Ale nie mam problemu z opisywanym zachowaniem, więc tak naprawdę nie robię tego.
romainl,
2
@Jonah Nadal masz opcję utworzenia mapowania. Coś takiego :nmap <key> :'{,'}y<CR>powinno wystarczyć.
statox
10

Mój kursor znajduje się w środku akapitu

Jeśli właśnie go edytowałeś, najprostszym rozwiązaniem jest g ;wpisanie kursora na ostatniej pozycji edycji.

A jeśli nie edytowałeś akapitu, możesz wykonać prostą operację zastępowania tym samym znakiem, na którym się znajdujesz (np. Jesteś włączony h, piszesz rh), aby wywołać „zdarzenie” edycji bez faktycznej edycji.

Al.G.
źródło
2
+1: Zawsze używałem '., ale bardzo przydatne może być przechodzenie między ostatnimi zmianami za pomocą g;i g,.
mMontu,
2
Czy jest jakaś wersja, g;która zabiera Cię również do właściwej pozycji kolumny?
Jonasz
@Jonah takie zachowanie jest domyślnie. Czy to nie działa dla ciebie? Zawsze zabiera mnie do właściwej pozycji kolumny i linii.
Al.G.
4

Plugin vim-easyclip ma ustawienie to:

g:EasyClipPreserveCursorPositionAfterYank- Domyślnie 0 (tzn. Wyłączone). Domyślnym zachowaniem Vima jest umieszczenie kursora na początku zszarpanego tekstu, co jest zgodne z innymi ruchami. Jeśli jednak wolisz, aby pozycja kursora pozostała niezmieniona podczas wykonywania szarpnięć, włącz tę opcję.

Trochę dla mnie jest instalacja całej wtyczki tylko dla tej małej funkcji, więc wolę używać znaków zgodnie z moim komentarzem.

fruglemonkey
źródło
0

Rozszerzając odpowiedź Al.G., możemy przejść do wymaganej lokalizacji bez edycji. Rozwiązaniem jest gi. Dotrzemy do tej samej pozycji, w której wcześniej byliśmy w ostatnim trybie wstawiania.

  • Jesteś w środku akapitu.
  • przejdź do trybu wstawiania.
  • przełączyć w tryb normalny.
  • prasa vip.
  • prasa gi.
  • przełączyć w tryb normalny. ( giopuści nas, aby wstawić tryb)

Jeśli chcemy przejść do początku lub końca podświetlonego tekstu.

 :help v_o 

Gdy pociągniesz podświetlony tekst, powrócisz również do trybu normalnego i możesz zachować pierwotną pozycję kursora.

  1. Jeśli zaczniesz podświetlać od wyższej do dolnej pozycji kursora (od dolnej liczby kolumn linii do wyższej linii linii kolumn), zachowasz oryginalną pozycję kursora po naciśnięciu y
  2. Kursor pozostanie w bieżącej pozycji, jeśli podświetlanie rozpocznie się od dolnej do wyższej pozycji kursora.

Powrót do pierwotnej lokalizacji po wyrwaniu:
gv aby uzyskać poprzednią atrakcję.

Teraz możesz przełączać się między pierwotną i bieżącą lokalizacją w trybie wizualnym za pomocą klawisza
olub O.

Numer linii i kolumny linii statusu pomoże poznać dokładną pozycję kursora.
Dokumentacja:

:help visual-change
Vusan
źródło
To nie działa, vipgdy kursor zaczyna się w środku akapitu.
Antony
O tak, nie zauważyłem tego, na razie zmienię odpowiedź, zamiast ją usunąć.
vusan
@Antony Teraz działa również w celu vipsprawdzenia mojej edycji.
vusan