Fish-shell: Singkatan

Dibuat pada 11 Mei 2013  ·  92Komentar  ·  Sumber: fish-shell/fish-shell

Perkenalkan singkatan sebagai alternatif untuk alias, mungkin menggantikannya.

Singkatan persis seperti alias, kecuali mereka diperluas ke bentuk lengkapnya secara langsung saat Anda mengetiknya di baris perintah. Katakanlah Anda memiliki gc sebagai singkatan dari git commit ; sekarang jika Anda mengetik gc -am "did stuff" baris perintah berubah ketika Anda mengetik spasi setelah "gc" dan akhirnya berakhir sebagai git commit -am "did stuff" . Ini seharusnya hanya terjadi di posisi perintah, dan ketika Anda mengetik spasi atau menekan enter.

_Teks asli berikut:_

Ganti aliasing dengan formulir pendek yang berkembang sendiri

Aku tidak tahu harus menyebutnya apa, tapi toh. Idenya adalah jika Anda mengetik "g" sebagai perintah, itu akan diperluas menjadi "git" saat Anda mengetik spasi atau enter.

Argumen untuk:

  • Ini memecahkan banyak masalah dengan penyelesaian. Karena alias memperluas "langsung", penyelesaian git berfungsi seperti biasa dan commandline tidak harus berbohong atau melakukan peretasan lain seperti itu.
  • Sangat mudah untuk menerapkan. Saya agak bisa melakukannya dengan bind dan commandline meskipun saya tidak mencoba untuk menulis implementasi yang lengkap. Kami tidak memerlukan perubahan apa pun pada function atau complete dll, seperti pada solusi lain yang diusulkan.
  • Ini bisa dibilang "mencurigakan": pengguna dapat melihat formulir yang diperluas, tidak disembunyikan dalam alias; itu instan dan langsung, mirip dengan penyelesaian, pengecatan ulang cepat dengan prevd-or-backward-word dll.
  • Saat menyalin-menempelkan baris perintah untuk instruksi kepada orang lain, itu tidak akan penuh dengan alias khusus Anda yang tidak mereka ketahui.
  • Anda dapat mengedit formulir yang diperluas jika hampir benar.

Argumen menentang:

  • Tidak menyelesaikan masalah dengan alias git=hub , masalah yang saat ini tidak ada tetapi diperkenalkan dengan beberapa proposal penyelesaian alias seperti ini. Namun Anda cukup menulis fungsi normal function git; hub $argv; end sebagai gantinya untuk mengesampingkan sistem alias yang diusulkan ini.
  • Beberapa orang mungkin terkejut jika baris perintah berubah saat Anda mengetik, tanpa menekan apa pun seperti Tab atau semacamnya.
  • Alasan Anda dapat mengedit formulir yang diperluas juga merupakan alasan Anda tidak dapat menghapus apa yang Anda ketik hanya dengan dua spasi mundur. Bahkan CTRL-W mungkin tidak cukup karena Anda mungkin memiliki gc memperluas ke git commit misalnya. CTRL-U akan melakukannya jika itu satu-satunya perintah tetapi akan menghapus terlalu banyak jika Anda menggunakan alias untuk pipa misalnya. Mungkin kita bisa memperkenalkan pengikatan baru untuk "bunuh perintah saat ini tetapi tidak seluruh buffer".
  • :pertanyaan:

Seni sebelumnya:

  • :abbreviate di Vim
  • Saya pikir mungkin mesin pencari di Chrome?

Membahas.

enhancement

Komentar yang paling membantu

Alangkah baiknya jika ikan menyimpan singkatan dalam file ...

Dari halaman manual: "Singkatan disimpan menggunakan variabel universal." Yang berarti Anda akan menemukannya di file _~/.config/fish/fishd.macaddr_ di bawah nama var fish_user_abbreviations . Perintah abbr hanya memanipulasi var universal itu.

Semua 92 komentar

Gagasan lain adalah memberi nama "singkatan" ini seperti di Vim, dan kemudian memutuskan apa yang harus dilakukan dengan alias di edisi lain [saya cenderung berpikir mereka harus dihapus].

Memikirkan argumen lain yang menentang:

  • Tidak dapat menggunakan "alias" ini dalam skrip. Tidak yakin itu ide yang baik untuk menggunakan alias dalam skrip, tetapi kami dapat memiliki fungsi untuk memperluas "singkatan" dan/atau kami dapat mengaitkan singkatan ikan ke editor agar mereka memperluas input di sana juga.

Saya suka proposal Anda, terdengar keren dan mencurigakan :+1:

Saya juga suka ini.
Ini adalah solusi yang sangat bersih untuk masalah "penyelesaian untuk alias" #393 yang cukup mengganggu.
Ini dikombinasikan dengan ll (Alias) printout saat melakukan ll<tab> akan menjadi sempurna.

Karena alias hanyalah pembungkus skrip di sekitar function hari ini, saya ingin itu diubah juga sehingga ada perbedaan yang jelas antara fungsi dan alias karena mereka berbeda dalam banyak hal setelah ini, mis :

  • Sintaksis
  • Ekspresibilitas
  • Penggunaan

@gustafj Saya pikir mungkin lebih baik untuk menyebut ide ini "singkatan" dan mengganti alias dengan sesuatu yang menunjukkan pesan kesalahan bermanfaat yang menunjuk pada function dan abbreviate . Pikiran?

Catatan lain:

Maksud saya ini hanya memengaruhi perintah di baris perintah, karena akan sangat mengganggu jika g terus berkembang ke git dalam posisi argumen. Namun, kami mungkin ingin beberapa perluasan dalam posisi argumen juga, misalnya dengan sudo (yang berarti Anda dapat menggunakan sudo dengan singkatan - sesuatu yang tidak dapat Anda lakukan dengan alias!) dan kasus tertentu dari penyelesaian yang tidak ambigu seperti untuk alias git sendiri atau jika Anda mengetik bagian dari opsi yang panjang. Mendapatkan ini dengan benar mungkin sulit, dan hanya akan menghalangi jika penyelesaiannya kedaluwarsa, dan jika Anda benar-benar ingin sudo g bukan sudo git Anda sekarang harus melakukan sesuatu seperti sudo (echo git) . Mungkin kita dapat mengatakan bahwa argumen yang dikutip tidak pernah berkembang, sehingga Anda dapat mengatakan sudo "g" . Tidak yakin apakah itu akan terlalu ajaib dan mengejutkan atau sebenarnya persis seperti yang diharapkan dan intuisi. Pikiran? :-)

Singkatan terdengar bagus bagi saya (tapi saya pengguna vim biasa, jadi saya mungkin bias ...).
Ketika saya memikirkannya, ada cukup banyak hal "menarik" yang dapat dilakukan dengan ini, tetapi (seperti yang sudah Anda tunjukkan) ada jebakan yang tersembunyi di ladang ranjau ini juga :/

Saya pikir itu mungkin bermasalah/mengganggu jika itu benar-benar otomatis dan di mana saja di baris perintah, sebagian besar karena membatalkan singkatan bisa membosankan jika itu meluas ke sesuatu yang tidak Anda inginkan dan terutama jika itu meluas ke string yang panjang.

Beberapa pemikiran saya sendiri:
Haruskah itu otomatis dengan menggunakan space atau haruskah dipicu oleh opsi melalui tab , atau yang lainnya?
Haruskah itu hanya untuk string sederhana ex g for git ?
Haruskah itu hanya berlaku untuk item pertama di baris perintah, atau di mana saja?
Apakah mungkin untuk melakukan string -> konversi nilai ex d untuk tanggal saat ini Tue May 14 20:23:03 CEST 2013 ?
Apakah mungkin untuk memperluas subkulit ex vim (find . -iname '*cfg')<tab> memberi

foo.cfg bar/poo.cfg foo/bar/more/beer.cfg
> vim

