文件中的光标位置不是先前编辑会话的持久性。仅当文件位于长路径中时

时间:2018-05-12 21:00:10

标签: bash vim emacs vi vim-plugin

对于位于长路径中的文件,我注意到了

是光标位置(来自之前的编辑/打开会话)

采取了报告herehere的操作后,问题仍然存在。

运行此script.sh是一个最小的工作示例,可以让您重现同样的问题:

#!/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

此脚本运行后,我们打开test_file.txt

vim testing_long_path/.../.../test_file.txt

并导航到第5行:

enter image description here

当我们退出文件:q并再次打开它时,光标不再位于第5行,而是位于第1行:

enter image description here

这也发生在emacs

我的/etc/vim/vimrc已取消注释这些行:

if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif

更新1:使用@Sergio 1st建议: 我没有~/.vimrc文件。我创建了一个我写过以下内容的文章:

" Tell vim to remember certain things when we exit
"  '10  :  marks will be remembered for up to 10 previously edited files
"  "100 :  will save up to 100 lines for each register
"  :20  :  up to 20 lines of command-line history will be remembered
"  %    :  saves and restores the buffer list
"  n... :  where to save the viminfo files
set viminfo='10,\"100,:20,%,n~/.viminfo

function! ResCur()
  if line("'\"") <= line("$")
    normal! g`"
    return 1
  endif
endfunction

augroup resCur
  autocmd!
  autocmd BufWinEnter * call ResCur()
augroup END

使用vim testing_long_path/.../.../test_file.txt关闭并再次打开时,不会记住光标的位置。

更新2:使用@Sergio第二条建议: :scriptnames的输出如下,其中未列出/etc/vim/vimrc

enter image description here

更新3 :通过vim testing_long_path/.../.../test_file.txt打开文件,并要求:autocmd BufWinEnter我收到:

enter image description here

1 个答案:

答案 0 :(得分:0)

在Emacs中,存储文件位置的机制称为saveplace。它可以过滤应存储位置的文件。请参阅变量save-place-forget-unreadable-files

的文档
  

非零意味着忘记放在不可读的文件中。

     

save-place-alist中的文件名不匹配   save-place-skip-check-regexp通过file-readable-p进行过滤。   如果为nil,则删除其alist条目。

现在,让我们看看file-readable-p说明你的文件:

(defvar the-long-file)
(setq the-long-file "testing_long_path/mksj/[omitted for brevity]/mkmsj/test_file.txt")

(file-readable-p the-long-file) ;; => nil
(file-readable-p "/etc/passwd") ;; => t

我无法解释为什么file-readable-p会返回nil,但至少这可以解释您观察到的行为。如果您想学习该功能,请查看Vue documentation

由于这种情况发生在Emacs和vim中,正如您所描述的那样,这可能是LibC或某些操作系统限制中的进一步限制。