Cara tercepat untuk memindahkan kursor pada baris perintah terminal?

157

Apa cara terbaik untuk bergerak di jalur perintah yang sangat panjang di terminal?

Katakanlah saya menggunakan tombol panah atau Ctrl- Runtuk mendapatkan baris perintah panjang ini:

./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 

Sekarang saya perlu memindahkan (mulai dari awal atau akhir baris) kursor --option25untuk memodifikasi sesuatu di sana.

Apa cara tercepat untuk sampai ke sana? Apa yang biasanya saya lakukan adalah Ctrl- Auntuk memulai dan kemudian berulang kali Alt- Funtuk bergerak maju, kata demi kata (atau Ctrl- Euntuk mencapai akhir dan Alt- Buntuk kemudian mundur). Tetapi pada garis panjang itu membutuhkan waktu terlalu banyak. Pasti ada cara untuk mencari dan melompat langsung ke bagian yang perlu saya modifikasi, misalnya option25?

jujur
sumber

Jawaban:

108

Karena ini belum ditutup, berikut adalah beberapa opsi lagi.

  • Gunakan Ctrl+ xdiikuti oleh Ctrl+ euntuk membuka baris saat ini di editor yang ditentukan oleh $FCEDITatau $EDITORatau emacs(dicoba dalam urutan itu).
  • Jika Anda menjalankan perintah sebelumnya, tekan Ctrl+ runtuk pencarian dan ketik histori terbalik option25(dalam hal ini). Baris akan ditampilkan. Tekan Tabuntuk mulai mengedit pada titik ini.
  • Gunakan ekspansi riwayat dengan s///pengubah. Misalnya !-2:s/--option25/--newoption/akan menjalankan kembali perintah kedua-ke-terakhir, tetapi ganti opsi25. Untuk memodifikasi ./cmdperintah terakhir , gunakan !stringsintaksis: !./cmd:s/--option25/--newoption/
    Pembatas apa pun dapat digunakan sebagai pengganti / dalam substitusi.
  • Jika mengedit baris sebelumnya, Anda dapat menggunakan penggantian cepat: ^--option25^--newoption
  • Pencarian karakter. Ini disebutkan oleh Pax, dan dapat dilakukan dalam mode emacs biasa dengan Ctrl+ ]untuk pencarian maju, dan Ctrl+ Alt+ ]untuk pencarian mundur.

Saya merekomendasikan opsi kedua. Ctrl+ rsangat praktis dan cepat, tidak ada masalah dengan editor, dan Anda melihat hasilnya sebelum perintah dijalankan (tidak seperti ekspansi sejarah).

Pianosaurus
sumber
203

Agar jelas, Anda tidak ingin "cara cepat untuk memindahkan kursor pada baris perintah terminal ". Apa yang sebenarnya Anda inginkan adalah cara cepat untuk menavigasi melalui baris perintah di program shell Anda .

Bash adalah shell yang sangat umum, misalnya. Menggunakan pustaka Readline untuk mengimplementasikan input baris perintah. Jadi bisa dikatakan, sangat mudah untuk mengetahui binding Readline karena digunakan tidak hanya dalam bash. Misalnya, gdb juga menggunakan Readline untuk memproses input.

Dalam dokumentasi Readline Anda dapat menemukan semua binding terkait navigasi (dan banyak lagi): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Salin-tempel pendek jika tautan di atas rusak:

Bare Essentials

  • Ctrl-b Pindah kembali satu karakter.
  • Ctrl-f Memajukan satu karakter.
  • [DEL] atau [Backspace] Hapus karakter di sebelah kiri kursor.
  • Ctrl-d Hapus karakter di bawah kursor.
  • Ctrl-_ atau Cx Cu Membatalkan perintah pengeditan terakhir. Anda dapat membatalkan semua jalan kembali ke baris kosong.

Gerakan

  • Ctrl-a Pindahkan ke awal baris.
  • Ctrl-e Pindah ke akhir baris.
  • Meta-f Memajukan kata, di mana kata terdiri dari huruf dan angka.
  • Meta-b Pindah mundur satu kata.
  • Ctrl-l Bersihkan layar, cetak ulang garis saat ini di atas.

Bunuh dan tarik

  • Ctrl-k Bunuh teks dari posisi kursor saat ini ke akhir baris.
  • Md Bunuh dari kursor ke akhir kata saat ini, atau, jika antara kata, ke akhir kata berikutnya. Batas kata sama dengan yang digunakan oleh Mf.
  • M- [DEL] Bunuh dari kursor awal kata saat ini, atau, jika antara kata, dengan awal kata sebelumnya. Batas kata sama dengan yang digunakan oleh Mb.
  • Ctrl-w Kill dari kursor ke spasi sebelumnya. Ini berbeda dari M- karena kata batas berbeda.
  • Ctrl-y Yank teks yang baru saja terbunuh kembali ke buffer di kursor.
  • My Rotate the kill-ring, dan tarik bagian atas yang baru. Anda hanya dapat melakukan ini jika perintah sebelumnya adalah Cy atau My.