Pikiran pada pikiran Anda!

Haruskah otomatis dengan menggunakan ruang atau harus dipicu oleh opsi melalui tab, atau yang lainnya?

Saya tidak berpikir ini berfungsi dengan ruang _but_ apa pun (dan masuk) karena intinya adalah untuk mendapatkan pengalaman mulus yang Anda dapatkan dengan alias di mana Anda tidak perlu memikirkan sesuatu sebagai alias atau bukan, dan tab tidak berfungsi baik karena g<Tab> harus menyelesaikan perintah yang dimulai dengan g . Jika kita menambahkan pengikatan baru, katakanlah CTRL-X, kita sekarang memiliki tiga jenis penyelesaian: yang normal, sugesti otomatis, dan singkatan. Saya benar-benar berpikir ini perlu dilakukan dengan ruang atau tidak sama sekali.

Haruskah itu hanya untuk string sederhana ex g untuk git?

Dalam posisi perintah harus dimungkinkan untuk memasukkan argumen dalam singkatan. Misalnya gc berkembang menjadi git commit --all atau apa pun yang Anda miliki. Pada dasarnya saya menganggap singkatan persis seperti alias, kecuali mereka memperluas langsung di baris perintah.

Haruskah itu hanya berlaku untuk item pertama di baris perintah, atau di mana saja?

Hanya di posisi komando mungkin merupakan awal yang baik. Kemudian kita bisa _maybe_ bereksperimen dengan kasus penggunaan posisi argumen yang saya sarankan sebelumnya.

Apakah mungkin untuk melakukan string -> konversi nilai ex d untuk tanggal saat ini Sel 14 Mei 20:23:03 CEST 2013?

Maksudmu dalam posisi argumen? echo d diperluas untuk menggemakan tanggal? Saya benar-benar berpikir jika kita melakukan singkatan posisi argumen sama sekali, itu perlu digunakan dengan sangat konservatif dan _only_ ketika argumennya adalah perintah (seperti dalam kasus sudo ) atau ketika perintah memiliki sistem alias sendiri (seperti dalam kasus git ) dan memperluas akan memiliki efek yang sama persis dengan tidak memperluas (jadi kami hanya memperluas untuk kegunaan).

Apakah mungkin untuk memperluas subkulit ex vim (find . -iname '*cfg')<tab>

Saya pikir itu pertanyaan untuk penyelesaian dan bukan singkatan, karena saya tidak menganggap singkatan sebagai melibatkan tab dan memperluas subkulit pada ruang mungkin adalah ide yang buruk. Namun tidak yakin itu bisa berfungsi untuk penyelesaian karena Anda sudah bisa melengkapi nama variabel tanpa memperluasnya.

Padahal itu bisa berguna. Seperti yang saya bayangkan melakukan rm *.png , memperluas wildcard dan menghapus beberapa file dari daftar.

Bagaimana dengan ini: kami memiliki sistem "perluasan" atau "singkatan" generik yang mirip dengan sistem penyelesaian; kami mengikat CTRL-X atau sesuatu untuk memperluas token; dan di posisi perintah kami juga memperluas singkatan secara otomatis. Itu juga bisa membuat kasus penggunaan sudo dan git bekerja kurang mencolok dengan membuat ekspansi tersebut eksplisit.

Ini adalah proposal yang jauh lebih besar daripada ide awal saya. :mengedip:

Ruang sebagai pemicu terdengar bagus bagi saya, mungkin memberikan pengalaman pengguna terbaik.
Memperluas *.png terdengar menarik ;)
Saya sendiri tidak suka banyak ikatan yang berbeda untuk hal yang berbeda, mungkin "tab ganda" dapat digunakan sebagai pengganti ikatan baru.
Contoh ....*.png<tab> memberikan press <tab> again to expand *.png (sama untuk subkulit).

Tapi mungkin lebih baik untuk membatasi proposal ini ke: singkatan untuk posisi perintah, memperluas menggunakan spasi.
Dan memiliki "perluas subkulit/wildcard" & dukungan Sudo sebagai yang terpisah?

Tidak yakin tab ganda akan berfungsi karena saat ini berputar di antara penyelesaian. Vim tampaknya memiliki CTRL+] untuk memperluas singkatan tanpa mengetik spasi...

Saya pikir jika kita melakukan ekspansi langsung, maka singkatan harus diterapkan dengan cara itu, jadi idenya terkait. Tetapi jika kita tidak melakukan ekspansi langsung, singkatan tetap harus dipertimbangkan sendiri. Jadi tidak yakin apa yang harus dilakukan di sini. :-)

Ya benar tentang <tab> , hanya memikirkan subkulit (di mana saat ini tidak melakukan apa-apa).
Dimungkinkan untuk mengubah perilaku <anything><space><tab> saat ini yang saat ini menggilir semua file yang tersedia di direktori saat ini (pertama mencetak semuanya).
Mantan

> ls <tab>
a.cfg  b.cfg  c.cfg  d.cfg
> ls <tab>
> ls a.cfg<tab>
> ls b.cfg<tab>

