vim에서 현재 버퍼의 Yank 파일 이름 / 경로
문제
현재 버퍼가 편집 할 수있는 파일이라고 가정하므로 :e
표시되지 않습니다 E32: No file name
.
나는 하나 또는 전부의 하나를 잡고 싶다 :
- 상태 라인에 표시되는 파일 이름 (예 :
~\myfile.txt
- 파일의 전체 경로, 예를 들어
c:\foo\bar\myfile.txt
- 파일 이름 만 (예 :
myfile.txt
해결책
tl; dr
:let @" = expand("%")
>
파일 이름을 복사합니다 이름이없는 레지스터, 당신은 좋은 오래된 것을 사용할 수 있습니다 p
붙여 넣기. 물론 빠른 사용을 위해 이것을 키에 매핑 할 수 있습니다.
:nmap cp :let @" = expand("%")<cr>
전체 경로에 이것을 사용할 수도 있습니다
:let @" = expand("%:p")
설명
vim을 사용합니다 이름이없는 레지스터 삭제되거나 복사 된 텍스트 (Yanked)를 저장하려면이 레지스터에서 텍스트를 읽을 때 마찬가지로 페이스트 할 때 마찬가지로.
사용 let
레지스터에 텍스트를 수동으로 저장할 수 있습니다 :let @" = "text"
그러나 우리는 표현의 결과를 저장할 수도 있습니다.
위의 예에서는 기능을 사용합니다 expand
와일드 카드와 키워드를 확장합니다. 이 예에서 우리는 사용합니다 expand('%')
현재 파일 이름을 확장하려면 우리는 그것을 수정할 수 있습니다 expand('%:p')
전체 파일 이름의 경우.
보다 :help let
:help expand
:help registers
자세한 내용은
다른 팁
거의 당신이 요구하는 것과 할 수 있습니다. Ctrl+R %
현재 파일 이름을 어디에 있는지 (명령 프롬프트, 편집 버퍼, ...)로 끌어 당깁니다. 보다 이 vim 팁 이상.
현재 버퍼 파일 이름을 시스템 레벨 클립 보드에 넣으려면 레지스터를 @+로 변경하십시오.
" 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
디렉토리 용.
당신이한다면 :reg
현재 파일의 이름이 %
등록하다. 당신은 그것을 붙여 넣을 수 있습니다 "%p
, 예를 들어.
나와 마찬가지로 종종 '대체'버퍼로 전환하면 전체 경로와 파일 이름이 #
등록하다. 당신은 그것을 붙여 넣을 수 있습니다 "#p
, 예를 들어.
참고 (이것은 내 설정과 관련된 동작 인 경우) : Ubuntu 14.04.4 LTS에서 VIM 7.4.52를 사용하고 있습니다.
몇 가지 다른 답변에서 정보 결합 : 파일의 현재 전체 경로를 잡아 당기고 다른 창에 명령 버퍼에 넣으려면 먼저 :let @" = expand("%:p")
, 그런 다음 다른 창으로 이동하여 입력하십시오 Ctrl+R "
.
동일한 디렉토리에 머무르고 이전 디렉토리를 열어 두는 동안 파일을 복사하는 데 유용합니다. 예를 들어:
시작: 편집 src/com/benatkin/paint/shapes/circle.java
유형
:let @" = expand("%:p")
(경로는 메인 클립 보드 버퍼에 젖 힙니다.)함께 새 창을 엽니 다
:sp
유형
:e Ctrl+R"
화살표 키를 사용하여 원으로 돌아가서 정사각형으로 변경하고 누르고 누릅니다.u003CCR>
끝: 편집 src/com/benatkin/paint/shapes/square.java
내 해결책은 다음과 같습니다.
" 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>
" }}}
XClip을 사용하여 X의 클립 보드에 액세스하므로 사용합니다.
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>