İmleci bir terminal komut satırında hareket ettirmenin en hızlı yolu?


157

Terminaldeki belirli bir çok uzun komut satırında dolaşmanın en iyi yolu nedir?

Diyelim ki bu uzun komut satırını almak için ok tuşunu veya Ctrl-R

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

Şimdi imleci hareket ettirmem gerekiyor (satırın başından veya sonundan başlayarak) imleci orada bir --option25şey değiştirmek için hareket ettirmeliyim .

Oraya ulaşmanın en hızlı yolu nedir? Genellikle yaptığım şey Ctrl- Abaşlangıca ulaşmak ve tekrar tekrar Alt- Filerlemek, kelimeye göre kelime (veya Ctrl- Esonuna gitmek ve Alt- Bsonra geriye gitmek). Ama uzun bir çizgi üzerinde çok fazla zaman alıyor. Aramak ve değiştirmek gerekir parçası doğrudan atlamak için bir yol olmalı, örneğin option25?

Yanıtlar:


108

Bu henüz kapatılmadığından, birkaç seçenek daha var.

  • Kullanım Ctrl+ x, ardından Ctrl+ ebelirtilen düzenleyici akım hattı açmak $FCEDITya da $EDITORya da emacs(bu sıra ile).
  • Komutu daha önce çalıştırdıysanız, geriye doğru geçmiş araması için Ctrl+ rdüğmesine basın ve yazın option25(bu durumda). Çizgi görüntülenecektir. TabBu noktada düzenlemeye başlamak için tuşuna basın .
  • s///Değiştiriciyle geçmiş genişletmeyi kullanın . Örneğin !-2:s/--option25/--newoption/, ikinci-son komutu yeniden çalıştırır, ancak option25 yerine geçer. Son ./cmdkomutu değiştirmek için !stringsözdizimini kullanın: !./cmd:s/--option25/--newoption/
    İkame yerine / yerine herhangi bir sınırlayıcı kullanılabilir.
  • Önceki satırı düzenliyorsanız, hızlı değiştirme kullanabilirsiniz: ^--option25^--newoption
  • Karakter arama. Bu Pax bahsettiği edildi ve düzenli emacs-modunda yapılabilir Ctrl+ ]ileri arama için, ve Ctrl+ Alt+ ]geri arama yapmak için.

İkinci seçeneği tavsiye ederim. Ctrl+ rgerçekten kullanışlı ve hızlıdır, editörlerle uğraşmak yoktur ve komut çalıştırılmadan önce sonuçları görürsünüz (geçmiş genişletmelerin aksine).


203

Açık olmak gerekirse, "imleci bir terminal komut satırında hareket ettirmenin hızlı bir yolu" istemezsiniz . Aslında istediğiniz şey size kabuk programında komut satırı üzerinden gezinmek için hızlı bir yoldur .

Örneğin Bash çok yaygın bir kabuktur. Komut satırı girdisini uygulamak için Readline kitaplığını kullanır . Ve söylemek gerekirse, sadece bash'da kullanılmadığı için Readline bağlarını bilmek çok uygundur. Örneğin gdb, girişi işlemek için Readline'ı da kullanır.

Readline belgelerinde navigasyonla ilgili tüm bağlantıları (ve daha fazlasını) bulabilirsiniz: http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Yukarıdaki bağlantı koparsa kısa kopyala yapıştır:

Bare Essentials

  • Ctrl-b Bir karakter geri gider.
  • Ctrl-f Bir karakter ileri gider.
  • [DEL] veya [Geri al] İmlecin solundaki karakteri siler.
  • Ctrl-d İmlecin altındaki karakteri siler.
  • Ctrl-_ veya Cx Cu Son düzenleme komutunu geri alır. Boş bir satıra geri alabilirsiniz.

hareket

  • Ctrl-a Satırın başına git.
  • Ctrl-e Satırın sonuna gitme.
  • Meta-f Bir sözcüğün harf ve rakamlardan oluştuğu bir sözcüğü ileri götürür.
  • Meta-b Bir sözcük geri gider.
  • Ctrl-l Geçerli satırı en üste yeniden yazarak ekranı temizler.

Öldür ve çek

  • Ctrl-k Geçerli imleç konumundan satırın sonuna kadar metni öldürür.
  • Md İmleçten geçerli kelimenin sonuna veya kelimeler arasındaysa bir sonraki kelimenin sonuna kadar öldür. Kelime sınırları Mf tarafından kullanılanlarla aynıdır.
  • M- [DEL] İmleçten geçerli kelimenin başlangıcını veya kelimeler arasındaysa önceki sözcüğün başına kadar öldürür. Kelime sınırları Mb tarafından kullanılanlarla aynıdır.
  • Ctrl-w İmleçten önceki boşluğa kadar öldürür. Bu, M'den farklıdır, çünkü kelime sınırları farklılık gösterir.
  • Ctrl-y En son öldürülen metni imleçteki arabelleğe geri gönderir.
  • My Kill-ring'i döndür ve yeni zirveyi çek. Bunu yalnızca önceki komut Cy veya My ise yapabilirsiniz.

