Vim에서 Yank 파일 이름 / 현재 버퍼 경로


188

현재 버퍼가 편집을 위해 열린 파일이라고 가정하면 :e표시되지 않습니다 E32: No file name.

하나 또는 모두를 잡아 당기고 싶습니다.

  • 상태 표시 줄에 표시된 것과 정확히 같은 파일 이름 ~\myfile.txt
  • 파일의 전체 경로, 예 : c:\foo\bar\myfile.txt
  • 파일 이름 만 myfile.txt


답변:


209

TL; DR

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

그러면 파일 이름이 unamed register에 복사되고 , good old p를 사용 하여 붙여 넣을 수 있습니다. 물론 빠른 사용을 위해 키에 매핑 할 수도 있습니다.

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

당신은 또한 전체 경로에 사용할 수 있습니다

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

설명

Vim은 이름을 지정하지 않은 레지스터 를 사용하여 붙여 넣을 때와 같이 삭제되거나 복사 된 (감지 된) 텍스트를이 레지스터에서 텍스트를 읽을 때 저장합니다.

를 사용하여 let텍스트를 레지스터에 수동으로 저장할 수 :let @" = "text"있지만 식의 결과를 저장할 수도 있습니다.

위의 예에서는 expand와일드 카드와 키워드를 확장 하는 함수 를 사용합니다 . 이 예 expand('%')에서는 현재 파일 이름을 확장하는 데 사용 합니다. expand('%:p')전체 파일 이름 으로 수정할 수 있습니다 .

자세한 내용 :help let :help expand :help registers을 참조하십시오


23
쿨이 방금 vimrc에 이것을 추가했습니다 : noremap <silent> <F4> : let @ + = expand ( "% : p") <CR>
ThePosey

9
Windows에서는 Windows 클립 보드에 : let : * @ expand ( "%")를 사용하려면 대신 사용해야 합니다.
KFL

15
당신이 사용하는 경우 unnamedplus클립 보드 사용으로let @+ = expand("%")
케빈 콕스

4
"%:h"파일 이름없이 전체 경로를 얻는 데 사용하십시오 .
Polymorphix

- 당신은 파일 이름없이 디렉토리를 필요로하는 경우 특히, 관련 stackoverflow.com/a/2233924/1882064
arcseldon

94

거의 모든 요구 사항과 수행 방식 : Ctrl+R %현재 파일 이름을 현재 위치로 가져옵니다 (명령 프롬프트, 편집 버퍼 등). 자세한 내용은 이 Vim Tip 을 참조하십시오 .


1
편집 모드를 종료하면 파일 이름을 추가 할 수 있습니다. ctrl- "ctrl- % p
stefanB

13
Ctrl+R %insert모드 에서 작동 하지만 edit모드에서는 Ctrl+R다시 실행을 의미합니다.
Kevin Panko

3
stefanB의 의미는 "정상 / 명령 모드의 경우 % p입니다. 이것은 insert / cmdline-mode의 <Cr> %와 같습니다.
graywh

간단히 요약하거나 다르게 말하면 : graywh와 dwc에 대한 답변은 "레스터에서 붙여 넣기"입니다. 하나는 삽입 모드, 다른 하나는 일반 모드에 대해 수행합니다. macvim에서는 % 레지스터를 덮어 쓸 수없는 것으로 보입니다.
Eric Hu

linenumber를 얻는 동일한 간단한 명령이 있습니까? 솔루션) 들으
itsnikolay

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에 "*"+당신이 플랫폼 확인하고 바로 사용으로 분배 할 수 있도록 동일@+
게이브 Moothart

1
이상하게도 이것은 vimscript 함수에서 작동하지 않는 것 같습니다. "echo bufname ( '% : p')"는 비어 있지만 더 긴 "fnamemodify (bufname ( '%'), ': p' ) "
David Ljung Madison Stellar

6

그렇게 :reg하면 %레지스터에 현재 파일 이름이 표시됩니다 . "%p예를 들어로 붙여 넣을 수 있습니다 .

나와 같이 종종 '대체'버퍼로 전환하면 전체 경로 및 파일 이름을 #레지스터에 저장하는 것이 매우 편리합니다 . "#p예를 들어로 붙여 넣을 수 있습니다 .

참고 (이것이 내 설정과 관련된 동작 인 경우) : Ubuntu 14.04.4 LTS에서 VIM 7.4.52를 사용하고 있습니다.


4

다른 두 가지 답변의 정보 결합 : 파일의 현재 전체 경로를 잡아 당기고 다른 창에서 명령 버퍼에 넣으려면 먼저 수행 :let @" = expand("%:p")한 다음 다른 창으로 이동하여을 입력하십시오 Ctrl+R ".

동일한 디렉토리에 머무르면서 이전 디렉토리를 열어 둔 상태에서 파일을 복사하는 데 유용합니다. 예를 들면 다음과 같습니다.

시작 : src / com / benatkin / paint / shapes / Circle.java 편집

  1. 유형 :let @" = expand("%:p") (경로가 기본 클립 보드 버퍼로 이동합니다.)

  2. 로 새 창을 엽니 다 :sp

  3. 유형 :e Ctrl+R"

  4. 화살표 키를 사용하여 Circle으로 돌아가서 Square로 변경하고 <CR>을 누릅니다.

: src / com / benatkin / paint / shapes / 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에서 기본적으로 동일한 작업을 수행합니다.
도리안 B.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.