长路径下Vim/Emacs无法记住光标上次位置的问题求助
长路径文件无法保留光标位置?这里有针对性的解决方案
看起来你遇到的是编辑器会话信息存储的路径长度限制问题——不管Vim还是Emacs,它们用来记录光标位置的文件(比如Vim的.viminfo、Emacs的saveplace文件)对存储的路径长度有默认限制,超长路径会导致这些信息无法被正确保存或读取。
先理清楚你的问题细节:
问题复现
你可以通过这个脚本生成测试环境:
#!/bin/bash # We create a `test.txt` file: echo "Hello, this is line this is line 5 this is line 7 " > test_file.txt # We declare a long path directory: long_path_dir=testing_long_path/mksj/jfhgbus/jfhgdbhsio/kjihu_ijku_okjih/kjhui__okjikol__kjhikjn__/kjnjkmloipokl/polkjioplkmn/lkjiopk/llkkmjilpoi/kkklmn__kojuo/klkjoip_plko/ppplkojiun/klklkjmkiolp___okjn/mnhgfvghbjuio/lkmnjko/MKJNKIL_l/kjhgbhnjmki__jdjdm/kFGESCE_igjhdjd/JDJDKCNS_jdjd/jfjfj_KAJK/lkdjwnmckdjcnm/lsksjiowp___HSNKAL/mCNSJSIEO/ksjcnmsjs/KJSIL/jfhns_OSKL/ksmcmkfjnv_lksjCKSL/kfjdhnbjk_KJSH/KSJAILMK_opoijt/kdjkflmsnkjdu_LALALKJSN/NJNJKS_kskslkmcnbsm/ksjskjnjc/kioikrjsnm/kioikjui/jshncmsjkl/klkopo/NCBCNMA/mkmjnks/ksksmk/klkjh/kioskmnxl/lolOIJS/LOKSJNK/jsojs/mkmcnjkjsu/lolwos/kmkmJKJS/LOLOSPLS/lolskija/lskjmcml/lolksjfh/kjdjskn/LOLXnjijs/laSHHS/lsksmcl/lslsopolsn/lmknf/KSJAO/lolfngi/LOLSNL/lolsnzzjs/mkmdnaj/ldldpokng/lsksiks/lomxkksjm/KSLSKML/kdjdnxjfjfnk/mkmsj # We create this directory (first remove it, in case it exists): rm -Rf $long_path_dir mkdir -p $long_path_dir # We move the test_file.txt to that directory: mv test_file.txt $long_path_dir
执行脚本后:
- 用Vim打开该长路径下的
test_file.txt,导航到第3行(内容为this is line 5) - 执行
:q退出,再次打开文件,光标会回到第1行而非上次的位置 - 该问题同样出现在Emacs中
你已尝试的操作(供参考)
- 取消了
/etc/vim/vimrc中光标恢复自动命令的注释 - 创建
~/.vimrc并添加相同配置,问题未解决 - 执行
:scriptnames发现/etc/vim/vimrc未被加载 - 执行
:autocmd BufWinEnter查看自动命令输出
针对性解决方案
针对Vim的修复步骤
- 调整viminfo的路径长度限制
Vim的.viminfo默认对存储的文件名长度有限制,超长路径会被截断,导致光标位置无法关联到正确文件。在~/.vimrc中添加:
set viminfo='100,<500,s100,h
其中<500表示允许存储的文件名最大长度为500字符,你可以根据实际路径长度调整这个数值(比如改成<1000)。
- 确保光标恢复命令正确加载
从你的scriptnames输出看,系统级的/etc/vim/vimrc没被加载,说明Vim优先使用了用户目录下的~/.vimrc。确保你的~/.vimrc中包含完整的光标恢复自动命令:
if has("autocmd") autocmd BufReadPost * \ if line("'\"") > 1 && line("'\"") <= line("$") | \ exe "normal! g'\"" | \ endif endif
保存后重启Vim,用:scriptnames确认~/.vimrc被加载,再测试光标位置是否恢复。
- 验证光标位置变量
打开长路径文件后,执行:echo line("'\""):
- 如果输出是
0或1,说明Vim没有记录到上次的光标位置,进一步验证是路径长度导致的viminfo存储问题 - 如果输出是你上次退出时的行号,那可能是自动命令被其他配置覆盖了,需要检查
~/.vimrc中是否有冲突的命令
针对Emacs的修复步骤
Emacs依赖save-place包记录光标位置,同样会受路径长度限制影响:
在~/.emacs或~/.emacs.d/init.el中添加:
(require 'saveplace) (setq-default save-place t) (setq save-place-file "~/.emacs.d/saveplace") ;; 增大文件名存储长度上限 (setq save-place-max-length 1000)
保存后重启Emacs,测试光标位置是否能正常保留。
通用排查建议
- 查看系统路径长度限制:执行
getconf PATH_MAX,如果你的测试路径超过了这个值,即使修改编辑器配置也可能无效,需要手动缩短目录名 - 临时测试:把超长路径中的部分目录重命名为更短的名称(比如把
kjihu_ijku_okjih改成dir1),再测试光标位置是否能保留,以此确认是否是路径长度导致的问题
内容的提问来源于stack exchange,提问作者DavidC.
相关产品推荐
相关产品推荐

