Saya telah membuat alias alias bersarang dan ingin menyelesaikan semuanya sebelum menjalankan perintah. Bagaimana aku melakukan itu?
Jika ada fungsi yang tidak terikat pada tombol apa pun M-x foobar
juga baik untuk saya. Aku bahkan bisa menggunakan perintah eksternal ( type
, command
, which
, apa pun). Saya mencoba semuanya dari utas Mengapa tidak menggunakan "yang"? Lalu apa yang harus digunakan? tapi tidak ada yang berhasil.
C-x a
perluas alias di bawah kursor (dengan asumsi Anda menggunakan sistem penyelesaian)._expand_alias (^Xa): expands the word the cursor is on if it is an alias
,. Itu membantu, namun masih sayang bahwa di bash seseorang dapat memperluas seluruh baris tetapi dalam zsh tidak._expand_alias
hingga edit buffer tidak lagi berubah.Jawaban:
Perhatikan bahwa Ctrl-Alt-E di
bash
tidak hanya memperluas alias. Itu juga memperluas variabel, substitusi perintah (!), Substitusi proses (!), Memperluas aritmatika dan menghapus tanda kutip (itu tidak melakukan generasi nama file (globbing) atau ekspansi tilde).Itu tidak selalu berhasil memperluas alias. Jadi, meskipun memiliki kegunaannya, penting untuk menyadari hasilnya berpotensi mengubah makna baris perintah, memiliki efek samping dan berpotensi berbahaya.
Misalnya di:
Jika saya menekan di
M-C-E
sini, itu memberi saya:Yang memberi saya baris perintah yang sama sekali berbeda (dan bayangkan apa yang akan terjadi jika saya memiliki
rm -rf *
alih-alih dipwd
atas) dan tidak memperluasfoo
alias.Dengan
zsh
, untuk membangun catatan Gilles di alias yang diperluas di dalam fungsi, Anda bisa melakukan:Itu akan memperluas alias hanya jika baris perintah saat ini secara sintaksis valid (sehingga berfungsi sebagai pemeriksa sintaksis).
Berlawanan dengan
bash
MCE, ia juga menyelesaikan alias sepenuhnya. Misalnya jika Anda memiliki:Akan diperluas ke:
Perhatikan bahwa itu juga membuat kanon sintaksis sehingga hal-hal seperti:
akan diubah menjadi:
sumber
alias ls='ls --color'
dan ketikC-x a
lebihls
, saya mendapatkan:\ls --color
(sehingga baruls
tidak disalahartikan sebagai alias). Tapi dengan Andaexpand-aliases
, saya dapatkanls --color
:, membuat hasilnya ambigu.bash
setara). Tapi itu benar jika Anda menjalankan perintah setelah itu, Anda akan mendapatkan putaran alias ekspansi (seperti dibash
), jadi idealnya Anda ingin menonaktifkan sementara ekspansi alias, jadi misalnya bungkus dalam a(){ setopt localoptions noexpandalias; ...; }
. Perhatikan bahwa Anda bisa mengatakan_expand_alias
buggy juga memperluas alias saat dijalankan\ls
._expand_alias
juga mudah dibodohi sepertialias 'foo=repeat 3 foo'
ataualias ls='ls --color'; alias '\ls=echo fooled'
. Tidak ada solusi sempurna di sini._expand_alias
untukalias 'foo=repeat 3 foo'
, saya akan menganggap backslash hilang sebagai bug. Danalias '\ls=echo fooled'
seharusnya tidak diizinkan; di sini saya lebih memilih bash, yang mengatakan:bash: alias: '\ls': invalid alias name
.bash
. Jika Anda tidak suka alias dengan garis miring terbalik, jangan gunakan itu, tetapi mengapa Anda ingin shell menolaknya? Sementara alias adalah penggantian fungsi orang miskin di csh (dari mana asalnya), dalam cangkang mirip Bourne, mereka adalah peretasan untuk melakukan trik yang tidak dapat dilakukan dengan fungsi, beberapa bentuk ekspansi makro yang menghubungkan awal pengurai shell di awal , Saya tidak melihat gunanya membatasi apa yang bisa dilakukan.Jika Anda memasukkan baris perintah ke dalam definisi fungsi dan kemudian mencetak fungsinya, alias akan diperluas. Anda juga akan mendapatkan spasi putih yang dinormalisasi.
Untuk memasukkan semua ini ke dalam perintah interaktif, Anda dapat membuat widget zle. Anda dapat mendefinisikan suatu fungsi secara langsung dengan memasukkan kodenya ke dalam entri dalam
functions
array; Anda akan mendapatkan efek normalisasi ketika Anda membaca kembali.Anda mendapatkan efek normalisasi yang sama di
preexec
hook . Alias juga diperluas pada saat suatu fungsi dimuat secara otomatis (autoload -U
biasanya digunakan untuk menghindari ekspansi alias).Fungsi
_expand_alias
penyelesaian memperluas kata di bawah kursor jika itu alias. Menggunakanaliases
array . Itu tidak rekursif. Anda bisa mengimplementasikan alias menggunakan expander yang lebih umumaliases
, tetapi agak sulit, karena mencari tahu lokasi di mana alias diperluas diperluas terkait dengan sintaksis shell.sumber
autoload -U
hanya karena dokumentasi zsh merekomendasikannya, tetapi saya tidak pernah mengerti apa yang-U
sebenarnya saya lakukan sampai saya membaca ini :). Juga bagi siapa saja yang tertarik, kita dapat memohon _expand_alias berfungsi langsung dengan mengetikkan alias Anda ke baris perintah, memukul<Esc>
,x
, untuk meluncurkan minibuffer, kemudian mengetik_expand_alias<Enter>
Jika Anda memiliki banyak alias alias bersarang dan Anda tidak yakin apa yang sebenarnya dilakukan zsh dengan mereka dan di mana opsi pesanan dilewatkan ke perintah maka Anda selalu dapat memulai zsh dengan
-x
opsi. Ini akan mencetak perintah dan argumen saat dijalankan.Perlu diketahui bahwa opsi ini dimaksudkan untuk tujuan debugging sehingga mencetak banyak hal yang tidak berguna setelah
zsh -x
doa (pada dasarnya masing-masing dan setiap fungsi / widget / plugin .zshrc Anda), dan selama eksekusi perintah itu bisa juga bertele-tele, terutama jika Anda telah menetapkanpreexec
danprecmd
hook.Saya juga harus menyebutkan, bahwa ia hanya mencetak perintah-perintah yang akhirnya dieksekusi, dan perintah-perintah yang terpisah dicetak secara terpisah
Kamu akan lihat
sumber