Vi'daki bir dosyadan başka bir dosyaya içerik kopyalayıp yapıştırma


256

İki dosyayla çalışıyorum ve bir dosyadan birkaç satır kopyalayıp başka bir dosyaya yapıştırmam gerekiyor. Aynı dosyaya (yy) ve (p) 'yi nasıl kopyalayacağımı biliyorum. Ancak bu farklı dosyalar için geçerli değildir. Bu nasıl yapılır?

Ayrıca, kesip yapıştırmanın bir yolu var mı? Google'ı denedim, ancak kaynakların çoğu sadece kopyala yapıştır hakkında konuşuyor.


Bunun işe yaramadığından emin misiniz? Bunu dosyalar arasında satır kopyalamak için sık sık kullanıyorum.
sjngm

Bunu yaparken sadece tırnak işareti mi alıyorum?
macha

4
Dd komutu kesilmiş gibi çalışır.
Martin Stålberg

Yanıtlar:


218

Metni nasıl keseceğinizi / çekeceğinizi bildiğiniz için, onu başka bir dosyaya yapıştırmak için birkaç fikir:

  • İstediğiniz metni sorarak ilk dosyayı düzenleyin. Sonra ikinci dosyanızı vi ( :e /path/to/other/file) içinden açın ve yapıştırın
  • Her iki dosyayı da bölünmüş bir pencerede açın ve Ctrl+ w, Up/ tuşlarını kullanarak aşağıdakiler arasında gezinin Down:

    • vi -o /path/to/file1 /path/to/file2
    • İlk dosyadan Ctrl+ w,s

İki macun pencerem var, önce görsel mod için "v yapıyorum ve sonra tüm satırları seçiyorum ve soran için bir" y "yapıyorum, diğer dosyaya girmek için alt + sekme yapıyorum ve ne zaman yapıyorum koymak için bir "p", sadece bir tırnak işareti yazdırır
macha

10
2 macun penceresi ile çalışıyorsanız, kopya / yapıştırma macunu / windows yolunu kullanmanız gerekir. Bu kolay. Kopyalamak istediğiniz şeyleri farenizle işaretleyin (başka bir şey yapmanız gerekmez, işaretli metin artık panoya kopyalanır.) Diğer macun pencerenize geçin. Ekleme moduna vim olarak girin (i tuşuna basın). Sağ fare düğmesine basın - macun penceresindeki sağ fare panoda ne varsa yapıştırır.
nos

3
Yaptığınız şey işe yaramaz: vi'de Yanking, metni Windows panonuza yerleştirmez ve yan tampon, açık vim örnekleri arasında paylaşılmaz.
Adam Batkin

1
İlk dosya içinde itibaren *,: Ben son nokta yapmak için ne gerekiyor anlamıyorum Ctrl+ w, s.
svassr

1
benim için pencereyi böldü ama aynı dosyayı açtı. Hangi dosyanın açılacağını nasıl seçersiniz? :sp myfileYatay olarak bölünmüş ve belirtilen dosyayı açan komutu gördüm , ancak pencereyi dikey olarak bölmeyi tercih edersem nasıl yapardım?
svassr

50

Windows'ta Vim kullanıyorsanız, panoya (MS kopyala / yapıştır) aşağıdakileri kullanarak erişebilirsiniz:

"*dd - bir çizgi kes (veya üç çizgi kesmek için 3dd)

"*yy - bir satırı kopyalayın (veya üç satırı kopyalamak için 3yy)

"*p - satır (ları) imleçten sonraki satıra yapıştır

"*P - satır (ları) imlecin önündeki satıra yapıştır

Ayrı Vim pencereleri arasında veya Vim ve PC uygulamaları ( Not Defteri , Microsoft Word vb.) Arasına yapıştırabilmenizi sağlar .


17
Kullanım +vs çapraz platform sistemi panosu kayıt (Windows ve Linux) olarak *, Windows, sadece ( +olarak Windows sadece aynı çalışır *).
Stephen Swensen

42

Kesmek için dbenzer varyasyonlarını kullanın dd.

Başka bir dosyaya satır aralığı yazmak için şunları kullanabilirsiniz:

:<n>,<m> w filename

Nerede <n>ve <m>, bir dizi çizgi belirten sayılar (veya semboller).

Masaüstü panosunu kullanmak için +gkomutlara göz atın .


Bunu işaretlerle yapmak için, bir dosyaya yazmak istediğiniz metnin çevresinde iki işaret (örneğin a ve b) oluşturun: ilk satıra git, mason satıra git mb,. Ardından 'yukarıdaki komutu kullanırken a işaretinin harfine başlayınız::'a,'b w filename
EchoLynx

geniş hat aralıkları için mükemmel çözüm!
Yasin Okumuş

29

Diğer dosyayı açıp yazabilirsiniz :r file_to_be_copied_from. Veya arabelleğe alabilirsiniz. Veya ilk dosyaya gidin, kopyalamak istediğiniz satıra "qYgidin , yazın , yapıştırmak istediğiniz dosyaya gidin ve yazın "qP.

