ZSH: bagaimana cara ZLE widget secara langsung?

12

Dokumentasi mengatakan dalam bagian 18.4 Widget , bahwa "pekerjaan widget hanya untuk melakukan beberapa tindakan kecil". Tetapi saya tidak dapat menemukan deskripsi umum bagaimana menjalankan tindakan ini, yaitu cara memanggil widget.

Saya telah melihat dalam contoh (misalnya melihat T&J ini ) bahwa widget dapat diikat menggunakan kunci bindkey KEY WIDGET. Maka seseorang dapat memanggil widget menggunakan KEY.

Saya ingin beralih set-local-historydan saya mencoba:

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active

zle -htidak berfungsi, tetapi saya telah menemukan deskripsi argumen di sini . Tapi sepertinya tidak ada yang namanya --call.

Apa yang saya lakukan salah? Bagaimana mungkin memanggil widget tanpa bindkey? Bagaimana saya bisa mencetak status saat ini? ( set-local-historymatikan negara)

lumbric
sumber

Jawaban:

9

Anda dapat mengeksekusi widget berdasarkan widget execute-named-cmd, yang terikat pada ESC-x(emacs bindings) atau :(vi bindings):

execute-named-cmd (ESC-x) (:) (unbound)

Baca nama perintah editor dan jalankan.

Ini membuka buffer mini di bawah baris perintah, di mana Anda dapat memulai widget zle. (Pelengkapan otomatis tersedia!):

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command

Untuk menanyakan keadaan zle(termasuk riwayat lokal), gunakan variabel $ZLE_STATE(hanya fungsi widget yang dapat diakses):

ZLE_STATE (scalar)

Berisi satu set kata-kata yang dipisahkan ruang yang menggambarkan keadaan zle saat ini.

Saat ini, status yang ditampilkan adalah mode penyisipan yang ditetapkan oleh mode timpa-mode atau vi-ganti widget dan apakah perintah riwayat akan mengunjungi entri yang diimpor sebagai dikendalikan oleh widget set-local-history. String berisi insert jika karakter yang akan dimasukkan pada baris perintah memindahkan karakter yang ada ke kanan atau overwritejika karakter yang akan dimasukkan menimpa karakter yang ada. Ini berisi localhistoryjika hanya perintah sejarah lokal yang akan dikunjungi atau globalhistoryjika perintah sejarah yang diimpor juga akan dikunjungi.

Substring diurutkan dalam urutan abjad sehingga jika Anda ingin menguji dua substring tertentu dengan cara yang terbukti di masa depan, Anda dapat melakukan pencocokan dengan melakukan:

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

Semua kutipan dari man zshzle.

mpy
sumber
Uh ya, saya pikir saya sudah melihat kedua tanda kutip, tapi saya tidak mengerti nilai dalam tiga kawat gigi. Halaman manual mengatakan: "Parameter khusus ini selalu tersedia dalam fungsi widget, tetapi tidak dengan cara apa pun khusus di luar ZLE." Itu artinya, untuk mendapatkan ZLE_STATE, saya perlu mendefinisikan fungsi dan widget khusus, bukan?
lumbric
@umbric: Anda benar, ZLE_STATEhanya ditentukan di dalam fungsi widget. Saya memperbaiki jawaban saya. Apa tujuanmu? [Tebakan liar: Untuk menunjukkan sejarah lokal / global di prompt saya, saya menggunakan widget untuk (i.) Mengatur variabel shell (ini dimungkinkan di dalam widget) dan (ii.) Mengeksekusi zle set-local-history.]
mpy
Tujuan utama saya adalah untuk memahami konsep widget zle. Bermain-main dengan set-local-history, saya ingin tahu apakah saat ini diatur ke global atau lokal. Saya pikir harus ada kita untuk mendapatkan status saat ini (mirip dengan memanggil "setopt" untuk mendapatkan opsi yang saat ini diaktifkan). Tujuan awal saya telah dipecahkan dalam T&J ini .
lumbric
1
Saya akan mengharapkan string dalam tes jika harus " *globalhistory*insert*" bukan " *insert*globalhistory*", berdasarkan membaca kalimat sebelum contoh?
Volker Siegel
@ VolkerSiegel: Poin yang sangat bagus, terima kasih! Saya memeriksa dengan kode sumber dan mencoba contoh yang diberikan sendiri, menyimpulkan bahwa contoh di halaman manual salah, bukan pernyataan ("diurutkan berdasarkan abjad"). Saya mengedit jawaban saya dan akan mengirim jalur ke milis zsh-pekerja .
mpy
1

Jika Anda menggunakan, tmuxAnda dapat memanggil tombol terikat dengan send-keys.

Contoh:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
Eyal Levin
sumber