M adalah kunci Meta. Untuk Terminal Max OS X Anda dapat mengaktifkan "Gunakan opsi sebagai meta key" di Pengaturan / Keyboard untuk itu. Untuk Linux lebih rumit.

Memperbarui

Perhatikan juga, bahwa Readline dapat beroperasi dalam dua mode:

  • mode emacs (yang merupakan default)
  • mode vi

Untuk beralih Bash untuk menggunakan mode vi:

$ set -o vi

Secara pribadi saya lebih suka mode vi karena saya menggunakan vim untuk mengedit teks.

Bonus

Di aplikasi Terminal macOS (dan di iTerm juga) Anda bisa Opsi-Klik untuk memindahkan kursor (kursor akan pindah ke posisi yang diklik). Ini bahkan berfungsi di dalam vim.

wonder.mice
sumber
3
Saya lebih suka jawaban ini karena turun [esensi / root / alasan di belakang] bagaimana input keyboard bash bekerja (dari mana asalnya), yaitu Readline.
eugenevd
6
Di terminal Ubuntu standar, Meta (M) adalah Alt + Shift, kecuali jika Anda menonaktifkan pintasan keyboard akses menu yang hanya Alt.
brianpeiris
2
Dalam Kde dalam Konsole, Meta (M) adalah kunci alt
Pipo
Masalahnya adalah bahwa Meta + F tidak berfungsi jika Meta ALT karena ALT memberikan akses ke menu program yang sedang berjalan (dalam hal ini terminal). Apakah ada alternatif?
Pithikos
1
apa Mf, jadi Anda tidak menggunakan kontrol di sini jadi apa itu?
PositiveGuy
33

Tahan tombol Option dan klik di mana Anda ingin kursor bergerak, dan Terminal mempercepat kursor ke tempat yang tepat.

Menghubungkan kehidupan dengan Android
sumber
2
Anda baru saja menggandakan efisiensi saya
Lay González
Di lingkungan mana ini bekerja? Saya kira hanya di Mac OS?
Abdull
Bekerja pada linux ssh jarak jauh, bahkan melalui server lompat.
John Jiang
10

Saya cenderung memilih mode edit vi (karena penekanan tombol itu tertanam ke sumsum tulang belakang saya sekarang (otak tidak digunakan sama sekali), bersama dengan CTRL-K, CTRL-X dari WordStar 3.3 :-). Anda dapat menggunakan baris perintah set -o viuntuk mengaktifkannya (dan set -o emacsmengembalikan).

Di Vi, itu akan menjadi (ESC-K untuk mendapatkan antrian pertama tentu saja) " f5;;B" (tanpa tanda kutip ganda).

Tentu saja, Anda harus memahami apa yang ada di jalur untuk lolos dengan ini. Pada dasarnya, ini

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.

Mari kita lihat apakah para penggemar emacs dapat memberikan solusi yang lebih baik, kurang dari 5 penekanan tombol (walaupun saya tidak ingin memulai perang agama).

Pernahkah Anda memikirkan apakah Anda mungkin ingin memasukkan perintah yang sangat panjang ini ke dalam naskah? :-)

Sebenarnya, saya bisa melakukan yang lebih baik dari itu: " 3f5B" untuk menemukan kemunculan ketiga "5" kemudian kembali ke awal kata.

paxdiablo
sumber
Tidak perlu skrip - cukup tekan "v" dalam mode vi dan buka baris perintah di editor. Anda dapat memformat baris perintah, err, "skrip" lebih baik dengan baris baru, dan tidak perlu tempfile. :) Jadi, "v / 25" membuat Anda di sana dalam 4 karakter.
dannysauer
Tetapi kemudian, Anda membutuhkan lebih dari kunci <Enter> untuk menjalankannya. @dannysauer
CDR
9

Gunakan Meta-b / Meta-f untuk bergerak mundur / maju dengan kata masing-masing.

Di OSX, Meta diterjemahkan sebagai ESC, yang menyebalkan.

Tetapi sebagai alternatif, Anda dapat membuka preferensi terminal -> pengaturan -> profil -> keyboard dan centang "gunakan opsi sebagai kunci meta"

Edson Medina
sumber
8

Setelah menjalankan perintah sekali, jalankan fc

Itu akan diluncurkan $EDITOR dengan perintah sebelumnya, maka Anda dapat menggunakan editor reguler Anda untuk memodifikasi perintah. Ketika Anda menyimpan dan keluar, file tersebut akan dieksekusi.

..tapi, seperti yang dikatakan Pax - baris perintah tidak terlalu baik untuk mengedit garis panjang yang tidak masuk akal - mengapa tidak membuat perintah menjadi skrip?

dbr
sumber
4

