Bagaimana cara mengubah penyelesaian bash history untuk menyelesaikan apa yang sudah ada di telepon?

133

Saya menemukan perintah beberapa bulan yang lalu yang membuat riwayat bash saya melengkapi secara otomatis apa yang sudah ada di telepon ketika menekan panah ke atas:

$ vim fi

tekan

$ vim file.py

Saya ingin mengatur ini di komputer baru saya, karena menghemat banyak waktu ketika menyimpan sejarah besar. Masalahnya adalah bahwa saya tidak bisa seumur hidup saya mengingat di mana disebutkan dan membaca referensi bash yang tak ada habisnya dan tutorial sayangnya tidak membantu juga.

Apakah ada yang tahu perintahnya?

blokkie
sumber

Jawaban:

223

Mungkin kira-kira seperti itu

# ~ / .inputrc
"\ e [A": pencarian-sejarah mundur
"\ e [B": riwayat-pencarian-maju

atau yang setara,

# ~ / .bashrc
if [[$ - == * i *]]
kemudian
    bind '"\ e [A": history-search-backward'
    bind '"\ e [B": histori-search-forward'
fi

(Pernyataan if memeriksa mode interaktif)

Biasanya, Atas dan Bawah terikat ke fungsi Readline previous-historydan next-historymasing - masing. Saya lebih suka mengikat PgUp / PgDn ke fungsi-fungsi ini, daripada mengganti operasi normal Atas / Bawah.

# ~ / .inputrc
"\ e [5 ~": pencarian-sejarah mundur
"\ e [6 ~": pencarian-riwayat-maju

Setelah Anda memodifikasi ~/.inputrc, mulai ulang shell Anda atau gunakan Ctrl+ X, Ctrl+ Runtuk memerintahkannya untuk membaca kembali ~/.inputrc.


Omong-omong, jika Anda mencari dokumentasi yang relevan:

Bash menggunakan Perpustakaan Readline GNU untuk prompt shell dan riwayat.

singkat
sumber
Terima kasih atas jawaban anda. Ini kedengarannya akrab, tetapi sayangnya tidak berhasil untuk saya. Menempatkannya di .inputrc tidak mengubah apa pun dan memasukkannya ke .bashrc menghentikan panah dari melakukan apa pun. Ada ide?
blokkie
Lupakan. history-complete- * tidak ada; hanya fungsi pencarian-sejarah * yang ada. Terima kasih!
blokkie
Ah, saya jelas salah mengetik dua contoh pertama di sana ... yang terakhir benar, meskipun. Saya akan memperbaikinya.
ephemient
@ user1037114: ini adalah pertanyaan di dalamnya sendiri, Anda harus menanyakannya pada posnya sendiri.
kamaradclimber
Ini memperbaiki panah atas / bawah untuk saya menggunakan mode vi di bash. Catatan, saya harus menekan "Esc" (mode perintah) agar bisa berfungsi.
Chris
5

Perbarui .inputrc dengan yang berikut ini:

"\C-[OA": history-search-backward
"\C-[[A": history-search-backward

"\C-[OB": history-search-forward
"\C-[[B": history-search-forward
nate_weldon
sumber
4
Apa kunci-kunci itu?
Chris
Saya tidak tahu apa kunci-kunci ini secara khusus, tetapi jawaban ini memperbaiki fungsi ini untuk saya ketika tombol naik dan turun tidak melakukan pencarian riwayat saat menggunakan terminal tmux dan st pada X11.
razzintown
1
@razzintown untuk st Anda mungkin memiliki set enable-keypad onuntuk delkunci untuk bekerja dengan baik ( faq ). Ketika tombol pada tombol panah berada "\C-[OA"dan "\C-[OB"(dan "\C-[OC"dan "\C-[OD"). Saya mengirim jawaban di bawah untuk memperjelas ini.
MauricioRobayo
@ Chris Itu adalah tombol keypad atas dan bawah mode keypad, dan tombol ANSI mode panah atas dan bawah. Lihat jawaban saya di bawah.
MauricioRobayo
3

Jika set enable-keypad onada di pengguna Anda ~/.inputrcsebagai st ( terminal sederhana tanpa pengisap ), perlu diketahui bahwa tombol panah berada dalam mode keypad. Ubuntu mengirim ini dengan berguna /usr/share/doc/bash/inputrc.arrows:

# This file controls the behaviour of line input editing for
# programs that use the Gnu Readline library.
#
# Arrow keys in keypad mode
#
"\C-[OD"        backward-char
"\C-[OC"        forward-char
"\C-[OA"        previous-history
"\C-[OB"        next-history
#
# Arrow keys in ANSI mode
#
"\C-[[D"        backward-char
"\C-[[C"        forward-char
"\C-[[A"        previous-history
"\C-[[B"        next-history
#
# Arrow keys in 8 bit keypad mode
#
"\C-M-OD"       backward-char
"\C-M-OC"       forward-char
"\C-M-OA"       previous-history
"\C-M-OB"       next-history
#
# Arrow keys in 8 bit ANSI mode
#
"\C-M-[D"       backward-char
"\C-M-[C"       forward-char
"\C-M-[A"       previous-history
"\C-M-[B"       next-history

Jadi saya tidak yakin apakah Anda akan membutuhkan semuanya, tetapi mungkin tidak ada salahnya untuk Anda ~/.inputrc:

# Arrow keys in keypad mode
"\C-[OA": history-search-backward
"\C-[OB": history-search-forward
"\C-[OC": forward-char
"\C-[OD": backward-char

# Arrow keys in ANSI mode
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
"\C-[[C": forward-char
"\C-[[D": backward-char

Ini juga pada topik yang sama: Tombol kursor saya tidak berfungsi dan juga xterm ini : tombol khusus

MauricioRobayo
sumber
1

Dengan ohmyzsh, gunakan ini di .zshrc Anda :

bindkey '^[OA' history-search-backward
bindkey '^[OB' history-search-forward

Untuk memuat ulang, source ~/.zshrcatau meluncurkan kembali terminal.

Sumber: https://superuser.com/a/418299/71680

Benjamin Crouzier
sumber
Apa yang berhasil bagi saya di zsh adalah opsi yang diberikan dalam tautan sumber: bindkey '\ e [A' bindkey-pencarian-mundur sejarah '' e-B-forward-forward
Michael Massey
-3

Anda mungkin harus mengaktifkan penyelesaian bash.

Memeriksa

  • /etc/profile
  • /etc/bash.bashrc
  • ~/.bashrc

untuk melihat apakah ada sumber file di atas /etc/bash_completion. yaitu

. / etc / bash_completion

Jika /etc/bash___completiontidak bersumber dari salah satu file di atas, Anda perlu menambahkannya ke salah satunya.

Jika Anda ingin semua pengguna bash di mesin Anda memiliki penyelesaian bash, sumber /etc/bash_completiondari /etc/bash.bashrc.

Jika hanya Anda yang ingin menyelesaikan bash, /etc/bash_completiondapatkan dari ~/.bashrc.

Menghukum
sumber
2
Penyelesaian tab itu bagus, tapi tidak sama dengan penarikan riwayat, yang diminta oleh poster asli.
ephemient