端末入力をファイルに書き込むのに代わるものは何ですか?

端末入力をファイルに書き込むのに代わるものは何ですか?

cat > something.txtQuickとCtrl+ closeを使用することは、端末に貼り付けるか、手動で入力したファイルにすばやく何かを書きたいときにD便利なショートカットです。ただし、もちろん、明らかなエラーがある場合はカーソルを移動できないため、テキストエディタ(vimやnanoなど)を開くことはできません。しかし、これは端末マルチプレクサを使用しない限り画面を占有し、私のユースケースには少し不便または過度です。カーソルを動かす猫に代わるものはありますか?画面を占有せずにCtrl+するまでは、実際にはテキストバッファにすぎない小さなエディタがありますかD

hel SomeScript私のより大きなユースケースは、端末に入力できるように小さなヘルパースクリプトを作成することです。これにより、~/binパスにその名前のスクリプトが自動的に作成され、上部にシェブangが追加され、次のchmod+x操作が完了します。一度cat > ~/bin/$1始めて間違いが多すぎると判断してnanoに切り替えましたが、画面をキャッチして後ろにスクロールせずにターミナルで以前に何をしたかを見ることができず、vimキーを使用しようとしました。私は編集長です、ハハ。

答え1

「高速」アプローチに固執し、教育を学びたくない場合は、次のことを使用できます。

cat > test <<'EOF'
...
EOF

もちろん、これは完全なエディタではありませんが、入力している行を編集できます(Enterキーを押す前)。

答え2

rlwrapによる

rlwrap cat

(経由で)readlineを正しく設定すると、~/.inputrcrlwrapはreadlineを使用するbashや他のプログラムと同じキーバインディングを使用します。

そしてvi

もしモーダルviキーバインディングとエディタの「オープンモード」(またはなどの不適切な複製ではなくvi実際)に慣れています。vivimnvi

そしてzsh

zshコマンドライン編集インターフェースを使用すると、全画面を占有することなく複数行編集が可能です。

vared以下は、zshの組み込み機能(変数編集が目的)を使用するクイックエディタの「実装」です。

# in .zshrc
bindkey -N for-qe emacs
bindkey -M for-qe \
   "^M" self-insert-unmeta \
   "^J" self-insert-unmeta \
   "^X" accept-line
qe(){
    local e=$(cat $1; echo x); e=${e%x}
    vared -M for-qe e && printf %s $e > $1
}

# usage
% qe some_file
  # Enter, ^M, ^J = insert a newline
  # ^X = save & exit
  # ^C = abort editing 

答え3

Pythonを使用すると、同様のことができます。prompt_toolkit図書館。以下は短いスクリプトです。

#! /usr/bin/env python3

import sys
from prompt_toolkit import PromptSession
from prompt_toolkit.output import create_output
from prompt_toolkit.key_binding import KeyBindings

bindings = KeyBindings()

@bindings.add('c-d')
def _(event):
    event.app.current_buffer.validate_and_handle()

# This will allow it to work when re-directing stdout, by using stderr instead.
output = create_output(always_prefer_tty=True)

session = PromptSession(output=output)
text = session.prompt(
    message='', # No prompt.
    multiline=True,
    key_bindings=bindings,
    enable_history_search=False,
    vi_mode=True, # Change to False, if you prefer emacs-style editing shortcuts.
)

sys.stdout.write(text)
sys.stdout.flush()

誰もが適切な名前を提案できる場合は、喜んでパッケージ化してPyPIに公開します。

関連情報