Cat 将终端输入写入文件的替代方案?

Cat 将终端输入写入文件的替代方案?

当我想快速将某些内容写入到粘贴或从终端手动输入的文件中时,使用快速cat > something.txtCtrl+D关闭是一个不错的快捷方式。然而,这当然不允许您移动光标,以防出现明显的错误,因此您将无法打开文本编辑器(例如 vim 或 nano)。然而,除非您使用终端复用器,否则这些会占用您的屏幕,并且对于我的用例来说,这有点不方便/过度杀伤力。有没有可以替代 cat 的方法来移动光标?某种微型编辑器不会抓取您的屏幕,实际上只是一个文本缓冲区,直到您Ctrl+D它?

我更大的用例是我制作了一个小帮助脚本,这样我就可以hel SomeScript在终端中输入,它会自动在我~/bin的路径中创建一个具有该名称的脚本,将 shebang 添加到顶部,然后chmod+x当我完成时。我曾经cat > ~/bin/$1开始并决定我会犯太多错误并切换到nano,但由于它抓住了屏幕,我无法看到我之前在终端中所做的事情而无需向后滚动,而且我一直在尝试使用vim 键,因为我在编辑器中,哈哈。

答案1

如果您想坚持“快速”方法并且不想学习 ed,您可以使用:

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

当然,这不是完整的编辑器,但可以编辑您正在键入的行(在按 Enter 之前)。

答案2

与 rlwrap

rlwrap cat

如果您正确配置了 readline(通过~/.inputrc),rlwrap 将使用与 bash 和其他使用 readline 的程序相同的键绑定。

vi

如果你习惯了模态 vi 键绑定,还有vi编辑器的“打开模式”(真正的vi,而不是像vim或那样的不充分的克隆nvi)。

zsh

zsh 命令行编辑界面还可以进行多行编辑,而无需占据整个屏幕。

这是一个快速编辑器的“实现”,使用 zsh 的vared内置函数(其目的是编辑变量):

# 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。

相关内容