M, Meta anahtarıdır. Max OS X Terminali için bunun için Ayarlar / Klavye'den "seçeneği meta anahtar olarak kullan" özelliğini etkinleştirebilirsiniz. Linux için daha karmaşık.

Güncelleme

Ayrıca Readline'ın iki modda çalışabileceğini unutmayın:

  • emacs modu (varsayılan değerdir)
  • vi modu

Bash'i vi modunu kullanacak şekilde değiştirmek için:

$ set -o vi

Kişisel olarak Metin düzenleme için vim kullandığım için vi modunu tercih ederim.

Bonus

MacOS Terminal uygulamasında (ve iTerm'de de) imleci hareket ettirmek için Option tuşunu basılı tutarak tıklayabilirsiniz (imleç tıklatılan konuma taşınır). Bu içeride bile çalışır vim.


3
Bu cevabı tercih ederim çünkü bash klavye girişinin nasıl çalıştığı (nereden geldiğini), yani Readline'ı [özü / kökü / nedeni] indirir.
eugenevd

6
Standart Ubuntu terminalinde, menü erişimi klavye kısayollarını devre dışı bırakmazsanız Meta (M), Alt + ÜstKrktr'dir, bu durumda yalnızca Alt'tır.
brianpeiris

2
Konsole'daki Kde'de Meta (M) alt anahtardır
Pipo

Sorun, ALT'ın çalışan program menüsüne (bu durumda terminal) erişim sağladığı için Meta ALT ise Meta + F'nin çalışmamasıdır. Bir alternatif var mı?
Pithikos

1
Mf nedir, burada kontrolü kullanmıyorsunuz, nedir?
PositiveGuy

33

Option tuşunu basılı tutun ve imlecin hareket etmesini istediğiniz yeri tıklatın; Terminal imleci tam olarak o noktaya getirir.


2
Verimliliğimi tekrarladın
Lay González

Bu hangi ortamlarda çalışır? Sanırım sadece Mac OS'de mi?
Abdull

Bir atlama sunucusu üzerinden bile uzak ssh linux üzerinde çalışır.
John Jiang

10

Vi düzenleme modunu tercih etme eğilimindeyim (bu tuş vuruşları şimdi omuriliğime gömülü olduğundan (beynin hiç kullanılmıyor), WordStar 3.3'ten CTRL-K, CTRL-X :-) ile birlikte. Komut satırını set -o vietkinleştirmek (ve set -o emacsgeri almak) için kullanabilirsiniz.

Vi'de (ESC-K, ilk önce çizgiyi almak için) " f5;;B" (çift tırnak olmadan ) olurdu .

Elbette, bundan kurtulmak için hatta ne olduğunu anlamalısınız. Temel olarak,

f5 to find the first occurrence of "5" (in --option5).
;  to find the next one (in --option15).
;  to find the next one (in --option25).
B  to back up to the start of the word.

Emacs meraklılarının 5 tuş vuruşundan daha az daha iyi bir çözüm getirip getiremeyeceğini görelim (dini bir savaş başlatmak istemememe rağmen).

Bu korkunç uzun komutu bir senaryoya koymak isteyip istemediğinizi düşündünüz mü? :-)

Aslında, bundan daha iyisini yapabilirim: " 3f5B" nin üçüncü oluşumunu bulmak için "" sonra kelimenin başına geri dönelim.


Betiğe gerek yok - vi modunda "v" ye basın ve komut satırını bir düzenleyicide açın. Komut satırı, err, "script" i yeni satırlarla daha iyi biçimlendirebilirsiniz ve herhangi bir geçici dosya gerekmez. :) Yani, "v / 25" 4 karakter sizi oraya götürür.
dannysauer

Ancak, çalıştırmak için <Enter> tuşundan daha fazlasına ihtiyacınız vardır. @dannysauer
CDR

9

Sırasıyla bir sözcük ileri / geri gitmek için Meta-b / Meta-f tuşlarını kullanın.

OSX'te Meta, berbat olan ESC olarak çevirir.

Ancak alternatif olarak, terminal tercihlerini -> ayarlar -> profil -> klavyeyi açıp "seçeneği meta anahtar olarak kullan" seçeneğini işaretleyebilirsiniz.


8

Komutu bir kez çalıştırdıktan sonra çalıştırın fc

$EDITORÖnceki komutla başlatılır , daha sonra komutu değiştirmek için normal düzenleyicinizi kullanabilirsiniz. Kaydettiğinizde ve çıktığınızda dosya yürütülür.

... ama Pax'ın dediği gibi - komut satırı saçma uzun satırları düzenlemek için özellikle iyi değil - neden komutu bir komut dosyasına dönüştürmüyorsunuz?


4