"buffer_name, buffer'a kopyalar. Yçekilir ve Pkonur. Umarım yardımcı olur!


Teşekkürler! Bu bana tonlarca yardımcı oldu
Atsushi Yamamoto

28

İşte bunu yapmanın bir yolu;

  • Vim'i başlatın ve üzerinde çalıştığınız dosya olan file1'i açın.
  • :e Dosya2, satırları kopyalamak istediğiniz dosya olan file2'yi getirir.
  • kopyalamak istediğiniz satırları bulun. Eğer üç çizgi varsa, vurursunuz3yy
  • :b1 bu arabellek 1'e geçecektir, burada dosya1
  • Çektiğiniz satırları nereye eklemek istediğinizi anlayın ve p

Her iki dosyayı da görüntüleyebilirsiniz. Ekranı örn. Ctrl+ İle bölün w s.

dKesmeye gelince , kesilmiş malzemeleri yank tamponuna yerleştirir ve yerleştirir. ddbir çizgiyi "keser".


2
konu dışı: Bu klavye düğmesi benzeri şeyleri nasıl edinebilirim?
Eckes


İki dosya, aynı istemcinin Linux / MacOS'ta iki farklı terminalde yer aldığı iki farklı ssh sunucusunda ne olacak? Yani, kullanmak için macun yok ve iki dosya bir terminalde aynı vi oturumunda açılamaz.
Qiang Xu

1
İstemci iki sunucuya ssh yapabiliyorsa, bu iki sunucuya scp veya sftp de kullanabilir. Bu nedenle en hızlı yol, dosyayı bir sunucudan diğerine kopyalamaktır, böylece aynı sunucuda bulunurlar, bu dosyaları açıklandığı gibi düzenler ve gerektiğinde dosyayı diğer sunucuya kopyalarlar.
nos

16

Bunların hepsi harika önerilerdir, ancak metnin başka bir dosyadaki yerini biliyorsanız kolaylıkla sed kullanın. :r! sed -n '1,10 p' < input_file.txtBu, imlecin geçerli konumunda zaten açık olan bir dosyaya 10 satır ekleyecektir.


garip bir şekilde ne yazık ki os x üzerinde çalışırken 1 çıkış kodu var, emin değilim.
jayunit100

1
Bu öneri için teşekkürler! Sed yerine kafa kullandım çünkü ilk 2 satırı istedim::r ! head -n2 file.py
Federico Ponzi

7

Dosyayı düzenlerken, başlangıç ​​ve bitişin kullanılmasını istediğiniz yerleri işaretleyin

ma- aişareti belirler

mb- bişareti belirler

Ardından, bunu başka bir dosyaya kopyalamak için şu wkomutu kullanın:

:'a,'bw /name/of/output/file.txt

7

2017-05 güncellemesi:

Az önce vimrc dosyanıza aşağıdaki satırı eklerseniz,

pano ayarla = adsız

Vim sistem panosunu kullanıyor.


Sadece yank yolunun farklı Vim örneği pencereleri arasında içerik kopyaladığım yolda çalışmadığını buldum. (En azından Vim bilgime dayalı olarak çalışmıyor. Çalışmasını sağlamak için başka bir yol olup olmadığını bilmiyorum).

Yank yolu sadece testime göre aynı pencerede birden fazla dosyanın açıldığı yolda çalışır.

Bunu yapmak istiyorsanız, Ctrl+ x, Ctrl+ c(Windows altında) gibi OS kesme-kopyalama geçmişini kullanmanız daha iyi olur .


5

Aynı Vim örneğinde açılan iki arabellek (== dosya) arasında metin kopyalamak sorun değil:

Sadece bir arabellekle y(daha önce görsel modda kopyalanacak bir alanı işaretlediğinizi varsayalım ) ve ardından diğer ara belleğe yapıştırın p. Aynı Vim örneğinde oldukları sürece farklı sekmelerle de çalışır.

Aynı Vim örneğinde iki dosyayı açmak sisteminize bağlıdır:

  • Win32'de, içerik menüsünde iki veya daha fazla dosya seçerseniz bir vim ile Düzenle yazan bir seçenek vardır.
  • Konsoldayken, vim file1 file2
  • Vim'i başka bir araç için düzenleyici olarak kullanıyorsanız --remote-silent, tüm dosyaların aynı örnekte açıldığından emin olma seçeneğini belirttiğinizden emin olun.

İki dosyayı iki farklı Vim örneğinde açtıysanız, sistem panosuna gitmeniz gerekir: ilk Vim örneğinde, metni "+y(tekrar, daha önce görsel modda çekilecek alanı işaretleyin) ), sonra ikinci Vim gidip orada panoya yapıştırın: "+p.


: tabedit dosyaadı hedef dosyayı açmak için kullanılabilir ve daha sonra satırlarınızı yapıştırmak için sadece p kullanabilirsiniz. Bence daha hızlı.
jabalv

5

Bu hatırlamalar benim için bir cazibe gibi çalışıyor:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

