Shell dengan kemampuan mengedit yang lebih baik

11

Shells (setidaknya yang saya tahu) memiliki kemampuan mengedit perintah yang sangat buruk.

Sebagai contoh:

  • Saya tidak bisa mengarahkan kursor ke titik perintah mana pun.
  • Saya tidak bisa memilih dan mundur / menghapus / mengganti teks dalam perintah.

Saat ini sangat mengganggu, saya menggunakan gedit untuk mengedit perintah sebelum menempelkannya ke terminal.

Apakah ada solusi yang bagus untuk ini?

UniversalUniqueID
sumber
2
Anda mengkonfigurasi terminal dengan sebuah shell.
JdeBP

Jawaban:

13

Bash sebenarnya cukup pandai dalam hal ini. Anda hanya perlu mempelajari cara pintasnya. Misalnya (dalam mode emacs default):

  • Ctrl+ A: pindah ke awal baris.
  • Ctrl+ E: pindah ke akhir baris.
  • Ctrl+ B: pindahkan satu karakter ke belakang.
  • Ctrl+ F: pindahkan satu karakter ke depan.
  • Alt+ B: pindahkan satu kata ke belakang.
  • Alt+ F: pindahkan satu kata ke depan.
  • Ctrl+ K: hapus (potong) semuanya sampai akhir baris.
  • Alt+ D: hapus (potong) kata setelah kursor.
  • Ctrl+ W: hapus (potong) kata sebelum kursor.
  • Ctrl+ Y: yank (tempel) apa yang ada di buffer (apa yang Anda potong dengan Ctrl+ Katau Alt+ Dmisalnya)

Dan masih banyak lagi. Baca man readlineuntuk melihat apa lagi yang tersedia. Anda dapat menetapkan cara pintas yang berbeda dengan menempatkannya ~/.inputrc. Misalnya, untuk membuat Ctrl+ Leftkembali satu kata dan Ctrl+ Rightmaju satu kata, tambahkan ini ke ~/.inputrc:

"\e[1;5D": backward-word 
"\e[1;5C": forward-word

