Metin seçimlerini tmux ve pano arasında kopyala / yapıştır


15

Tmux (git deposundan) ve xclip (0.12) 'nin en son sürümünü çalıştırıyorum ve metin içinde dolaşmak copy-mode, kopya ( M-w) seçimlerini panoya kopyalamak için Emacs benzeri klavye bağlarını kullanabilmek ve C-ykopya arabelleğinden panoya yapıştırmak ( ).

Şimdiye kadar olan metni yapıştırmak mümkün olmuştur C-yve içinde hareket copy-modeEmacs benzeri klavye bağları ile, ama yine de metni kopyalamak alamıyorum (örneğin bir tmux tampon copy-mode)

Panoya (ve viceversa) tüm arabelleği kopyalamak için bu iş parçacığını buldum , ama benim için çalışmıyor gibi görünüyor.

Ayrıca, tmux-usersposta listesinde, tmux'un son sürümlerinin (yalnızca git repo'sunda) adlı bir komut sağladığı söylendi copy-pipe. Man sayfası bu komut hakkında şunları söylüyor:

İçindeki bir komut, seçimi kopyalayan ve bir komuta yönlendiren copy-pipe bağımsız değişkenini kabul eder. Örneğin aşağıdakiler, seçimi / tmp ve yapıştırma arabelleğine kopyalamak için 'C-q' bağlayacaktır:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

Görünüşe göre copy-pipeseçimi kısmen başka bir komuta bağlamak için kullanılır. Bu açıklamada ve komutta bazı yazım hataları var gibi görünüyor (nedir temacs-copy?)

Her iki durumda da, ne yapmak istiyorum:

Kopyalama:

  1. Kopyalama moduna girin
  2. Ben (yani Emacs navigasyon komutları kullanarak kopyalamak istediğiniz metnin taşı C-f, C-b, M-f, M-b, C-a, C-eimleci hareket ettirmek için vs.). Bunlardan hiçbiri için önek yok .
  3. Seçilen metni panoya şu şekilde kopyalayın: M-w( ön ek de yok)

yapıştırma:

  1. Ben yazın mümkün olmak istiyorum C-y( olmadan girmek zorunda copy-mode(terminalde metni yapıştırmak için) hiçbir önek ya)

Şanssız kopyalama için aşağıdakileri denedim:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

Ancak, yapıştırma harika çalışıyor:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Garip şey, xclip -i -selection clipboardyukarıdaki komut komutunun " " kısmının iyi çalıştığını biliyorum , çünkü komut satırındaki panoya bir şeyler kopyalayabiliyorum, örneğin:

echo "Hello world. How are you?" | xclip -i -selection clipboard

Bütün bunlarla, bir seçimi kopyalama modundan panoya nasıl kopyalayabilirim?

Yanıtlar:


19

Aşağıdakileri kullanın tmux.confile copy-pipetmux (1.8+) yeni sürümlerinde:

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[ kopyalama moduna geçme
  2. fare ile içerik seçme (basılı tutun)
  3. M-w bu bölümü sistem panosuna kopyalamak için
  4. C-yC-vweb tarayıcısı gibi diğer normal uygulamaların içine yapıştırmak için tmux içine yapıştırın.

Bu cevap daha fazla oyu hak ediyor, Linux tabanlı kurulumlar için en iyisi.
Louis Kottmann

run-shellrun
Tmux

@LouisKottmann: neden sadece Linux tabanlı?
schaiba

Diğer sistemler hakkında yorum yapamam, ancak mac'in genellikle xclip yerine bpaste kullandığına inanıyorum
Louis Kottmann

Tmux 2.8'de onları değiştirmek zorunda kaldım bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c ". starfrybind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"
azzamsa

6

Tmux 2.4 ile (bu işlemden bu yana ) bağlayıcı sözdiziminin değiştiğini lütfen unutmayın . Ben tefsir bu Github yorumunu değişikliği kısaca özetlemek:

  1. yerine -tsahip-T
  2. yerine vi-<name>sahip<name>-mode-vi
  3. komutun önüne send-keys -X

Sahiptim:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

hangi değiştirmek için gerekli:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

Gönderen değişmek :

Anahtar tablolarda büyük değişiklikler yapılmıştır. Mod anahtarı tabloları artık ana anahtar tablolarından ayrı değildir. Tüm mod anahtar tabloları, bind-key ve unbind-key işaretlerinin -t işaretiyle birlikte kaldırıldı.

Emacs-edit, vi-edit, emacs-select ve vi-select tabloları, komut isteminde ve seçim modlarında sabit anahtar bağlamaları ile değiştirildi. Mod tuşları ve durum tuşları seçenekleri kalır.

Emacs-copy ve vi-copy tablolarının yerini copy-mode ve copy-mode-vi tabloları aldı. Komutlar, gönderme anahtarlarına -X ve -N bayrakları kullanılarak gönderilir. Yani aşağıdakiler:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

Oluyor:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

Bu değişiklikler tam komut ayrıştırıcısının (komut dizileri dahil) ve komut kümesinin kullanılmasına izin verir - örneğin, düzenleme ve geçmiş içeren normal komut istemi artık özel bir komut yerine arama, atlama vb. İçin kullanılır. Varsayılan Cr bağlaması şimdi:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

Send -X ile kopyala-borula-iptal gibi bazı yeni commmands'lar da vardır.


2

-temacs-copyBir yazım hatası değil. Baştaki tire, bunun bind-keyskomut için bir seçenek olduğu anlamına gelir ( seçenek için bir argüman ile birlikte). Daha -t emacs-copyiyi isterseniz , buna eşdeğerdir .

Kopyalama modu “normal mod” dan farklı bir ciltleme ve komut seti 1 kullanır . copy-pipeKomut alternatif “modu” bağlamaları tablolarda kullanılabilir. Bu mode-keysdurumda emacs, kopyalama modu emacs-copytabloyu kullanır , bu nedenle Mw'yi copy-pipeo tabloya bağlamanız gerekir .

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

Çok fazla “önek yok” bağlama yaparken dikkatli olun. Onlar zor iç çalışan bir program için bu sınır anahtarları yazmaya yapacak tmux (eğer bir tty modu örneğine Cy yazmak istediğiniz zaman örneğin Emacs içinde çalışan tmux ). Bunu yapan bazı anahtarları her zaman (önek) bağlayabilirsiniz send-keys C-y, ancak bu, yeterince sık ihtiyacınız varsa yazmayı daha hantal hale getirebilir.


1 Yalnızca hareket ve düzenleme komutları kullanılabilir. Bunun dışında copy-pipe, bu komutlar herhangi bir argüman almazlar (man sayfasının “Bir komut bir argümanı kabul eder” derken anlamı budur; “in” muhtemelen bir yazım hatası veya düzenleme hatasıdır).


2

Diğer cevaplar yardımcı olabilirken, ben de aynısını nasıl yaparım:

  • Shift + imleçle birlikte metni seçin.
  • Metni panoya kopyalamak için Ctrl + Üst Karakter + C tuşlarına basın.

Bu adil bir cevaptır, ancak yatay olarak düzenlenmiş iki veya daha fazla bölmeniz olduğunda sorunlar başlar.
cjauvin

Görüyorum, bunun için yararlı bir şey bulursanız bana bildirin.
Rishabh Agrahari

prefix+ zseçilen bölmeyi yakınlaştırır, böylece tmux kopya seçimini atlayarak yatay bölmeler sorun olmaz shift.
joelostblom
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.