알려진 파일 형식 나열


54

vim이 현재 알고있는 파일 형식의 이름 목록을 어떻게 얻을 수 있습니까?

vim이 파일 형식을 자동으로 감지하지 않을 때 vim이 알고있는 파일 형식 중 일부가 비슷한 것을 강조하고 합리적인 구문 강조 표시를 제공하는지 확인할 수 있도록이 작업을 수행 할 수 있기를 원합니다.

파일 형식을 다루는 vimscript 파일 ftplugin은 규칙 에 따라 디렉토리에 저장되지만 반드시 그럴 필요는 없습니다 (확실하지는 않지만 ftplugin디렉토리 의 vimscript 파일 이 특별 하다고 생각하지는 않습니다 ). vim에게 어떻게 배웠는지에 관계없이 알고있는 파일 형식을 물어보십시오.


1
자동 완성을 시도 할 때 :setfiletype (예 : Tab공백 후) 목록을 볼 수 있습니다 . 전체 목록인지 또는 일부 버퍼 / 파일로 캡처하는 방법을 잘 모르겠습니다.
VanLaser

1
완료를 나열하는 <c-d>대신 사용하십시오 <tab>.
Peter Rincker

문자를 몇 개 입력하여 목록을 필터링하고 해당 문자로 시작되는 항목을 표시하십시오.
Shamaoke

답변:


63

간단한 솔루션

유형 :setfiletype (이후 공백) , 다음 Enter 키를 누릅니다 Ctrl-d.

:help cmdline-completionvim의 명령 행에서 자동 완성에 대한 자세한 내용 을 참조하십시오 .

복잡한 솔루션

이 솔루션은 'runtimepath'옵션을 사용하여 사용 가능한 모든 구문 디렉토리를 가져온 다음 해당 디렉토리에서 확장자가 제거 된 vimscript 파일 목록을 가져옵니다. 이것이 가장 안전한 방법은 아니므로 개선을 환영합니다.

function! GetFiletypes()
    " Get a list of all the runtime directories by taking the value of that
    " option and splitting it using a comma as the separator.
    let rtps = split(&runtimepath, ",")
    " This will be the list of filetypes that the function returns
    let filetypes = []

    " Loop through each individual item in the list of runtime paths
    for rtp in rtps
        let syntax_dir = rtp . "/syntax"
        " Check to see if there is a syntax directory in this runtimepath.
        if (isdirectory(syntax_dir))
            " Loop through each vimscript file in the syntax directory
            for syntax_file in split(glob(syntax_dir . "/*.vim"), "\n")
                " Add this file to the filetypes list with its everything
                " except its name removed.
                call add(filetypes, fnamemodify(syntax_file, ":t:r"))
            endfor
        endif
    endfor

    " This removes any duplicates and returns the resulting list.
    " NOTE: This might not be the best way to do this, suggestions are welcome.
    return uniq(sort(filetypes))
endfunction

그런 다음 목록의 모든 값을 인쇄하는 등 원하는 방식으로이 기능을 사용할 수 있습니다. 당신은 그렇게 그렇게 할 수 있습니다 :

for f in GetFiletypes() | echo f | endfor

이것은 아마도 상당히 압축 될 수 있으며 가독성을 위해 이와 같습니다. 여기에 사용 된 모든 기능과 명령을 설명하지는 않지만 여기에 대한 모든 도움말 페이지가 있습니다.

  • :help 'runtimepath'
  • :help :let
  • :help :let-&
  • :help split()
  • :help :for
  • :help expr-.
  • :help :if
  • :help isdirectory()
  • :help glob()
  • :help fnamemodify()
  • :help add()
  • :help uniq()
  • :help sort()

1
내가 입력 set filetype<space><c d>하면 목록이 표시되지만 html은 목록에 없습니다. Java가 목록에 없습니다. 구문 형식 구성에 해당하는 파일 형식으로 파일 형식 이름을 표시하려면 어떻게합니까?
John Meyer

6
@ JohnMeyer : 나는 같은 실수를했다. 이 명령에는 실제로 :setfiletype"set"과 "filetype"사이에 일반적인 공백 이 없습니다. :help :setfiletype및로 더 많은 정보를 찾을 수 있습니다 :help ftdetect.
sanscore

나는 이것을 시도했지만 작동합니다! btw, :setfiletype ht<Ctrl+D>ht로 시작하는 파일 형식을 나열하여 원하지 않는 결과를 필터링 하는 데 사용할 수 있습니다 . :)
pimgeek

18

vim 버전이 최신 버전 인 경우 (v7.4.2011 +), 수동 자동 완성을 정의하는 데 사용할 수있는 기능으로 알려진 파일 형식을 요청할 수 있습니다. getcompletion()

:echo getcompletion('', 'filetype')

당신이로 시작하는 파일 형식의 목록을 제한하려면 'c', 당신은 전화 것

:echo getcompletion('c', 'filetype')

등등.

참고 :에 파일 이름과 디렉토리 이름을 구문 분석 솔루션과는 달리 $VIMRUNTIME/{syntax,filetype}/,이 솔루션 분석 'runtimepath'뿐만 아니라. 내가 이해하는 한, set ft=foobar자동 명령을 사용하거나 사용 하여 즉시 새 파일 형식을 정의 / 등록하지 않습니다 .


3

다음 두 명령을 실행하여 터미널에서 모든 파일 유형을 인쇄 할 수도 있습니다.

1.

cd $(vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIMRUNTIME|quit' | tr -d '\015')

2.

cat <(ls -1 ftplugin/*.vim) <(ls -1 syntax/*.vim) | tr '\n' '\0' | xargs -0 -n 1 basename | sort | uniq | cut -f 1 -d '.'

첫 번째 명령은 단순히 vim 런타임 경로로 이동합니다 (나에게는 / usr / share / vim / vim80 ).

두 번째 명령은 vim이 파일 유형 정의를 저장하는 두 개의 폴더에 모든 파일 유형 이름을 나열합니다.

최신 정보

다음을 제공하는 muru의 두 명령에 대한 개선 제안 :

1.

cd $(vim -Nesc '!echo $VIMRUNTIME' -c qa)

2.

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u

3
그것은 너무 복잡한 파이프 라인입니다. 사용하여 tr줄 바꿈을 변환하는 간단한 명령 그룹화 할 것이다 때 바로 다음 명령, 공정 대체 그것을 다시 변환 만 null로. 나는 다음과 같은 것을 제안 할 것이다 :find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru

멋지고 간결합니다. 터미널에서 VIMRUNTIME 값을 찾는 더 나은 솔루션이 있습니까?
사미르 Alajmovic

1
vim -Nesc '!echo $VIMRUNTIME' -c qa생각합니다.
muru

Yikes. 두 번째 명령은 무섭습니다. 죄송합니다. 나는 좋지 않다. ;) 재미있게, 여기에 하나의 외부 명령을 사용하는 muru의 제안에 대한 Bash 대안 printf이 있습니다 (내장이 내장되어 있다고 가정 ) f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. 상형 문자에 대한 설명은 Bash 매뉴얼 페이지의 "매개 변수 확장"을 참조하십시오.
B Layer

이 사이비 파일 형식 플러그인과 같은 당신에게 줄 것이다 bash'가 아니라 실제 파일 형식 플러그인 ... 그리고 "쉬"파일 형식의 효과를 얻는다'인
jeremysprofile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.