Belirli sayıda kelimeyi ileriye taşımak istiyorsanız, M-<n>( M-Meta ve genellikle çıkış tuşu için) tuşuna basın ve bir sayıya basın. Bu, readline'a bir tekrar argümanı gönderir, böylece istediğiniz komutu tekrarlayabilirsiniz - ileri gitmek istiyorsanız tuşuna basın M-<n> M-fve imleç <n>kelime sayısını ileri götürecektir .

Örneğin

 $|echo "two three four five six seven"
 $ M-4
 (arg: 4) echo "two three four five six seven"
 $ M-f
 $ echo "two three four| five six seven"

Böylece, örneğin satırın başındaki imleçten örnek alırsınız M-26 M-fve imleciniz --option25|-veya- satırın sonundan itibaren M-26 M-bimlecinizi--|option25


2

Artımlı geçmiş araması

terminalde şunu girin:

gedit  ~/.inputrc

sonra yapıştırın ve kaydedin

"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

bir önceki komutu bulmak için yapmanız gereken tek şey, ilk 2 veya 3 harfleri girmek ve yukarı ok hızlı bir şekilde oraya istediğimi söyleyeceğimizi girmektir:

for f in *.mid ; do timidity "$f"; done

tek yapmam gereken girmek

fo

ve yukarı ok tuşuna basarsanız yakında görünecek


1

Seçeneklerden biri kullanımda etmektir M-x shelliçinde emacs. Hepsi bu düzenleme imkanı ve tuş vuruşlarını sağlar emacs, böylece etti C-smetinde arama için kullanılabilir option25, örneğin.

(Ama yine de birisi beni iyi arama ve düzenleme olanaklarına yönlendirebilirse bunun yerine gerçek terminal kabuğunda olmayı tercih ederim.)


0

Fareyi kullan

Bazen, bir komut satırını düzenlemenin en kolay yolu fare kullanmaktır. Önceki bazı yanıtlar geçerli satırınızı $ EDITOR ürününüzde açma komutu verir. Benim için (grml config ile zhs) bu kombinasyon Alt+e. Farenizi düzenleyicinizde etkinleştirirseniz, fareyi kullanabilirsiniz.

Vim'de fareyi etkinleştirmek için bunu ~ / .vimrc'nize ekleyin

set mouse=a
set ttymouse=xterm2

Daha sonra terminalde bir metin seçimi yapmak istiyorsanız (fare tıklamasını vim'e geçirmek yerine), tıkladığınızda Shift tuşunu basılı tutun; bu elbette terminale özgüdür.

Sistem yöneticileri fareden korkmamalıdır.


0

Cygwin'de, pencereyi sağ tıklatarak bu özelliği etkinleştirebilirsiniz. Açılır pencerede Seçenekler ... -> Fare -> etkinleştir Yer komut satırı imlecini tıklar -> Uygula'yı seçin.

Şu andan itibaren, komut satırının içindeki bir konumdaki sol fare düğmesine tıklamak imleci oraya yerleştirecektir.


0

ilk olarak: dışa aktarma EDITOR = 'nano -m'

sonra: CTRL + X CTRL + E sırayla.

Şu anki satır nano editörde mouse enable ile açılacaktır. Metnin herhangi bir bölümünü tıklayıp düzenleyebilirsiniz

sonra çıkmak için CTRL + X ve kaydetmeyi onaylamak için y tuşuna basın.


0

Komut satırı imlecini fare tıklamasıyla hareket ettirmek için bir komut dosyası yaptım :

  1. Xterm fare izleme raporlamasını etkinleştir
  2. Tıklamaların oluşturduğu kaçış sırasını tüketmek için readline bağlarını ayarlama

Github'da bulunabilir

Başka bir yayında daha fazla bilgi

echo -e "\e[?1000;1006;1015h" # Enable trackingFare ile tıklandığında terminalde baskı kaçış dizileri varsa çalışır


0

En hızlı olmayabilir, ancak bunun burada olması gerekiyor, ANSI imleç hareketleri hakkında bazı okumalar

ANSI kaçış dizileri, imleci ekranın etrafında istediğiniz zaman hareket ettirmenizi sağlar. Bu, kabuk komut dosyaları tarafından oluşturulan tam ekran kullanıcı arabirimleri için daha kullanışlıdır , ancak bilgi istemlerinde de kullanılabilir . Hareket kaçış dizileri aşağıdaki gibidir:

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J  or \033c
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

(...)

Komut istemine aşağıdaki kod satırını koymayı deneyin (istemi, bunu koyduğunuzda terminalin birkaç satır aşağısındaysa ne yaptığı biraz daha açıktır): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"Bu, imleci yedi satır yukarı ekrana getirmeli, "BASH" kelimesini yazmalıdır. "yazın ve normal bir istem oluşturmaya başladığı yere dönün.


Örnekler :

İmleci 7 satır geriye götür:

echo -e "\033[7A"

İmleci satır 10, sütun 5'e getirin:

echo -e "\033[10;5H"

Bir programı renklendirmek için renk kodlarını hızla yankılayın :

echo -e "\033[35;42m" ; ifconfig
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.