Ім'я файлу / шлях поточного буфера у Vim


188

Якщо припустити, що поточний буфер - це файл, відкритий для редагування, тому :eне відображається E32: No file name.

Я хотів би витягнути один чи всі:

  • Назва файлу точно так само, як показано у рядку стану, наприклад ~\myfile.txt
  • Повний шлях до файлу, наприклад c:\foo\bar\myfile.txt
  • Просто назва файлу, наприклад myfile.txt


Відповіді:


209

TL; DR

:let @" = expand("%")>

це скопіює ім'я файлу до реєстру , який не має статусу , тоді ви можете скористатися старим добрим файлом p. і звичайно, ви можете скопіювати це на ключ для швидшого використання.

:nmap cp :let @" = expand("%")<cr>

Ви також можете використовувати це для повного шляху

:let @" = expand("%:p")

Пояснення

Vim використовує безіменний регістр для зберігання тексту, який був видалений або скопійований (витягнутий), так само, коли ви вставляєте, він читає текст з цього реєстру.

Використовуючи, letми можемо зберігати текст в реєстрі вручну, використовуючи, :let @" = "text"але ми також можемо зберігати результат вираження.

У наведеному вище прикладі ми використовуємо функцію, expandяка розширює підстановку та ключові слова. у нашому прикладі ми використовуємо expand('%')для розширення поточного імені файлу. Ми можемо змінити його як expand('%:p')для повного імені файлу.

Детальніше :help let :help expand :help registersдив


23
Cool просто додав це до мого vimrc: noremap <silent> <F4>: нехай @ + = розширюється ("%: p") <CR>
ThePosey

9
У Windows слід замість цього використовувати: нехай @ * = розширюється ("%"), якщо ви хочете, щоб це було у буфері обміну Windows .
KFL

15
Якщо ви використовуєте unnamedplusв якості буфера обмінуlet @+ = expand("%")
Кевін Кокс

4
Використовуйте "%:h"для отримання повного шляху без імені файлу.
Поліморфікс

Пов'язані, зокрема , якщо вам потрібен каталог без імені файлу - stackoverflow.com/a/2233924/1882064
arcseldon

94

Майже те, що ви просите, і це може зробити: Ctrl+R %перетягує поточне ім'я файлу туди, де ви знаходитесь (командний рядок, редагування буфера, ...). Докладніше див. У цій підказці Vim .


1
при виході з режиму редагування ви можете додати ім'я файлу: ctrl- "ctrl-% p
stefanB

13
Ctrl+R %працює в insertрежимі - але в editрежимі Ctrl+Rозначає повторно.
Кевін Панько

3
Що означає stefanB, було "% p для нормального / командного режиму. Це те саме, що <Cr>% у режимі вставки /
cmdline

Просто для відновлення чи констатації інакше: відповіді і для siwh, і для dwc - "вставити з регістру%" Один робить це для режиму вставки, інший для звичайного режиму. У macvim, схоже, регістр% неможливо перезаписати.
Ерік Ху

чи є така ж проста команда отримати ліновий номер? ) thx для рішення
itnikolay

73

Якщо ви хочете помістити поточне ім'я буфера в буфер обміну на рівні системи, спробуйте змінити регістр на @ +:

" relative path
:let @+ = expand("%")

" full path
:let @+ = expand("%:p")

" just filename
:let @+ = expand("%:t")

Редагувати 20140421: Я зазвичай їх використовую, тому я створив деякі ярлики. Linux Vims, мабуть, працює дещо інакше, ніж Mac Vims , тому для цього є і особливий випадок. Якщо ви помістіть його в вашому ~/.vimrc:

" copy current file name (relative/absolute) to system clipboard
if has("mac") || has("gui_macvim") || has("gui_mac")
  " relative path  (src/foo.txt)
  nnoremap <leader>cf :let @*=expand("%")<CR>

  " absolute path  (/something/src/foo.txt)
  nnoremap <leader>cF :let @*=expand("%:p")<CR>

  " filename       (foo.txt)
  nnoremap <leader>ct :let @*=expand("%:t")<CR>

  " directory name (/something/src)
  nnoremap <leader>ch :let @*=expand("%:p:h")<CR>
