Как я могу переименовать файл, который я редактирую?

38

Можно ли переименовать файл, который я редактирую, из Vim? В настоящее время я выхожу из Vim, переименовываю файл и снова открываю из Vim.

thameera
источник
1
Связанный: stackoverflow.com/questions/1205286/…
muru
Я заинтересован, чтобы сделать это в Neovim
Мигель де Валь-Борро

Ответы:

35

Вы можете сохранить файл под другим именем, используя :w. Но эта операция не удалит старый файл, и «старый» файл останется в вашем буфере, поэтому любые изменения будут применены к вашему «старому» файлу.

:saveasсохраняет ваш новый файл и открывает его в новом буфере. Но это не удаляет старый файл.

Я использую tpope / vim-eneuch для :Moveфайлов.

: Move: переименовать буфер и файл на диске одновременно.

OrangeTux
источник
Одним из недостатков :wили :saveasявляется то, что он потеряет разрешение на выполнение, если вы редактировали скрипт. netrwПереименовать сохранит разрешения.
Висбуки
11

Вы можете перейти в Netrw и переименовать файл там.

Если файл, который вы редактируете, находится в текущем каталоге, выполните:

:edit .

Перейдите к файлу, нажмите Rи измените имя. Нажмите, Enterчтобы редактировать файл.

Однако есть предостережение: исходный буфер остается в списке буферов. Если вы переключитесь на него, он пуст.

Если файл, который вы редактируете, находится в другом каталоге, вы можете перейти в каталог файла с помощью:

:cd %:p:h

Если вы не хотите изменять каталог для всего сеанса Vim, а только для текущего буфера, тогда вы можете сделать вместо этого:

:lcd %:p:h
Прекратить постоянный вред Монике
источник
2
Печатание прямо :edit %:p:hтакже, кажется, работает.
Младен Ябланович
:Eтакже откроет Netrw
Висбуки
6

Я использовал плагин Rename2 для этого в течение многих лет. Переименовывает как текущий буфер, так и файл на диске:

:Rename {newname}

РЕДАКТИРОВАТЬ: Я нашел этот .vimrcфайл на GitHub :

function! RenameFile()
    let old_name = expand('%')
    let new_name = input('New file name: ', expand('%'), 'file')
    if new_name != '' && new_name != old_name
        exec ':saveas ' . new_name
        exec ':silent !rm ' . old_name
        redraw!
    endif
endfunction
map <leader>n :call RenameFile()<cr>
craigp
источник
3

Лучший способ - использовать :Move, как сказал OrangTux. Для полноты вы также можете выполнять терминальные команды в редакторах vi, используя bang ( !) в командном режиме.

:!mv {current_file} {new_name}
:e {new_name}

Однако этот метод не удаляет старый буфер из вашего списка буферов.

Коди Полл
источник