Bash:在另一个函数中定义动态函数

Bash:在另一个函数中定义动态函数,bash,shell,vim,Bash,Shell,Vim,由于我的问题似乎有点繁重,我只想解释一下我想做什么。 我经常使用像bash这样的监禁程序,这将我置于另一个环境中。(例如,文本编辑器如vim或shell如irb或python-i) 我通常会在那里闲逛一会儿,直到我把程序放在^Z上睡觉。在那一点上,我回到了我正常的bash外壳中,即母舰 在某个时刻,我可能想再次调用irb或vim,但由于我心不在焉,我通常已经忘记了该程序的睡眠实例。即使我没有忘记,我的手的动作也通常比我的大脑想象的要快。让我们看看该工作说明书吧 现在我有两个相同程序的实例在同一个

由于我的问题似乎有点繁重,我只想解释一下我想做什么。 我经常使用像
bash
这样的监禁程序,这将我置于另一个环境中。(例如,文本编辑器如
vim
或shell如
irb
python-i

我通常会在那里闲逛一会儿,直到我把程序放在
^Z
上睡觉。在那一点上,我回到了我正常的
bash
外壳中,即母舰

在某个时刻,我可能想再次调用
irb
vim
,但由于我心不在焉,我通常已经忘记了该程序的睡眠实例。即使我没有忘记,我的手的动作也通常比我的大脑想象的要快。让我们看看该工作说明书吧

现在我有两个相同程序的实例在同一个
shell
实例中运行。现在
goto 1
:我将再次
^Z
,忘记它,运行另一个实例,等等

所以我想我应该这样做,当我调用
vim

  • 当有1个以上的
    vim
    open实例时,可能会感到困惑
  • 当已有
    vim
    open的实例时,打开该实例
  • 当没有
    vim
    open实例时,打开一个新实例
  • 当我真的想打开同一个程序两次时,我可以使用
    vim!
以下是我的节目:

_make_escapable() {
    "$1"() {
        declare INSTANCES_OF_CMD=$(jobs | grep -c "\S\+Stopped\+\S\+\s\+$1")

        case ${INSTANCES_OF_CMD} in
            0)
                command "$1" "$@"
                ;;
            1)
                if [ $# -eq 0 ]; then
                    %"$1"
                    return 0
                else
                    echo "Can't open other files with a running instance of $1"'!' 1>&2
                fi
                ;;
            *)
                echo "You have multiple instances of $1 running. Choose one." 1>&2
                ;;
        esac
    }

    alias "$1"'!'="command $1"
}

_make_escapable 'vim'
_make_escapable 'irb'
正如你所看到的,我想自动化这个功能。问题是函数名没有参数扩展(看起来)。我可以为每个程序做一个新函数,但我更希望有一个很好的界面来做这件事。有人知道怎么做吗

就像我在问题中所描述的那样,这将接受任何命令并使其易于逃脱

它首先使用别名构造函数定义,然后执行别名,定义函数

就像我在问题中所描述的那样,这将接受任何命令并使其易于逃脱


它首先使用别名构造函数定义,然后执行别名,定义函数。

您想过使用vim
--remote
选项吗?这将在客户机-服务器模式下打开vim,在该模式下,所有打开的缓冲区都可以从所有客户机实例访问。好的,我刚才测试了
--remote
非常适合我的工作流程。我使用tmux,因此我已经有一台服务器在运行,其中包含我的工作套件。我认为
tmux
会话是我可以处理特定
事情的上下文。如果我想处理其他事情,我会更改会话并有一个新的任务,而不会放弃旧的任务。我也使用tmux,一个se我发现使用
emacsclient
vim--remote
的能力非常好,特别是用于跨会话共享剪贴板。老实说,作业控制是在
tmux
(或者GUI中的
xterm
s)的时候遗留下来的不可用。在你启动了像
vi
这样的程序之后,没有太多的必要将它们放在后台,只是为了回到shell。@Meitham感谢你的提示,我从来没有真正研究过emacs,因为我觉得Vim不够,但我肯定有一天会这样做。同时共享剪贴簿听起来是个好主意。你有没有想过在使用vim
--remote
选项?这将在客户机-服务器模式下打开vim,所有打开的缓冲区都可以从所有客户机实例访问。好的,我刚刚测试了
--remote
,但我并不真正适合我的工作流程。我使用tmux,所以我已经有一台服务器在其中运行我的工作套件。我认为
tmux
会话是c我可以从中处理特定
事情的ontext
。如果我想处理其他事情,我会更改会话并使用一个新的slate,而不会放弃旧的slate。我也使用tmux,每个项目一个会话,我发现使用
emacsclient
vim--remote
的能力非常好,特别是用于共享clipb跨会话处理。老实说,作业控制是在
tmux
(或者GUI中的
xterm
s)之类的事情发生时遗留下来的不可用。在你启动了像
vi
这样的程序之后,没有太多的必要把它们放在后台,只是为了回到shell。@Meitham感谢你的提示,我从来没有真正研究过emacs,因为我觉得Vim不够,但我肯定有一天会这样做。共享剪贴簿听起来是个不错的主意。
_make_escapable() {
    alias make_function="$1"'() { declare INSTANCES_OF_CMD=$(jobs | grep -c "\S\+\s\+\S\+\s\+'"$1"'") &&
        case ${INSTANCES_OF_CMD} in
            0) command '"$@"' "$@" ;;
            1) if [ $# -eq 0 ]; then %'"$1"'; return 0 ; else echo ''Cannot use parameters with running instance of '"$1"'''; fi ;;
            *) echo ''You have multiple instances of '"$1"' running. Choose one.'' 1>&2 ;;
        esac; }'
    eval make_function
    unalias make_function

    alias "$1"'!'='command '"$1"
}

_make_escapable 'vim'
_make_escapable 'irb'
_make_escapable 'ghci' '-v0'