Fish-shell: mendukung perluasan riwayat (misalnya, bash's !!, bang bang, dan !$, bang dollar, token)

Dibuat pada 20 Agu 2012  ·  98Komentar  ·  Sumber: fish-shell/fish-shell

Tampaknya double-bang tidak berfungsi dan entah bagaimana ditafsirkan sebagai program yang Sudo coba temukan dengan tidak berhasil. Ini terjadi pada Ubuntu 12.04 LTS dengan fish-shell dikompilasi dari sumber.

Langkah-langkah untuk repro:

  1. Jalankan perintah apa pun:

    $ l

  2. Jalankan perintah sebelumnya sebagai root:

    $ sudo!!
    sudo: !!: perintah tidak ditemukan

    Perilaku yang diharapkan:

Perintah sudo !! mengeksekusi perintah yang dieksekusi sebelumnya ( ls ) sebagai root.

Saya juga memeriksa bahwa masalah tersebut tidak disebabkan oleh sudo dengan mengikuti langkah-langkah repro di bash, yang berperilaku seperti yang diharapkan.

Perhatikan juga bahwa versi sebelumnya dari fish-shell di Mac OS X 10.7 tidak memiliki masalah ini dan sudo !! bekerja seperti yang diharapkan.

duplicate

Komentar yang paling membantu

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

sudo !! untuk orang yang masih menggunakan !! untuk beberapa alasan.

Semua 98 komentar

Itu dibahas dalam FAQ dokumentasi: http://fishshell.com/docs/current/faq.html#faq -history

Terimakasih atas klarifikasinya.

Saya mengerti alasan untuk menghapus karakter sejarah. Namun, sementara saya memahami alasan untuk ini dan bahwa dimungkinkan untuk menggunakan Ce dan Ca alih-alih End dan Home, bagi banyak pengguna, terutama yang terbiasa !! dan yang di laptop yang tidak memiliki tombol Home dan End, masih lebih mudah mengetik sudo !! dari Atas+C-a+sudo.

Apakah Anda masih mempertimbangkan untuk memulihkan fungsionalitas token substitusi riwayat?

Karena itu adalah kasus yang langka dimana !! lebih nyaman digunakan, coba fungsi berikut:

function sudo!!
    eval sudo $history[1]
end

yang disebut hanya dengan "sudo!!".

Atau kemungkinan lain yang saya gunakan:

function .runsudo --description 'Run current command line as root'
    commandline -C 0
    commandline -i 'sudo '
    commandline -f execute
end
bind \es .runsudo

Kemudian dengan menekan MS saya menjalankan baris perintah saat ini dengan sudo diletakkan tepat di depannya.
Atau dengan memodifikasi contoh ini, Anda dapat membuat fungsi yang akan menempatkan baris perintah sebelumnya di baris saat ini dan mengikatnya misalnya ke '\e!'. Pendekatan ini lebih baik daripada penggunaan sederhana '!!' karena memberi Anda kesempatan untuk melihat dan memperbarui baris perintah sebelum eksekusi.

Saya membuat sedikit variasi dari perintah terakhir:

  function .runsudo --description 'Run current command line as root'
    set cursor_pos (echo (commandline -C) + 5 | bc)
    commandline -C 0
    commandline -i 'sudo '
    commandline -C "$cursor_pos"
  end
  bind \es ".runsudo"

Ini menyimpan posisi kursor alih-alih langsung mengeksekusinya.

!$ juga akan menyenangkan untuk dimiliki

function sudo
    if test "$argv" = !!
        eval command sudo $history[1]
    else
        command sudo $argv
    end
end

sudo !! untuk orang yang masih menggunakan !! untuk beberapa alasan.

Terima kasih. Ada sebagian besar orang yang menggunakan Sudo !! berikan bahwa sintaks ini didukung di banyak shell lain termasuk bash dan zsh. sudo!! lebih mudah untuk mengetik daripada menggunakan tombol home dan end karena tombol tersebut lebih jauh.

Saya menyarankan agar fungsi di atas disertakan dengan cangkang ikan secara default.

!! adalah kandidat yang baik untuk singkatan (#731)

Mengungkapkan dukungan untuk !! dan pintasan terkait. Tidak ada salahnya untuk menambahkannya dan rasanya seperti ikan hanya mendorong filosofi pribadi pada penggunanya.

Pemikiran saya saat ini tentang solusi ideal adalah !! seharusnya singkatan (#731), dan kami mengimplementasikan tanda tangan fungsi (#478) untuk mendukung subperintah (perintah yang mengambil perintah, seperti sudo). Kemudian singkatan diperluas di posisi subcommand, sehingga 'sudo !!' akan berkembang.

Menambahkan diriku sendiri

Meskipun sudah tua, ini adalah fitur yang seharusnya menjadi default di Fish. Tidak ada alasan untuk tidak memilikinya - jika Anda tidak ingin menggunakannya secara pribadi, tidak apa-apa, tetapi memiliki perintah tambahan tidak terlalu merugikan siapa pun - orang suka melakukan sesuatu dengan cara yang berbeda.

Jalan !! diimplementasikan di sebagian besar cangkang memang menyakiti orang. Misalnya, pertimbangkan perintah ini:

echo fish is great!!

di bash / zsh / tcsh, ini akan melakukan sesuatu yang tidak terduga dan mengerikan, karena !! adalah sintaks ajaib. Ini adalah jenis interaksi aneh yang ikan berusaha sangat keras untuk hindari.

Saran saya adalah untuk menerapkan !! bukan sebagai sintaks ajaib, tetapi sebagai alias. Ini berarti itu hanya akan melakukan sesuatu yang istimewa di 'posisi perintah' - itu tidak akan berkembang dalam argumen. Itu juga membuat set fitur ikan turun, yang diinginkan.

Untuk membuatnya berguna, kita perlu mengajari ikan tentang subperintah, dengan sudo menjadi contoh paling umum, tetapi juga time , strace , dll. fish kemudian akan memperluas alias di "posisi sub-perintah", yang merupakan fitur keren dan berguna dalam dirinya sendiri.

Solusi yang Anda usulkan berantakan ketika Anda mempertimbangkan sudo echo fish is great!! . Argumen yang sama dapat dibuat dari semua sintaks: bukankah echo I really like fish (the shell)! juga membingungkan? Saya juga khawatir bahwa daftar "sub-perintah" tidak mungkin dipertahankan dan akan mengurangi fleksibilitas.

Dengan alias, hanya perintah yang diperluas, dan ikan akan tahu argumen mana yang merupakan (sub)perintah dan mana yang bukan. Jadi sudo echo fish is great!! tidak akan melakukan ekspansi perintah terakhir, tetapi meneruskan literal "hebat!!" ke Sudo (dan dengan demikian menggemakan). Saya mengklaim itulah yang diharapkan pengguna. Lihat diskusi tentang singkatan (#731) dan tanda tangan fungsi (#478) untuk desain dan alasan.

SirCmpwn benar bahwa memerlukan tanda tangan fungsi yang komprehensif adalah kelemahan dari pendekatan alias, dan juga bahwa elemen sintaksis lainnya membingungkan. Contoh kehidupan nyata termasuk gangguan ekspansi brace dengan git (#434) atau wildcard (#967, antara lain). Sintaks datang dengan biaya tinggi, dan kami mencoba menghilangkan sintaks jika berlebihan dengan fitur lain (mis. #354).

Bagaimanapun itu argumen saya mengapa mendukung !! sebagai elemen sintaksis dasar adalah larangan. Namun saya terbuka untuk memperkenalkannya dengan cara yang tidak memerlukan modifikasi sintaksis ikan.

Saya pikir perbandingan dengan {} sangat buruk. Pada ikan, kawat gigi bekerja secara berbeda dari cangkang lainnya. Orang-orang hanya tersandung ketika mereka mengharapkannya berfungsi seperti bash dan teman. !! sintaks harus bekerja sama dengan shell umum lainnya. Juga, !! bukan sesuatu yang saya harapkan cukup sering terlihat dalam perintah untuk menyebabkan masalah. Faktanya, saya memperkirakan berapa kali orang mencoba dan gagal menggunakan !! dengan ikan jauh melebihi jumlah berapa kali seseorang menggunakan literal !! dalam sebuah perintah.

Saya mengklaim bahwa ! membingungkan di shell lain, dan akan lebih baik jika tidak diterapkan dengan cara ini. Misalnya, di http://codegolf.stackexchange.com/a/17776/3103 saya sederhanakan "Halo, dunia!" program yang ditulis dalam shell UNIX yang gagal karena ! (dalam pertanyaan Ridiculous Runtime Errors). Bahkan mendapat tujuh upvotes, jadi saya bisa membayangkan fitur ini bisa mengejutkan ketika Anda tidak ingin menggunakannya.

Namun, !! dengan sendirinya akan baik-baik saja, karena seberapa sering pengguna akan menulis !! sebagai token? Kemudian lagi, menambahkan !! akan mendorong penambahan pola substitusi riwayat lainnya, beberapa di antaranya dapat mengganggu.

Menambahkan diri saya sendiri - baru saja mengalami akhir pekan pertama saya dengan ikan. Pasti harus didukung.

Menambahkan diriku sendiri - butuh ini.

Bagi mereka yang menginginkan ini, fungsi dan binding yang disebutkan sebelumnya dalam diskusi telah memberi saya alur kerja yang lebih mudah untuk menambahkan sudo atau sudoing perintah terakhir daripada sudo !! khas.

Anda harus memberi mereka mencoba. Itu membuat saya mengunjungi kembali konfigurasi readline dan zsh saya untuk memiliki binding yang serupa.

Ternyata tujuh penekanan tombol (dua di antaranya digeser) menjadi satu ikatan.

Terlepas dari apa yang _Anda_ sukai - apakah benar-benar ada alasan untuk !! tidak untuk didukung? Setiap orang memiliki hal yang berbeda yang bekerja untuk mereka, dan meskipun beberapa orang mungkin senang menggunakan panah atas, banyak orang senang menggunakan !!, dan jujur, mengapa itu menjadi hal yang buruk? Mereka yang tidak menginginkannya tidak perlu menggunakannya.

Tentunya tidak begitu sulit untuk diterapkan?...

Ya, saya tahu Anda dapat meretasnya bersama dengan skrip ikan, tetapi cara ini _tidak_ bekerja dengan cara yang sama seperti pada bash atau shell serupa, yang sering kali cukup nyaman.

Lihat komentar saya di atas untuk alasan saya mengapa saya tidak ingin memperkenalkan ini cara bash dan zsh melakukannya (sebagai elemen sintaksis baru), dan proposal saya untuk cara yang dapat dilakukan yang sesuai dengan filosofi ikan.

Argumen "ikan gema hebat!!" menjadi lebih baik daripada menggunakan '!!' untuk sejarah agak lemah, tapi saya mengerti maksudnya. Sepertinya "set shell_history advanced" sederhana atau sesuatu yang memungkinkannya untuk orang yang mau mengambil risiko "echo fish is great!!" mendapatkan pesan kesalahan.

Namun demikian, kasus penggunaan saya dari '!!' serupa tetapi dapat dihindari dengan beberapa peningkatan fitur mungkin.

Misalnya di mac saya dengan bash:
$ pembaruan minuman
$ minuman sudah ketinggalan zaman
$ brew mengambil !!

Jadi saya agak teratur menggunakan output dari perintah sebelumnya untuk perintah baru.
Dengan ikan saya bisa melakukan ini:
$ brew fetch (minuman sudah ketinggalan zaman)
Sekarang di beberapa titik mungkin itu akan menjadi saran yang dapat saya gunakan, tetapi yang benar-benar saya butuhkan adalah dapat mencari riwayat di dalam blok ().
misalnya:
$ brew fetch (bre)

Sayangnya meskipun ikan cukup bangga menggunakan () untuk sub-perintah daripada backtick "membingungkan" dan semacamnya, itu tidak benar-benar memperlakukannya seperti itu sampai Anda menekan enter. Setidaknya itulah yang saya lihat.

Jika ikan mengizinkan pencarian riwayat setelah '(' (alias subperintah) pertama, saya pikir akan lebih mudah untuk menangani tidak memiliki manipulasi riwayat !.

Jika saya memahami sarannya, ketika Anda menekan panah ke atas, itu harus melakukan penggantian riwayat hanya di dalam subperintah terdalam alih-alih seluruh baris perintah.

:-1:

Saya masih mendukung penerapan bash-style !! .

Saya lebih suka :up_arrow:, Ctrl+p dan pencarian riwayat perintah bekerja di posisi sub-perintah daripada memperkenalkan !!

Seluruh riwayat API dari shell lain cukup membingungkan sehingga orang biasanya hanya mengingat !! dari itu.

Benar. Itu akan nyaman dan cukup mudah mengganti '!!' Atau !penggunaan kata kunci.

Sangat menyukai gagasan !! menjadi singkatan.

Sepertinya singkatan di nightly build terbaru hanya mengizinkan singkatan di command position, semoga bisa diupdate agar bisa dijadikan argumen untuk kasus seperti ini.

Fitur ini dilebih-lebihkan, cukup gunakan sudo cmd atau eval sudo $cmd .

@bucaran Saya tidak mengikuti persis. !! adalah untuk kecepatan, bagaimana cara mencocokkan kecepatan !! dengan cmd ?

Apakah maksud Anda membuat variabel bernama $cmd itu adalah perintah terakhir? Ini bukan variabel asli.

Terima kasih

@mdsib Ya, saya pikir saya ingat ada diskusi di edisi lain tentang tidak mengizinkan singkatan dalam posisi argumen. Pada saat itu lebih disukai untuk tidak menerapkannya. Ini pasti akan mengubah itu.

Saya pikir kesimpulan dari utas ini adalah bahwa itu tidak akan terjadi dalam waktu dekat, dan saya harus berhenti berlangganan dari masalah Github ini dan beralih ke zsh. Adis!

Bukan karena !! tidak ada di sini, tetapi karena masalah Github untuk fitur yang cukup sederhana telah dibuka selama 3 tahun tanpa diimplementasikan karena filosofis BS.

Sangat lucu melihat orang mencoba meyakinkan orang lain bahwa fitur bukanlah masalah besar. Tentu, Anda tidak menginginkannya, jadi Anda tidak peduli.. Sepertinya Anda mencoba meyakinkan orang untuk tidak menyukai hijau karena menurut Anda biru lebih baik.
Namun demikian, karena fitur "sederhana" tampaknya tidak dapat digunakan, mungkin seseorang harus memotong ikan jika mereka menyukai fitur yang ada tetapi ingin menambahkan beberapa fitur lagi. Sepertinya itu akan sampai di suatu tempat lebih cepat.

Saya membuat ~/bin/!! yang terlihat seperti ini:

#!/bin/fish
eval $history[1]

Untuk jangka pendek, ini membantu saya mengatasi fitur yang hilang dan kecenderungan saya untuk mengetik !!.
Saya juga membuat ~/bin/!vi:

#!/bin/fish
for f in $history
    echo $f | grep '^vi'
    if test "$status" = "0"
        eval $f
        exit $status
    end
end

Tidak ideal, tetapi cukup bahwa shell saya cenderung melakukan apa yang saya harapkan lebih sering sekarang.

@SirCmpwn Apakah tidak jelas bagi saya bahwa !! adalah fitur sederhana. Misalnya, bash mendukung ini:

ls some_long_file.txt
!!:s/ls -l/cat/

Haruskah ini menggunakan !! didukung atau tidak? Pengguna yang mengatakan "ikan harus mendukung !!" mungkin memiliki ide yang berbeda tentang apa artinya itu.

Anda sangat merasakan hal ini, jadi saya mendorong Anda (atau siapa pun) untuk menulis proposal tentang caranya !! akan bekerja di ikan (semantik, bukan implementasi). Sintaks apa yang akan didukung dengan tepat? Bagaimana ekspansi ini berhubungan dengan jenis ekspansi lainnya, seperti ekspansi variabel atau proses? Bagaimana pemisahan argumen terjadi dalam string yang diperluas? Bisakah Anda menggunakan pelarian untuk mencegahnya?

Ini adalah permintaan yang tulus. Sebuah fitur tidak ditentukan oleh kasus penggunaan tunggal; kita perlu proposal konkrit untuk dibahas.

Jika Anda mengatakan "Saya ingin kasus ini berhasil, dan saya tidak peduli bagaimana caranya", maka itu bagus dan valid. Tetapi seseorang harus mengerjakan detailnya sebelum apa pun dapat diimplementasikan.

Dalam waktu dekat, satu rencana konkret adalah menerapkan alias global dan kemudian membuat !! Menjadi satu. Alternatifnya adalah menggabungkan pekerjaan docopt, memberikan tanda tangan fungsi untuk Sudo, lalu buat !! menjadi alias biasa. Arah mana yang kita tuju bergantung pada apakah kita berpikir !! harus berkembang di mana-mana, atau hanya di posisi komando.

@ridiculousfish Anda benar sekali bahwa '!!' permintaan fitur harus cukup rinci. Saya tidak pernah menggunakan contoh khusus yang Anda berikan karena saya selalu melakukan sesuatu seperti ini:
$ ls -l some_long_file.txt
$ ^ls-l^cat

Jelas ini juga tidak berhasil. Itu akan menjadi permintaan fitur terpisah untuk saya, yang tidak saya pedulikan karena saya baru mulai menguji ikan baru-baru ini.

"fish: Mengalami pengalihan saat mengharapkan nama perintah. Ikan tidak mengizinkan operasi pengalihan sebelum perintah."

Sepertinya akan mudah untuk memperlakukan '^' di posisi perintah sebagai substitusi karena tidak bertentangan dengan fungsi yang ada. Tapi itu adalah masalah yang terpisah, hanya menyebutkannya karena Anda benar bahwa harus ada definisi yang jelas tentang apa '!!' (atau hanya sejarah substitusi pada umumnya) artinya.

Berikut adalah beberapa contoh yang saya gunakan:

$ !!
$ some command `!!`
$ !keyword 
$ !123

Terima kasih @gillham , informasi seperti itu sangat membantu saat mendesain sebuah fitur.

Saya juga mencatat bahwa @nyarly memiliki solusi cerdas untuk !! dan !$ sini: https://github.com/fish-shell/fish-shell/wiki/Bash-Refugees

Perbaiki yang lebih baik #5:
Fish sangat didorong oleh sejarah, sehingga ketika lupa sudo atau mengotori riwayat Anda dengan perintah yang tidak berfungsi, mungkin perlu waktu Anda (dalam jangka panjang) untuk menghapusnya secara manual dari riwayat. Ya, itu buka terminal baru, exec bash dan edit ~/.config/fish/fish_history. Ikan telah membawa saya ke perintah yang salah berkali-kali, ketika saya telah berhemat dalam hal ini.

Adapun kebiasaan @nyarly mkdir …; cd !$ , saya lakukan mkcd … :

function mkcd --description 'mkdir and cd'
        mkdir $argv[1]
        and cd $argv[1]
end

Perhatikan bahwa menghapus dari sejarah tidak memerlukan bash shenanigans:

history --delete --prefix some_command

fish_config history juga memungkinkan Anda melakukannya dengan titik-n-klik.

Fungsionalitas ini dapat direplikasi dengan cukup baik di dalam Fish menggunakan https://github.com/fish-shell/fish-shell/wiki/Bash-Style-History-Substitution- (!!-and-!$) -- mungkin masalahnya harus ditutup?

:-1: :-1: Kecuali jika mode kompatibilitas bash penuh diterapkan.

Saya pikir ini adalah lereng yang licin. Jika ini diterapkan pada ikan, bagaimana dengan !s tunggal, dan bagaimana dengan fitur riwayat ksh? Bagaimana dengan $()? Ikan adalah cangkang gaya csh. Jika orang tidak bisa/tidak mau beradaptasi, ada zsh...

Apa yang saya dapatkan dari diskusi ini sebagai tl;dr bagi orang-orang yang menemukan ini. (lebih dari 3 tahun dalam)

  1. Tim tidak ingin mengembangkan fitur tersebut, karena mereka tidak menggunakannya.
  2. Ada banyak orang yang menginginkan fitur tersebut, karena mereka menggunakannya.
  3. Tim tampaknya tidak mau mengimplementasikan fitur seperti yang ada tetapi bersedia membuat sesuatu
    yang bekerja sama jika kita memberi mereka cukup data.
  4. Orang-orang menerima tidak memiliki fitur, menerapkan solusi yang sebagian besar berfungsi, atau pindah
    ke proyek lain.

Saya salah satu dari yang terakhir, sementara saya berharap ini dapat diselesaikan, saya tidak dapat menggunakan ikan secara wajar dan menambahkan solusi itu dengan jumlah mesin yang saya gunakan tanpa banyak usaha (saya memerlukan pengaturan konfigurasi yang berbeda di mesin yang berbeda), dan saya menggunakan ! ! cukup di mana itu adalah persyaratan bagi saya. Jadi saya akan mengikuti diskusi ini dengan harapan suatu hari ikan akan memenuhi kasus penggunaan saya.

@tetra-archos Belum ada yang mengajukan proposal konkret, jadi kami tidak memiliki pemahaman yang kuat tentang apa "fitur" itu. Karena Anda jelas sangat merasakan hal ini, jika Anda memang ingin demikian, akan sangat membantu jika Anda menyarankan perilaku yang seharusnya, sebagai titik awal. Jika gagal, akan berguna untuk setidaknya mencantumkan formulir substitusi riwayat yang Anda gunakan.

Perhatikan bahwa perilaku substitusi riwayat bash penuh sangat kompleks, dan juga dapat dikonfigurasi, jadi "lakukan saja apa yang dilakukan bash" adalah non-starter.

Belum ada yang mengajukan proposal konkret, jadi kami tidak memiliki pemahaman yang kuat tentang apa "fitur" itu.

@tetra-archos: Ini sangat penting. Sejauh ini, sebagian besar dari ini adalah 'Kami ingin "!!"!!!' dan mungkin "!$" (yaitu "masukkan argumen terakhir dari perintah terakhir"). Tetapi ada banyak detail yang perlu diluruskan jika (atau penggantinya) ingin diterapkan.

Sebagai contoh:

  • Bagian mana dari penggantian riwayat yang Anda inginkan - apakah itu hanya "masukkan perintah terakhir di sini" ("!") dan "masukkan argumen terakhir perintah terakhir di sini" ("!$"), atau semua hal lain seperti " !!:s/string1/string2" (Saya lebih suka menambahkan mode "ganti" umum seperti "query-replace" emacs atau ":s/" vim sehingga Anda juga dapat melakukannya _before_ mengeksekusi perintah yang salah)? Bagaimana dengan "masukkan perintah kelima dalam riwayat saya" ("!5") - yang tidak pernah saya dapatkan - atau "masukkan perintah kelima terakhir" ("!-5")? Bagaimana dengan " penanda kata " dan " pengubah "?
  • Apakah Anda ingin perintah dieksekusi segera (yaitu Anda memasukkan sudo !! , tekan enter dan semuanya langsung dieksekusi) atau bolehkah memasukkannya terlebih dahulu sehingga Anda dapat memeriksa ulang - ini seperti bash dengan opsi "histverify" (saya akan condong ke yang terakhir)?
  • Apakah harus "!!" dan "!$" atau dapatkah digunakan secara berbeda , yaitu apakah memori otot menjadi masalah Anda? Namun, jika itu masalahnya, kita tidak akan pernah 100%, dan substitusi sejarah _is_ bagian yang agak kecil dari bash

Jika ini hanya memori otot, Anda juga dapat memasukkan yang berikut ini ke dalam fish_user_key_bindings Anda:

bind '!!' 'commandline -i "$history[1]"'
bind '!$' 'history-token-search-backward'

(masalahnya, mengapa kita mungkin tidak boleh memasukkannya ke dalam binding default, apakah itu kemudian menunggu setelah Anda memasukkan "!" untuk memeriksa karakter kedua)

Saya pikir !! adalah praktik yang buruk

Perintah sudo !! tidak memberi tahu siapa pun apa yang sebenarnya akan dijalankan oleh shell.
jika saya ingin menjalankan perintah revious p dengan sudo pada ' a nfang' saya ketik

^p ^a sudo

Saya sarankan menambahkan pesan untuk memberi tahu orang-orang agar menggunakan perintah pengeditan baris ^p dan ^a alih-alih menggunakan fungsi riwayat.

!!: command not found, try 'Ctrl-p Ctrl-a' to prefix the previous command with 'sudo' or any other  prefix

Aku benci !! juga. Metode yang lebih mudah untuk fish_vi_mode sebagai alternatif dari ^p ^a :

^v k I

Karena Anda tidak menyukai cara melakukan sesuatu tidak membuatnya kurang valid.
Pada 10 November 2015 8:14, "Ivan Tham" [email protected] menulis:

aku benci!! juga. Metode yang lebih mudah untuk fish_vi_mode sebagai alternatif dari ^p
^a:

^vk aku


Balas email ini secara langsung atau lihat di GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155416048
.

Kebalikannya juga benar.

Kedua sisi masalah ini memiliki kebutuhan dan kekhawatiran yang sah. Saya pikir perampokan utama adalah menemukan cara _benar_ untuk melakukannya alih-alih cara cepat dan kotor

Saya setuju dan saya tidak menentang cara lain untuk melakukannya, mereka hanya tidak
sesuai dengan kebutuhan saya (dan jelas orang lain).
Pada 10 Nov 2015 12:19, "Eric Mrak" [email protected] menulis:

Kebalikannya juga benar.

Kedua sisi masalah ini memiliki kebutuhan dan kekhawatiran yang sah. saya pikir
perampokan utama adalah menemukan cara _benar_ untuk melakukannya alih-alih cara cepat dan
cara kotor


Balas email ini secara langsung atau lihat di GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -155494929
.

Untuk mengulangi pendekatan yang disebutkan dalam diskusi awal dan untuk sedikit memperluasnya: Saya telah menemukan ikatan kunci bekerja lebih baik untuk saya daripada "!!".

Saya telah menulis fungsi ini yang dapat diikat ke beberapa kunci (^S untuk saya, bind \cs 'prepend_command sudo' ). Jika baris perintah memiliki konten, ia menambahkan sudo. Jika tidak ada konten, itu menambahkan sudo ke item terakhir dalam sejarah. Jadi sudo !!<Enter> sekarang menjadi ^S<Enter> .

function prepend_command
  set -l prepend $argv[1]
  if test -z "$prepend"
    echo "prepend_command needs one argument."
    return 1
  end

  set -l cmd (commandline)
  if test -z "$cmd"
    commandline -r $history[1]
  end

  set -l old_cursor (commandline -C)
  commandline -C 0
  commandline -i "$prepend "
  commandline -C (math $old_cursor + (echo $prepend | wc -c))
end

Beberapa orang mengatakan mengonfigurasi sesuatu seperti ini terlalu rumit untuk dilakukan. Solusi yang mungkin adalah memasukkan sesuatu yang secara fungsional mirip dengan fungsi saya pada ikan sehingga mengonfigurasi ini setidaknya menjadi satu baris.

Tentu saja, ini tidak menjawab tuntutan lain seperti some_command --with-subshell-param (!!) .

@Ahti Itu benar-benar buruk, baru saja berhasil, sepertinya akan menyenangkan untuk digunakan, akan melaporkan kembali sebentar lagi!

Ya, sejauh ini mengalahkan sudo !! . Menjadi setengah jalan melalui perintah dan menyadarinya seharusnya sudo terjadi pada saya. ^s , instan sudo prefix!

Secara pribadi saya tidak pernah menggunakan !! dalam konteks apa pun selain sudo !! sehingga tidak mengganggu saya.

Kebetulan saya baru saja mencoba fish_vi_mode dan sangat menyukainya. Namun, dalam mode Vi ^s tampaknya tidak mengikat lagi. Saran?

Oke, saya memiliki kunci yang mengikat di config.fish. Saya menemukan #2254 dan kemudian menemukan https://github.com/faho/fish-shell/commit/f7e8ad632a388d5f1c5eb4cfc33f3cdb1f7fd831 dan kemudian menemukan http://stackoverflow.com/a/16675092/292408 yang mengonfirmasi bahwa saya harus menempatkan binding saya di fish_user_key_bindings fungsi yang belum ada.

Itu berhasil dan sekarang ketika saya dalam mode perintah Vi [N] awalan berfungsi seperti yang diharapkan.

Kami sudah memiliki Alt-P untuk menjalankan pipeline saat ini di pager; Saya ingin tahu apakah kita harus menambahkan Alt-S juga?

Saya pikir @Ahti 's adalah solusi yang cukup elegan untuk apa yang semua orang cari. Langsung ke keybind tanpa khawatir tentang ekspansi acak atau kasus tepi yang aneh. Ini hanya menempatkan teks untuk Anda gunakan atau batalkan sesuai keinginan.

Aku seperti kedua @nyarly 's substitusi dan @Ahti' s solusi kunci yang mengikat.
Secara pribadi, saya menggunakan !! hanya dalam konteks sudo !!

Oy! Utas ini sudah hampir empat tahun sekarang. Saya baru-baru ini membeli .com dan .net (yang Github tidak akan membiarkan saya hyperlink, tampaknya, jadi salin dan tempel) jika ada yang menginginkannya.

Hai! Itu keren! @geoff-codes Bagaimana Anda melakukannya?)

Mereka baru-baru ini mulai mengizinkan nama domain .com dan .net "diinternasionalkan".
screen shot 2016-05-11 at 4 53 48 am

Dukungan untuk itu masih cukup bermasalah saat ini. Misalnya, mereka mengizinkan saya mendaftar .com tetapi tidak .com.

Saya tidak tahu Anda bisa mendaftar !!.com, itu gila.

Pelajaran yang dipetik dari masalah ini: jika Anda pernah menulis shell Unix, satu-satunya fitur yang harus Anda pastikan untuk diterapkan adalah Sudo !!, karena tampaknya orang tidak dapat hidup tanpanya.

Serius, saya mendapat kabar dari orang-orang yang mengatakan bahwa ini bekerja dengan baik:

@bucaran Ya, memang, sepertinya begitu .

Nama Domain Internasionalisasi - IDN:

https://en.wikipedia.org/wiki/Internationalized_domain_name

edit: terlalu lambat dengan posting ini, dan juga pendaftaran seperti itu @geoff-codes! Itu harus menjadi investasi yang bijaksana. Dua karakter (agak) .com!

#!.com akan mengambil kue sekalipun. Apakah ada aturan yang melarang itu untuk com TLD, atau sesuatu yang harus mereka selesaikan?

Dalam presentasi bash untuk Windows, pria yang mempresentasikan mengetik sesuatu
seperti ini:

$> echo halo Windows!!

Dan saya harap Anda semua bisa menebak apa yang terjadi.
Pada 11-Mei-2016 13:57, "Aaron Gyes" [email protected] menulis:

Nama Domain Internasional - IDN

Pada 11 Mei 2016 pukul 4:44:58, Timophey ([email protected]) menulis:

Hai! Itu keren! @geoff-codes https://github.com/geoff-codes Bagaimana caranya
Anda
lakukan itu?)


Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung atau lihat di GitHub
<
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218435761


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung atau lihat di GitHub
https://github.com/fish-shell/fish-shell/issues/288#issuecomment -218438118

Jadi, saya harus beralih ke bash?

@ base698 - Saya akhirnya mengeluarkan plugin fisherman untuk mendukung dua kasus penggunaan paling umum dari substitusi riwayat: !! untuk seluruh perintah terakhir dan !$ untuk argumen terakhir. Sejujurnya, saya sebagian besar melanggar kebiasaan saya sendiri karena pengeditan baris perintah ikan sangat bagus. Tetap saja, saya sangat suka bisa

> which tool
> cat (!!)

untuk memeriksa naskah misalnya

Anda dapat menginstal plugin dengan fisher install nyarly/fish-bang-bang setelah Anda menginstal Fisherman.

demi kelengkapan (dan memberikan contoh yang benar)
di sini adalah tangkapan layar dari video youtube yang saya sebutkan, ini adalah salah satu fitur hebat dari '!!' pola yang sekarang tersedia di Windows juga.
bangpatternbash

https://www.youtube.com/watch?v=2dB0igTfhfg&feature=youtu.be&t=760

Dia ingin mengeksekusi git commit -a -m "Rawr!!"

menghasilkan git commit -a -m "Rawrclear"

Sama seperti saya suka ikan, !! terlalu berguna. Tidak yakin sudo !! tetapi juga sebagai cara untuk meneruskan info sebelumnya ke perintah baru. Sebagai contoh:

find . -name something | grep "pattern" maka saya akan bermain dengan pola sampai saya mendapatkan apa yang saya inginkan.
Lalu saya akan meneruskannya ke sesuatu seperti itu (someCommand !! ). Saat ini, pada ikan, ini membutuhkan terlalu banyak langkah. Solusinya tidak bekerja cukup baik untuk saya.

zsh berkembang !! sehingga Anda dapat mengeditnya. Jadi harus kembali ke zsh.

Jika Anda menggunakan fisherman (yang seharusnya sangat Anda lakukan), Anda dapat menginstal nyarly/fish-bang-bang dan mendapatkan ekspansi di mana saja dalam perintah !! dan !$

@nyarly Ya, saya mencobanya. Tapi saya tidak suka bagaimana itu berkembang segera setelah ! diketik. Rasanya canggung. zsh terasa lebih baik karena mengembang setelah Anda memasukkan spasi atau menekan enter.

EDIT: Tidak apa-apa, saya tidak bisa melakukannya. Saya lupa betapa menjengkelkannya pengaturan ZSH menjadi seperti yang saya inginkan. plugin nyarly harus dilakukan.

Saya sangat senang ini tidak diterapkan! Ini melanggar Hukum ortogonalitas Ikan dan Hukum fokus pengguna. Penggantian riwayat Bash membutuhkan terlalu banyak pemikiran selain !! dan !$ dan mungkin s^ . Itu sebabnya orang hanya menggunakan itu. Solusi Fish lebih interaktif, yang memungkinkan penggantian argumen yang lebih umum. Ini cukup efisien dalam hal jumlah pukulan, dan sama-sama efisien dengan !! .

Beberapa pengguna melewatkan !! dan !$ dan tidak ingin belajar dengan cara yang berbeda. Haruskah Fish mengimplementasikan fitur-fitur ini sebagai kasus tepi (lihat Hukum ortogonalitas)? Atau semua penggantian riwayat Bash? Atau semua fitur dari shell lain? Semua fitur yang dapat dipikirkan pengguna?

Berikut adalah perbaikan untuk siapa saja yang menginginkan sesuatu untuk disalin dan ditempel:

masukkan ini ke ~/.config/fish/functions/fish_user_key_bindings.fish

function bind_bang
  switch (commandline -t)
  case "!"
    commandline -t $history[1]; commandline -f repaint
  case "*"
    commandline -i !
  end
end

function bind_dollar
  switch (commandline -t)
  case "!"
    commandline -t ""
    commandline -f history-token-search-backward
  case "*"
    commandline -i '$'
  end
end

function fish_user_key_bindings
  bind ! bind_bang
  bind '$' bind_dollar
end

@siteshwar URL yang ditautkan ke https://github.com/fish-shell/fish-shell/issues/288#issuecomment -7869918 rusak. Bisakah Anda mengedit komentar Anda untuk memperbaikinya bagi orang yang membaca masalah yang masih terbuka ini?

Saya mengedit komentarnya untuk menunjukkan tempat kami meng-host FAQ sekarang.

Sekarang ikan itu memiliki && dan || (https://github.com/fish-shell/fish-shell/issues/4620) Ini hampir menjadi pengganti bash!

Aku benar-benar bingung --

Jadi shell yang menyatakan tujuan desain nomor 1 adalah:

1. Everything that can be done in other shell languages should be possible to do in fish

... tidak mengizinkan saya melakukan salah satu tindakan yang paling umum digunakan di setiap shell lainnya?

Faq ikan mengatakan bahwa pengguna seharusnya

First press Up, then Home, then type "sudo ".

Man, apa peregangan. Berapa banyak pengguna yang menekan tombol 'Beranda' dalam enam bulan terakhir karena alasan apa pun? Selama itu, saya dapat berargumen bahwa secara otomatis mem-parsing perintah dari halaman manual tidak cukup ortogonal dari hanya membuka file pria sialan dan menemukannya sendiri.

@andysalerno
tindakan yang ingin Anda lakukan adalah menjalankan perintah sebelumnya dengan sudo prepended
dan ikan menyediakan fungsi ini
meskipun bukannya masuk
First type "sudo ", then press shift+1, then press shift+1
saya bersedia
ctrl+p, ctrl+a, type "sudo "
ini bekerja dengan cara yang sama di bash
sekarang setelah Anda menyebutkan faq, saya memeriksanya lagi dan seseorang menghapus bagian tentang pintasan ini sekarang hilang. (saya membuat https://github.com/fish-shell/fish-shell/pull/3879 untuk memperbaikinya)
Alasan pintasan ini berfungsi adalah karena ia mengikuti pustaka readline yang diimplementasikan atau ditiru secara luas untuk pengeditan baris.
Jika saya menemukan waktu saya akan membuat permintaan tarik untuk menambahkan ini ke faq
Saya dapat memahami rasa frustrasi Anda, menggunakan tombol Home sebenarnya bukanlah suatu pilihan, karena tombol itu berada di tempat yang berbeda pada banyak keyboard (misalnya semua 3 keyboard saya).

thx untuk mengangkat ini lagi. Saya pikir penting untuk memiliki cara yang mudah (hanya pengubah dan tombol huruf, tidak ada tombol home, tidak ada tombol panah), cepat (tidak terlalu banyak penekanan tombol) dan _documented_ cara melakukan ini.

luar biasa, saya tidak tahu tentang ctrl+p! Saya suka ini bahkan lebih baik dari !!.

edit:
apakah ada cara lain untuk mengevaluasi kembali perintah yang dijalankan terakhir? Saya mendapati diri saya sering melakukan sesuatu seperti ini di bash:

> man -w fish  # prints location of man file for fish
/usr/share/fish/man/man1/fish.1

> less $(!!)

Ini tidak sesingkat, tetapi Anda dapat melakukan ini dengan eval dan variabel histori:

> man -w fish
/usr/share/fish/man/man1/fish.1

> less (eval $history[1])

Tetapi cara yang lebih baik untuk melakukan ini adalah menggunakan alt-p. Fish akan menyalurkan output perintah ke less jika Anda menekan alt-p setelah Anda mengetikkan perintah:

> man fish alt-p > man fish ^&1 |less;

saya tidak mengerti semua orang anti-bang.. ada begitu banyak contoh di mana hal-hal menggelikan lebih cepat dan lebih nyaman daripada "bekerja di sekitar" seperti:
First press Up, then Home, then type "sudo ".

Perintah Bang benar-benar ajaib setelah Anda terbiasa dengannya.. Saya sangat berharap orang-orang ikan berubah pikiran dan menambahkannya kembali. Setidaknya beberapa yang bagus, seperti:

!!
!WORD
!WORD:p
!:n
!$
!^
!n:n
!:gs/MISTAKE/FIX
!#
!#^

Ikan cukup bagus, teruslah bekerja dengan baik

Apakah ada cara yang didukung untuk menjalankan perintah terakhir dalam sejarah? Saya tidak keberatan harus mengetiknya, karena saya hanya menggunakan makro untuk memanggil perintah di jendela tmux saya yang lain. Tetapi kasus penggunaan saya adalah saya hanya ingin dapat melakukan sesuatu seperti ini:

$ echo "hi"
hi
$ x
hi
$ x
hi

Saya mencoba eval $history[1] , tetapi panggilan kedua meledak. Itulah hal yang berguna tentang perintah !! . Satu hal yang tidak benar-benar dapat diterima adalah menggunakan tombol panah. Apakah ada perintah di ikan yang mendukung kasus penggunaan ini?

Yang terbaik yang dapat saya pikirkan saat ini adalah menggunakan spasi utama yang mencegah penambahannya ke riwayat:

$ function x ; eval $history[1] ; end
$ echo "hi"
hi
$  x    # note leading space
hi
$  x
hi

itu pasti tidak bagus aku tahu. Namun dalam kasus sederhana ini, pengikatan history-search-backward sepertinya sudah cukup? Itu tombol panah secara default tetapi Anda dapat menambahkan atau mengubahnya.

Oh! Itu ide yang bagus, saya tidak berpikir untuk menggunakan ruang terdepan. Aku harus mencobanya.

Perbarui :
Itu bekerja dengan sempurna untuk usecase saya. $ eval $history[1] #note extra leading space

Ini mungkin menjadi alasan saya tidak bisa tinggal dengan Fish. Meskipun elegan dan sederhana, kurangnya pintasan standar untuk banyak hal membuatnya tidak produktif:

barang pertama. Saya ingin mengulangi perintah sebelumnya dengan Sudo:

sudo !!

1) Tekan tombol Atas
Masalah, saya harus meraih tombol Naik di keyboard Mei. Sekitar seperempat dari waktu saya melewatkannya dan kemudian harus melihat ke bawah ke keyboard untuk melihat dengan tepat di mana letaknya dan mungkin memperbaiki apa pun yang salah. Kemudian...
2) Tekan Beranda atau Ctrl-A
Rumah adalah bentangan lain dan terletak di begitu banyak lokasi yang beragam pada keyboard yang berbeda sehingga saya harus mencarinya. Ctrl-A datang lebih alami sehingga saya kira berfungsi.
3) Ketik 'sudo' dan tekan kembali.
Oke, itu hanya tujuh penekanan tombol, tetapi salah satunya rentan terhadap kesalahan dan menyebabkan alur kerja saya terganggu pada sebagian besar waktu.

Item berikutnya, saya ingin membahas argumen terakhir sebelumnya:

ls -l /etc/network/iptables
cat !$

Atau dengan ikan:
1) Ketik 'kucing'
2) Alt-Up
Oke, sekali lagi ini sangat tidak alami. Saya jarang menekan tombol Alt dan lebih sering menekan tombol Super (Cmd/Windows/apa pun) di sebelahnya yang mengubah konteks saya sama sekali.

