6

Я редактирую файл в vim, и я хотел бы создать новое окно (аналогично тому, как это делает :vsplit ), которое содержит представление файла до того, как я начал редактирование.

Другими словами, я хочу редактировать текст в левом окне, но я хочу, чтобы текст в правом окне оставался неизменным.

Есть ли способ сделать это в Vim, или я должен скопировать файл во временный файл и открыть его в новом окне?

3 ответа3

4

Вы можете создать команду, аналогичную DiffOrig (см. Ответ Дэниела Андерссона и ":help DiffOrig), которая просто считывает исходный файл в новый буфер:

command ShowOrig vert new | set bt=nofile | r ++edit # | 0d_

Чтобы вернуть курсор в исходное окно, добавьте wincmd p:

command ShowOrig vert new | set bt=nofile | r ++edit # | 0d_ | wincmd p

Опция ++edit была также добавлена в ответ MikeSep и ":help DiffOrig" в последних выпусках Vim .

2

:DiffOrig может быть, если использовать. Это дает вам разницу оригинала, по крайней мере:

Since 'diff' is a window-local option, it's possible to view the same buffer
in diff mode in one window and "normal" in another window.  It is also
possible to view the changes you have made to a buffer since the file was
loaded.  Since Vim doesn't allow having two buffers for the same file, you
need another buffer.  This command is useful:
     command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
        \ | wincmd p | diffthis
(this is in |vimrc_example.vim|).  Use ":DiffOrig" to see the differences
between the current buffer and the file it was loaded from.

A buffer that is unloaded cannot be used for the diff.  But it does work for
hidden buffers.  You can use ":hide" to close a window without unloading the
buffer.  If you don't want a buffer to remain used for the diff do ":set
nodiff" before hiding it.
2

Отказ от ответственности: мне никогда не нужно было этого делать, но ...

Я думаю, что этот однострочник мог бы добиться цели:

:new +read\ ++edit\ FILENAME

Я еще не понял, как автоматически заполнить фактическое имя файла ... Я пытался что-то с модификаторами имени файла, как %:p . Я думаю, что имя должно быть сохранено в переменную перед переключением окон.

Для объяснения :new открывает новое окно, затем запускает :read внутри этого окна, чтобы прочитать содержимое FILENAME непосредственно в буфер этого окна. Буфер остается "безымянным", поэтому нет конфликта, как при попытке :split FILENAME (которая просто открывает другую копию того же буфера).

Она также может иметь смысл , чтобы сделать это scratch буфер (см :help buffers но я не экспериментировал много с этим.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .