Dopo aver copiato una selezione visiva sulla tastiera, tornare alla posizione originale


18

Il mio cursore si trova nel mezzo di un paragrafo quando decido improvvisamente che devo copiare quel paragrafo:

inizio

Quindi scrivo vipper selezionare visivamente il paragrafo:

selezionato

Ora premo cmd+Cper copiare negli appunti (questo può variare sul tuo sistema, ma non dovrebbe essere rilevante per la domanda centrale del mio post), che lascia il cursore all'inizio del paragrafo:

finale

piuttosto che la posizione desiderata, che è dove era quando ho iniziato.

Nota lo stesso problema si verifica quando si strappa la selezione non visivamente con yip.

Vorrei che il comportamento predefinito fosse "ritorna alla posizione originale del cursore" dopo aver fatto azioni di selezione / copia come questa. Esiste una configurazione che lo rende possibile?


11
Sì, lo trovo anche noioso. Tendo solo ad usare i segni per quello scopo: mm "+yap `m(Nota che si "+ystrappa agli appunti del tuo sistema)
fruglemonkey

3
Trovo molto utile posizionare il cursore all'inizio o alla fine della zona strappata. Dopotutto, cosa posso fare ora, con il testo strappato e il cursore al suo interno? Non ha molto senso fare un put / paste ora. Ma, se voglio farlo più tardi, significa che potrei anche strapparlo più tardi ... forse quello che ti serve ora è solo un segno.
VanLaser

Risposte:


14

Una possibile soluzione è utilizzare i salti:

Prima di tirare o selezionare visivamente, puoi impostare un nuovo salto a cui potrai accedere dopo che il cursore si è mosso. Per farlo usa m`.

Quindi, dopo che il cursore si è mosso a causa dell'uso dello yanking ctrloper tornare indietro nella jump list. Inoltre puoi vedere l'elenco dei salti disponibili con :jumpse navigare in questo elenco con ctrloectrli

Per riassumere il flusso di lavoro sarebbe:

  • m`
  • yip
  • ctrlo

Come usando m` imposta un segno, puoi saltare ad esso con ``invece di ctrlo.

Puoi leggere :h mark-motionse :h :jumpsper maggiori informazioni.


Mi piace questo. C'è un modo per fare in modo che la singola citazione si comporti come un backtick in generale, quando si salta? la virgoletta singola è più semplice da digitare e di solito voglio saltare alla posizione corretta della colonna e alla riga giusta ...
Giona

1
@Giona, immagino <leader>'di essere `, il che funziona abbastanza bene per me. (Uso <space>come mio capo.)
Numeri dice Reinstate Monica

@Jonah: Come ha detto Numeri una mappatura può essere una buona soluzione, altrimenti se vuoi sbarazzarti del backtick puoi dare un'occhiata :h 'langmap'. Non sto dicendo che sia la soluzione ideale, ma forse potrebbe essere interessante per te.
statox

@Johah, in realtà scambio la singola citazione e torno indietro usando noremap ' ` noremap ` '... Questo è nel mio vimrc e funziona benissimo
Niko Bellic

10

Puoi evitare di spostare il cursore con:

:'{,'}y

Vedi :help range, :help mark-motionse :help :y.


1
Bello da sapere, ma è quello che fai davvero? Sembra che digitare gli 8 tasti premuti, con due parentesi, renda questo più difficile rispetto alle soluzioni mark
Giona

Questo è quello che vorrei fare se fossi nella tua posizione. Ma non ho alcun problema con il comportamento che descrivi, quindi in realtà non lo faccio.
Romainl

2
@Jonah Hai ancora la possibilità di creare una mappatura. Qualcosa del genere :nmap <key> :'{,'}y<CR>dovrebbe fare il lavoro.
statox

10

Il mio cursore si trova nel mezzo di un paragrafo

Se l'hai appena modificato, la soluzione più semplice è digitare g ;che posizionerà il cursore sull'ultima posizione di modifica.

E se non hai modificato il paragrafo, puoi eseguire una semplice operazione di sostituzione con lo stesso carattere in cui ti trovi (ad esempio, sei attivo h, digiti rh) per attivare un "evento" di modifica senza effettivamente modificare nulla.


2
+1: l'ho sempre usato '., ma può essere molto utile navigare tra le ultime modifiche con g;e g,.
mMontu,

2
Esiste una versione g;che ti porta anche nella posizione corretta della colonna?
Giona

@Jonah questo è il comportamento di default. Non funziona per te? Mi porta sempre nella posizione corretta di colonna e linea.
Al.G.

4

Il plug-in vim-easyclip ha un'impostazione per questo:

g:EasyClipPreserveCursorPositionAfterYank- Predefinito 0 (cioè disabilitato). Il comportamento predefinito di Vim è posizionare il cursore all'inizio del testo strappato, che è coerente con altri movimenti. Tuttavia, se si preferisce che la posizione del cursore rimanga invariata durante l'esecuzione di strappi, abilitare questa opzione.

È un po 'troppo per me installare un intero plugin solo per questa piccola funzione, quindi preferisco usare i segni come da mio commento.


0

Estendendo la risposta di Al.G., possiamo andare nella posizione richiesta senza modificare. La soluzione è gi. Arriveremo nella stessa posizione in cui eravamo in precedenza nell'ultima modalità di inserimento.

  • Sei nel mezzo del paragrafo.
  • passa alla modalità inserimento.
  • passa alla modalità normale.
  • stampa vip.
  • stampa gi.
  • passa alla modalità normale. ( gici lascerà per inserire la modalità)

Se vogliamo andare all'inizio o alla fine del testo evidenziato.

 :help v_o 

Quando si strappa il testo evidenziato, si ritorna anche alla modalità normale e si può o meno conservare la posizione del cursore originale.

  1. Se si inizia a evidenziare dalla posizione del cursore superiore a quella inferiore (dal numero della colonna di linea inferiore al numero della colonna di linea superiore), si manterrà la posizione del cursore originale premendo y
  2. Il cursore rimarrà nella posizione corrente se l'evidenziatore inizia dalla posizione del cursore inferiore a quella superiore.

Ritorno alla posizione originale dopo lo strappo:
gv per ottenere l'evidenziazione precedente.

Ora puoi passare dalla posizione originale a quella attuale in modalità visiva con il tasto
oo O.

Il numero di riga e colonna della riga di stato consente di conoscere la posizione esatta del cursore.
Documentazione:

:help visual-change

Questo non funziona vipquando il cursore inizia nel mezzo di un paragrafo.
Antonio

Oh ya non l'ho notato, per ora modificherò la mia risposta anziché eliminarla.
vusan,

@Antony Ora funziona anche per vipcontrollare la mia modifica.
vusan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.