Ikan membutuhkan ekspansi sejarah yang lebih baik seperti semua pesaing utama. Kekurangannya adalah pengurangan produktivitas bagi pengguna kelas atas.

@wrecklass Karena saya tidak bisa mengeluarkan sudo !! dari jari saya, saya menulis https://github.com/nyarly/fish-bang-bang , yang akan saya sarankan kepada Anda.

Juga, IIRC, mengirim ikan dengan Alt-S untuk "tambahkan sudo" yang akan berfungsi untuk entri riwayat terakhir jika perintah Anda saat ini kosong, dengan cara yang sama seperti Alt-P akan menambahkan | less .

Dan hanya karena itu terus muncul, ("yaitu mengapa tidak !! bekerja pada ikan seperti yang dilakukan bash") Saya ingin menghubungkan: perlakuan khusus dari karakter ! adalah salah satu hal yang mengusir saya dari bash. Sebagai pengguna ikan lama, saya akan sangat kecewa jika perilaku itu dibawa-bawa untuk menenangkan minoritas vokal.

sudo !! adalah hal yang standar. Saya mengerti bahwa ikan berusaha sangat keras untuk menjauh dari sintaks bash kuno, tetapi dengan menyingkirkan fitur yang berguna secara sah demi filosofi pribadi, saya pikir kami menghentikan kemajuan.

