Положение курсора в файле не является постоянным от предыдущего сеанса редактирования.Только когда файл находится в длинном пути - PullRequest
0 голосов
/ 13 мая 2018

Для файла, расположенного по длинному пути, я заметил, что
положение курсора (из предыдущего сеанса редактирования / открытия) не является постоянным.

После предпринятых действий, о которых сообщается здесь и здесь , проблема все еще появляется.

Запуск этого 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.

My /etc/vim/vimrc раскомментировал эти строки:

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

Обновление 1: Использование @Sergio 1-е предложение: У меня не было файла ~/.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 2-е предложение: Вывод :scriptnames является следующим, в котором /etc/vim/vimrc не указан.

enter image description here

Обновление 3: При открытии файла через vim testing_long_path/.../.../test_file.txt и запросе :autocmd BufWinEnter я получаю:

enter image description here

1 Ответ

0 голосов
/ 13 мая 2018

В Emacs механизм хранения файловых позиций называется saveplace. Он может фильтровать файлы, для которых должны быть сохранены позиции. Смотрите документацию по переменной save-place-forget-unreadable-files

Не ноль означает забыть место в нечитаемых файлах.

Имена файлов в save-place-alist, которые не совпадают save-place-skip-check-regexp фильтруются через file-readable-p. Если ноль, их списочные записи удаляются.

Теперь давайте посмотрим, что 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, но по крайней мере это объясняет поведение, которое вы наблюдали. Если вы хотите изучить эту функцию, взгляните на https://github.com/typester/emacs/blob/master/src/fileio.c#L2554

Поскольку это происходит в Emacs и vim, как вы описали, возможно, это ограничение в LibC или в некоторых ОС.

...