在 bash 中,使用 vi 模式,如果我点击Esc, v,我当前的命令行会在由 指定的编辑器中打开$EDITOR
,我可以在“保存”要返回到 shell 并执行的命令之前全屏编辑它。
如何在 zsh 中实现类似的行为?击中v,在命令模式导致钟的没有明显的效果,尽管EDITOR
环境变量来设定。
当我在给定环境中进行更改时,我大量使用 screen 的“log”命令将会话的输出记录到文件中。我搜索了 tmux 的手册页,但找不到等效的。有没有人知道 tmux 中的类似功能,或者我是否必须编写自己的包装器脚本才能做到这一点?
编辑:我知道允许我记录会话的“脚本”和其他实用程序。screen 的功能如此有用的原因是能够定义一个日志文件变量,该变量使用字符串转义来唯一标识每个会话。
例如,我有一个 shell 函数,给定一个主机名,它将在新的屏幕窗口中通过 SSH 连接到该主机,并将窗口标题设置为主机名。当我开始记录该会话时,它以窗口标题为前缀。
如果 tmux 中不存在此功能,我将不得不创建一组新的 shell 函数来设置我想要记录的会话的“脚本”。这并不是非常困难,但考虑到屏幕已经完全满足我的需求,这可能不值得付出努力。
我有一个共享主目录,它通过 NFS 自动挂载在我登录的所有 UNIX 服务器上。我想要一个单一的 .screenrc(例如)将主机名放在 hardstatus 行中以不同的颜色来指示我何时登录到生产与开发;我们的主机名可以通过使用模式匹配轻松完成。
有没有办法将条件语句放入 .screenrc 中?手册页的快速 grep 似乎没有揭示任何明显的东西。
编辑:
澄清一下,我已经有一个自定义的硬状态行;我想根据调用屏幕的主机名更改显示的一些颜色/字段。我的 PS1 已经有了这样的东西,但是我宁愿在屏幕状态行中这样做,因为我从这些主机跳到路由器/交换机,这不允许我进行任何提示着色。这样,我可以有一个用于生产的窗口,一个用于开发的窗口,屏幕状态行的颜色一目了然地告诉我我在哪个窗口。
例如,如果我想让vim将名称gitconfig
(无前导.
)识别为 of 的文件filetype=gitconfig
,是否有办法在注释或文件本身的类似内容中指出这一点?请注意,我希望它可以跨系统工作,因此不建议修改 vim 的启动文件。
根据对这个问题的公认答案,我试图在 vim 中使用模式行来强制在某些文件中进行文件类型检测。
例如,在名为gitconfig
(注意没有前导.
)的文件的顶部,我有以下行:
# vim: set filetype=gitconfig :
Run Code Online (Sandbox Code Playgroud)
modeline
在我的系统上启用。但是,当我在 vim 中打开文件时,set filetype?
返回的是conf
,而不是预期的gitconfig
.
我的 vim 配置的其他部分(例如 filetype.vim)是否可能导致这种奇怪的行为?
针对评论进行了编辑:
set compatible?
返回 nocompatible
set modeline?
返回 modeline
verbose set filetype?
返回:
filetype=conf
Last set from /usr/share/vim/vim73/filetype.vim
Run Code Online (Sandbox Code Playgroud)
我不明白为什么系统范围的文件类型插件会覆盖我在文件本身中设置的内容。
最后一点:这是 OSX 附带的 Vim 7.3 版本。
在同一系统上运行的最新版本的MacVim使用与.vimrc
预期相同的行为,set ft?
返回filetype=gitconfig
.
我在 my.zshrc
中定义了几个 shell 函数,它们可以节省打字时间并允许与屏幕集成。例如:
function s()
{
screen -t "$1" ssh "$@"
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用这些 shell 函数时,我无法利用 zsh 的内置命令完成功能。(在 SSH 的情况下,根据 known_hosts 和 ssh_config 自动完成主机名)。挂钩到我为其创建包装器的命令的现有完成机制的首选方法是什么?
编辑:
感谢 Gilles 在下面的回答。使用 compdef 似乎是做到这一点的方法,但有趣的是,它似乎并没有统一地工作。在这种情况下,我有以下设置:
function s()
{
screen -t "$1" ssh "$@"
}
function m()
{
screen -t "man.$1" man "$1"
}
compdef $_comps[man] m
compdef $_comps[ssh] s
Run Code Online (Sandbox Code Playgroud)
我的包装函数“m”的完成按预期工作,但是我的函数“s”的完成没有;它没有尝试完成主机名,而是通过在我点击“选项卡”时向我提供文件列表来回退到默认自动完成。处理 SSH 完成的方式是否有些奇怪,这意味着我需要进一步做些什么?
zshmisc
我的新 Debian Squeeze 安装的手册页指出,位于SIMPLE PROMPT ESCAPES
:
%m
The hostname up to the first `.'. An integer may follow the '%' to specify how
many components of the hostname are desired. With a negative integer, trailing
components of the hostname are shown.
Run Code Online (Sandbox Code Playgroud)
当我包含%2m
在我的提示中时,我看到 OSX 和 Linux 之间的不同行为。
在 OSX (10.7.3) 上,运行 zsh 4.3.11,提示的行为符合预期,显示系统主机名的两个主要部分。
在 Debian 上,运行 zsh 4.3.10,提示仍然只显示裸主机名。hostname -f
在此系统上确认完整的主机名设置正确。另请注意,此 zsh 版本的联机帮助页表示应支持 %2m。
有没有人对从哪里开始调试这个有任何建议?