Pisahkan lookback panah atas untuk sejarah ZSH lokal dan global

24

Apakah mungkin untuk ...

  • Meningkatkan riwayat shell ZSH lokal (tindakan hanya terjadi pada prompt itu)

  • Meningkatkan riwayat ZSH global (riwayat bersama aktif) - default apa yang terjadi ketika Anda menekan panah ATAS saat riwayat bersama diaktifkan

... terpisah.

Misalnya seseorang dapat mengikat CTRL + untuk sejarah global, normal untuk sejarah lokal. Pada saat yang sama masuk akal untuk menggunakan sejarah global untuk pencarian riwayat mundur (yaitu CTRL+ R).

Ini mungkin mempercepat beberapa operasi shell, karena beberapa operasi khusus untuk jendela shell itu dan Anda ingin kembali ke dalamnya.

Mikko Ohtamaa
sumber

Jawaban:

23

Salin & Rekatkan ini ke .zshrc:

Kursor menggunakan riwayat lokal:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

Jika Anda juga perlu mengikat kunci ( CTRL+ kursor) untuk menelusuri sejarah global, tambahkan juga ini ke .zshrc:

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

Untuk membuat ini berfungsi, opsi SHARE_HISTORY (lihat 16.2.4 Riwayat ) perlu diaktifkan. Jalankan setoptdan periksa apakah "sharehistory" terdaftar. Jika tidak menambah setopt sharehistoryke Anda .zshrc. Maka kita dapat menggunakan set-local-history seperti yang kita lakukan di atas. Dokumentasi mengatakan:

Secara default, perintah pergerakan riwayat mengunjungi baris yang diimpor serta jalur lokal, tetapi Anda dapat mengaktifkan dan menonaktifkannya dengan zle binding set-local-history. Dimungkinkan juga untuk membuat widget zle yang akan membuat beberapa perintah mengabaikan perintah yang diimpor, dan beberapa menyertakannya.

Perhatikan bahwa riwayat global standar digunakan (dan semua fungsi diakhiri dengan "zle set-local-history 0", yaitu riwayat lokal dinonaktifkan). Jadi menekan CTRL+ Rakan mencari sejarah global secara default (yang masuk akal dalam banyak kasus).

Ini sangat mirip dengan solusi oleh @mpy, tetapi siap untuk salin & tempel. Itu menimpa tombol kursor atas dan ke bawah. Saya menggunakan entri daftar surat ini .

Lihat juga:

lumbric
sumber
1
Pada zsh 5.0.2 saya mendapatkan kesalahan karena tidak dapat mengikat ke urutan kunci kosong. Bahkan jika saya menggantinya dengan kunci dari jawaban lain di bawah ini, baik atas / bawah dan Ctrl + atas / bawah cukup melalui sejarah global. Ada yang salah dengan saya di sini?
rjh
1
@ rjh: Coba ini: Di ​​editor seperti vim, hapus ${key[Up]}. Kemudian (dalam mode edit), ketik Ctrl + V diikuti dengan panah atas. Ini harus memasukkan kode kunci yang benar. Lakukan hal yang sama untuk panah bawah.
robinst
Saya menggunakan metode ini dan berhasil, tetapi saya kehilangan kemampuan untuk mencari sejarah dengan menulis bagian awal dari sebuah perintah dan kemudian Panah ke atas. Itu melewati semua perintah seperti Bash, jadi saya harus bekerja menggunakan Ctrl+R.
Melebius
5

Anda dapat mengatur widget zle khusus untuk hanya menampilkan item riwayat lokal:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

Dengan asumsi, itu terikat up-line-or-history(saya pikir itu default), Anda dapat mengikat widget ini ke stroke kunci lain, seperti CTRL+ :

 bindkey "^[Oa" only-local-history

Jika ini berfungsi mungkin tergantung pada terminal Anda. Baris di atas berfungsi di URxvt/Screen. Dengan yang xtermAnda butuhkan

 bindkey "^[[1;5A" only-local-history

untuk CTRL+ .

Varian lain bisa jadi

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

jadi, jika Anda memiliki riwayat lokal yang diaktifkan, Anda dapat mengintip ke riwayat global atau sebaliknya.

mpy
sumber
4

Jawaban @ lumbic hanya berfungsi untuk saya dengan beberapa perubahan:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

Kode ini menjadikan sejarah global sebagai default, dan menggunakan panah CTRL untuk sejarah lokal.

Catatan: Saya menggunakan zsh 5.0.2 bersama dengan oh-my-zsh.

arnuschky
sumber
Ini terlihat seperti kebalikan dari apa yang diminta OP - Ctrl+arrowsuntuk sejarah lokal.
Melebius
1

Saya sudah mencoba opsi yang tercantum dalam jawaban lain di sini tapi saya tidak senang dengan mereka. Widget 1 up-history atau up-line-or-historytidak termasuk pencarian awal dan widget 1 up-line-or-beginning-search tampaknya tidak berfungsi dengan baik ketika mengubah preferensi riwayat lokal saat menggunakannya. 2

Jadi saya datang ke pengaturan berikut. Ini memungkinkan Ctrl+ panah untuk menelusuri sejarah global, Alt+ panah untuk menelusuri hanya sejarah lokal (mirip dengan Bash) dan panah mandiri untuk menggunakan pencarian awal yang pintar (default di Oh My Zsh ).

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1down Rekan-rekan mereka juga dimaksudkan secara implisit.

2 Awal yang digunakan untuk mencari didefinisikan ulang setelah mengubah preferensi riwayat lokal, sehingga seluruh perintah pertama yang ditemukan digunakan sebagai awal yang akan dicari dalam pencarian kedua.

Melebius
sumber
0

Berdasarkan berbagai jawaban di sini, saya dapat membuat versi yang disingkat:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

Versi ini akan menimpa widget yang ada up-line-or-historydan down-line-or-historydengan widget baru yang ditentukan pengguna. Widget ini memungkinkan riwayat lokal dan kemudian akan memanggil widget asli , yang tersedia dengan .nama -prefixed. Lihat dokumentasi widget zle untuk detailnya.

Ini berarti bahwa Anda dapat menyimpan ikatan kunci yang ada. Karena itu Anda dapat menghindari harus mencari tahu apa urutan melarikan diri untuk mengetikkan panah ke atas di terminal Anda saat ini.

Martin Geisler
sumber
-1
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

Jawaban di atas berhasil untuk saya.

Referensi: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys

maddy10
sumber
Bisakah Anda menjelaskan bagaimana ini membedakan sejarah lokal dan global? IMHO kode Anda tidak melakukan itu sama sekali. Selain itu, ini tampaknya sudah diatur dalam Oh My Zsh .
Melebius