Parameter terakhir dari perintah terakhir dalam bash dalam mode-vi

19

Saya telah diyakinkan (di Stack Overflow) untuk menggunakan bash kesayangan saya dalam mode vi. Sejauh ini saya terbiasa dengan itu dan saya menyukainya.

Namun saya benar-benar kehilangan satu fitur: Dalam emacs-mode, Anda dapat memasukkan parameter terakhir dari perintah sebelumnya dengan menekan "ESC." (Yaitu, tekan pelarian diikuti oleh.)

Apakah ada ikatan standar untuk memasukkan parameter terakhir dalam mode-vi? Saya tidak dapat menemukan satu dan saya benar-benar kehilangan perintah ini ...

Mo.
sumber

Jawaban:

9

Tidak ada standar. Ikatan untuk 'yank-last-arg' (seperti yang tercantum oleh 'bind -p') menghilang ketika Anda beralih ke mode vi.

bind '"\e."':yank-last-arg

akan memberi Anda itu mengikat kembali yang sama (atau memilih sesuatu yang lain)

Polsy
sumber
1
klon untuk zshbindkey "\e." insert-last-word
jhvaras
Saya sudah memilikinya selama bertahun-tahun di zsh dan setiap kali saya dipaksa untuk menggunakan bash (misalnya di server di tempat kerja) saya selalu lupa saya tidak pernah menemukan cara mengaturnya di bash. Tidak lagi! Ini dalam kombinasi dengan history-search-backwardssangat berharga bagi pengguna baris perintah yang serius.
Sridhar Sarnobat
11

Ada (vi-yank-arg), secara default dipetakan ke "_". Itu harus melakukan apa yang Anda inginkan (dalam mode perintah).

Mika Fischer
sumber
+1. Saya tidak yakin mengapa jawaban ini tidak diterima.
Sathyam
7

Tidak persis sama, tetapi dalam mode mana pun Anda dapat mengetik !$, dan itu akan diganti dengan kata terakhir dari perintah sebelumnya. Temukan lebih banyak hal seperti itu di manual .

legoscia
sumber
Cukup dekat untuk mendapatkan upvote tetapi tidak persis sama ... Saya kehilangan kemungkinan untuk mengedit baris sebelum menjalankannya. Tapi terima kasih banyak pula!
Mo.
5

File ~ / .inputrc dapat mengkonfigurasi key-map (Anda dapat membuatnya secara manual jika tidak dapat ditemukan). Tambahkan perintah berikut ke ~ / .inputrc :

"\e.": yank-last-arg
"\e_": yank-last-arg

~ ~ .Inputrc saya adalah:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

set editing-mode vi
set keymap vi-insert

"\C-p": previous-history
"\C-n": next-history
"\C-a.":beginning-of-line
"\C-e.":end-of-line

"\e.": yank-last-arg
"\e_": yank-last-arg

Anda dapat menemukan detail tentang readline dan di bind -psini: http://linux.about.com/library/cmd/blcmdl3_readline.htm

Dan beberapa informasi tentang keyblindings Vi di bash dan Readline VI Editing Mode Cheat Sheet

Marslo
sumber
3

Di dalam .bashrc Anda, tambahkan ini:

set -o vi
bind -m vi-command ".":insert-last-argument
bind -m vi-insert "\C-l.":clear-screen
bind -m vi-insert "\C-a.":beginning-of-line
bind -m vi-insert "\C-e.":end-of-line
bind -m vi-insert "\C-w.":backward-kill-word

Ini akan mengembalikan perilaku default tidak hanya ESC-dot - tetapi juga Ctrl-A, Ctrl-E, Ctrl-W dan Ctrl-L. Karena itu Anda dapat menikmati mode-bash normal dan tetap menggunakan pintasan yang Anda kenal dan sukai. Jika Anda memerlukan lebih banyak tindakan, cukup centang "man bash" untuk menemukan nama tindakan readline yang Anda butuhkan (seperti "clear-screen", "end-of-line", dll).

ttsiodras
sumber
0

Anda dapat menggunakan $_untuk merujuk ke argumen terakhir dari perintah sebelumnya.

Kerugiannya adalah:

  1. Anda tidak dapat memverifikasi sebelum menekan Enter bahwa benda yang dimasukkan adalah benda yang ingin Anda masukkan.

  2. Jika Anda menggunakan PROMPT_COMMAND atau jebakan DEBUG (saya tidak yakin yang mana, yang menyebabkan masalah; Saya memiliki keduanya di .bashrc saya) untuk melakukan hal-hal mewah seperti memasukkan perintah yang berjalan ke dalam judul xterm, ia akan musnah $_.

Marius Gedminas
sumber