Setelah menyalin pilihan visual ke keyboard, kembali ke lokasi asli

18

Kursor saya ada di tengah paragraf ketika tiba-tiba saya memutuskan untuk menyalin paragraf itu:

Mulailah

Jadi saya ketik vipuntuk memilih paragraf secara visual:

terpilih

Sekarang saya menekan cmd+Cuntuk menyalin ke clipboard (ini mungkin bervariasi pada sistem Anda, tetapi seharusnya tidak relevan dengan pertanyaan utama posting saya), yang meninggalkan kursor saya di awal paragraf:

terakhir

daripada posisi yang diinginkan, di situlah saya mulai.

Perhatikan masalah yang sama terjadi ketika menarik pilihan dengan non-visual yip.

Saya ingin perilaku default menjadi "kembali ke posisi kursor asli" setelah melakukan tindakan seleksi / salin seperti ini. Apakah ada konfigurasi yang memungkinkan ini terjadi?

Jonah
sumber
11
Ya, saya menemukan ini juga mengganggu. Saya hanya cenderung menggunakan tanda untuk tujuan itu: mm "+yap `m(Perhatikan bahwa "+ymenarik ke clipboard sistem Anda)
fruglemonkey
3
Saya menemukan cara yang berguna untuk menempatkan kursor baik di awal, atau di akhir zona menarik. Lagi pula, apa yang bisa saya lakukan sekarang, dengan teks yang ditarik, dan kursor di dalamnya? Tidak masuk akal untuk melakukan put / paste sekarang. Tetapi, jika saya ingin melakukannya nanti, itu berarti saya juga bisa menariknya nanti ... mungkin yang Anda butuhkan sekarang hanyalah sebuah tanda.
VanLaser

Jawaban:

14

Solusi yang mungkin adalah dengan menggunakan lompatan:

Sebelum menarik atau memilih secara visual, Anda dapat mengatur lompatan baru yang dapat Anda akses setelah kursor bergerak. Untuk melakukannya gunakan m`.

Kemudian setelah kursor Anda bergerak karena penggunaan mencabut ctrlountuk melompat kembali dalam daftar melompat. Anda juga dapat melihat daftar lompatan yang tersedia dengan :jumpsdan menavigasi daftar ini dengan ctrlodanctrli

Singkatnya alur kerja Anda adalah:

  • m`
  • yip
  • ctrlo

Seperti menggunakan m` set tanda, Anda dapat melompat ke sana dengan ``bukan ctrlo.

Anda dapat membaca :h mark-motionsdan :h :jumpsuntuk informasi lebih lanjut.

statox
sumber
Saya suka ini. Apakah ada cara untuk membuat kutipan tunggal berperilaku seperti backtick pada umumnya, ketika melompat? kutipan tunggal lebih mudah untuk diketik, dan biasanya saya ingin melompat ke posisi kolom yang benar serta garis yang benar ...
Jonah
1
@ Jonah, saya memetakan <leader>'untuk menjadi `, yang bekerja cukup baik untuk saya. (Saya gunakan <space>sebagai pemimpin saya.)
Numeri mengatakan Reinstate Monica
@Jonah: Seperti yang dikatakan Numeri pemetaan bisa menjadi solusi yang baik, jika tidak, jika Anda ingin menyingkirkan backtick, Anda bisa melihatnya :h 'langmap'. Saya tidak mengatakan itu solusi ideal tapi mungkin itu bisa menarik untuk Anda.
statox
@Johah, saya benar-benar menukar kutipan tunggal dan centang kembali menggunakan noremap ' ` noremap ` '... Ini ada di vimrc saya dan berfungsi dengan baik
Niko Bellic
10

Anda dapat menghindari memindahkan kursor dengan:

:'{,'}y

Lihat :help range, :help mark-motions, dan :help :y.