Jika Anda ingin memajukan sejumlah kata tertentu, tekan M-<n>( M-untuk Meta dan biasanya tombol pelarian) lalu tekan angka. Ini mengirimkan argumen berulang ke readline, sehingga Anda dapat mengulangi perintah apa pun yang Anda inginkan - jika Anda ingin maju kemudian tekan M-<n> M-fdan kursor akan bergerak maju<n> sejumlah kata.

Misalnya

 $|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"

Jadi untuk contoh Anda dari kursor di awal baris Anda akan menekan, M-26 M-fdan kursor Anda akan di --option25|-atau- dari akhir baris M-26 M-bakan meletakkan kursor Anda di--|option25


sumber
2

Pencarian riwayat tambahan

di terminal masukkan:

gedit  ~/.inputrc

lalu salin tempel dan simpan

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

yang perlu Anda lakukan untuk menemukan perintah sebelumnya adalah memasukkan katakanlah 2 atau 3 huruf pertama dan panah ke atas akan membawa Anda ke sana dengan cepat mengatakan saya ingin:

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

yang perlu saya lakukan hanyalah memasukkan

fo

dan tekan perintah panah ke atas akan segera muncul

Alexandr
sumber
1

Salah satu pilihan adalah untuk digunakan M-x shelldi emacs. Itu menyediakan semua fasilitas pengeditan dan penekanan tombol yang emacsdimiliki, jadi C-sdapat digunakan untuk mencari teks option25, misalnya.

(Tapi saya masih lebih suka berada di shell terminal nyata jika seseorang dapat mengarahkan saya ke fasilitas pencarian dan edit yang baik.)

jujur
sumber
0

Gunakan mouse

Terkadang, cara termudah untuk mengedit baris perintah adalah menggunakan mouse. Beberapa jawaban sebelumnya memberikan perintah untuk membuka baris Anda saat ini di $ EDITOR Anda. Bagi saya (zhs dengan konfigurasi grml) kombinasi itu Alt+e. Jika Anda mengaktifkan mouse di editor Anda, Anda dapat menggunakannya.

Untuk mengaktifkan mouse di Vim, tambahkan ini ke ~ / .vimrc Anda

set mouse=a
set ttymouse=xterm2

Jika Anda kemudian ingin melakukan pemilihan teks di terminal (alih-alih meneruskan mouseclick ke vim), tahan Shift ketika Anda mengklik; ini spesifik terminal, tentu saja.

Sysadmin seharusnya tidak takut dengan mouse.

pengguna7610
sumber
0

Di Cygwin, Anda dapat mengaktifkan fitur tersebut dengan mengklik kanan jendela. Di jendela sembul, pilih Opsi ... -> Mouse -> aktifkan kursor baris perintah Clicks place -> Apply.

Mulai sekarang, cukup mengklik tombol kiri mouse di beberapa posisi dalam baris perintah akan menempatkan kursor di sana.

Abdull
sumber
0

pertama: ekspor EDITOR = 'nano -m'

lalu: CTRL + X CTRL + E secara berurutan.

Baris Anda saat ini akan terbuka di editor nano dengan mouse diaktifkan. Anda dapat mengklik bagian teks mana saja dan mengedit

kemudian CTRL + X untuk keluar dan y untuk mengkonfirmasi penyimpanan.

Sunfloro
sumber
0

Saya membuat skrip untuk membuat kursor baris perintah bergerak saat klik mouse :

  1. Aktifkan pelaporan pelacakan mouse xterm
  2. Tetapkan binding baris baca untuk menggunakan urutan keluar yang dihasilkan oleh klik

Itu dapat ditemukan di github

Info lebih lanjut tentang pos lain

Akan berfungsi jika echo -e "\e[?1000;1006;1015h" # Enable trackingmencetak urutan pelepasan pada terminal saat mengklik dengan mouse

Tinmarino
sumber
0

Mungkin bukan yang tercepat, tetapi ini perlu di sini, beberapa membaca tentang gerakan kursor ANSI

Sequence escape ANSI memungkinkan Anda untuk memindahkan kursor di layar sesuka hati. Ini lebih berguna untuk antarmuka pengguna layar penuh yang dihasilkan oleh skrip shell, tetapi juga dapat digunakan pada prompt . Urutan escape move adalah sebagai berikut:

- 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

(...)

Coba masukkan baris kode berikut pada prompt (sedikit lebih jelas apa fungsinya jika prompt ada beberapa baris di terminal ketika Anda memasukkan ini): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"Ini harus memindahkan kursor tujuh baris ke atas layar, cetak kata "BASH ", dan kemudian kembali ke tempat mulai menghasilkan prompt normal.


Contoh :

Pindahkan kursor ke belakang 7 baris:

echo -e "\033[7A"

Pindahkan kursor ke baris 10, kolom 5:

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

Kode warna gema dengan cepat , untuk mewarnai program:

echo -e "\033[35;42m" ; ifconfig
NVRM
sumber