web-dev-qa-db-ja.com

最後の単語を削除(Ctrl-W):bashシェルをvimコマンドラインのように動作させる

Bashシェルで利用できる多くの便利なキーボードショートカットの中には、 Ctrl-W カーソルの左側にある単語を削除します。私のコマンドラインが次のようになっているとしましょう。

cp some-file /foo/bar/baz/copy

今、私は押すことができると期待しています Ctrl-W そして、次のようになります。

cp some-file /foo/bar/baz/

Vimのコマンドラインでは、実際には次のように機能します。英数字のみが「単語」として扱われ、特殊文字(/など)は新しい「単語」の開始を示す区切り文字として機能します。

しかし残念ながら、これまで使用したすべてのシェルでそのように機能するわけではありません。スペースだけが「単語」を区切るので、上記のコマンドラインでショートカットを押すと次のようになります。

cp some-file

BashをVimのように動作させる方法はありますか? .bashrcに入れることができるいくつかの構成?

6
lethal-guitar

これはVimとは何の関係もありません。すべてのエディターはそのように動作し(emacsを含む)、Word以外の文字を区切り文字として扱います。とにかく、あなたが話している振る舞いはreadlineによって制御され、そのマニュアルにはショートカットを割り当てることができるかなりの数のコマンドがリストされています。ここにいくつかの関連するものを貼り付けていますが、詳細についてはman readlineを読むことをお勧めします。

   backward-Word (M-b)
          Move  back  to  the  start  of the current or previous Word.  Words 
          are composed of alphanumeric characters (letters and digits).

   kill-line (C-k)
          Kill the text from point to the end of the line.
   kill-Word (M-d)
          Kill from point the end of  the  current  Word,  or  if  between
          words,  to  the  end  of the next Word.  Word boundaries are the
          same as those used by forward-Word.
   backward-kill-Word (M-Rubout)
          Kill the Word behind point.  Word boundaries  are  the  same  as
          those used by backward-Word.
   unix-Word-rubout (C-w)
          Kill  the  Word behind point, using white space as a Word bound‐
          ary.  The killed text is saved on the kill-ring.
   unix-filename-rubout
          Kill the Word behind point, using  white  space  and  the  slash
          character  as  the Word boundaries.  The killed text is saved on
          the kill-ring.

したがって、必要なのはbackward-kill-Wordで、これは英数字以外の文字を単語の境界として使用します。デフォルトでは、 Alt+Backspace ただし、すべてのユーザーに適用する場合はグローバル/etc/inputrcを使用するか、(より適切には)独自のローカル$HOME/.inputrcを使用して変更できます。

私の知る限り、 Ctrl+W 予約されているようで、それを使用することはできませんが、別のショートカットを選択できます。 Ctrl+J 例えば。 $HOME/.inputrcファイルが存在しない場合は作成し、次の行を追加します。

Control-J: backward-kill-Word 

最近のほとんどのターミナルエミュレータでは、これで十分です。ただし、一部の古い端末は異なるコードを使用します。たとえば、xtermを使用している場合、上記の行は次のように記述する必要があります。

C-J: backward-kill-Word 
11
terdon

次の行を~/.inputrcに入れて新しいシェルを開始することにより、いわゆる「viモード」のreadline(したがってbash)を有効にできます。

set editing-mode vi
set keymap vi-command

しかし、<C-w>はデフォルトのEmacsモードと同じように機能することに気付くでしょう。単語はスペースで区切られています。ただし、dT/または同様のコマンドを実行できます。それはまだエミュレーションであり、実際の取引ではありません。利用可能なマッピングは、readlineのマニュアルにリストされています。

$ man readline
/VI

Vim wikiのこのページ も参照してください。

しかし、コマンドラインを真剣に編集する必要がある場合は、readlineのviモードはそれほど便利ではないと思います...実際にVimを使用してみませんか

<C-x><C-e>
5
romainl

私が知っている2つのオプションがありますが、どちらもあなたが求めることを直接行いません。

  1. viモードを使用するようにbashを設定すると、プロンプトはviの行のように動作します。コマンドはset -o vi。参照: BASHヘルプ-Bashチュートリアル
  2. 現在のシェルプロンプトにviキーマップを追加します。参照: StackOverflow:set key map viは何をしますか?
1
Theo