알려진 파일 형식 나열


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.