Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 如何从shell脚本启动编辑器?_Vim_Shell_Emacs_Tcsh - Fatal编程技术网

Vim 如何从shell脚本启动编辑器?

Vim 如何从shell脚本启动编辑器?,vim,shell,emacs,tcsh,Vim,Shell,Emacs,Tcsh,我希望我的tcsh脚本启动一个编辑器(例如,vi、emacs): 这将使用my_文件启动vi,但首先会显示一条警告“Vim:warning:Output is not to a terminal”(Vim:warning:Output is not to a terminal),并且我的击键不会出现在屏幕上。在我杀死vi之后,我的终端窗口被弄乱了(没有换行符),需要“重置”。我尝试了“emacs-nw”、“xemacs-nw”和pico,得到了类似的结果。“xemacs”可以工作,但会启动一个单

我希望我的tcsh脚本启动一个编辑器(例如,vi、emacs):

这将使用my_文件启动vi,但首先会显示一条警告“Vim:warning:Output is not to a terminal”(Vim:warning:Output is not to a terminal),并且我的击键不会出现在屏幕上。在我杀死vi之后,我的终端窗口被弄乱了(没有换行符),需要“重置”。我尝试了“emacs-nw”、“xemacs-nw”和pico,得到了类似的结果。“xemacs”可以工作,但会启动一个单独的窗口。我想重复使用相同的终端窗口


有没有一种方法可以从脚本启动编辑器,以便它重用相同的终端窗口?

我回答了自己的问题!您必须重定向终端输入和输出:

#!/bin/tcsh
vi my_file < `tty` > `tty`
#/垃圾箱/垃圾箱
vi我的_文件<`tty`>`tty`

我能够在bash+Cygwin+下获得所需的行为:


运行脚本,vim加载,没有错误消息,行为正常。毫无疑问,我们的设置之间有几十种不同,所以我不能冒险猜测是什么造成了不同。我很好奇它是什么,但你让它工作了,这是重要的一部分。

你出错的原因是当你在你的环境中启动一个shell时,它是在一个有STDIN和STDOUT未连接到TTY的子shell中启动的-可能是因为它在类似管道的东西中。重定向时,您将直接打开与设备的新连接。例如,您的命令行

$ vi < `tty` > `tty`
$vi<`tty`>`tty`
进入

$vi/dev/ttys000
因此,您并没有真正使用旧的STDIN/STDOUT,而是创建了两个新文件,并将它们映射到vi进程的STDIN/STDOUT

现在,告诉我们你在做什么,我们将告诉你如何避免这种混乱。

绝对。:-)

编写脚本并让它调用编辑器环境变量,将其设置为“EmacClient”。然后启动Emacs,执行
M-x服务器启动
,切换到shell缓冲区(
M-x shell
)并执行脚本。EmacClient将弹出要编辑的内容,
C-x#
将充当“完成”命令,并根据您的选择将编辑完成或中止后返回脚本

享受


编辑:我想补充一点,现在Emacs是我的终端程序。我有几十个shell缓冲区,从来不用担心输出丢失,可以使用Emacs的所有功能来操作和分析终端输出。并让Emacs脚本生成shell的输入。真是太棒了。例如,在编辑源代码、处理邮件或执行大多数Emacs操作时,观看Tomcat输出在shell缓冲区中滚动是非常方便的。当Tomcat堆栈跟踪出现时,我可以快速响应它。

将终端
tty
设置为一个变量,然后通过该变量重定向编辑器I/o

在脚本中:

#!/bin/sh

ls | while read a; do vi $a < $MYTTY >$MYTTY; done

在shell脚本“while”循环中遇到与“pinfo”相同的问题。该行可用于脚本中,它使用“ps”查找当前进程号“$$”的tty,并将该tty存储在$KEY\u tty中:

  KEY_TTY=/dev/`ps | grep $$ | tr -s '[:blank:]' | cut -d " " -f 3`
在脚本的后面,只需调用tty only程序,以$KEY\u tty作为输入,在我的例子中是:

  pinfo -m $s $page < $KEY_TTY
pinfo-m$s$page<$KEY\u TTY
对于“vi”,它应该是:

  vi $a < $KEY_TTY > $KEY_TTY
vi$a<$KEY\u TTY>$KEY\u TTY

优点是脚本作为一个整体仍然可以接受STDIN输入,“vi”(或其他)应该可以很好地工作——在运行脚本之前不必记得设置任何环境变量。

我想做一些类似的事情。我想要一个别名,可以找到我正在处理的最后一个文件,并在vi(1)中打开它进行编辑。无论如何,我不知道如何将其作为一个可读的别名(在tcsh中),所以我只创建了一个难看的shell脚本(csh,因为我已经老了):

#/bin/csh
set DIR=“~/www/TooMuchRock/shows/”
set file=$DIR`ls-t$DIR | head-1`
设置tty=`tty`
vi$file$tty
(1) 卡夫沃克:bin>哪个vi
vi:别名为/usr/local/bin/vim-u~/.exrc

通常情况下,我完全按照您所做的去做,而且对我来说效果很好。但我的壳是bash。这类事情在sh下也能很好地工作。你能做一个“whichvi”来找出是否调用了vi以外的东西吗?而且。。。您运行的是什么样的操作系统环境?使用bash和vim,您可以从脚本中执行vi my_文件。我不知道你为什么要做任何特殊的事情。你是否试图让vim读取文件或变量的内容?你使用的是什么操作系统/终端应用程序和vim的版本?当我尝试你的剧本时,我对它没有任何问题。但是。。。但是但是从哪里重定向?为什么你需要这样做对我来说仍然是一个谜。我正试图用vim做这件事,但我只得到了
`tty`:不明确的重定向
,结果是
`tty`
在我的脚本中扩展成了“不是tty”。我刚刚使用了
/dev/tty
,但我想知道它的可移植性有多好…我不是在创建新文件。我正在将我的终端设备文件(tty告诉您它是哪个文件)重定向到vi的STDIN/STDOUT,该文件与我的终端窗口关联,并且在运行脚本之前存在。我创建了一个脚本,它包装了“cvs commit”,并在提交签入之前进行了大量额外检查(例如,运行我们的测试套件)。这有时被称为“门控签入”。出于我不想讨论的原因,我不能使用标准的CVS预提交钩子。我正在尝试模拟“cvs提交”在命令行上没有指定提交消息时如何启动编辑器。在Ubuntu 18.04上,我需要
cut-d'-f2
。结果只是使用了
ps otty=$$
而不是任何管道。
$ MYTTY=`tty` ./myscript >/tmp/log
  KEY_TTY=/dev/`ps | grep $$ | tr -s '[:blank:]' | cut -d " " -f 3`
  pinfo -m $s $page < $KEY_TTY
  vi $a < $KEY_TTY > $KEY_TTY
#!/bin/csh

set DIR = "~/www/TooMuchRock/shows/"

set file = $DIR`ls -t $DIR | head -1`
set tty = `tty`

vi $file <$tty >$tty