Tetapi saya lebih suka "ekspansi langsung" menggunakan kombo kunci baru daripada hidup tanpanya;)
Memperluas *.cfg ke a.cfg b.cfg c.cfg d.cfg terasa sangat berguna.
Tetapi kemudian semua bentuk ekspansi yang mungkin harus dapat diperluas, bukan hanya wildcard, penyelesaian ex brace (yang saya lebih suka dihapus ... tapi itu masalah yang berbeda #354)

Tetapi kemudian semua bentuk ekspansi yang mungkin harus dapat diperluas, bukan hanya wildcard, penyelesaian ex brace (yang saya lebih suka dihapus ... tapi itu masalah yang berbeda #354)

Setuju di kedua akun. Saya ingin tahu apakah tanda kutip ganda harus dapat diperluas juga... echo "hello $USER" -> echo "hello dag" .

Saya pikir apa yang kita bicarakan di sini sebenarnya "evaluasi" lebih dari "memperluas" sementara di sisi lain singkatan bukan tentang evaluasi, jadi ide-ide ini mungkin terpisah dan saya akan membuat masalah baru untuk yang lain dan mengedit yang ini sedikit.

Berikut adalah prototipe kerja dasar:

function __fish_expand_abbreviation
    if test (count (commandline -poc)) -eq 0
        switch (commandline -t)
            case g
                commandline -t git
            case gc
                commandline -t 'git commit'
        end
    end
end

bind \  '__fish_expand_abbreviation; commandline -i " "'
bind \n '__fish_expand_abbreviation; commandline -f execute'

Satu masalah yang saya perhatikan adalah jika Anda menekan enter untuk menjalankan baris perintah yang disingkat, formulir yang diperluas disorot sebagai kesalahan (perintah tidak dikenal), bahkan menyertakan argumen.

Saya sangat menyukai ini, jadi saya menerapkan cara untuk mengelola singkatan ini.

Pada akhirnya saya pikir ini harus ditangani dengan cara yang sama penyelesaian dan fungsi ditangani. Dengan folder singkatan itu sendiri di mana itu dapat disimpan.

Ini adalah implementasi saat ini:

function __fish_expand_abbreviation
  if test (count (commandline -poc)) -eq 0
    set -l token (commandline -t)

    if abbreviations -q $token
      commandline -t (abbreviations $token)
    end
  end
end
function abbreviations --description 'List, show and query abbreviations'
  if test (count $argv) = 0
    printf '%s\n' $fish_abbreviations
    return
  end

  set -l abbreviation_index 0
  set -l expanded_abbreviation

  for i in $fish_abbreviations
    set abbreviation_index (math $abbreviation_index + 1)
    echo $i | read -l abbreviation command

    if test $abbreviation = $argv[-1]
      set expanded_abbreviation $command
      break
    end
  end

  if test -n "$expanded_abbreviation"
    switch $argv[1]
      case -q --query
        return 0
      case -e --erase
        set -e fish_abbreviations[$abbreviation_index]
      case '*'
        echo $expanded_abbreviation
      end
  else
    return 1
  end
end
function abbreviate --description 'Define a new abbreviation'
  if test (count $argv) -lt 2
    echo 'abbreviate: Takes two arguments. First abbreviation and then expanded command'
    return 1
  end

  echo $argv | read -l abbreviation command

  eval "function $abbreviation; $command \$argv; end"
  abbreviations -e $abbreviation

  set -U fish_abbreviations $fish_abbreviations "$argv"
  return 0
end

Kemudian Anda melakukan sesuatu seperti ini:

abbreviate !    'sudo'
abbreviate tf   'tail -f'
abbreviate l    'ls -la'
abbreviate l.   'ls -d .*'
abbreviate g    'git'
abbreviate gs   'git status'

Pembaruan 1: Tambahkan kemampuan untuk menghapus singkatan dan menyimpannya dalam variabel universal.
Pembaruan 2: Buat fungsi untuk singkatan juga

Melihat cara kerja fungsi, kami dapat memperkenalkan:

  • abbred
  • abbrsave

Yang pada dasarnya adalah mengkloning fungsi-fungsi itu.

Bagus! Saya tidak _cukup_ yakin bahwa kita memerlukan direktori ~/.config/fish/abbreviations dan abbr{ed,save} menyertainya. Tidak seperti fungsi dan penyelesaian, mereka tidak terlalu lambat untuk memuat satu per satu dan mereka hanya perlu satu baris untuk didefinisikan. Saya pikir mereka lebih seperti bind , mungkin kita bisa memiliki fungsi fish_[user_]abbreviations seperti fungsi fish_user_key_bindings , yang memuat pertama kali ikan mencoba memperluas singkatan? ( [user_] untuk konsistensi tetapi saya tidak yakin kami harus mengirimkan singkatan default?)

Satu-satunya alasan yang dapat saya pikirkan untuk memiliki banyak file untuk singkatan adalah jika Anda telah mengatakan singkatan untuk setiap perintah git yang ada dan beberapa dengan argumen, jadi Anda ingin yang terpisah dari yang lain. Tapi bukan itu cara kerja lazy-loading dan penyelesaiannya: mereka dimuat berdasarkan nama perintah, jadi jika kita melakukannya untuk singkatan, kita akan mendapatkan satu file untuk setiap singkatan, setiap file hanya berisi satu baris kode !

Ide lain adalah melakukan sesuatu seperti variabel universal, bahkan mungkin dengan benar-benar menggunakan universal (seperti set -U fish_abbreviations ). Mungkin ada kasus penggunaan untuk singkatan host-local? Tidak yakin.

Anda memiliki beberapa poin bagus dan saya condong ke arah fish_user_abbreviations .

Pendekatan lain adalah memiliki penyelesaian seperti di mana Anda memasukkan semua singkatan terkait ke dalam file, tetapi itu mungkin lebih sulit untuk dipetakan.

Saya berencana untuk menggunakan set -U fish_abbreviations pada awalnya, tetapi saya ingin konfigurasi dikelola oleh git, jadi lebih suka mengaturnya di suatu tempat, seperti konfigurasi. Tetapi hal yang menyenangkan dengan variabel universal adalah Anda dapat menambahkan penyelesaian dengan cepat tanpa ragu-ragu, seperti ( abbred , abbrsave ). Lakukan saja abbreviate .

Salah satu solusinya adalah membiarkan perintah memastikan singkatan ditambahkan secara unik dan menimpa yang sudah ada. Kemudian itu akan di-bootstrap dengan fish_user_abbreviations dan pengguna dapat menambahkan yang khusus ke variabel universal jika mereka mau.

Saya memiliki ini sekarang:
set -q fish_abbreviations ; or fish_user_abbreviations

Tapi itu tidak akan berhasil jika saya terus mempertahankan file.

Memperbarui fungsi saya sebelumnya untuk menggunakan variabel universal dan menambahkan kemungkinan untuk menghapusnya dan juga memeriksa sebelum menambahkan yang baru jika ada.

Saya sedang berpikir untuk membuatnya lebih interaktif, seperti menanyakan apakah itu harus menggantikan singkatan saat ini. Tetapi karena itu mungkin juga ditulis, saya tidak ingin melakukan itu. Saya akan melihat ke dalam penentuan mode interaktif.

Nah lihat hal dengan penyelesaian adalah bahwa bahkan mereka dimuat untuk satu perintah. Jika proses baris perintah saat ini adalah git maka completions/git.fish dimuat. Ketika Anda memiliki nama perintah terpisah, Anda harus membuat file terpisah, lihat misalnya penyelesaian untuk [ef]grep yang sebenarnya dalam fungsi yang dipanggil dari masing-masing dari tiga file penyelesaian tersebut.

Dengan singkatan, saya tidak melihat cara untuk mengetahui dari singkatan file mana yang akan dimuat, kecuali nama file _is_ singkatannya. Dan kemudian Anda tidak dapat memiliki beberapa singkatan dalam satu file. Saya kira kita dapat memuat semua file singkatan di awal, atau pada upaya pertama untuk memperluas singkatan, tetapi itu berbeda dari bagaimana fungsi dan penyelesaian dimuat, dan berpotensi menjadi lambat jika Anda memiliki banyak file singkatan.

Ide baru: abbreviate -U untuk membuat singkatan universal, dan abbreviate -g atau hanya abbreviate untuk membuat singkatan global? Jika kita melakukan itu, mungkin kita harus mempertimbangkan untuk melakukannya untuk bind juga...

Saya juga berpikir abbreviate seharusnya hanya menimpa singkatan yang ada, sama seperti bind dan function dan set ...

Semua adalah poin yang valid. Saya pikir masuk akal untuk hanya menimpa seperti semua fungsi lainnya.

Saya juga menyukai saran dengan universal dan global, yang memberikan fleksibilitas untuk memilih cara menangani singkatan/binding Anda. Saya tidak sepenuhnya yakin bagaimana menerapkannya, dan saya pikir mungkin ini harus menjadi bawaan untuk meningkatkan kinerja?

Ya, saya hanya membuat prototipe dalam skrip ikan untuk mencobanya. Mungkin tidak ingin skrip lambat diaktifkan setiap kali Anda mengetik spasi. :mengedip:

Ya, masih bekerja dengan baik. Saya telah menggunakannya selama sekitar 1 hari sekarang dan tidak dapat membayangkan diri saya hidup tanpanya lagi, haha ​​:grin:

:merah:

Masalah lain yang saya perhatikan adalah bahwa jika Anda melakukan C-a pada baris perintah yang tidak kosong dan mengetikkan singkatan, itu tidak diperluas pada ruang karena Anda berada di tengah-tengah kata. Jadi katakanlah Anda melakukan make install oops perlu root C-a ! sekarang Anda memiliki ![cursor]make install dan mengetik spasi tidak memperluas singkatan ! . Saya akan mencoba mengatasi ini dengan commandline -C .

Masalah ketiga, yang mungkin merupakan fitur, adalah bahwa itu hanya diperluas ketika Anda mengetik spasi atau memasukkan setelah singkatan. Jadi tidak misalnya jika Anda mengetik spasi maka C-a ! C-e . Ini bisa menjadi fitur karena memungkinkan untuk menghindari perluasan singkatan, tetapi saya pikir ini agak tidak menarik dan kita seharusnya memiliki perintah untuk menjalankan baris perintah secara harfiah, sedikit seperti perintah command tetapi juga akuntansi untuk fungsi shell dan builtin. Atau beberapa sintaks khusus, seperti \g di posisi perintah ditafsirkan sebagai g dan tidak diperluas. Sintaks khusus juga tidak terlalu mencurigakan, tetapi kita sudah memiliki ruang sebelum perintah khusus yang berarti "jangan masuk sejarah", jadi angkat bahu.

Keempat, dan yang ini tidak jelas, jika Anda suka pada paragraf sebelumnya sehingga Anda memiliki singkatan yang tidak diperluas diikuti dengan spasi, maka lakukan C-a dan spasi, singkatannya diperluas dan spasi tambahan dimasukkan setelah itu! Sekali lagi, mungkin perlu memeriksa posisi kursor dengan commandline -C .

Oh dan, masalah pertama yang saya sebutkan di komentar sebelumnya, itu hanya terjadi jika singkatan yang tidak diperluas adalah perintah yang tidak diketahui. Jadi singkatan gc diperluas menjadi git commit dan semuanya disorot sebagai kesalahan, saat menekan enter (tanpa spasi), tetapi singkatan gs diperluas menjadi git status dan sorot dengan benar, karena ternyata saya telah menginstal ghostscript:

> which gs
/usr/bin/gs

Saya juga bertanya-tanya apakah mungkin singkatan harus disorot sebagai "perintah" yang diketahui bahkan sebelum Anda menekan spasi... Saat ini jika saya mengetik g itu merah sampai mengetik spasi, tetapi jika saya mengetik git itu menyoroti seperti yang diketahui bahkan sebelum spasi.

Semua masalah ini mungkin dapat diatasi dengan lebih baik jika kita melakukan ini di bagian C++.

Solusi konyol untuk masalah penyorotan sintaks: buat alias/fungsi untuk setiap singkatan. :tertawa:

Sebenarnya, mungkin itu ide yang bagus untuk dilakukan, hm... Berarti singkatan akan berfungsi dalam skrip, di eval , dengan type ... Tidak yakin.

Solusi Anda adalah apa yang saya gunakan saat ini, tetapi saya tidak yakin apakah itu yang harus dilakukan pada akhirnya, atau apakah itu dimaksudkan untuk digunakan di dalam eval atau type . Bagi saya mereka harus menjadi hal masukan saja. Tapi saya kira tidak ada salahnya juga membiarkan mereka dijalankan untuk mendapatkan dukungan mudah untuk mengatakan sudo.

Jadi saya telah menggunakan implementasi saat ini untuk sementara waktu sekarang dan ini adalah masalah yang ditemukan dengan solusi ini sejauh ini (tidak terkait dengan pendekatan :+1:):

  1. Saat menempelkan teks, spasi terakhir disisipkan di awal baris, misalnya echo this is a test menjadi _echo this is atest saat disisipkan, di mana _ adalah spasi.
  2. Saat menggunakan read bawaan, binding pada enter dan space juga berlaku di sana. Jadi misalnya jika saya ingin memasukkan beberapa perintah non untuk membacanya akan berkembang. Saya kira dalam implementasi akhir ini harus dimatikan secara default dan diaktifkan oleh read -s
  3. Ini sedikit lambat (~ 0,25-0,5 detik)

Anda dapat mengatasi 1. dengan menempelkan C-y .

Bagi saya C-y hanya menempel di dalam ikan (dari apa yang dipotong di dalam ikan) dan bukan dari clipboard sistem saya. Menyalin antar terminal atau aplikasi lain.

Saya pikir singkatan adalah ide yang sangat keren.

Saya ingin memungkinkan orang untuk bereksperimen dengan singkatan untuk memperbaiki apa yang seharusnya menjadi perilaku yang benar. Saya memeriksa dukungan awal untuk singkatan ke master sebagai 92099c7af23d0cebf52f89de4f9d829825e53ac8 dan f9c2a77c67754324f3036ec79501c6131d19562b.

Contoh cara menggunakannya:

set -U fish_user_abbreviations 'gc=git checkout'
gc

gc akan diperluas ke "git checkout" di luar angkasa atau kembali.

Singkatan adalah daftar, jadi untuk menambahkan yang baru:

set fish_user_abbreviations $fish_user_abbreviations 'grh=git reset --hard'

Singkatan diperluas dalam "posisi perintah" (misalnya, dalam subkulit atau sebagai argumen untuk jika), tetapi tidak sebagai argumen. Singkatan juga tidak diperluas dalam skrip.

Berikut adalah beberapa masalah yang belum terselesaikan untuk diskusi:

  1. "Singkatan" panjang dan sulit dieja - dapatkah kami menemukan nama yang lebih baik? "Alias" akan bagus jika belum digunakan untuk hal lain. Salah satu kemungkinan adalah untuk membalikkannya, misalnya "ekspansi." fish_user_expansions kedengarannya OK untuk saya.
  2. Bagaimana seharusnya singkatan ditentukan? Sintaks gc=git checkout ringan tetapi tidak digunakan di tempat lain di fish.
  3. Kami mungkin ingin tidak memperluas enter, hanya ruang. Memperluas saat masuk memiliki kelemahan bahwa pengguna tidak melihat perintah apa yang mereka jalankan sampai setelah mereka berkomitmen untuk menjalankannya. Jika kita memperluas hanya pada spasi, maka pengguna bisa mengetik singkatan, diikuti spasi, diikuti enter, yang sepertinya tidak terlalu memberatkan. Kemungkinan kedua adalah membuat entri pertama memicu ekspansi, dan entri kedua benar-benar menjalankannya.

Di sisi lain, jika semua singkatan ditentukan oleh pengguna, maka kemungkinan pengguna menjalankan sesuatu secara tidak sengaja rendah, jadi memperluas enter mungkin baik-baik saja.

  1. Bentuk singkatan yang diperluas hanyalah substitusi tekstual, dan tidak harus dengan sendirinya menjadi perintah yang valid. Misalnya, Anda dapat membuat singkatan yang menghasilkan tanda kutip atau kurung yang tidak cocok. Saya pikir ini adalah fitur yang berpotensi berguna, tetapi itu berarti bahwa ikan tidak dapat melakukan pemeriksaan sintaks pada kode yang berisi singkatan, yang berarti kita mungkin tidak akan pernah dapat menggunakannya dalam skrip.
  2. Haruskah ekspansi singkatan itu sendiri menjalani subkulit dan ekspansi variabel sebelum substitusi? Saya pikir ya, karena itu akan membuat mereka sangat fleksibel. Singkatan kemudian dapat menjalankan kode ikan arbitrer.
  3. Jika saya menekan spasi, dan singkatannya meluas dan saya berubah pikiran, mungkin saya harus bisa menekan delete dan unexpand itu.

Mudah-mudahan setelah tinggal di sana untuk sementara waktu, kita akan tahu apa yang terasa benar.

Terima kasih, saya menjalankannya sekarang dan sejauh ini tampaknya berfungsi dengan sangat baik.

  1. Kita bisa menggunakan singkatan abbr untuk singkatnya. Adapun alias , jika menurut kami itu lebih baik, mungkin bisa diganti dengan perilaku ini. Jika orang ingin menggunakan alias dalam skrip mereka, mereka bisa melakukan pembungkusan fungsi. Singkatan menurut saya persis untuk apa orang menggunakan alias secara normal.
  2. Saya pikir akan menyenangkan untuk memiliki beberapa fungsi pembantu untuk mendefinisikan dan juga menghapus singkatan.
    Misalnya: abbr gc 'git checkout' dan abbr -e gc .
    Agak rumit untuk melakukan manipulasi ini melalui variabel menurut saya. Juga akan menyenangkan untuk memastikan bahwa singkatannya unik. Jadi Anda hanya perlu menentukan yang baru untuk memperbaruinya.
  3. Saya lebih suka perilaku yang sekarang, banyak singkatan saya seperti gs untuk git status tidak akan begitu berguna jika Anda harus menekan spasi. Namun, saya akan baik-baik saja dengan enter ganda untuk benar-benar menjalankannya seperti yang Anda sebutkan.
  4. Secara pribadi saya baik-baik saja dengan tidak menggunakannya dalam skrip.
  5. Ya, ini akan keren. Tidak dapat memikirkan singkatan apa pun untuk menggunakannya di atas kepalaku.
  6. Ini juga merupakan ide yang bagus, jika saya menekan spasi terlalu dini untuk singkatan misalnya. Ini juga akan cocok dengan saran nomor 3 sebagai double enter (masih tidak yakin apakah saya ingin enter tambahan itu).

alias adalah pembungkus kompatibilitas POSIX. Saya tidak punya masalah dengan itu melakukan singkatan. Jika Anda menulis abbr gc 'git checkout' atau semacamnya, Anda tetap menginginkan penyelesaian untuk git checkout .

saya menggunakan implementasi skrip dari terlar selama beberapa minggu terakhir dan beralih ke versi asli baru hari ini jadi inilah dua sen saya di titik terbuka

  1. Saya pikir itu akan menjadi ide bagus untuk membiarkan alias melakukan singkatan sekarang. Sebagai Bonus itu akan memperbaiki penyelesaian yang tidak berfungsi pada alias saat ini.
  2. apa yang dikatakan terlar terdengar bagus
  3. Itu benar-benar akan mengganggu saya jika saya perlu menekan dua kali enter pada singkatan untuk menjalankannya. Akan lebih baik jika mereka juga berfungsi tidak diperluas seperti alias dengan sekali tekan enter tetapi kemudian saya memiliki singkatan yang tidak diperluas dalam riwayat saya
  4. --
  5. bukankah ekspansi variabel berarti konten variabel akan dimasukkan ke dalam perintah dan karenanya ke dalam riwayat Anda? Ini akan membuat kegunaan kembali perintah seperti itu dari riwayat jauh lebih rendah karena tidak lagi mengandung variabel tetapi hanya konten sebelumnya. Atau apakah saya salah memahami poin ini?
  6. Saya tidak melihat diri saya menggunakan fitur unexpand karena saya tidak menggunakan abbreviation lebih dari 3 karakter yang berarti semuanya pada dasarnya ada dalam memori otot dan akan lebih cepat untuk menghapus baris saat ini. Ini mungkin berbeda sekarang karena implementasi asli dapat digunakan di mana saja dan tidak hanya di awal baris. Tapi mungkin ide yang bagus jika itu tidak berarti saya harus selalu menekan spasi atau tekan dua kali enter untuk memperluasnya.

"Singkatan" panjang dan sulit dieja - dapatkah kami menemukan nama yang lebih baik? "Alias" akan bagus jika belum digunakan untuk hal lain. Salah satu kemungkinan adalah untuk membalikkannya, misalnya "ekspansi." fish_user_expansions terdengar OK bagi saya.

Setuju, tapi tidak dijual di "ekspansi".

Bagaimana seharusnya singkatan ditentukan? Sintaks checkout gc=git ringan tetapi tidak digunakan di tempat lain di fish.

Seharusnya hanya bawaan baru, seperti complete dan bind atau dalam hal ini function yang dapat dipanggil pengguna tetapi penyimpanan dasarnya buram.

Kami mungkin ingin tidak memperluas enter, hanya ruang. Memperluas saat masuk memiliki kelemahan bahwa pengguna tidak melihat perintah apa yang mereka jalankan sampai setelah mereka berkomitmen untuk menjalankannya. Jika kita memperluas hanya pada spasi, maka pengguna bisa mengetik singkatan, diikuti spasi, diikuti enter, yang sepertinya tidak terlalu memberatkan. Kemungkinan kedua adalah membuat entri pertama memicu ekspansi, dan entri kedua benar-benar menjalankannya.

Saya benar-benar berpikir kami ingin memperluas Enter . Saya membayangkan saya akan mendapatkan banyak fish: Unknown command “gc” membuat frustrasi dan saya tidak membayangkan saya akan sendirian dalam hal itu. Namun, ekspansi harus terjadi pada baris perintah, sebelum dieksekusi, sehingga Anda akan melihat ekspansi di scrollback dan itu adalah bentuk yang diperluas yang berakhir di histori.

Haruskah ekspansi singkatan itu sendiri menjalani subkulit dan ekspansi variabel sebelum substitusi? Saya pikir ya, karena itu akan membuat mereka sangat fleksibel. Singkatan kemudian dapat menjalankan kode ikan arbitrer.

Saya pikir tidak seharusnya. Biasanya akan lebih baik untuk memperluasnya pada saat baris perintah dijalankan. Katakanlah saya memiliki singkatan untuk membuat catatan waktu. Saya mengetik singkatan dan spasi, dan itu berkembang menjadi sesuatu seperti vim 12:34:56.txt . Sekarang, saya tidak menjalankan perintah ini selama beberapa detik, dan stempel waktu akan salah. Akan lebih baik jika singkatannya diperluas menjadi vim (time +%T).txt . Ini melakukan hal yang benar, dan juga berarti saya memiliki opsi untuk mengedit baris perintah sebelum menjalankannya, misalnya untuk menggunakan format waktu yang berbeda. Itu juga membuatnya dapat diulang; misalnya kill %firefox dapat dipanggil kembali dari sejarah dan dijalankan kembali bahkan ketika PID telah berubah. Terakhir, saya berpendapat bahwa ini lebih konsisten dengan ikan lainnya, di mana token pada baris perintah hanya dievaluasi pada waktu eksekusi.

Di sisi lain, mengevaluasi pada waktu ekspansi benar-benar lebih kuat karena kita dapat memilih keluar darinya misalnya dengan melarikan diri, tetapi tanpanya kita tidak dapat benar-benar _opt in_. Saya pikir ini akan lebih baik diselesaikan dengan #751, karena ini membuat pengguna mengendalikan evaluasi. Itu masih tidak memberikan cara untuk mendapatkan momen _exact_ dari ekspansi singkatan; itu akan menjadi momen pengguna memperluas token individu. Namun, saya pikir itu akan lebih berguna dan lebih konsisten, karena akan bekerja tidak hanya dengan singkatan tetapi dengan token apa pun pada baris perintah yang dapat dievaluasi, namun ditambahkan ke baris perintah.

Jika saya menekan spasi, dan singkatannya meluas dan saya berubah pikiran, mungkin saya harus bisa menekan delete dan unexpand itu.

Saya pikir ini tidak boleh di hapus atau mundur, karena bagian dari motivasi saya untuk singkatan adalah kemampuan untuk mengedit _bagian_ ekspansi sebelum dieksekusi. Mungkin ide yang lebih baik adalah menambahkan pengikatan untuk "hapus mundur dari kursor ke proses saat ini" seperti yang didefinisikan oleh commandline -p . Ini akan menyelesaikan masalah dengan singkatan (karena mereka hanya berkembang di posisi perintah) tetapi pada saat yang sama sangat berguna tanpa singkatan. Ini pada dasarnya akan bekerja seperti Ctrl-U tetapi berhenti di awal "proses" saat ini. Varian yang sesuai dengan Ctrl-K yang berhenti di _end_ dari proses saat ini dapat ditambahkan untuk konsistensi dan mungkin juga berguna.

Ini mungkin berbeda sekarang karena implementasi asli dapat digunakan di mana saja dan tidak hanya di awal baris.

Saya belum mencoba implementasi @terlar tetapi ini didasarkan pada milik saya di mana ekspansi benar-benar berfungsi dengan baik di posisi perintah _any_, bukan hanya awal baris, kudos commandline -p . Saya benar-benar kagum pada seberapa baik bukti kasar kode konsep saya bekerja! :ikan: :hati:

hmm kira saya tidak pernah benar-benar mencoba menggunakan singkatan di posisi perintah lain.
Ya, prototipe bekerja dengan baik, hanya ketidaknyamanan yang saya miliki adalah masalah menempel yang disebutkan, tetapi fitur itu bagus untuk tidak menggunakannya.

@sch1zo Menempel akan berfungsi jika Anda menggunakan Ctrl-Y .

itu mungkin masalahnya tetapi sebagian besar waktu saya menyalin/menempel melalui memilih/klik tengah dan di sana masalahnya ada. Tetapi implementasi asli tidak memiliki masalah itu lagi dan saya sudah memperbarui semua mesin saya untuk menggunakannya.

Jadi setelah ~ 10 hari menggunakan singkatan asli, saya menemukan satu hal yang mengganggu saya. Jika Anda sudah memiliki perintah yang diketik dan kemudian lompat ke awal baris untuk menambahkannya dengan singkatan, itu tidak diperluas dan tidak akan berfungsi dalam keadaan tidak diperluas. Situasi umum bagi saya adalah sebagai berikut:
Salah satu singkatan saya adalah !=sudo jadi sekarang ketika saya ingin mengedit beberapa file konfigurasi sistem seperti pada vim /path/to/some/file/I/am/not/allowed/to/write Saya sering terlambat menyadari bahwa saya perlu sudo jadi saya biasanya hanya melompat ke awal dan menambahkan ! sayangnya itu tidak akan memperluas singkatan dan meninggalkan saya dengan pesan command not found .
Solusi saya saat ini untuk ini adalah dengan hanya menambahkan alias untuk singkatan tetapi karena itu akan lebih baik jika itu akan berkembang dengan benar.

Sepakat; kita perlu melihat posisi kursor ketika spasi dimasukkan, bukan hanya "token pertama". Atau, pertama-tama masukkan spasi dan kemudian uraikan kembali baris perintah dan perluas singkatannya.

Komit b6f495d1077b7627ea851da33936c77b2d594bb2 harus memperbaiki masalah yang diidentifikasi @sch1zo (dengan ! untuk sudo)

Hal lain untuk ditambahkan ke ini: kita mungkin harus membuat ll , la , dan alias sejenisnya secara default alih-alih fungsi.

Saya menargetkan ulang ini ke next-minor karena fitur ini mungkin akan dikirimkan bersama rilis berikutnya.

Rilis berikutnya kemungkinan akan segera dilakukan, yaitu pada akhir minggu depan. Saya hanya membersihkan dokumentasi saat ini.

Singkatan akan dimasukkan dalam keadaan tidak lengkap saat ini. Saya tidak ingin mempublikasikan atau mendokumentasikannya sampai kita memiliki perintah abbrev (atau menggunakan kembali alias ). Untuk alasan itu saya mendorong ini kembali ke jurusan berikutnya.

Saya tidak berpikir alias adalah istilah yang baik. Bagi saya, alias adalah nama alternatif... bukan sesuatu yang perlu diperluas.

Saya juga tidak suka abbr , untuk alasan yang sama.

Saya berpikir tentang expand foo "foobar" ... tetapi tampaknya perintah expand sudah ada :/ Sayang sekali, saya pikir expand akan menjadi istilah terbaik.

Bagaimana dengan menyatukan alias dan singkatan? Alih-alih memperkenalkan fungsi baru atau menghentikan alias , perkenalkan opsi konfigurasi ke "perluas alias". Kelemahannya di sini adalah kami tidak menyukai opsi konfigurasi pada ikan (tetapi kami mungkin dapat melewati opsi konfigurasi) dan (mungkin hal yang baik) itu berarti kami tidak dapat menggabungkan dua perilaku meskipun Anda masih dapat menulis fungsi normal untuk mendapatkan yang lama alias perilaku... Keuntungannya adalah kami tidak memiliki dua cara untuk melakukan hal serupa, mudah dijelaskan ("alias mengembang di ikan") dan singkatan akan benar-benar berfungsi dalam skrip (karena mereka juga alias) yang juga berarti mereka juga tidak harus memiliki casing khusus dalam penyorot sintaks. Dan dengan memindahkan mesin alias ke kode C++ kita bisa menghindari kelambatan implementasi alias saat ini. Masih perlu mencari cara agar penyelesaian berfungsi untuk alias yang tidak diperluas.

Satu permintaan fitur...

Saya sebelumnya menggunakan fungsi untuk mengeluarkan kombinasi perintah yang sering digunakan dalam satu perintah, seperti git add, git commit dan git Push dalam satu operasi.

Saya suka fitur singkatan baru. Saya pikir itu besar dan saya mencoba untuk beralih ke sana. Saya setuju dengan fakta bahwa itu terbatas pada ekspansi perintah tunggal. Namun, saya masih ingin mengeluarkan banyak perintah sekaligus. Sekarang saya bisa menggunakan singkatan untuk perintah pertama, diikuti dengan titik koma, lalu singkatan untuk perintah kedua, dll. Ini berfungsi dengan baik, sebenarnya saya pikir lebih baik seperti ini.

Permintaan saya adalah bahwa ekspansi dipicu tidak hanya oleh spasi atau enter tetapi juga oleh titik koma. Karena titik koma pada dasarnya setara dengan entri yang tertunda, saya kira ini juga masuk akal bagi Anda semua.

Tidak sabar menunggu fitur ini dirilis secara resmi!

Masuk akal bagi saya.

1a7b33e8fb75dd702730ca9637d760fbd23a4000 memperluas singkatan pada titik koma.

Terima kasih!

Di mana fish_user_abbreviations disimpan? Saya ingin menambahkannya ke repo dotfiles saya.

Saat ini variabel universal, jadi disimpan di ~/.config/fish/config.fish. Tapi ini hanya peretasan sementara sampai kami menemukan cara yang tepat untuk menyimpannya. Umpan balik di sini diterima.

Jika mau, Anda bisa menambahkan baris ke config.fish seperti set -g fish_user_abbreviations... untuk mengaturnya secara manual.

Hm, saya tidak melihat variabel itu di sana.

Saya menggunakan set -U fish_user_abbreviations 'g=git' . Apakah itu cara yang tepat untuk memasukkannya ke config.fish?

Maaf, maksud saya itu akan disimpan di ~/.config/fish/fishd.[mac_address] . Jelas menyinkronkan itu tidak akan berfungsi (berdasarkan desain) karena itu dimatikan dari MAC.

Untuk memasukkannya ke dalam config.fish, Anda akan menulis `set -g fish_user_abbreviations 'g=git'. -g untuk global, karena Anda mengaturnya setiap saat.

Saya pikir variabel universal cukup rapi, hanya perlu UI yang lebih baik melilitnya.

Jika kita menggunakannya sebagai array, baik dengan = untuk membagi kunci dan nilai, atau ASCII FS ( \x1c ), maka fungsi ikan untuk mengelolanya ( abbr ) + /- halaman antarmuka web akan berguna.

Pemikiran harus diberikan untuk menghasilkan output yang sesuai untuk ekspor/transfer.

@ridiculousfish Ahh, terima kasih, itu sangat membantu! Saya akan melakukan itu untuk saat ini sampai ada proses untuk mengekspor.

Btw, saya netral untuk memiliki A) satu file dengan semua singkatan atau B) file terpisah untuk setiap singkatan. Mungkin condong ke arah A tapi tidak kuat.

Saya menambahkan UI dasar di sekitar implementasi yang ada sebagai abbr - gunakan abbr -h untuk melihat lebih banyak. Saya juga menambahkan UI hanya-lihat ke antarmuka web, tetapi akan lebih baik jika itu dilakukan lebih banyak.

Daripada menggunakan = sebagai pemisah, kita bisa menggunakan token pertama (dipisahkan dengan spasi?) dari setiap item array - ini akan menyederhanakan implementasi.

Variabel universal rapi, tetapi jika kita tidak mengeksposnya secara langsung, mungkin lebih baik untuk memindahkannya ke __fish_user_abbreviations (dan mungkin memperingatkan tentang pengaturannya di tingkat lokal atau global).

Saya lebih suka space-separated daripada menggunakan = sebagai pemisah. Terutama karena gaya itu tidak digunakan di tempat lain di dalam fish .

Saya setuju bahwa ini harus dipisahkan oleh ruang. Itu sedikit lebih masuk akal, dan itu berarti = sebenarnya bisa menjadi bagian dari singkatan jika diinginkan. Perintah abbr mungkin harus dimodifikasi untuk menghapus flag --add dan hanya mengambil dua argumen saja.

Mengenai $__fish_user_abbreviations , saya dapat bersimpati dengan saran ini, tetapi masuk akal bahwa pengguna mungkin ingin memodifikasi $fish_user_abbreviations sendiri tanpa menggunakan perintah abbr , dan saya lebih suka tidak mendorong siapa pun untuk secara langsung memodifikasi variabel $__fish_* . Demikian pula, menetapkannya di tingkat lokal atau global adalah sah; tidak semua orang ingin menggunakan variabel universal untuk hal-hal seperti ini.

Pada catatan terkait, read mungkin harus memperluas singkatan pada input interaktif saat menggunakan flag --shell .

Kekhawatiran saya dengan mendorong modifikasi variabel di luar perintah abbr adalah bahwa memperluas perintah untuk mendukung pelingkupan meningkatkan kompleksitasnya dalam hal UI, tetapi tidak melakukannya mengarah pada hasil yang berpotensi menyesatkan. Tidak ada penggabungan cakupan variabel saat ini, yang mungkin membingungkan - jika Anda menetapkan ekspansi universal dan ekspansi global (berbeda), haruskah keduanya berfungsi? Lalu, bagaimana Anda membatalkan ekspansi universal dalam lingkup global? Apakah ini sesuatu yang orang ingin lakukan?

Pemisahan ruang terdengar seperti ide yang bagus. Untuk menghindari kebingungan, menambahkan singkatan baru mungkin harus mengambil jumlah argumen yang tidak terbatas, dengan yang pertama menjadi 'kata' dan sisanya bergabung menjadi 'frasa'.

Tidak perlu melakukan pekerjaan apa pun untuk "mendukung pelingkupan". Jika abbr hanya menggunakan $fish_user_abbreviations , itu akan menggunakan variabel global jika ada, atau universal sebaliknya. Begitulah cara pembaca bekerja. Satu-satunya kerutan adalah jika pengguna menetapkan $fish_user_abbreviations sebagai variabel lokal di tingkat atas, pembaca akan benar-benar melihatnya juga. Dan memperbaiki sederhana adalah dengan menambahkan -S bendera ke abbr deklarasi fungsi, yang akan membiarkannya melihat variabel lokal didefinisikan dalam induknya. Tetapi jelas tidak perlu mencoba dan menggabungkan singkatan (atau cara apa pun untuk melakukannya, selain menghapus sementara variabel di cakupan lain).

Setelah menjalani ini, saya pikir saya ingin melihat singkatan digarisbawahi atau disorot secara berbeda, sebelum diperluas. Ini memberi saya kepercayaan diri bahwa saya mengetiknya dengan benar. Pikiran?

Dukungan pemisah ruang ada di fbade198b942a666d3fc1110804a7da2c47918f1

Jika Anda menekan spasi dan tidak mengembang, maka Anda tahu Anda tidak mengetiknya dengan benar. Saya tidak menentang menggarisbawahi atau menyorot (tentu saja akan menjadi isyarat tambahan untuk memberi tahu pengguna mengapa baris perintah mereka baru saja berubah), tetapi saya tidak yakin saya mengerti mengapa Anda harus memiliki kepercayaan diri sebelum mencapai spasi.

@ridiculousfish Mengenai fbade198b942a666d3fc1110804a7da2c47918f1, singkatan cukup baru (dan tidak didokumentasikan hingga master baru-baru ini) sehingga kita harus menghapus dukungan = .

Saya sedang memikirkan kasus sebelum-kembali, bukan kasus sebelum-ruang

Terdengar bagus untukku. Saya kira itu _is_ mungkin untuk berlebihan dengan penyorotan, mengakibatkan kelambanan dan informasi yang membingungkan yang berlebihan, tetapi saya tidak berpikir itu yang terjadi di sini. Juga, saya kira, itu akan menggunakan beberapa variabel $fish_color_abbr-or-whatever sehingga dapat dengan mudah dinonaktifkan oleh mereka yang menginginkannya, untuk alasan apa pun.

Pada awalnya saya akan berkomentar bahwa saya merasa tidak intuitif bahwa perilaku penyorotan berbeda untuk singkatan vs perintah normal, sampai saya menyadari bahwa saya salah dan itu konsisten.

Kebingungan saya berasal dari fakta bahwa saya mencampurkan highlight dan fitur penyelesaian yang disarankan.

Misalnya, ketika saya mengetik "echo", sorotannya berwarna merah sampai saya mengetikkan perintah lengkap, yang seharusnya. Namun penyelesaian yang disarankan berhasil mengantisipasi apa yang akan saya ketik dan memberi saya kepastian bahwa saya menuju ke arah yang diinginkan.

Saya tidak menerima umpan balik seperti itu untuk singkatan, yang disayangkan karena saya tidak dapat sering membuat pemendekan perintah yang mudah diingat, terutama yang diperluas ke perintah kompleks.

Faktanya, tujuan saya adalah untuk mengemas berbagai perintah ke dalam namespace kecil (saya memotret ~5 karakter singkatan dan memiliki ratusan). Karena itu, saya lebih mengandalkan panduan shell yang saya tuju untuk mengetik perintah yang valid. Sesuatu yang memenuhi peran yang disarankan untuk diselesaikan, tetapi untuk singkatan alih-alih perintah biasa, akan sangat membantu, lebih dari untuk perintah standar bahkan untuk saya.

Saya dapat melihat kesulitan untuk penyelesaian yang disarankan yang ditimbulkan oleh singkatan. Tidak intuitif jika singkatan diperluas ke perintah yang sebenarnya karena tidak lagi bersebelahan dengan apa yang Anda ketikkan. Namun, saya merasa itu bisa lebih baik daripada sekarang.

Setidaknya bagi saya, memasukkan singkatan itu sendiri (bukan perluasan) dalam pelengkap yang disarankan akan menggores gatal saya. Saya hanya ingin melihat bahwa saya mengetik dengan benar awalan dari singkatan yang ditentukan. Itu cukup untuk memberitahu saya bahwa saya tidak mengetik dengan sia-sia karena saya salah ingat atau salah ketik singkatan saya.

Saya mencoba memperluas abbr.fish untuk menangani kedua spasi dan pemisah = , tetapi saya belum banyak berhasil dalam menghasilkan solusi yang kuat tanpa mengeluarkan alat eksternal.

Saya pikir rencananya adalah untuk menghapus = support? Saya berpikir untuk melakukannya saja, dan kemudian memposting pesan ke milis ikan dengan skrip yang menampilkan $fish_user_abbreviations yang dapat dijalankan orang untuk beralih ke spasi.

Hai semuanya,

Saya ingin membuat catatan setelah menggunakan singkatan untuk beberapa waktu sekarang.

Saya penggemar berat, dan mereka membuat hidup saya lebih mudah. Saya terutama menyukai kenyataan bahwa orang lain dapat melihat perintah apa yang saya keluarkan, dalam bentuk yang familier.

Satu-satunya ketidaksukaan saya adalah tidak ada riwayat untuk singkatan. Karena saya menggunakan singkatan untuk hampir setiap perintah, ini akhirnya membuat saya kehilangan sebagian besar fungsionalitas riwayat. Meskipun Anda mungkin berpikir bahwa singkatan harus cukup pendek untuk tidak memerlukan fungsionalitas riwayat, saya menemukan diri saya sedikit melewatkannya. Saya memiliki lebih dari 200 singkatan yang ditentukan, dan beberapa di antaranya hanya sedikit berbeda. Memiliki riwayat menunjukkan kepada saya yang saya terbitkan kemarin, misalnya, akan sangat berguna untuk singkatan yang lebih sering digunakan dan lebih jarang digunakan. Karena saya praktis hidup dengan singkatan, saya harus menggunakan fungsi sebagai gantinya di mana saya memerlukan dukungan riwayat karena saya benar-benar tidak memiliki riwayat sebaliknya.

Terima kasih sekali lagi untuk fiturnya.

@binaryphile Sangat menarik. Sepertinya Anda memiliki gagasan tentang seperti apa tampilannya (yaitu UI). Apakah Anda ingin menggambarkannya secara lebih rinci?

Pertanyaan bagus. Saya kira saya hanya ingin jika ada ekspansi yang dipicu maka singkatan itu masuk ke daftar riwayat. Jadi jika saya singkatan saya adalah "gclon" untuk "git clone", maka ketika saya menekan spasi (atau titik koma), "gclon" akan ditambahkan ke riwayat saya. Saya tidak akan mengubah perilaku normal menyimpan perintah yang diperluas dalam sejarah, jadi keduanya akan tersedia.

Setelah itu, ketika saya mulai mengetik awalan dari singkatan (seperti "gcl"), saya berharap "gclon" menjadi opsi pertama untuk pelengkapan otomatis yang muncul.

Idealnya, pada saat itu saya dapat menekan alt-f dan menyelesaikannya secara otomatis ke versi yang diperluas, ditambah lagi menawarkan pelengkapan otomatis baru dari perintah yang diperluas dari sejarah. Saya menginginkannya karena saya mungkin telah memasukkan argumen lebih lanjut setelah ekspansi, dan ingin agar itu tersedia dalam penekanan tombol sesedikit mungkin melalui rute yang sama dengan yang saya masukkan di tempat pertama (disingkat kemudian argumen). Karena singkatan dalam sejarah tidak akan memiliki argumen, alt-f akan menjadi metode paling alami bagi saya untuk melangkah lebih jauh di sepanjang argumen penyelesaian demi argumen.

Saya pikir ctrl-f tidak akan berubah dan hanya akan bergerak maju ke akhir singkatan, bukan versi yang diperluas, karena tidak akan ada isyarat visual tentang apa yang akan Anda perluas.

Saya baru saja membangun dan berlari setiap malam untuk akhirnya menguji ini! Saya sangat menyukai fitur ini dan menyukai fakta bahwa ada perintah abbr yang disertakan bersamanya.

Umpan balik saya adalah bahwa kami membutuhkan cara yang baik untuk mengekspor untuk cadangan dotfile. Saya pikir ini semua harus masuk ke satu file dalam format abbr --show output. abbr --show cukup baik untuk saya untuk saat ini, saya hanya akan menyalurkannya ke dotfile untuk saat ini. Tetapi saya ingin cara mudah untuk mengimpornya lagi ketika saatnya tiba. Jadi jika Fish bisa mengimpor format itu sekarang, itu akan menjadi langkah bagus berikutnya.

Mengikuti perintah dalam bantuan untuk menambahkan singkatan baru gagal dengan kesalahan ini.

selection_235

Saat ini Anda perlu memasukkan abbr -a "gco git checkout" tetapi saya pikir akan lebih masuk akal untuk mendukung kasus yang dijelaskan dalam manual.

Terima kasih!

48d3536 membuat perubahan itu.

Saya pikir kita harus meninggalkan dukungan pemisah '=' di rilis minor berikutnya dan menonaktifkannya setelah itu, atau (diam-diam?) tingkatkan fish_user_abbreviations .

Saya akan menutup ini sebagai tetap; Saya mengajukan #2051 untuk melacak migrasi. Terima kasih banyak kepada @dag untuk konsepnya dan semua orang yang mengujinya - menantikan untuk segera merilisnya!

W00t, terima kasih semuanya, saya sangat MENCINTAI fitur ini!!

Saya suka singkatan, ini pengalaman yang jauh lebih ramah daripada alias. Terima kasih banyak!

Saya menemukan utas ini sambil mencari cara menyimpan singkatan di dotfiles 1 , 2 .
Jika ada yang tersandung di sini karena alasan yang sama, Anda dapat menggunakan abbr -s/--show . Sebagai contoh

abbr --show >> ~/.config/fish/config.fish

@dideler Saya menggunakan sesuatu yang mirip dengan itu untuk pencadangan otomatis, saya juga merekomendasikan pemipaan ke sort .

abbr --show | sort > fish_abbreviation_backup;

Saya memasukkan semuanya ke dalam file fish_abbreviation_backup dan kemudian menambahkannya ke Homeshick untuk cadangan. Itu semua otomatis dan berjalan di cron. Setelah saya backup saya source fish_abbreviation_backup sehingga ikan menunjukkan urutan abjad ketika melakukan abbr --show .

Akan lebih baik jika ikan menyimpan singkatan dalam file, mirip dengan cara kerjanya dengan fungsi.

pembaruan: Masalah untuk mengurutkan singkatan saat menyimpannya -> https://github.com/fish-shell/fish-shell/issues/2156

Alangkah baiknya jika ikan menyimpan singkatan dalam file ...

Dari halaman manual: "Singkatan disimpan menggunakan variabel universal." Yang berarti Anda akan menemukannya di file _~/.config/fish/fishd.macaddr_ di bawah nama var fish_user_abbreviations . Perintah abbr hanya memanipulasi var universal itu.

Terima kasih, apakah boleh mempertimbangkan ide untuk menyimpannya di ~/.config/fish/abbreviations.fish sehingga kami dapat menambahkannya dengan mudah ke dotfiles kami?

@ElijahLynn : Apa yang saya lakukan adalah saya memiliki file bernama "abbrs.fish" di ~/.config/fish/conf.d/, dengan isi sebagai berikut:

if not set -q fish_initialized
    abbr -a alsamixer alsamixer -c0
    abbr -a e emacs -nw
    abbr -a \$PAGER less
    abbr -a mu4e emacs --eval "\(mu4e\)"
    abbr -a pm pulsemixer
    abbr -a rm rm -I
    abbr -a sc systemctl
    abbr -a upo upower -i /org/freedesktop/UPower/devices/battery_BAT0
    abbr -a usc systemctl --user
    # Double-escaping needed
    abbr -a d2 env WINEPREFIX=/home/alfa/.wine32/ wine ~/.wine/drive_c/Program\\ Files\\ \\(x86\\)/Diablo\\ II/Diablo\\ II.exe
    abbr -a c curl -LO -C -
    set -U  fish_user_paths ~alfa/.local/bin $GOPATH/bin
    set -U fish_initialized
end

Saya memiliki ini di dotfiles saya , dan saya bisa memasukkannya ke mesin apa pun yang belum saya gunakan, dan jika saya ingin mengatur ulang abbrs, saya dapat menghapus semuanya (saya lakukan set -e fish_user_abbreviations; set -e fish_initialized ) dan ulangi ikan.

Terima kasih, saya mungkin melewatkan ini tetapi sepertinya Anda perlu mempertahankannya secara manual dan tidak dapat menambahkannya dengan mudah dengan perintah abbr .

Anda menambahkan perintah abbr di sana. Ini bahkan bisa menjadi output dari panggilan abbr --show .

Hanya di posisi komando mungkin merupakan awal yang baik. Kemudian kita mungkin bisa bereksperimen dengan kasus penggunaan posisi argumen yang saya sarankan sebelumnya.

Saya pikir tidak hanya posisi di awal saja yang akan sedikit, contoh: s untuk sudo dan n untuk nano yang dapat berkembang dari s n hingga sudo nano , tetapi tidak dalam implementasi saat ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat