Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
Unix 如何在VIm和终端中始终具有相同的当前目录?_Unix_Vim_Vim Plugin - Fatal编程技术网

Unix 如何在VIm和终端中始终具有相同的当前目录?

Unix 如何在VIm和终端中始终具有相同的当前目录?,unix,vim,vim-plugin,Unix,Vim,Vim Plugin,我希望我的终端当前目录遵循我的VIM one 例如: 在终端: > pwd => /Users/rege > vim 然后在VIM中 :cd /Users/rege/project <Ctrl-z>(for suspend) 我用的是MacOS,zsh,tmux 我需要这个,因为当我试图在VIM中使用标记时,标记是从我的终端目录而不是VIM one签入项目的 因此,当我更改VIM当前目录时,我需要始终更改终端当前目录。您可以像这样打开一个新的终端 :!xterm

我希望我的终端当前目录遵循我的VIM one

例如:

在终端:

> pwd
=> /Users/rege
> vim
然后在VIM中

:cd /Users/rege/project
<Ctrl-z>(for suspend)
我用的是MacOS,zsh,tmux

我需要这个,因为当我试图在VIM中使用标记时,标记是从我的终端目录而不是VIM one签入项目的


因此,当我更改VIM当前目录时,我需要始终更改终端当前目录。

您可以像这样打开一个新的终端

:!xterm -e bash -c "cd %:p:h;bash" &
实际上我是在我的.vimrc中写的

nmap <F3> :!xterm -e bash -c "cd %:p:h;bash" &<CR> | :redraw!
nmap:!xterm-ebash-c“cd%:p:h;bash”&|:重画!

在bash或zsh以及Unix上,您可以这样做:进程的当前工作目录在
/proc/{PID}/cwd
中表示为指向实际目录的符号链接。说到zsh,以下代码将完成此工作:

function precmd()
{
    emulate -L zsh
    (( $#jobstates == 1 )) || return
    local -i PID=${${${(s.:.)${(v)jobstates[1]}}[3]}%\=*}
    cd $(readlink /proc/$PID/cwd)
}
。注意:使用此代码,您将无法再在终端中永久切换目录,只能在vim中切换目录或在一个命令期间切换目录(使用
cd other dir&&some命令)

注2:我不知道如何在bash中表达这一点。最简单的方法是获取shell所有子级的PID(使用
ps--ppid$$-o CMD
),过滤掉
ps
过程(它也将显示为子级),检查是否只有一个子级,并使用上面最后一行中的PID。但是我很确定有一种更好的方法可以使用一些shell内置,就像我使用zsh的
$jobstates
关联数组那样。我也不记得bash中的
precmd
类似于什么


另一个想法是让vim在执行
操作时将其当前目录保存到某个文件中,并让shell在precmd中读取以下内容:

" In .vimrc:
function s:CtrlZ()
    call writefile([fnamemodify('.', ':p')], $CWDFILE, 'b')
    return "\<C-z>"
endfunction
nnoremap <expr> <C-z> <SID>CtrlZ()

# In .zshrc
function vim()
{
    local -x CWDFILE=~/.workdirs/$$
    test -d $CWDFILE:h || mkdir $CWDFILE:h
    vim $@
}
function precmd()
{
    local CWDFILE=~/.workdirs/$$
    test -e $CWDFILE && cd "$(cat $CWDFILE)"
}
.vimrc中的“
”:
函数s:CtrlZ()
调用writefile([fnamemodify('.',':p')],$CWDFILE,'b'))
返回“\”
端功能
nnoremap CtrlZ()
#英寸zshrc
函数vim()
{
本地-x CWDFILE=~/.workdirs/$$
测试-d$CWDFILE:h | mkdir$CWDFILE:h
维姆$@
}
函数precmd()
{
本地CWDFILE=~/.workdirs/$$
测试-e$CWDFILE&&cd“$(类别$CWDFILE)”
}

。将上面的代码移植到bash应该更容易。

在挂起Vim后,您在shell中发出了哪种命令?Vim的
:!command
不够吗

使用
set autochdir
,当您从一个文件跳到另一个文件时,Vim的当前目录将跟随您。使用此设置,一个简单的
:!ctags-R.
将始终在当前文件的目录中创建一个
标记
文件

另一个有用的设置是
set tags=./tags,tags;$HOME
,它告诉Vim在当前文件的目录中查找
tags
文件,然后在“当前目录”中查找“并一直向上,直到它到达您的
~/
。您可以修改端点以满足您的需要。这允许您在编辑属于项目的任何文件时,在项目根目录下使用
标记

因此,基本上,您可以在不离开Vim的情况下走很长的路

如果您确实需要返回shell发出命令,
:shell
(或
:sh
)使用Vim的当前目录启动一个新shell。完成后,只需
$exit
即可返回Vim:

$ pwd
/home/romainl
$ vim
:cd Projects
:sh
$ pwd
/home/romainl/Projects
$ exit

对于来自的bash用户:

Vim:
处保存
pwd
(使用
map
getpwd()
)。
Bash:在prompt命令之前,使用
prompt\u命令转到vim指示的目录

.bashrc

PROMPT_COMMAND='read -r line 2>/dev/null </tmp/cd_vim'\
'&& > /tmp/cd_vim && cd ${line##\r};'$PROMPT_COMMAND
function! s:CtrlZ() call writefile([getcwd(),''], '/tmp/cd_vim', 'b')
    return "\<C-z>"
endfunction
nnoremap <expr> <C-z> <SID>CtrlZ()
PROMPT_COMMAND='read-r line 2>/dev/null/tmp/cd_vim&&cd${line##\r}'$提示命令
vimrc

PROMPT_COMMAND='read -r line 2>/dev/null </tmp/cd_vim'\
'&& > /tmp/cd_vim && cd ${line##\r};'$PROMPT_COMMAND
function! s:CtrlZ() call writefile([getcwd(),''], '/tmp/cd_vim', 'b')
    return "\<C-z>"
endfunction
nnoremap <expr> <C-z> <SID>CtrlZ()
函数!s:CtrlZ()调用writefile([getcwd(),'','/tmp/cd_vim',b')
返回“\”
端功能
nnoremap CtrlZ()

这是为bash编辑的ZyX答案

那么
:shell
呢?它在Vim的当前目录中打开了一个新的shell。我解释得更清楚了。
/proc
在Mac OS X上不可用。您的第二个想法看起来不错。看起来不错,但我想在Vim
:cd method
@regedarek中运行时将其锁定,但为什么?在任何情况下,在挂起vim之前,它都不会更改目录(当前台进程运行时,shell不会执行任何操作),在
:cd
上运行只会生成一堆无用的write.TK!!我找了这么久。。。在bash提示符中,命令允许在返回时更改目录。我正在做另一个答案(从你的抄袭)。对不起,但这不是我想要实现的。