Untuk mengetahui apa arti kode aneh itu, tekan Ctrl+ Vlalu tekan tombol yang ingin Anda gunakan. Jika Anda mencoba dengan Ctrl+ Right, Anda akan melihat ^[[1;5C. Ganti ^[dengan \ein ~/.inputrc.


Anda mungkin juga ingin melihat kerang lain. Kerang "modern" yang populer dan kaya fitur termasuk:

terdon
sumber
Dengan gnome-terminalAnda harus menggunakan ESCtombol alih-alih ALT menavigasi satu kata ke depan dan ke belakang. . .. atau beralih ke terminal yang tidak menggunakan Alt untuk menu aplikasi itu. . . seperti xterm atau sakura
Sergiy Kolodyazhnyy
@Serg bukan pada sistem saya, terima kasih. Saya tidak tahu apakah Anda telah mengaturnya atau apakah itu beberapa perubahan standar oleh Ubuntu. Esc sering digunakan sebagai sinonim dari Alt.
terdon
Namun tidak ada buffer cut sharing antar terminal.
Craig Hicks
7

Anda dapat mengedit perintah kosong atau diketik sebagian ke dalam editor pilihan Anda dengan mengatur EDITORke editor pilihan Anda dan dengan menekan CTRL+ X+ Eatau CTRL+ X/ CTRL+ E, yang membuka baris yang sedang diedit di EDITOR;

Misalnya, pengaturan EDITORke geditakan membuat CTRL+ X+ Edan CTRL+ X/ CTRL+ Emembuka baris saat ini di Gedit.

Untuk membuat ini solusi permanen, Anda dapat mengatur EDITORdi ~/.bashrc.

Ini memungkinkan bahkan menggunakan editor teks grafis sepenuhnya untuk mengedit perintah; untuk menjalankan perintah yang diedit, cukup simpan dan tutup dokumen.


Fitur yang sama dapat diaktifkan di Zsh dengan menambahkan yang berikut ke ~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line
kos
sumber
2
Ini juga dapat dipanggil dengan fcperintah jika variabel FCEDIT diatur. Jawaban yang bagus !
Sergiy Kolodyazhnyy
1
@Erg Terima kasih, namun fcmembuka perintah sebelumnya (yang bahkan lebih rapi dengan cara tertentu). Saya tidak tahu tentang itu, terima kasih!
kos
6

Terminal tidak memiliki kemampuan mengedit teks sendiri. Terminal menyediakan area teks dan menghubungkan keyboard ke sesuatu. Tetapi sesuatu yang Anda jalankan di dalam terminal menentukan apa yang dapat dilakukannya.

Kerang seperti bashbiasanya adalah hal pertama yang Anda temukan berjalan di dalam terminal. Karena shell bekerja berdasarkan perintah, Anda hanya dapat mengedit perintah saat ini. menyediakan pengeditan perintah yang sangat baik dibandingkan dengan shell Bourne atau cshatau kshitu bukanlah sesuatu yang Anda ingin sunting bahkan dengan cerita pendek.

Editor teks adalah salah satu perintah yang dapat Anda gunakan dalam shell. Contoh utama adalah dan . vimatau emacsakan memberi Anda kemampuan untuk mengedit hampir semua hal. Keduanya mencakup lingkungan pemrograman bawaan untuk memperluas kemampuan mereka ke masalah apa pun yang Anda hadapi.

Jadi solusinya adalah untuk memahami lebih baik apa yang dilakukan alat-alat ini dan dimaksudkan untuk melakukan dan memilih yang tepat untuk pekerjaan itu .

anak ayam
sumber
Saya tahu bedanya, tetapi dapatkah sesuatu dilakukan untuk meningkatkan pengeditan perintah bash?
UniversallyUniqueID
1
letakkan di naskah?
anak ayam
0

Biasanya terminal memungkinkan pemilihan teks dengan mouse, tetapi shell tidak dibuat sadar akan hal ini. Jadi sayangnya tidak bash, zsh, fishatau esdapat mendukung editing mouse berbasis. Saya pikir untuk melakukannya, mereka perlu mengambil kendali lebih besar atas terminal.

Namun (dan ini adalah sedikit peregangan) jika Anda membuka Vim atau GVim, dan kemudian masukkan perintah shell menggunakan:

:!...

maka Anda dapat mengklik mouse Anda untuk melompat ke mana saja di dalam barisan . (Anda harus :set mouse=aterlebih dahulu jika itu belum diaktifkan.) Tombol pengeditan dalam mode ini dapat dilihat dengan:help cmdline-editing

Vim juga memiliki mode histori perintah yang cukup kuat, yang dapat dicapai dengan menekan q:. Dari sana Anda dapat menarik, menghapus, dan menempel menggunakan perintah mode normal Vim. Dalam mode ini, Anda bisa mendapatkan pilih-dengan-mouse dan kemudian menghapus fitur yang Anda inginkan (dengan menekan d).

Peringatan penting di sini adalah bahwa Vim tidak benar-benar menjaga sesi live shell tetap berjalan. Setiap perintah yang Anda jalankan akan dijalankan dalam proses anak. Jadi setiap perubahan yang dibuat ke variabel lingkungan atau opsi shell oleh proses anak akan hilang.

Yang mengatakan, Anda dapat memodifikasi variabel lingkungan dari dalam proses Vim, dan menggunakannya dari baris perintah Vim, dan mereka bahkan akan diekspor ke proses anak:

:let $FOO="bar"        " the $ and the quotes are mandatory here

:echo $FOO             " Vim's own echo command
bar

:!echo "$FOO"          " Passing the variable to a shell command
bar

:!bash                 " Opening a child shell
$ echo "$FOO"
bar

Jadi, jika Anda mau berpura-pura bahwa Vim sebenarnya adalah sejenis shell aneh, maka Anda dapat menikmati fitur pengeditan lanjutan! Mungkin kekurangan terbesarnya adalah Anda harus memulai setiap perintah dengan mengetik salah satu :!atauq:

Oh dan omong-omong, jika Anda ingin mendapatkan output dari perintah shell ke buffer Vim Anda saat ini, Anda bisa melakukan itu seperti ini (tetapi berhati-hatilah itu akan mengganggu baris Anda saat ini):

:,!ls
joeytwiddle
sumber