endif

" copy current file name (relative/absolute) to system clipboard (Linux version)
if has("gui_gtk") || has("gui_gtk2") || has("gui_gnome") || has("unix")
  " relative path (src/foo.txt)
  nnoremap <leader>cf :let @+=expand("%")<CR>

  " absolute path (/something/src/foo.txt)
  nnoremap <leader>cF :let @+=expand("%:p")<CR>

  " filename (foo.txt)
  nnoremap <leader>ct :let @+=expand("%:t")<CR>

  " directory name (/something/src)
  nnoremap <leader>ch :let @+=expand("%:p:h")<CR>
endif

Тоді, наприклад, <leader>cfбуде скопійовано відносний шлях поточного буфера (лідером за замовчуванням є зворотна косою ( \)). Я часто використовую їх для запуску команд у файлі або для виконання інших завдань у командному рядку. Я не дуже часто використовую прізвище / ім'я файлу часто.

Ви можете розглянути більш інтуїтивні відображення, такі як <leader>cfrвідносне, <leader>cfaабсолютне, <leader>cffпросто ім'я файлу, <leader>cfdкаталог.


2
У Windows та Mac "*і "+вони рівноцінні, тому ви можете відмовитися від перевірки платформи та просто використовувати@+
Gabe Moothart

1
Як не дивно, це, здається, не працює у функції vimscript: "echo bufname ('%: p')" порожнє, але ви можете виправити це за допомогою довшого "fnamemodify (bufname ('%'), ': p' ) "
Девід Люнг Медісон Зоряний

6

Якщо це зробити, :regви побачите ім'я поточного файлу в %реєстрі. "%pНаприклад, можна вставити його .

Якщо, як я, ви часто переходите на "альтернативний" буфер, дуже зручно, що його повний шлях-і-файл-ім'я буде внесено до #реєстру. "#pНаприклад, можна вставити його .

Примітка (про всяк випадок це поведінка, специфічна для моєї установки): я використовую VIM 7.4.52 на Ubuntu 14.04.4 LTS.


4

Поєднання інформації з декількох інших відповідей: Якщо ви хочете перетягнути поточний повний шлях до файлу і помістити його в буфер команд в іншому вікні, спочатку зробіть :let @" = expand("%:p"), а потім перейдіть до іншого вікна та введіть Ctrl+R ".

Корисно для копіювання файлу під час перебування в одному каталозі та збереження відкритого. Наприклад:

Початок : Редагування src / com / benatkin / paint / shape / Circle.java

  1. Тип :let @" = expand("%:p") (Шлях потрапляє на основний буфер буфера обміну.)

  2. Відкрийте нове вікно за допомогою :sp

  3. Тип :e Ctrl+R"

  4. Використовуйте клавіші зі стрілками, щоб повернутися до кола та змінити його на квадрат, а потім натисніть <CR>

Кінець : Редагування src / com / benatkin / paint / shape / Square.java


1

Ось моє рішення:

" filename / dirname of the current file {{{
    " copy result to the system clipboard and echo the result
    " the cb> prompt means the clipboard
    " *f*ile *n*ame, ex. init.vim
    map <Leader>fn :let @+ = expand("%:t") \| echo 'cb> ' . @+<CR>
    " *f*ile *p*ath, ex. /home/user/nvim/init.vim
    map <Leader>fp :let @+ = expand("%:p") \| echo 'cb> ' . @+<CR>
    " *d*irectory *p*ath, ex. /home/user/nvim
    map <Leader>dp :let @+ = expand("%:p:h") \| echo 'cb> ' . @+<CR>
    " *d*irectory *n*ame, ex. nvim
    map <Leader>dn :let @+ = expand("%:p:h:t") \| echo 'cb> ' . @+<CR>
" }}}

-1

Я використовую xclip для доступу до буфера обміну X, тому я використовую:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>

"+ або" * зробіть те саме, що відбувається у vim, не використовуючи зовнішню команду.
Доріан Б.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.