Bir metin bloğunu taşımanın daha hızlı yolu


25

Genelde bir metin veya kod bloğunu şöyle kopyalarım:

  1. Visual modlu ( V) bloğu seçiniz ve d; ya da sadece bir satırsa, sadece kullanın dd.
  2. Metnin olmasını istediğim yere git, pve arasındaki farkı hatırlayamayacak kadar aptalım P, bu yüzden zamanın% 50'sinde bunu doğru yapıyorum. (Yanlış yaparsam: tekrar deneyin).
  3. Bazen, girintinin ayarlanması gerekir, bu yüzden Vtekrar Visual Mode'a gidiyorum ve aynı bloğu tekrar seçiyorum ve düzeltmek için >veya <tuşlarını kullanıyorum.

Daha kolay bir yolu var mı? Bazı editörlerde, bir metin bloğunu "olduğu gibi" alabileceğinizi ve hareket ettirebileceğinizi gördüm; İşte Emacs'tan bir örnek (ancak bunu diğer editörlerde de gördüm):

Emacs

Ya da belki başka (daha iyi) bir yol var mı?


Girinti konuyla ilgili sizinle yapıştırarak bunu çözebilir ]pya [pziyade pya P. Bu şekilde yapıştırdığınız blok otomatik olarak bağlanır.
Gonçalo Ribeiro

Senaryoyu, vim-unpaired kullanmayi tavsiye eden Drew Neil Bubbling Text ile izlemek isteyebilirsiniz .
Hotschke

Yanıtlar:


13

Bunun için bir eklenti var: dragvisuals.vim .

Hiçbir anahtarı varsayılan olarak bağlamaz, bu nedenle kendiniz yapmanız gerekir. Onları Control+ ile eşleştirmeyi seviyorum Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

Ayrıca, geçerli seçimi kopyalamak için bir bonus anahtarla birlikte gelir:

xmap <expr> D DVB_Duplicate()

Bu eklentinin diğer cevaplara göre avantajları:

  • İlk satırdan daha ileriye gitmeye çalışırsanız herhangi bir metni ortadan kaldırmaz.
  • Son satırın altına inerseniz dosyayı genişletir.
  • Sola / sağa hareket etmek biraz daha iyi çalışır.

Bunu tamamlamak için bir başka yararlı hile şu anahtar kelimelerdir:

xnoremap > >gv
xnoremap < <gv

Bu, >Görsel moddayken kullandıktan sonra son görsel seçimi yeniden seçer , böylece hizalamayı daha kolay ayarlayabilirsin (ok tuşlarını da kullanabilirsiniz, ancak bu bir karakter değil, bir karakter taşır shiftwidth).


1
Bunun için önerdiğim eklentinin yazarının "kendi dragvisuals.vim ile ilgili çok daha iyi bir elden geçirme çalışması" olarak nitelendirdiği başka bir eklenti daha var: github.com/zirrostig/vim-schlepp
Jay Thompson

8

3. adım için gv=bunun yerine kullanabilirsiniz ( =girinti ve gv"son görsel seçimi yeniden seç" anlamına gelir).

Emacs davranışı için, .vimrc'nize bazı eşlemeler eklemek oldukça basit olurdu:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

Görsel çizgi seçiminde hareket etmek için yukarı ve aşağı ok tuşlarını kullanabilirsiniz. (Tabii ki, oklardan nefret ediyorsanız, farklı anahtarlarla da eşleştirebilirsiniz.)

(Bunu normal görsel seçimlerle ve bunları sola ve sağa hareket ettirerek yapabilirsiniz: vnoremap <left> dhPgvhohove vnoremap <right> dpgvlolo.)


gvBu durumda silinen paragraf olacak olan son görsel seçime gider. Neyi kaçırıyorum?
Robert Smith,

4

Çizgileri hareket ettirmek için bazı tuşları yeniden eşleyebilirsiniz. Örneğin, dolaşmak için kullanılıyorsanız yukarı ve aşağı okları kullanın hjkl.

Örneğin, .vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, bir satır taşımak için normal komut

+1veya -2çizgiyi yukarı veya aşağı belirtmek için (-1 çizgiyi aynı yerde tutar)

gvVISUALmodunda aynı metni tekrar seçmek için

Bu çözüm kayıtlara müdahale etmiyor, bu nedenle kopyalanan herhangi bir metin hala mevcut olacak ve uygun girinti, vb.


Bu hoş, ama benim için değil, çünkü kullanmaktan hoşlanmıyorum =(genellikle benim için çok fazla alakasız biçimlendirmeyi değiştiriyor).
Martin Tournoij


3

Bunun için çok az eklenti var ama Tim Papa'nın vim- unpapaired'i ( github ) tercih ediyorum (Ingo Karkat LineJuggler benzer).

Metin bloğunuzu görsel olarak seçersiniz, sonra ]ebloğu aşağıya doğru hareket ettirmek için ( [ediğerini değiştirmek için) yapın. Kullanım .işlemi tekrarlamak için (Sen var repeat.vim değil mi yüklenir). Eğer çok ileri gidersen, o zaman sadece üzerinden geri almak u.

Şimdi şahsen , kötü alışkanlıklar yaratmadan önce onları öğrenmenin en iyi yolu olduğunu düşünüyorum pve Pöyle yaygın komutlar olduğumu düşünüyorum . Sonra ]paynı girintiye yapıştırmak için kullanabilirsiniz . Eğer eşleşmemiş kullanıyorsanız, >pderinlemesine bir girinti seviyesini =pyapıştırmak veya yapıştırmak ve yeniden biçimlendirmek için yapabilirsiniz.

Eğer sorun hatırlanmasını varsa pve Po zaman bakımından onları düşünmek yardımcı olabilir ove Osimetri bir tür komutları.

Diğerlerinin belirttiği gibi, gvgörsel seçimi yeniden seçmek için kullanabilirsiniz . Ancak, metni yeni yapıştırdığınızda / yapıştırdığınızda görsel seçiminizi kaybedersiniz. Endişelenmeyin çünkü her değişiklik (ve yanklar!) Değişmiş alanın etrafında '[ve ']çevresinde olacaktır . Böylece girinti >'](okuma: en son değişikliğin sonuna kadar sağa kaydırma) yapabilir ve .metni doğru noktada alana kadar girintiyi tekrarlamak için kullanabilirsiniz .

Daha fazla yardım için bkz:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

Metin bloğunu taşımak istediğiniz satır numarasını biliyorsanız, o zaman :movebloğu oraya taşımak için komut ile bir aralık veya görsel seçim kullanabilirsiniz .

Örneğin, aşağıdaki dosyaya sahipsem:

1 aaa
2 bbb
3 ccc
4 ddd

ve a'nın çizgisini c'nin çizgisinden sonraya taşımak istiyorum, imleci a'nın çizgisine getirip giriyorum :m3ve sonra satır kaydırılıyor.

Bu ayrıca +/- ofsetlerle de çalışır. Yukarıdaki örnekte, aynı sonuç :m+2çizgiyi 2 satır aşağıya kaydırmakla başarılabilir .

Metin blokları için tek fark bir aralık veya seçimde eklemektir. Aaa ve bbb satırlarını dosyanın sonuna taşımak için, gibi bir komut kullanın :1,2m$($ = son satır) veya görsel olarak ve satırlarını seçin :m$.


1
Fazla ipucu yaklaşık için :moveayrıca bkz vim.wikia.com/wiki/Moving_lines_up_or_down veya İpucu 29 ': t' ve ': m' Komutları Yinelenen veya kullanma Taşı Hatları Kitap içinde Pratik Vim D. Neil tarafından.
Hotschke

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.