Görsel moddayken, istediğim satırları seçiyorum ve metni alıcı dosyasına eklemek için Ctrl+ cve ardından Ctrl+ tuşlarına vbasıyorum. "* Y" yi de kullanabilirsiniz, ancak bunun bazen hatırlanması zor olduğunu düşünüyorum.

Bu, Vim'den panoya metin kopyalamak için de yararlıdır.

Kaynak: Geçici bir dosya kullanarak oturumlar arasında kopyalama ve yapıştırma


4

Amaç : bir dosyanın bir parçasını başka bir dosyaya kaydetmek.

Çözüm :

  1. Kaydetmek istediğiniz metni seçin:
    • İmleci seçimi başlatmak istediğiniz yere getirin
    • Basın vkarakterleri seçmek VEYA büyük harfe Vbütün çizgileri seçmek için
    • İmleci seçmek istediğiniz öğenin sonuna getirin
  2. Seçilen metni yeni dosyaya kaydedin. Yazın :wSpaceve yeni bir dosya adı. Aslında göreceksin

    :'<,'>w new.txt

    Ardından Enter


Geçici dosyadan nasıl yapıştırılır.?
Vine

3

Senaryom, n numaralı satırı ortada, n bilinmeyen, dosya 1'den dosya 2'ye kopyalamam gerekti.

:'a,'bw /name/of/output/file.txt

3
  1. Vim sürümünün pano desteği ile derlendiğinden emin olun
    • :echo has('clipboard') geri dönmeli 1
    • geri dönerse 0(örneğin Mac OS X, en az v10.11 (El Capitan), v10.9 (Mavericks) ve v10.8 (Mountain Lion) - Vim sürümü eksik pano desteği ile birlikte gelir), Pano desteğiyle vim sürümü, yoluyla söyleyin brew install vim(kurulumdan sonra terminal (ler) inizi yeniden başlatmayı unutmayın)
  2. Görsel mod girin ( V- çok satırlı, v- düz veya Ctrlv- blok-görsel)
  3. Kopyalamak istediğiniz satırları seçin
  4. "*y - seçili kopyalamak için
  5. "*p - kopyalanmış yapıştırma

Not:

  • Eğer adımları yerine 2-5 aldığı talimatlar cevap tarafından JayG , kopyalamak ve tek bir satır yapıştırmak için gerekirse
  • çizgileri seçerek kolaylaştırmak için ya ekleyebilir set mouse+=aadresinden Müşteri .vimrc- (hat numaraları, vb gibi) yabancı unsurları seçerek değil iken, fareyi kullanarak Vim çizgileri seçmek sağlayacak BİLDİRİM: Bu fare-Seçilen metni kopyalamak için yeteneği bloke edecek Vim'den sistem panosuna .

1

Örnek: fileA ve fileB - satır 25'te dosyaA'da başlayın, 50 satır kopyalayın ve dosyaB'ye yapıştırın

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

1

Aşağıdaki seçenek çoğu zaman ve daha sonra yapıştırmak için kullanılabilir.

 "xnyy
x - buffer name
n - number of line to Yank - optional

Atılan çizgiler tamponda saklanacaktır 'x'. Düzenlemenin herhangi bir yerinde kullanılabilir.

Satırları diğer dosyaya yapıştırmak için,

:e filename&location

Örnek: Geçerli düzenlemeye aşağıdaki komutu yazın

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

İşlemi tamamlayın

açık dosya 1:

vi Test1.sh

a10yy

-Yanked 10 lines

- geçerli düzenlemeden ikinci dosyayı aç

*:e /u/test/Test2.sh*

- imleci yapıştırmanız gereken satıra taşıyın

*"ap*

- Tampondaki satırlar '*a*'geçerli imleç konumundan sonra kopyalanacaktır


1

Dosyanın bir bölümünü kopyalayıp başka bir dosyanın ortasına yapıştırmak istiyorsanız, bunu yapabilirsiniz.

:linenumber,linenumber write newfile

Misal:

:2,34 write temp1

Veya

:'mark, 'mark write newfile

Misal:

:'a,'b write temp1

Şimdi satırlar başka bir dosyaya kopyalanıyor. Kopyaladıktan sonra bu satırları silmek isterseniz,

:linenumber1,linenumber2 d

Veya

:'mark1,'mark2 d

Şimdi başka bir dosyaya gidin. Ardından imleci yapıştırmak istediğiniz satırda tutun.

tip

:r!cat temp1

Şimdi, geçici dosyanın içeriği buraya yapıştırılır. İçeriği yapıştırdıktan sonra geçici dosyayı komut satırından silebilirsiniz.

:!rm temp1

Birkaç kez kopyalayıp yapıştırmak istiyorsanız bu yardımcı olacaktır.


0

Başka bir yol, iki dosyayı iki bölünmüş tamponda açmak ve ilgilenilen satırların görsel seçiminden sonra aşağıdaki "snippet'i" kullanmak olabilir.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

Komut moduna girin ve çalıştırın

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

Örneğin hatları ayıklamak için 20-30gelen filenameanda açılmış olan dosyaya

:r! sed -n '20, 30p' filename
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.