Pertanyaan Pisahkan panah melihat kembali untuk sejarah ZSH lokal dan global


Apakah mungkin ...

  • Step up local ZSH shell history (tindakan hanya terjadi pada prompt itu)

  • Step up global ZSH history (shared history on) - default apa yang terjadi ketika Anda menekan panah ke atas ketika riwayat bersama diaktifkan

... terpisah.

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

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


22
2017-07-09 08:06


asal




Jawaban:


Salin & Tempel ini ke Anda .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 perlu juga bindings kunci (CTRL + kursor) untuk melangkah melalui sejarah global juga menambahkan ini ke Anda .zshrc:

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

Untuk membuatnya bekerja, opsi SHARE_HISTORY (lihat 16.2.4 Sejarah) harus diaktifkan. Menjalankan setopt dan periksa apakah "sharehistory" terdaftar. Jika tidak tambahkan setopt sharehistory untuk Anda .zshrc. Kemudian seseorang dapat menggunakan sejarah set-lokal seperti yang kita lakukan di atas. Dokumentasi mengatakan:

Secara default, perintah pergerakan histori mengunjungi jalur impor juga   sebagai jalur lokal, tetapi Anda dapat mengaktifkan dan menonaktifkan ini dengan   set-local-history zle binding. Juga dimungkinkan untuk membuat zle   widget yang akan membuat beberapa perintah mengabaikan perintah yang diimpor, dan beberapa lainnya   termasuk mereka.

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

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

Lihat juga:


20
2017-12-21 17:42



Pada zsh 5.0.2 saya mendapatkan kesalahan yang 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 hanya melalui sejarah global. Apa yang saya lakukan salah di sini? - rjh
@rjh: Coba ini: Dalam editor seperti vim, hapus ${key[Up]}. Kemudian (dalam mode edit), ketik Ctrl + V diikuti oleh 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 Arrow up. Ini melewati semua perintah seperti Bash, jadi saya harus bekerja menggunakan Ctrl+R. - Melebius


Anda dapat menyiapkan 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

Berasumsi bahwa  pasti up-line-or-history (Saya pikir itu adalah default), Anda dapat mengikat widget ini ke stroke kunci lain, seperti CTRL+:

 bindkey "^[Oa" only-local-history

Jika ini berhasil mungkin tergantung dari terminal Anda. Garis di atas berfungsi di URxvt/Screen. Dengan xterm kamu akan membutuhkan

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

untuk CTRL+.

Varian lain bisa

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

jadi, jika Anda mengaktifkan sejarah lokal, Anda dapat mengintip ke global atau sebaliknya.


5
2018-03-01 13:34





Jawaban @ lumbic bekerja hanya 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 riwayat global sebagai default, dan menggunakan CTRL-panah untuk sejarah lokal.

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


4
2018-01-13 15:19



Ini tampak seperti kebalikan dari apa yang diminta OP - Ctrl+arrows untuk sejarah lokal. - Melebius


Saya telah mencoba opsi yang tercantum di jawaban lain di sini, tetapi saya tidak senang dengan itu. Widget1  up-history atau up-line-or-history tidak termasuk mulai pencariandan widget1  up-line-or-beginning-search tampaknya tidak berfungsi dengan baik saat mengubah preferensi riwayat lokal saat menggunakannya.2

Jadi saya datang ke pengaturan berikut. Ini memungkinkan Ctrl+ panah untuk menelusuri riwayat global, Alt+ panah untuk menelusuri sejarah lokal saja (mirip dengan Bash) dan panah yang berdiri sendiri untuk menggunakan pencarian awal yang cerdas (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

1 Mereka down rekan-rekan dimaksudkan secara implisit juga.

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


0
2018-03-13 09:53





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


-1
2018-02-07 04:55



Bisakah Anda menjelaskan bagaimana hal ini membedakan sejarah lokal dan global? IMHO kode Anda tidak melakukan itu sama sekali. Terlebih lagi, ini sepertinya sudah diatur Oh My Zsh. - Melebius