Vim:Script
Vim에서 사용할 수 있는 스크립트에 대하여 정리한다.
Basic Layout
-
~/.vim/colors/
- 컬러(Color) 스킴(Shemes)들을 다룹니다. 예를들어 (vim 실행상태에서 Command Mode 에서)
:color mycolors
를 실행한다면 Vim 은~/.vim/colors/mycolors.vim
파일을 찾을 것이고 그것을 실행할 겁니다. 이 파일은 컬러 스킴을 생성하는데 필요한 모든 Vimscript 명령어들을 포함해야 합니다.
-
~/.vim/plugin/
- Vim 이 시작되는 매순간마다 각각 실행 됩니다. 이러한 파일들은 Vim 을 시작할때 마다 항상 로드되어질 원하는 코드를 포함한다는 것을 의미합니다.
-
~/.vim/ftdetect/
- Vim이 시작될때마다 실행되어 집니다. ftdetect는 "filetype detection"을 의미 합니다. 이 디렉토리안에 파일들은 탐지와 파일들의 파일타입이 지정하거나 아무것도 안하는 자동명령어들을 설정합니다.
-
~/.vim/ftplugin/
- The naming of these files matters! Vim 이 버퍼의 filetype 값으로 지정되면,
~/.vim/ftplugin/
에서 일치하는 파일을 찾습니다. 예를들어, 만약set filetype=derp
를 실행하면, Vim 은~/.vim/ftplugin/derp.vim
을 찾을 것입니다. 그리고 만약 파일이 존재한다면 이것을 실행할 것입니다. - Vim 은 또한
~/.vim/ftplugin/
안에 디렉토리들을 지원 합니다. 예제에서set filetype=derp
는~/.vim/ftplugin/derp/
안에 모든*.vim
파일들을 실행 시킵니다. 이것은 플러그인의 ftplugin 파일들을 로지컬 그룹으로 나눕니다. - 이러한 파일들이 매번 버퍼의 filetype을 실행시키기 위해서는 반드시 buffer-local 옵션들을 지정해줘야 합니다. 만얀 전역적으로 옵션들을 지정했다면 모든 열린 버퍼들을 덮어쓰게 됩니다.
-
~/.vim/indent/
- ftplugin 파일과 매우 유사합니다. 그들은 그들의 이름을 기반으로 로드됩니다.
- indent 파일들은 그들의 파일타입에 들여쓰기와 연관된 옵션들을 지정하고 이러한 옵션들은 buffer-local에 존재해야 합니다.
- 당연히, 단순하게 ftplugin 파일들에 이러한 코드를 집어넣을 수 있지만 Vim 사용자들이 당신이 무슨 일을 하는지 이해할수 있도록 이것을 분리시키는게 더 낫습니다. 이건단지 관습적인 것인데, 플러그인 제작자를 배려하도록 그것을 따르는게 좋습니다.
-
~/.vim/compiler/
- indent 파일들처럼 동작합니다. 이것은 이름을 기반으로 현재 버퍼에서 compiler-related 옵션들을 지정합니다.
-
~/.vim/after/
- 이 디렉토리에 파일들은 Vim 이 시작될때마다 로드되어 지지만,
~/.vim/plugin/
에 파일이후에나 로드되어 집니다. - 이것은 Vim의 내부 파일들을 오버라이드(override) 하도록 허용합니다.
-
~/.vim/autoload/
- autoload 는 실제로 필요할때까지 플러그인 코드 로딩을 지연시키는 방법입니다.
-
~/.vim/doc/
- 플러그인에 대한 문서를 위한 디렉토리 입니다.
Simple debugging
echom
를 사용하면 이력에 남는다. 확인 방법은:message
를 사용하면 된다.
Script help
Vim 세션 내에서 다음을 입력하여 내장 도움말 시스템을 통해 Vimscript에 대한 Vim의 자체 문서를 볼 수 있다.
Keyward
Vim으로 지원되는 추가 키워드:
-
autocmd
: 편집 중인 파일 유형에 따라 특정 명령을 자동으로 실행한다. autocmd 예제를 포함한 sample.vimrc 파일은 다운로드를 참조한다. -
filetype
: 특정 파일 유형을 편집하고 있을 때 추가 기능을 제공하는 다양한 플러그인을 로드하고 활성화한다. -
function
: 핵심 명령으로 맵핑할 수 있는 사용자 정의 함수를 정의한다. -
syntax
: 구문 강조표시를 활성화하거나 비활성화한다.
구성 및 사용자 정의 명령:
-
ab
: 확장된 약어를 Insert 모드에서 텍스트를 입력하는 동안 직면하는 문자들의 특정 순서로 정의한다. -
map
: 기존 vi 또는 Vim 명령을 사용자 정의 키로 지정하거나 자체적인 사용자 정의 명령을 정의한다. -
set
: vi 또는 Vim 변수를 설정한다.
Key code
아래의 명령을 입력하면 사용할 수 있는 전체 키코드 목록을 확인할 수 있다.
Execute
:source [PATH]
를 사용하여 Vim 스크립트를 실행할 수 있다.
Script file path
실행중인 스크립트 파일 경로를 알아보는 방법:
" Relative path of script file:
let s:path = expand('<sfile>')
" Absolute path of script file:
let s:path = expand('<sfile>:p')
" Absolute path of script file with symbolic links resolved:
let s:path = resolve(expand('<sfile>:p'))
" Folder in which script resides: (not safe for symlinks)
let s:path = expand('<sfile>:p:h')
" If you're using a symlink to your script, but your resources are in
" the same directory as the actual script, you'll need to do this:
" 1: Get the absolute path of the script
" 2: Resolve all symbolic links
" 3: Get the folder of the resolved absolute file
let s:path = fnamemodify(resolve(expand('<sfile>:p')), ':h')
WARNING |
주의할 점은 |
File Read
" Read the created file and echo it
let s:lines = readfile('readfile.txt')
for s:line in s:lines
echo s:line
endfor
Current file
echo @%
" full path
call expand('%:p')
" full path copy to buffer 'a'
redir @a | echo expand('%:p') | redir END
" full path copy to default buffer
redir @" | echo expand('%:p') | redir END
Variable
Vimscript에서 변수를 할당하려면 특수 키워드 let
을 사용해야 한다. 변수는 아래와 같은 종류가 있다.
" 스칼라: 문자열이나 숫자와 같은 단일 값이다.
let name = "Damian"
let height = 165
" 목록: 대괄호로 구분되고 0부터 시작하는 묵시적 정수 인덱스를 사용하는 정렬된 값 시퀀스이다.
let interests = [ 'Cinema', 'Literature', 'World Domination', 101 ]
" 사전: 중괄호로 구분되고 명시적 문자열 키를 사용하는 정렬되지 않은 값 세트이다.
let phone = { 'cell':5551017346, 'home':5558038728, 'work':'?' }
값과는 달리 변수에는 기본 유형이 없다. 대신 처음에 할당된 값의 유형을 따른다. 따라서 위의 name
및 height
변수는 스칼라 유형(즉, 문자열이나 숫자만 저장할 수 있음)이고, interests
는 목록 변수(즉, 목록만 저장할 수 있음)이고, phone
은 사전 변수(사전만 저장할 수 있음)이다. 한번 할당된 변수 유형은 런타임 동안 영구적으로 엄격하게 유지된다.
기본적으로 변수의 범위는 변수가 처음 할당된 함수로 한정된다. 그렇지 않고 첫 번째 할당이 함수 외부에서 발생한 변수는 전역 변수이다. 하지만 아래와 같이 다양한 접두어를 사용하여 변수를 명시적으로 다른 범위에 속한 변수로 선언할 수도 있다.
-
g: varname
: 변수가 전역 변수이다. -
s: varname
: 변수가 현재 스크립트 파일에 한정되는 로컬 변수이다. -
w: varname
: 변수가 현재 편집기 창에 한정되는 로컬 변수이다. -
t: varname
: 변수가 현재 편집기 탭에 한정되는 로컬 변수이다. -
b: varname
: 변수가 현재 편집기 버퍼에 한정되는 로컬 변수이다. -
l: varname
: 변수가 현재 함수에 한정되는 로컬 변수이다. -
a: varname
: 변수가 현재 함수의 매개변수이다. -
v: varname
: 변수가 Vim에 미리 정의되어 있는 변수이다.
스크립트에서 다른 유형의 값 컨테이너에 액세스하는 데 사용할 수 있는 의사 변수도 Vim에서 제공된다. 아래는 그러한 변수에 대한 요약 정보를 제공한다.
-
& varname
: Vim 옵션(정의된 경우 로컬, 그렇지 않은 경우 전역) -
&l: varname
: 로컬 Vim 옵션 -
&g: varname
: 전역 Vim 옵션 -
@ varname
: Vim 레지스터 -
$ varname
: 환경 변수
의사 변수는 매우 유용하게 사용할 수 있다. 예를 들어, 다음과 같이 두 개의 키 맵을 설정하여 현재 탭 간격을 늘이거나 줄일 수 있다.
Check variables
플러그인 등에서 추가된 변수는 아래와 같은 방법으로 확인 가능하다.
Innser variables
set
명령을 통해 사용자는 내부 vi 및 Vim 변수를 설정할 수 있다. 변수는 다음과 같이 유형에 따라 다른 방식으로 설정된다.
- 켜짐 또는 꺼짐으로 설정되는 변수는
set variable
명령으로 설정되고set novariable
명령을 사용하여 설정 해제된다. - 값을 취하는 변수는
set variable=value
명령으로 설정된다.
vi 또는 Vim에서 설정할 수 있는 모든 옵션의 현재 값을 확인하려면 vi 또는 Vim 내에서 :set all
명령을 사용한다. 특정 옵션의 현재 값을 표시하려면 f:set option?
명령을 사용한다. 기본값에서부터 수정한 옵션을 모두 표시하려면 :set 명령을 사용한다.
Fixed window size
(set WinFixHeight, set WinFixWidth)
Read-only buffer
function UpdateModifiable()
if !exists("b:setmodifiable")
let b:setmodifiable = 0
endif
if &readonly
if &modifiable
setlocal nomodifiable
let b:setmodifiable = 1
endif
else
if b:setmodifiable
setlocal modifiable
endif
endif
endfunction
autocmd BufReadPost * call UpdateModifiable()
Resize window
String
빈 문자열 테스트 방법
문자열 연결
주의할 점은 +=
을 사용하면 안된다.
문자열 비교 연산자의 대/소문자 구분 여부 지정하기 (==?
, ==#
)
문자열 비교는 대개 Vim ignorecase
옵션의 로컬 설정을 따르지만 명시적으로 문자열 비교 연산자에
- 대/소문자 구분 (
#
추가) 또는 - 대/소문자 구분 안함(
?
추가)
을 표시할 수 있다:
if name ==? 'Batman' |"Equality always case insensitive
echo "I'm Batman"
elseif name <# 'ee cummings' |"Less-than always case sensitive
echo "the sky was can dy lu minous"
endif
"명시적으로 대/소문자 구분 여부가 지정된" 연산자를 사용하면 사용자의 변형된 옵션 설정에 영향을 받지 않고 스크립트를 안정적으로 실행할 수 있으므로 모든 문자열 비교에 이러한 연산자를 사용하는 것이 좋다.
Regex
문자열에 대해서는 두 가지가 더 있습니다:
-
str =~ pattern
: 패턴이 일치할 경우. -
str !~ pattern
: 패턴이 일치하지 않는다.
함수가 필요하다면 matchstr()
를 사용하면 된다.
let url = matchstr(test, '\ca href=\([''"]\)\zs.\{-}\ze\1')
if empty(url)
throw "no url recognized into ``".test."''"
endif
Function
다음 명령을 입력하여 함수에 대한 자세한 정보를 확인할 수 있다.
User defined function
함수는 아래와 같이 추가할 수 있다. 주의할 점으로, 함수 이름의 첫 글자는 대문자로 해야 한다.
Vimscript 함수는 값을 항상 리턴하므로 return을 지정하지 않으면 0 값이 자동으로 리턴된다.
함수를 호출하는 방법은 아래와 같다.
덧붙여, 인자 및 반환 값을 가지는 함수 정의는 아래와 같다.
function f (int k, int l) returns float
begin
f = k * l;
for (int i=0; i<10; i++)
begin
f += sqrt(k) * sqrt(l);
end
return f + 2;
endfunction
또한, 변수와 같이 범위 접두어를 사용할 수 있다.
샵(#
) 문자를 사용하여 이름공간(namespace)을 구분할 수 있다.
재선언 가능한 함수
Vimscript의 함수 선언은 런타임 명령문이므로 스크립트를 두 번 로드하게 되면 스크립트 내의 모든 함수 선언이 두 번 실행되면서 해당 함수가 다시 작성된다.
함수 재선언은 치명적인 오류로 간주된다. (이는 서로 다른 두 스크립트에서 우연히 같은 이름의 함수를 선언했을 때 발생할 수 있는 충돌을 막기 위한 것이다.) 따라서 사용자 정의 구문 강조 스크립트와 같이 반복적으로 로드되어야 하는 스크립트의 경우 함수를 작성하기가 어렵다.
따라서 Vimscript에서는 키워드 한정자(function!
)를 사용하여 필요에 따라 안전하게 다시 로드될 수 있는 함수 선언임을 지정할 수 있다.
function! s:save_backup ()
let b:backup_count = exists('b:backup_count') ? b:backup_count+1 : 1
return writefile(getline(1,'$'), bufname('%') . '_' . b:backup_count)
endfunction
이 키워드 한정자를 사용하여 정의된 함수에 대해서는 재선언 검사가 수행되지 않으므로 명시적으로 범위가 지정된 함수와 사용하기에 적합하다. (범위가 지정되어 있기 때문에 스크립트 간 함수 충돌이 발생하지 않는다.)
Abortable function
오류가 발생하면 중단한다.
리턴 값
함수의 리턴 값 사용하기:
Vimscript에서는 C나 Perl과는 달리 함수의 리턴 값을 사용하지 않으면 버릴 수 없다는 데 주의해야 한다. 따라서 함수를 프로시저나 서브루틴으로 사용하고 함수의 리턴 값을 무시하려면 호출 앞에 call 명령을 사용해야 한다.
함수 내에서 인수 값에 액세스하기
function PrintDetails(name, title, email)
echo 'Name: ' a:title a:name
echo 'Contact:' a:email
endfunction
가변 매개변수
함수에 지정된 인수의 수를 모르는 경우에는 명명된 매개변수 대신 줄임표(...
)를 사용하여 가변 매개변수 목록을 지정할 수 있다. 이렇게 하면 인수의 수에 제한 없이 함수를 호출할 수 있으며 해당 값은 단일 변수 즉, a:000
이라는 이름의 배열에 수집된다. 또한 개별 인수에는 a:1
, a:2
, a:3
등과 같은 위치 매개변수 이름이 지정되며 a:0
에는 인수의 수가 들어 있다.
function Average(...)
let sum = 0.0
for nextval in a:000 "a:000 is the list of arguments
let sum += nextval
endfor
return sum / a:0 "a:0 is the number of arguments
endfunction
아래와 같이 일반 인수와 가변 인수를 조합할 수도 있다.
전체 인수 개수는 len(a:000)
로 확인할 수 있다.
Default arguments
get
함수를 사용해야 한다.
function! FunctionName(arg1,...)
let arg2 = get(a:, 1, 0)
let arg3 = get(a:, 2, 0)
if arg2
"Do stuff with arguments"
else
"Do stuff without arguments"
endif
endfunction
반복 (Loop)
Custom commands
Commands with arguments:
command! -nargs=? Save call script#foo(<args>)
" -nargs=0 0개의 인수. 기본값.
" -nargs=1 1개의 인수. 공백을 포함한다.
" -nargs=? 0개 또는 1개의 인수.
" -nargs=* 공백으로 구분된 0개 이상의 인수.
" -nargs=+ 공백으로 구분된 1개 이상의 인수.
Example
command! -nargs=0 -bang OpvimPreview call opvim#Preview(<bang>0)
command! -nargs=? -complete=shellcmd OpvimExec call opvim#Exec(<f-args>)
command! -nargs=? OpvimMode call opvim#Mode(<f-args>)
command! -nargs=0 OpvimModeMenu call quickmenu#bottom(g:opm_quickmenu_mode_id)
command! -nargs=0 OpvimCMake call opvim#CMake()
command! -nargs=? OpvimBuild call opvim#Build(<f-args>)
command! -nargs=? OpvimDebug call opvim#Debug(<f-args>)
command! -nargs=? OpvimScript call opvim#Script(<f-args>)
command! -nargs=0 OpvimReload call OpmReloadQuickMenu()
command! -nargs=0 OpvimCreate call opvim#CreateProject()
command! -nargs=0 OpvimDebugDone call opvim#ExitDebug()
함수 행 범위 내부화하기
각 행에 대해 함수를 반복적으로 호출하는(call-the-function-repeatedly-for-each-line) 동작은 편리한 기본 동작이다. 하지만 범위를 지정한 후 함수를 한 번만 호출한 다음 함수 자체 내에서 범위 시맨틱을 처리하려는 경우도 있다. 이 또한 Vimscript에서 쉽게 수행할 수 있다. 다음과 같이 특수 한정자(range
)를 함수 선언에 추가하면 된다.
function DeAmperfyAll() range
"Step through each line in the range...
for linenum in range(a:firstline, a:lastline)
"Replace loose ampersands (as in DeAmperfy())...
let curr_line = getline(linenum)
let replacement = substitute(curr_line,'&\(\w\+;\)\@!','&','g')
call setline(linenum, replacement)
endfor
"Report what was done...
if a:lastline > a:firstline
echo "DeAmperfied" (a:lastline - a:firstline + 1) "lines"
endif
endfunction
매개변수 목록 뒤에 range
한정자가 지정되어 있는 경우 다음과 같이 범위를 사용하여 호출할 수 있다.
표현식 실행하기
콜론명령(:
로 시작되는 명령 모드의 명령어)을 실행할 경우 execute
를 사용한다.
그 밖의 일반 모드 명령은 normal
을 사용한다. 이때 인자는 표현식이 아니고 명령을 나타내는 문자 그 자체이다.
normal
명령을 표현식과 함께 쓰려면, execute
와 조합해야 한다.
커서의 단어 추출
폴더 스캔 (파일 목록 확인)
That is due to how the glob()
function works: A single-star pattern does not match hidden files by design. In most shells, the default globbing style can be changed to do so (e.g., via </code>shopt -s dotglob</code> in Bash), but it is not possible in Vim, unfortunately.
However, one has several possibilities to solve the problem still. First and most obvious is to glob hidden and not hidden files separately and then concatenate the results:
(Be careful not to fetch the .
and ..
entries along with hidden files.)
Another, perhaps more convenient but less portable way is to use the backtick expansion within the glob()
call:
This forces Vim to execute the command inside backticks to obtain the list of files. The find shell command lists all files (-type f
) including the hidden ones, in the specified directory (-maxdepth 1
forbids recursion).
파일 목록만 확인하는 방법
let find_path = fnameescape('/home/user')
let normal_files = globpath(find_path, '*', 0, 1)
let hidden_files = globpath(find_path, '.[^.]*', 0, 1)
let files = normal_files + hidden_files
for file in files
if isdirectory(file)
continue
endif
let filename = fnamemodify(file, ':t')
if filename == '.' || filename == '..'
continue
endif
echom filename
endfor
Lowercase command
" Save file with sudo
command! -nargs=0 :WriteWithSudo :w !sudo tee % >/dev/null
" Use :ww instead of :WriteWithSudo
cnoreabbrev ww WriteWithSudo
Listing loaded scripts
Variables and Env
:set - shows vars different from defaults
:set all - shows all values
:set foo? - shows the value of foo
:set foo+=opt - add opt to the value w/o changing others
:set foo-=opt - remove opt from value
:set foo& - reset foo to default value
:setlocal foo - only the current buffer
행 연결
백슬래시로 행 연결시 타 스크립트언어(ex. Bash)처럼 행 끝에 연결하지 않고 다음 행의 처음에 입력한다.
명령 연결
수직 막대로 명령문을 구별하여 한 행에 둘 이상의 명령문을 입력할 수도 있다.
즉, Vimscript의 수직 막대는 대부분의 다른 프로그래밍 언어의 세미콜론과 동등한 기능을 수행한다. Vim에서는 세미콜론이 명령의 시작 부분에서 이미 다른 의미(구체적으로 명령의 행 범위의 일부로서 "현재 행에서 ...로"의 의미)로 사용되고 있기 때문에 명령문을 구별하는 데는 사용할 수 없다.
Copy ex command output
Ex 명령의 내용을 버퍼에 복사하는 방법은 아래와 같다.
"ap
를 사용하여 a레지스터 내용을 붙여넣을 수 있다.
List of built-in functions
또는 다음 명령을 실행하여 범주별로 분류된 유용한 목록에 액세스할 수도 있다.
문자열 처리 (string-functions)
-
nr2char()
: 아스키(ASCII) 값으로 문자 얻기 -
char2nr()
: 문자의 아스키 값 얻기 -
str2nr()
: 문자열을 숫자로 변환 -
str2float()
: 문자열을 실수(Float)로 변환 -
printf()
: 문자열을 % 표기법으로 구성 -
escape()
: 문자열 내의 문자들을 '\'를 이용하여 이스케이프 처리 -
shellescape()
: 문자열을 셸 명령에서 이용할 수 있도록 이스케이프 처리 -
fnameescape()
: 파일명을 Vim 명령에서 쓸 수 있도록 이스케이프 처리 -
tr()
: 일련의 문자들을 대응되는 문자들로 바꿈 -
strtrans()
: 문자열의 모든 문자를 화면에 표시할 수 있도록 바꿈 -
tolower()
: 영문자를 모두 소문자로 변경 -
toupper()
: 영문자를 모두 대문자로 변경 -
match()
: 문자열에서 패턴이 일치하는 곳을 찾음 -
matchend()
: 문자열에서 패턴이 일치하는 곳이 끝나는 부분을 찾음 -
matchstr()
: 문자열에서 패턴이 일치하는 곳의 내용 -
matchlist()
: matchstr()과 동일하나 부분 패턴의 내용도 함께 반환 -
stridx()
: 긴 문자열에서 찾는 문자열이 처음 나오는 곳 -
strridx()
: 긴 문자열에서 찾는 문자열이 마지막 나오는 곳 -
strlen()
: 문자열 길이 -
substitute()
: 패턴이 일치하는 곳을 다른 문자열로 바꿈 -
submatch()
: ":s" 와 substitute() 내에서 부분패턴의 내용을 얻음 -
strpart()
: 문자열의 일부를 얻음 -
expand()
: 예약된 키워드들을 실제 내용으로 바꿈-
expand('%')
: 현재 사용중인 파일명 획득.
-
iconv()
: 한 인코딩의 내용을 다른 인코딩으로 바꿈 byteidx()
: 문자열 내에서 문자의 바이트 단위 위치 repeat()
: 문자열을 여러 번 반복 eval()
: 문자열로 된 표현식을 계산 리스트 처리 (list-functions)
-
get()
: 항목을 가져오되, 잘못된 인덱스여도 에러 없음 -
len()
: 항목의 수 -
empty()
: 비어있는지 검사 -
insert()
: 특정 위치에 삽입 -
add()
: 리스트 뒤에 항목 덧붙이기 -
extend()
: 리스트 뒤에 다른 리스트 붙이기 -
remove()
: 하나 이상의 항목을 삭제 -
copy()
: 리스트를 얇게(shallow) 복사 -
deepcopy()
: 리스트 항목 속의 항목까지 전체를 복사 -
filter()
: 선택된 항목들을 삭제 -
map()
: 각 항목들을 변경 -
sort()
: 정렬 -
reverse()
: 순서를 뒤집음 -
split()
: 문자열을 쪼개서 리스트로 만듦 -
join()
: 리스트 항목들을 이어 붙여서 문자열로 만듦 -
range()
: 연속된 숫자로 이루어진 리스트를 반환 -
string()
: 리스트의 문자열(String) 표현 -
call()
: 리스트를 인자로 함수 호출 -
index()
: 리스트 내 항목의 인덱스 -
max()
: 항목들 중 최댓값 -
min()
: 항목들 중 최솟값 -
count()
: 리스트에서 값이 나타나는 횟수 -
repeat()
: 리스트를 여러 번 반복
사전 처리 (dict-functions)
-
get()
: 항목을 가져오되, 잘못된 키여도 에러 없음 -
len()
: 항목의 수 -
has_key()
: 키가 존재하는지 검사 -
empty()
: 비어있는지 검사 -
remove()
: 항목을 삭제 -
extend()
: 다른 사전의 내용을 추가 -
filter()
: 선택된 항목들을 삭제 -
map()
: 각 항목들을 변경 -
keys()
: 키들의 리스트를 얻음 -
values()
: 값들의 리스트를 얻음 -
items()
: 키-값 쌍들의 리스트를 얻음 -
copy()
: 사전을 얇게(shallow) 복사 -
deepcopy()
: 사전 항목 속의 항목들까지 전체를 복사 -
string()
: 사전의 문자열 표현 -
max()
: 값들 중 최댓값 -
min()
: 값들 중 최솟값 -
count()
: 사전에서 값이 나타나는 횟수
실수 연산 (float-functions)
-
float2nr()
: 실수(Float)를 정수(Number)로 변경 -
abs()
: 절댓값 (Number에도 쓸 수 있음) -
round()
: 반올림 -
ceil()
: 올림 -
floor()
: 내림 -
trunc()
: 소수점 이하를 버림 -
log10()
: 밑이 10인 로그 -
pow()
: x의 y승 -
sqrt()
: 제곱근 -
sin()
: 사인 -
cos()
: 코사인 -
tan()
: 탄젠트 -
asin()
: 아크사인 -
acos()
: 아크코사인 -
atan()
: 아크탄젠트 -
atan2()
: 아크탄젠트 -
sinh()
: 쌍곡사인 -
cosh()
: 쌍곡코사인 -
tanh()
: 쌍곡탄젠트
기타 계산 (bitwise-function)
-
and()
: 비트 단위 AND -
invert()
: 비트 뒤집기 -
or()
: 비트 단위 OR -
xor()
: 비트 단위 XOR
변수 (var-functions)
-
type()
: 변수의 타입 -
islocked()
: 변수가 잠겨있는지 검사 -
function()
: 함수 이름으로 함수 참조(Funcref)를 얻음 -
getbufvar()
: 특정 버퍼에서 변수 값을 얻음 -
setbufvar()
: 특정 버퍼의 변수 값을 할당 -
getwinvar()
: 특정 창에서 변수 값을 얻음 -
gettabvar()
: 특정 탭에서 변수 값을 얻음 -
gettabwinvar()
: 특정 탭 특정 창에서 변수 값을 얻음 -
setwinvar()
: 특정 창의 변수 값을 할당 -
settabvar()
: 특정 탭의 변수 값을 할당 -
settabwinvar()
: 특정 탭 특정 창의 변수 값을 할당 -
garbagecollect()
: 가능한 한 메모리 해제
커서와 마크 위치 (cursor-functions, mark-functions)
-
col()
: 커서 또는 마크의 열 번호 -
virtcol()
: 커서 또는 마크의 화면상 열 번호 -
line()
: 커서 또는 마크의 줄 번호 -
wincol()
: 커서의 창 내 열 번호 -
winline()
: 커서의 창 내 줄 번호 -
cursor()
: 커서를 지정한 열/줄로 이동 -
getpos()
: 커서, 마크 등의 위치를 얻음 -
setpos()
: 커서, 마크 등의 위치를 지정 -
byte2line()
: 특정 바이트 번째의 줄 번호를 얻음 -
line2byte()
: 특정 줄의 바이트 단위 위치를 얻음 -
diff_filler()
: 줄 위로 공간을 채우는 줄 수를 셈
현재 버퍼의 내용 다루기 (text-functions)
-
getline()
: 한 줄 혹은 여러 줄들의 리스트를 버퍼에서 얻음 -
setline()
: 버퍼에서 한 줄의 내용을 바꿈 -
append()
: 한 줄 혹은 여러 줄들의 리스트를 뒤에 붙임 -
indent()
: 특정 줄의 들여쓰기 정도 -
cindent()
: C 들여쓰기에 따른 들여쓰기 정도 -
lispindent()
: Lisp 들여쓰기에 따른 들여쓰기 정도 -
nextnonblank()
: 공백이 아닌 다음 줄 찾기 -
prevnonblank()
: 공백이 아닌 이전 줄 찾기 -
search()
: 패턴으로 찾기 -
searchpos()
: 패턴으로 찾기 -
searchpair()
: 시작/다음/끝 중에 반대쪽 찾기 -
searchpairpos()
: 시작/다음/끝 중에 반대쪽 찾기 -
searchdecl()
: 이름의 선언 위치 찾기
시스템 함수 및 파일 처리 (system-functions, file-functions)
-
glob()
: 와일드카드를 확장 -
globpath()
: 여러 디렉터리에 대해서 와일드카드를 확장 -
findfile()
: 지정한 디렉터리들에서 파일 찾기 -
finddir()
: 지정한 디렉터리들에서 디렉터리 찾기 -
resolve()
: 바로가기가 가리키는 곳 찾기 -
fnamemodify()
: 규칙에 따라 파일명 변경 -
pathshorten()
: 경로의 디렉터리 명을 짧게 줄임 -
simplify()
: 경로를 가리키는 곳이 변하지 않는 상태에서 단순하게 정리 -
executable()
: 실행 프로그램이 존재하는지 확인 -
filereadable()
: 파일을 읽을 수 있는지 확인 -
filewritable()
: 파일에 쓸 수 있는지 확인 -
getfperm()
: 파일의 권한 정보를 얻음 -
getftype()
: 파일의 종류를 얻음 -
isdirectory()
: 디렉터리가 존재하는지 확인 -
getfsize()
: 파일 크기를 얻음 -
getcwd()
: 현재 작업 경로를 얻음 -
haslocaldir()
: 현재 창이:lcd
를 사용하는지 확인 -
tempname()
: 임시파일 이름을 얻음 -
mkdir()
: 디렉터리 생성 -
delete()
: 파일 삭제 -
rename()
: 파일명 변경 -
system()
: 셸 명령 실행 후 결과 얻음 -
hostname()
: 호스트명 -
readfile()
: 파일 내용을 각 줄의 리스트로 반환 -
writefile()
: 각 줄의 리스트를 파일에 쓰기
날짜와 시간 (date-functions, time-functions)
-
getftime()
: 파일의 마지막 수정 시간을 얻음 -
localtime()
: 현재 시간을 초 단위로 얻음 -
strftime()
: 시간을 문자열로 표현 -
reltime()
: 현재 혹은 경과한 시간을 정확하게 얻음 -
reltimestr()
: reltime() 결과를 문자열로 변환
버퍼, 창 및 인자 리스트 (buffer-functions, window-functions, arg-functions)
-
argc()
: 인자 리스트의 인자 수 -
argidx()
: 인자 리스트에서 현재 위치 -
argv()
: 인자 리스트에서 한 인자를 얻음 -
bufexists()
: 버퍼가 존재하는지 확인 -
buflisted()
: 버퍼가 존재하고 나열되는지 확인 -
bufloaded()
: 버퍼가 존재하고 로드되었는지 확인 -
bufname()
: 특정 버퍼의 이름 얻음 -
bufnr()
: 특정 버퍼의 번호 얻음 -
tabpagebuflist()
: 탭의 버퍼 리스트 얻음 -
tabpagenr()
: 탭의 번호 얻음 -
tabpagewinnr()
: 특정 탭에 대한winnr()
-
winnr()
: 현재 창의 창 번호 얻음 -
bufwinnr()
: 특정 버퍼의 창 번호 얻음 -
winbufnr()
: 특정 창의 버퍼 번호 얻음 -
getbufline()
: 특정 버퍼의 내용을 각 줄의 리스트로 얻음
명령줄 (command-line-functions)
-
getcmdline()
: 현재 명령줄 얻음 -
getcmdpos()
: 명령줄에서 커서의 위치를 얻음 -
setcmdpos()
: 명령줄에서 커서의 위치를 지정 -
getcmdtype()
: 현재 명령줄의 종류를 얻음
퀵픽스와 위치 리스트 (quickfix-functions)
-
getqflist()
: 퀵픽스 에러 리스트 -
setqflist()
: 퀵픽스 리스트 변경 -
getloclist()
: 위치 리스트 -
setloclist()
: 위치 리스트 변경
입력 모드 자동 완성 (completion-functions)
-
complete()
: 자동 완성 후보를 설정 -
complete_add()
: 자동 완성 후보를 추가 -
complete_check()
: 자동 완성을 중단해야 하는지 확인 -
pumvisible()
: 팝업메뉴를 표시해야 하는지 확인
폴드 (folding-functions)
-
foldclosed()
: 특정 줄에 접힌 폴드가 있는지 확인 -
foldclosedend()
: foldclosed()와 같지만 마지막 줄을 반환 -
foldlevel()
: 특정 줄의 폴드 단계를 얻음 -
foldtext()
: 접힌 폴드 자리에 표시되는 내용을 생성 -
foldtextresult()
: 접힌 폴드 자리에 표시되는 내용을 얻음
문법과 문법 강조 (syntax-functions, highlighting-functions)
-
clearmatches()
:matchadd()
와:match
명령으로 정의된 모든 매치를 삭제 -
getmatches()
:matchadd()
와:match
명령으로 정의된 모든 매치를 얻음 -
hlexists()
: 하이라이트 그룹이 존재하는지 확인 -
hlID()
: 하이라이트 그룹의 아이디를 얻음 -
synID()
: 특정 위치의 문법 아이디를 얻음 -
synIDattr()
: 문법 아이디의 특정 속성을 얻음 -
synIDtrans()
: 해석된 문법 아이디를 얻음 -
synstack()
: 특정 위치의 문법 아이디 리스트를 얻음 -
synconcealed()
: 숨김 정보를 얻음 -
diff_hlID()
: 디프(diff) 모드에서 특정 위치의 강조 아이디를 얻음 -
matchadd()
: 강조할 패턴(매치라고 부름)를 정의 -
matcharg()
::match
인자 정보를 얻음 -
matchdelete()
:matchadd()
와:match
명령으로 정의된 매치를 삭제 -
setmatches()
:getmatches()
로 저장한 매치 목록을 불러옴
맞춤법 (spell-functions)
-
spellbadword()
: 커서 위치 이후의 맞춤법 오류를 찾음 -
spellsuggest()
: 수정 후보들을 반환 -
soundfold()
: 단어와 유사한 발음인 단어들을 반환
히스토리 (history-functions)
-
histadd()
: 히스토리에 항목 추가 -
histdel()
: 히스토리에서 항목 삭제 -
histget()
: 히스토리에서 항목 얻기 -
histnr()
: 히스토리 목록에서 가장 번호가 높은 항목의 번호
상호작용 (interactive-functions)
-
browse()
: 파일 대화상자를 띄움 -
browsedir()
: 디렉터리 대화상자를 띄움 -
confirm()
: 사용자의 선택 입력을 받음 -
getchar()
: 사용자에게 문자 입력을 받음 -
getcharmod()
: 마지막 입력의 조합 키 정보를 받음 -
feedkeys()
: 타이프어헤드 큐(typeahead queue)에 문자를 넣음 -
input()
: 사용자에게 한 줄을 입력 받음 -
inputlist()
: 사용자가 목록에서 하나를 고르도록 함 -
inputsecret()
: 화면에 표시하지 않고 사용자에게 한 줄을 입력 받음 -
inputdialog()
: 대화상자에서 한 줄을 입력 받음 -
inputsave()
: 타이프어헤드를 저장해놓고 비움 -
inputrestore()
: 저장해놓은 타이프어헤드를 불러옴
그래픽 사용자 인터페이스 (gui-functions)
-
getfontname()
: 사용 중인 글꼴 이름을 얻음 -
getwinposx()
: GUI Vim 창의 X축 위치 -
getwinposy()
: GUI Vim 창의 Y축 위치
Vim 서버 (server-functions)
-
serverlist()
: 서버 이름 리스트를 반환 -
remote_send()
: Vim 서버에 명령 문자를 전송 -
remote_expr()
: Vim 서버에서 표현식을 계산 -
server2client()
: Vim 서버의 클라이언트에 응답을 보냄 -
remote_peek()
: Vim 서버에서 응답이 있는지 확인 -
remote_read()
: Vim 서버의 응답을 읽음 -
foreground()
: Vim 창을 포그라운드(foreground)로 옮김 -
remote_foreground()
: Vim 서버 창을 포그라운드로 옮김
창 크기 및 위치 (window-size-functions)
-
winheight()
: 특정 창의 높이를 얻음 -
winwidth()
: 특정 창의 너비를 얻음 -
winrestcmd()
: 창 크기를 복구할 수 있는 명령을 반환 -
winsaveview()
: 현재 창의 뷰(view)를 얻음 -
winrestview()
: 현재 창의 저장한 뷰를 불러옴
매핑 (mapping-functions)
-
hasmapto()
: 매핑이 존재하는지 확인 -
mapcheck()
: 일치하는 매핑이 존재하는지 확인 -
maparg()
: 매핑의 확장 결과를 얻음 -
wildmenumode()
: 와일드모드(wildmode)가 활성화 되었는지 확인
기타 (various-functions)
-
mode()
: 현재 편집 모드를 얻음 -
visualmode()
: 마지막 사용한 시각 모드를 얻음 -
exists()
: 변수나 함수 등이 존재하는지 확인 -
has()
: Vim에서 기능이 지원되는지 확인 -
changenr()
: 최근에 변경한 횟수를 반환 -
cscope_connection()
: cscope 연결이 있는지 확인 -
did_filetype()
: FileType 자동명령이 사용되었는지 확인 -
eventhandler()
: 이벤트 핸들러가 동작시킨 것인지 확인 -
getpid()
: Vim의 프로세스 아이디를 얻음 -
libcall()
: 외부 라이브러리 함수를 호출 -
libcallnr()
: 상동. 숫자를 반환 -
getreg()
: 레지스터 내용을 얻음 -
getregtype()
: 레지스터에 저장된 형식을 얻음 -
setreg()
: 레지스터 내용 및 저장 형식을 지정 -
taglist()
: 일치하는 태그 리스트를 얻음 -
tagfiles()
: 태그 파일 리스트를 얻음 -
mzeval()
: MzScheme 표현식을 계산
Redirect
간단한 사용방법은 아래와 같다.
함수에 적용할 경우, output
변수에 출력을 적용하는 샘플은 아래와 같다.
See also
Favorite site
Tutorials
Guide
- vim 스크립트 프로그램 - 디렉토리 다루기
- vim script 에서 한영키 전환
- vi 및 Vim 편집기 사용자 정의하기
- [추천] Vim scripting cheatsheet
- [추천] Vim digraphs cheatsheet
- [추천] Tabular cheatsheet
- [추천] Projectionist cheatsheet
- [추천] Vim Easyalign cheatsheet
- [추천] Vimdiff cheatsheet