romainl
sumber
1
Senang diketahui, tetapi apakah itu yang sebenarnya Anda lakukan? Tampaknya mengetik 8 keystrakes, dengan dua tanda kurung, membuat ini lebih sulit daripada solusi yang tepat
Jonah
Itulah yang akan saya lakukan jika saya berada di posisi Anda. Tetapi saya tidak memiliki masalah dengan perilaku yang Anda jelaskan sehingga saya tidak benar-benar melakukannya.
romainl
2
@Jonah Anda masih memiliki opsi untuk membuat pemetaan. Sesuatu seperti :nmap <key> :'{,'}y<CR>harus melakukan pekerjaan itu.
statox
10

Kursor saya ada di tengah paragraf

Jika Anda baru saja mengeditnya, solusi paling sederhana adalah mengetikkan g ;yang akan memposisikan kursor Anda pada posisi edit terakhir.

Dan jika Anda belum mengedit paragraf, Anda bisa melakukan operasi penggantian sederhana dengan karakter yang sama dengan yang Anda gunakan (misalnya Anda aktif h, Anda mengetik rh) untuk memicu "acara" edit tanpa benar-benar mengedit apa pun.

Al.G.
sumber
2
+1: Saya selalu menggunakan '., tetapi bisa sangat berguna untuk menavigasi antara perubahan terakhir dengan g;dan g,.
mMontu
2
Apakah ada versi g;yang membawa Anda ke posisi kolom yang benar juga?
Jonah
@Jonah itu perilaku secara default. Apakah itu tidak berhasil untuk Anda? Membawa saya selalu ke posisi kolom dan garis yang benar.
Al.G.
4

The Plugin vim-easyclip memiliki pengaturan untuk ini:

g:EasyClipPreserveCursorPositionAfterYank- Default 0 (mis. Dinonaktifkan). Perilaku default Vim adalah memposisikan kursor di awal teks yang ditarik, yang konsisten dengan gerakan lain. Namun jika Anda lebih suka posisi kursor tetap tidak berubah saat melakukan penarikan, aktifkan opsi ini.

Agak banyak bagi saya untuk menginstal seluruh plugin hanya untuk fitur kecil ini, jadi saya lebih suka menggunakan tanda sesuai komentar saya.

fruglemonkey
sumber
0

Memperluas jawaban Al.G., kita dapat pergi ke lokasi yang diperlukan tanpa mengedit. Solusinya adalah gi. Kami akan mencapai ke posisi yang sama di mana kami berada dalam mode insert terakhir sebelumnya.

  • Anda berada di tengah paragraf.
  • beralih ke mode insert.
  • beralih ke mode normal.
  • tekan vip.
  • tekan gi.
  • beralih ke mode normal. ( giakan meninggalkan kami untuk memasukkan mode)

Jika kita ingin memulai atau mengakhiri teks yang disorot.

 :help v_o 

Ketika Anda menarik teks yang disorot, Anda juga akan kembali ke mode normal dan Anda mungkin atau mungkin tidak mempertahankan posisi kursor asli.

  1. Jika Anda mulai menyorot dari posisi kursor tinggi ke rendah (dari nomor baris-kolom lebih rendah ke nomor kolom-baris lebih tinggi), Anda akan mempertahankan posisi kursor asli saat menekan y
  2. Kursor akan tetap ke posisi saat ini jika sorotan mulai dari posisi kursor lebih rendah ke yang lebih tinggi.

Kembali ke lokasi semula setelah menarik:
gv untuk mendapatkan sorotan sebelumnya.

Sekarang Anda dapat beralih antara lokasi asli dan saat ini dalam mode visual dengan tombol
oatau O.

Baris dan nomor kolom dari baris status akan membantu untuk mengetahui posisi kursor yang tepat.
Dokumentasi:

:help visual-change
Vusan
sumber
Ini tidak berfungsi vipketika kursor dimulai di tengah paragraf.
Antony
Oh ya saya tidak menyadarinya, untuk saat ini saya akan mengedit jawaban saya daripada menghapusnya.
vusan
@Antony Sekarang ini juga berfungsi untuk vipmemeriksa edit saya.
vusan