優れた編集機能を備えたシェル


11

シェル(少なくとも私が知っていること)には、本当に悪いコマンド編集機能があります。

例えば:

  • コマンドのどのポイントにもカーソルを合わせることができません。
  • コマンド内のテキストを選択してバックスペース/削除/置換することはできません。

現在、これらは非常に注意をそらします。端末に貼り付ける前に、geditを使用してコマンドを編集します。

これらに適したソリューションはありますか?


2
端末をシェルと統合しています。
JdeBP

回答:


13

Bashは実際にはこれが非常に得意です。そのショートカットを学ぶ必要があります。例(デフォルトのemacsモードの場合):

  • Ctrl+ A:行の先頭に移動します。
  • Ctrl+ E:行の最後に移動します。
  • Ctrl+ B:1文字後ろに移動します。
  • Ctrl+ F:1文字前に移動します。
  • Alt+ B:1単語後方に移動します。
  • Alt+ F:1単語先に移動します。
  • Ctrl+ K:行末まですべてを削除(カット)します。
  • Alt+ D:カーソルの後の単語を削除(カット)します。
  • Ctrl+ W:カーソルの前の単語を削除(カット)します。
  • Ctrl+ Y:バッファにあるものをヤンク(貼り付け)(たとえば、Ctrl+ KまたはAlt+ Dでカットしたもの)

そして、もっとたくさんあります。man readline他に何が利用できるかを読むために読んでください。に異なるショートカットを配置できます~/.inputrc。例えば、作るためにCtrl+ Left1つの単語を移動して、Ctrl+ Rightあなたにこれを追加し、前方の1つの単語を行きます~/.inputrc

"\e[1;5D": backward-word 
"\e[1;5C": forward-word

これらの奇妙なコードの意味を調べるには、Ctrl+ Vを押してから、使用するキーを押します。あなたがしようとした場合Ctrl+ Right、あなたが表示されます^[[1;5C。交換する^[\eの中で~/.inputrc


他のシェルを調べることもできます。人気のある「モダン」で機能豊富なシェルには次のものがあります。


ではgnome-terminal、あなたは使用する必要がESC代わりにボタンをALT 前後にナビゲート1ワードに。。..または、アプリケーションメニューにAltを使用しない端末に切り替えます。。。xtermやsakuraのような
Sergiy Kolodyazhnyy

@Sergは私のシステムにはありません、ありがとう。あなたがそのように設定したのか、それともUbuntuによって調整されたデフォルトであるのかはわかりません。Escは、Altの同義語としてよく使用されます。
テルドン

ただし、端末間でカットバッファを共有することはありません。
クレイグヒックス

7

選択EDITORしたエディターに設定し、現在編集中の行を開くCTRL+ X+ EまたはCTRL+ X/ CTRL+を押すことにより、空または部分的に入力したコマンドを選択したエディターに編集できます。EEDITOR

たとえば、に設定EDITORするgeditと、CTRL+ X+ EおよびCTRL+ X/ CTRL+ EがGeditの現在の行を開きます。

この恒久的な解決策を作成するには、設定することができますEDITORの中で~/.bashrc

これにより、完全に機能するグラフィカルテキストエディターを使用してコマンドを編集できます。編集したコマンドを実行するには、単にドキュメントを保存して閉じます。


以下を追加することにより、同じ機能をZshで有効にできます~/.zshrc

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line

2
これはfc、FCEDIT変数が設定されている場合、コマンドで呼び出すこともできます。いい答えです !
セルギーKolodyazhnyy

1
しかし、@ Serg Thanksはfc前のコマンドを開きます(特定の点でもっときれいです)。知りませんでした、ありがとう!
コス

6

端末にはテキスト編集機能はありません。端末はテキスト領域を提供し、キーボードを何かに接続します。しかし、何かあなたは、端末内で実行することは、それが何ができるかを決定します。

などのシェルbashは、通常、端末内で実行することが最初に見つかるものです。シェルはコマンドに基づいて機能するため、現在のコマンドのみを編集できます。 優れた提供して編集がコマンドを Bourneシェルと比べたりcshまたはkshまだそれはほとんどあなたもショートストーリーで編集したいと思う何かではありません。

テキストエディターは、シェルで呼び出すことができるコマンドの1つです。主な例はです。 vimまたはemacs、ほとんど何でも編集できるようになります。どちらにも、直面している問題に機能を拡張するための組み込みプログラミング環境が含まれています。

したがって、解決策は、これらのツールが何をしているのかをよりよく理解し、何をするつもりで、仕事に合ったものを選ぶことです。


私は違いを知っていますが、bashのコマンド編集を改善するために何かできますか?
UniversallyUniqueID

1
スクリプトに入れますか?

0

通常、端末ではマウスでテキストを選択できますが、シェルはこれを認識しません。だから、残念ながらどちらもbashzshfishesマウスベースの編集をサポートすることができます。そうするためには、彼らはターミナルをより強く管理する必要があるでしょう。

ただし、VimまたはGVimを開いてから、次のコマンドを使用してシェルコマンドを入力する場合(これ少しストレッチです):

:!...

次に、マウスをクリックして行の任意の場所にジャンプできます。(:set mouse=aまだ有効になっていない場合は、最初に行う必要があります。)このモードの編集キーは、:help cmdline-editing

Vimには非常に強力なコマンド履歴モードもあり、を押すとアクセスできますq:。そこから、Vimの通常モードコマンドを使用して、ヤンク、削除、および貼り付けを行うことができます。このモードでは、マウスで選択してから、(を押すことでd)必要な機能を削除できます。

ここで重要な注意点は、Vimが実際にライブシェルセッションを実行し続けないことです。実行する各コマンドは、子プロセスで実行されます。そのため、子プロセスによって環境変数またはシェルオプションに加えられた変更は失われます。

とはいえ、Vimプロセスから環境変数を変更し、Vimのコマンドラインからこれらを使用すると、子プロセスにエクスポートすることもできます。

:let $FOO="bar"        " the $ and the quotes are mandatory here

:echo $FOO             " Vim's own echo command
bar

:!echo "$FOO"          " Passing the variable to a shell command
bar

:!bash                 " Opening a child shell
$ echo "$FOO"
bar

したがって、Vimが実際にはある種の奇妙なシェルであるかのように振る舞う場合は、その高度な編集機能をお楽しみください!おそらく最大の欠点は、次のいずれ:!かを入力してすべてのコマンドを開始する必要があることですq:

ところで、シェルコマンドの出力を現在のVimバッファーに取得する場合は、次のようにできます(ただし、現在の行が上書きされることに注意してください)。

:,!ls
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.