Bagaimana cara menghapus bagian dari jalur di shell interaktif?

19

Apakah ada pintasan di bash dan zsh untuk menghapus satu komponen jalan? Misalnya, jika saya mengetik ls ~/local/color/, dan kursor berada di ujung baris, apakah ada cara pintas untuk menghapus color/di akhir? Idealnya saya ingin solusi dalam mode-vi dan mode-emacs

Vayn
sumber

Jawaban:

25

Perintah yang paling umum digunakan dalam mode bash emacs default , untuk keyboard yang paling sering digunakan:

Gerakan

  • Ctrl- p, atau Up: perintah sebelumnya
  • Ctrl- n, atau Down: perintah selanjutnya
  • Ctrl- b, atau Left: karakter sebelumnya
  • Ctrl- f, atau Right: karakter berikutnya
  • Alt- b: kata sebelumnya
  • Alt- f: kata selanjutnya
  • Ctrl- a, atau Home: mulai dari perintah
  • Ctrl- e, atau End: akhir perintah

Editing

  • BkSpc: hapus karakter sebelumnya
  • Ctrl- d, atau Del: hapus karakter saat ini
  • Alt- BkSpc: hapus kata ke kiri
  • Alt- d: hapus kata di sebelah kanan
  • Ctrl- u: hapus untuk memulai perintah
  • Ctrl- k: hapus ke akhir perintah
  • Ctrl- y: tempelkan potongan terakhir

Miscellanea

  • Cltr- /: batalkan
  • Cltr- r: penelusuran riwayat terbelakang inkremental
enzotib
sumber
2
Komplemen: atur pintasan untuk keperluan ini di zshbindkey [key] vi-backward-kill-word
Vayn
Terima kasih. Saya menambahkan ini ke file ~ / .zshrc saya dan berfungsi dengan baik ketika saya menekan Alt + Backspace: bindkey "^ [^?" vi-backward-kill-word. Itu tidak ideal.
Tim Stewart
Alt-Bckspc dan Alt-d berfungsi dengan baik dengan filepath yang telah saya coba. (on bash)
demure
10

Ada juga unix-filename-ruboutuntuk Readline!

# in ~/.inputrc
# press ctrl-b to delete unix filename parts
# see: man bash | less -p 'unix-filename-rubout' and
#      http://www.calmar.ws/vim/vi-bash.html
set editing-mode vi
set keymap vi
"\C-b": unix-filename-rubout
mikeo
sumber
2
IMHO unix-filename-ruboutadalah jawaban yang benar untuk pertanyaan yang ditanyakan karena menghapus ke garis miring atau spasi, sedangkan Alt-BkSpcakan berhenti pada karakter seperti tanda hubung, garis bawah, titik, dll.
Steve
6

Secara default bash (dan saya menebak zsh) akan berada dalam mode emacs. Anda dapat mencoba sesuatu seperti ini:

Esc + bakan meletakkan kursor kembali satu kata. Ctrl + kakan menghapus sampai akhir baris.

Sebagian besar shell modern (seperti bash) akan mengimplementasikan fitur pengeditan baris perintah lanjutan. Perintah-perintah itu dekat dengan pengeditan emacs (Ctrl + A untuk awal baris, Ctrl + E untuk akhir baris, ...).

Jika Anda familier dengan editor vi-like, Anda bisa mencoba untuk mengizinkan vi-mode.

set -o vi

Ini memberikan shell Anda seperti mode (mode perintah / mode insert), dan Anda mendapatkan akses ke perintah standar (d untuk menghapus, r untuk mengganti, ...)

Dalam Mode Vi, inilah cara Anda akan melakukan apa yang Anda jelaskan:

Esc (command mode); d; b.
rahmu
sumber
1
Saya tidak akan mengatakan "Pengeditan baris perintah bahkan lebih kuat dan lengkap dalam mode-vi", mode emacs memiliki perintah untuk melakukan semua yang dapat Anda lakukan dalam mode vi .
enzotib
Saya akui saya agak terhanyut. Saya akan ulangi ini.
rahmu
Terima kasih telah mengingatkan saya ada mode-vi di bash, jadi saya bisa menggunakan dbskenario ini di bash. Saya juga menemukan vi-backward-kill-worddi zsh apa yang saya inginkan, dan lebih nyaman daripada mengatur vi-mode di bash. Tapi saya masih ingin mencari jalan pintas mode emacs untuk keperluan ini di bash.
Vayn
Atau "alt-bC". Cara ini tidak meninggalkan karakter yang tertinggal, yang dbtidak dalam beberapa kasus.
Wildcard