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 ...

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)


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).


+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 .


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


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).


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 $_.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.