@ClickSentinel , untuk alasan inilah saya berhenti menggunakan fish dan tetap menggunakan bash . :senyum:

Rencana kami saat ini adalah menerapkan singkatan global, yang kemudian juga dapat mendukung "!!" dkk. Lihat #5003 untuk itu.

Saya menutup masalah ini demi itu karena telah berjalan dengan sendirinya.

@tukusejssirs dan @ClickSentinel , https://github.com/fish-shell/fish-shell/issues/288#issuecomment -306212011 ke konfigurasi Anda?

Saya memiliki varian itu selama beberapa tahun (dimodifikasi dari masalah (masalah ini, mungkin?) di konfigurasi saya, dan ini adalah salah satu bagian dari ergonomi shell yang paling saya andalkan. (Juga, terutama dengan kasing tambahan Saya memiliki varian saya untuk melakukan pencarian token ke atas menggunakan string sebelum !$ , itu adalah salah satu hal yang paling saya sesali ketika bekerja di bash.)

Varian saya (atau mungkin saya mencuri variasinya...tidak ingat :man_shrugging: ):

function bind_bang
    switch (commandline --current-token)[-1]
    case "!"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- $history[1]
        commandline --function repaint
    case "*"
        commandline --insert !
    end
end

function bind_dollar
    switch (commandline --current-token)[-1]
    # This case lets us still type a literal `!$` if we need to (by
    # typing `!\$`). Probably overkill.
    case "*!\\"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- (echo -ns (commandline --current-token)[-1] | head -c '-1')
        commandline --insert '$'
    case "!"
        commandline --current-token ""
        commandline --function history-token-search-backward


    # Main difference from referenced version is this `*!` case
    # =========================================================
    #
    # If the `!$` is preceded by any text, search backward for tokens
    # that contain that text as a substring. E.g., if we'd previously
    # run
    #
    #   git checkout -b a_feature_branch
    #   git checkout master
    #
    # then the `fea!$` in the following would be replaced with
    # `a_feature_branch`
    #
    #   git branch -d fea!$
    #
    # and our command line would look like
    #
    #   git branch -d a_feature_branch
    #
    case "*!"
        # Without the `--`, the functionality can break when completing
        # flags used in the history (since, in certain edge cases
        # `commandline` will assume that *it* should try to interpret
        # the flag)
        commandline --current-token -- (echo -ns (commandline --current-token)[-1] | head -c '-1')
        commandline --function history-token-search-backward
    case "*"
        commandline --insert '$'
    end
end

function fish_user_key_bindings
    bind ! bind_bang
    bind '$' bind_dollar
end

Terima kasih @scooter-dangle ini bekerja lebih baik daripada #228

Ada kasus di mana Fish akan memberikan cara yang lebih idiomatis untuk melakukan beberapa tindakan:

LANG=C :
fish: Unsupported use of '='. To run ':' with a modified environment, please use 'env LANG=C :…'

Mungkin !! juga dapat, secara default, menghasilkan pesan seperti itu yang menyarankan cara alternatif yang lebih idiomatis untuk melakukannya?

Namun proposal harus sama efisiennya. Membandingkan:

  • sudo !!<enter> , semua dari posisi dasar tangan di keyboard
  • <up><home>sudo <enter> , seperti yang disarankan di FAQ Fish yang tampaknya membutuhkan lebih banyak atau lebih sedikit gerakan tangan tergantung di manadanada di keyboard.
  • <C-p><Ca>sudo <enter> , dapat diakses tanpa berpindah tangan , yang juga bekerja dengan default Bash, ZSH dan mungkin lebih, sehingga pengguna dapat mengadopsi kebiasaan baru yang portabel ketika mereka harus berurusan dengan shell lain.

Untuk !$ , menyarankan <alt-.> tampaknya baik-baik saja, bukan?

@psychoslave Tolong berhenti mengomentari semua masalah lama , terutama yang tertutup.

Juga mengunci yang ini. Sudah dijawab sekitar lima puluh kali lipat.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat