当我想快速将某些内容写入到粘贴或从终端手动输入的文件中时,使用快速cat > something.txt
和Ctrl+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。