Zsh 如何使用shell代码启动新的tmux会话?
我想找到一个文件,然后在新的tmux窗口中打开它 不幸的是,tmux会话立即退出,并返回0退出代码。如果我回显命令并从终端手动运行它,它工作正常。类似地,如果我复制echo的输出并使其成为自己的命令yy,我可以执行它,并且它也可以正常工作 另一个(额外的)问题似乎发生在使用ZLE时,因为它似乎没有设置终端。xx将返回0退出代码(立即),ctrl-x将从tmux返回警告“不是终端”Zsh 如何使用shell代码启动新的tmux会话?,zsh,tmux,fzf,Zsh,Tmux,Fzf,我想找到一个文件,然后在新的tmux窗口中打开它 不幸的是,tmux会话立即退出,并返回0退出代码。如果我回显命令并从终端手动运行它,它工作正常。类似地,如果我复制echo的输出并使其成为自己的命令yy,我可以执行它,并且它也可以正常工作 另一个(额外的)问题似乎发生在使用ZLE时,因为它似乎没有设置终端。xx将返回0退出代码(立即),ctrl-x将从tmux返回警告“不是终端” xx () { P=$(zsh -c $FZF_DEFAULT_COMMAND | fzf +m)
xx () {
P=$(zsh -c $FZF_DEFAULT_COMMAND | fzf +m)
CMD="'cd $(dirname $P) && ${EDITOR:-vim} $(basename $P)'"
echo tmux new-session $CMD
tmux new-session $CMD
}
yy () {
tmux new-session 'cd /data/repos/notes && nvim engineering_a_compiler.md'
}
# create zsh widgets
zle -N xx xx
# keybind zsh widgets
bindkey ^x xx
在其他堆栈溢出帖子中尝试了以下内容问题在于如何定义
CMD
。硬编码的tmux
命令是(使用-c
选项简化事情)
要存储命令及其参数,请使用数组
xx () {
P=$(zsh -c "$FZF_DEFAULT_COMMAND" | fzf +m)
CMD=("${EDITOR:-vim}" "$(basename "$P")")
echo "tmux new-session ${CMD[*]}"
tmux new-session -c "$(dirname "$P")" "${CMD[@]}"
}
对于任何感兴趣的人,这里是my.zshrc_fzf配置的相关部分;tl;dr是我不使用小部件,而是直接用文本键调用函数,因为ZLE似乎不会将tty传递给小部件中执行的函数 此文件映射ctrl+p以使用
fd
模糊查找文件,更改为包含目录,并在编辑器中打开它。如果您不在tmux会话中,它会在打开tmux会话后执行相同的操作(此外,在启动tmux会话之前会更改到项目目录,因此它是该会话中所有未来tmux窗格的根目录)
它对ctrl+f做了同样的事情,但是使用ripgrep(rg
)来逐个文件内容搜索文件
未在此文件中定义:source\u if\u exists(){if[-f$1];then source$1;fi}
#!/usr/bin/zsh
# SOURCE: https://github.com/junegunn/fzf/wiki/examples
source_if_exists /usr/share/fzf/key-bindings.zsh
source_if_exists /usr/share/fzf/completion.zsh
FZF_PREVIEW="'head -100 {}'"
FZF_VIM_PLUGIN_PREVIEW=~/.local/share/nvim/plugged/fzf.vim/bin/preview.sh
if [[ -f $FZF_VIM_PLUGIN_PREVIEW ]]; then
FZF_PREVIEW=$FZF_VIM_PLUGIN_PREVIEW
fi
FZF_DEFAULT_OPTS="--layout=reverse --height='40%' --preview='"$FZF_PREVIEW" {}'"
export FZF_RIPGREP_OPTS="--column --line-number --no-heading --hidden --ignore-file $HOME/.gitignore_global"
export FZF_DEFAULT_COMMAND="fd . $SEARCH_DIRS --hidden --ignore-file ~/.gitignore_global"
FZF_CTRL_T_COMMAND=$FZF_DEFAULT_COMMAND
edit () {
P=$1
# file
if [[ -f $P ]]; then
if [[ $TERM != tmux* ]]; then # not in tmux session
# change to project directory, becomes root of new tmux-panes
cd $(dirname $P)
if [[ $(git rev-parse --is-inside-work-tree 2>/dev/null) == "true" ]]; then
cd $(git rev-parse --show-toplevel)
fi
tmux new-session "cd $(dirname $P) && ${EDITOR:-vim} $(basename $P); zsh"
clear
else # within existing tmux session
cd $(dirname $P) && ${EDITOR:-vim} $(basename $P)
fi
# directory
elif [[ -d $P ]]; then
cd $P
fi
}
# find path, change to directory, if path is a file, open in $EDITOR
fd_find () {
edit $(zsh -c $FZF_DEFAULT_COMMAND | fzf +m)
}
rg_find () {
CMD="rg $FZF_RIPGREP_OPTS ${1:-'.*'} $SEARCH_DIRS"
edit $(zsh -c $CMD | fzf +m | cut -d: -f1)
}
# zsh shortcuts
bindkey -s ^p 'fd_find\n'
bindkey -s ^f 'rg_find\n'
所以-c标志不适用于新会话,至少在TMUX3.1b中是这样;我已经在下面发布了我的解决方案,它怎么不起作用
tmuxnewsession-c/usr/local/bin
给了我一个shell,它的工作目录是/usr/local/bin
,而不是$HOME
;tmux新会话vim“$P”
是否足够tmux new session-c“cd/”
在新会话中完成命令后立即退出;与tmuxnewsession-cdc/相同;zsh
;引用的版本,tmuxnewsession-c“cd/;zsh”
,实际上并没有在新会话中执行引用的代码。如果没有-c
,它就可以工作,因此tmux新会话“cd/;zsh”
工作正常(可能是版本问题?)。我将cd刻录到该目录的原因是,当我退出时,我在包含目录中,这几乎总是我想要的,即在我刚刚编辑的文件的项目目录中。
#!/usr/bin/zsh
# SOURCE: https://github.com/junegunn/fzf/wiki/examples
source_if_exists /usr/share/fzf/key-bindings.zsh
source_if_exists /usr/share/fzf/completion.zsh
FZF_PREVIEW="'head -100 {}'"
FZF_VIM_PLUGIN_PREVIEW=~/.local/share/nvim/plugged/fzf.vim/bin/preview.sh
if [[ -f $FZF_VIM_PLUGIN_PREVIEW ]]; then
FZF_PREVIEW=$FZF_VIM_PLUGIN_PREVIEW
fi
FZF_DEFAULT_OPTS="--layout=reverse --height='40%' --preview='"$FZF_PREVIEW" {}'"
export FZF_RIPGREP_OPTS="--column --line-number --no-heading --hidden --ignore-file $HOME/.gitignore_global"
export FZF_DEFAULT_COMMAND="fd . $SEARCH_DIRS --hidden --ignore-file ~/.gitignore_global"
FZF_CTRL_T_COMMAND=$FZF_DEFAULT_COMMAND
edit () {
P=$1
# file
if [[ -f $P ]]; then
if [[ $TERM != tmux* ]]; then # not in tmux session
# change to project directory, becomes root of new tmux-panes
cd $(dirname $P)
if [[ $(git rev-parse --is-inside-work-tree 2>/dev/null) == "true" ]]; then
cd $(git rev-parse --show-toplevel)
fi
tmux new-session "cd $(dirname $P) && ${EDITOR:-vim} $(basename $P); zsh"
clear
else # within existing tmux session
cd $(dirname $P) && ${EDITOR:-vim} $(basename $P)
fi
# directory
elif [[ -d $P ]]; then
cd $P
fi
}
# find path, change to directory, if path is a file, open in $EDITOR
fd_find () {
edit $(zsh -c $FZF_DEFAULT_COMMAND | fzf +m)
}
rg_find () {
CMD="rg $FZF_RIPGREP_OPTS ${1:-'.*'} $SEARCH_DIRS"
edit $(zsh -c $CMD | fzf +m | cut -d: -f1)
}
# zsh shortcuts
bindkey -s ^p 'fd_find\n'
bindkey -s ^f 'rg_find\n'