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个以上的
open实例时,可能会感到困惑vim
- 当已有
open的实例时,打开该实例vim
- 当没有
open实例时,打开一个新实例vim
- 当我真的想打开同一个程序两次时,我可以使用
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'