diff options
| author | Dmitrii Kuznetsov <torgeek@users.noreply.github.com> | 2021-02-22 18:36:35 +0300 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-22 18:36:35 +0300 | 
| commit | bc8bd2646f068cfb402850f7c0f9b1dbfe81e5a0 (patch) | |
| tree | 89213fd6afbf9cc9303c1c2fa08dafc840a9d99d /ko-kr | |
| parent | 363d5281f1e3d5bee6339b5316405b0a4b592c49 (diff) | |
| parent | 110511a10110f96b20f107c078f7d5ef4c01b109 (diff) | |
Merge pull request #1 from adambard/master
Merge from original adambard
Diffstat (limited to 'ko-kr')
| -rw-r--r-- | ko-kr/bash-kr.html.markdown | 382 | ||||
| -rw-r--r-- | ko-kr/bf-kr.html.markdown | 1 | ||||
| -rw-r--r-- | ko-kr/javascript-kr.html.markdown | 6 | ||||
| -rw-r--r-- | ko-kr/kotlin-kr.html.markdown | 376 | ||||
| -rw-r--r-- | ko-kr/markdown-kr.html.markdown | 58 | ||||
| -rw-r--r-- | ko-kr/pythonlegacy-kr.html.markdown (renamed from ko-kr/python-kr.html.markdown) | 6 | ||||
| -rw-r--r-- | ko-kr/vim-kr.html.markdown | 269 | ||||
| -rw-r--r-- | ko-kr/yaml-kr.html.markdown | 2 | 
8 files changed, 1064 insertions, 36 deletions
| diff --git a/ko-kr/bash-kr.html.markdown b/ko-kr/bash-kr.html.markdown new file mode 100644 index 00000000..8e271d1f --- /dev/null +++ b/ko-kr/bash-kr.html.markdown @@ -0,0 +1,382 @@ +--- +category: tool +tool: bash +contributors: +    - ["Max Yankov", "https://github.com/golergka"] +    - ["Darren Lin", "https://github.com/CogBear"] +    - ["Alexandre Medeiros", "http://alemedeiros.sdf.org"] +    - ["Denis Arh", "https://github.com/darh"] +    - ["akirahirose", "https://twitter.com/akirahirose"] +    - ["Anton Strömkvist", "http://lutic.org/"] +    - ["Rahil Momin", "https://github.com/iamrahil"] +    - ["Gregrory Kielian", "https://github.com/gskielian"] +    - ["Etan Reisner", "https://github.com/deryni"] +    - ["Jonathan Wang", "https://github.com/Jonathansw"]    +    - ["Leo Rudberg", "https://github.com/LOZORD"] +    - ["Betsy Lorton", "https://github.com/schbetsy"] +    - ["John Detter", "https://github.com/jdetter"] +translators: +    - ["Wooseop Kim", "https://github.com/linterpreteur"] +filename: LearnBash-kr.sh +lang: ko-kr +--- + +Bash는 유닉스 셸의 이름이며, 리눅스와 맥 OS X의 기본 셸로 그리고 GNU 운영체제를 위한 셸로서 배포되었습니다. +이하의 거의 모든 예시들은 셸 스크립트의 일부이거나 셸에서 바로 실행할 수 있습니다. + +[(영어) 이곳에서 더 알아보세요.](http://www.gnu.org/software/bash/manual/bashref.html) + +```bash +#!/bin/bash +# 스크립트의 첫 줄은 시스템에게 스크립트의 실행법을 알려주는 '셔뱅'입니다. +# https://ko.wikipedia.org/wiki/%EC%85%94%EB%B1%85 +# 이미 보았듯이 주석은 #으로 시작합니다. 셔뱅 또한 주석입니다. + +# 간단한 헬로 월드 +echo 헬로 월드! + +# 각각의 명령어는 개행 혹은 세미콜론 이후에 시작됩니다. +echo '첫번째 줄'; echo '두번째 줄' + +# 변수 선언은 다음과 같습니다. +Variable="어떤 문자열" + +# 하지만 다음은 틀린 형태입니다. +Variable = "어떤 문자열" +# Bash는 Variable이 실행해야 하는 명령어라고 판단할 것이고, 해당 명령어를 찾을 +# 수 없기 때문에 에러를 발생시킬 것입니다. + +# 다음도 같습니다. +Variable= '어떤 문자열' +# Bash는 '어떤 문자열'이 실행해야 하는 명령어라고 판단하여 에러를 발생시킬 것입니다. +# (이 경우에 'Variable=' 부분은 '어떤 문자열' 명령어의 스코프에서만 유효한 +# 변수 할당으로 해석됩니다.) + +# 변수 사용은 다음과 같습니다. +echo $Variable +echo "$Variable" +echo '$Variable' +# 할당, 내보내기 등 변수 자체를 사용할 때에는 $ 없이 이름을 적습니다. +# 변수의 값을 사용할 때에는 $를 사용해야 합니다. +# 작은 따옴표는 변수를 확장시키지 않는다는 사실에 주의하세요. +# (역자 주: '$Variable'은 변수 Variable의 값이 아닌 문자열 "$Variable"입니다.) + +# 인수 확장은 ${ }입니다. +echo ${Variable} +# 이는 인수 확장의 간단한 예시입니다. +# 인수 확장은 변수로부터 값을 받아 그 값을 "확장"하거나 출력합니다. +# 확장을 통해 인수나 그 값이 변경될 수 있습니다. +# 이하는 확장에 대한 다른 예시들입니다. + +# 변수에서의 문자열 치환 +echo ${Variable/Some/A} +# 처음으로 나타나는 "Some"를 "A"로 치환합니다. + +# 변수의 부분열 +Length=7 +echo ${Variable:0:Length} +# 변수 값에서 처음 7개 문자만을 반환합니다. + +# 변수의 기본값 +echo ${Foo:-"Foo가_없거나_비어_있을_때의_기본값"} +# null(Foo=) 값이나 빈 문자열(Foo="")일 경우에만 작동합니다. 0은 (Foo=0)은 0입니다. +# 기본값을 반환할 뿐 변수 값을 변경하지는 않는다는 사실에 주목하세요. + +# 중괄호 확장 { } +# 임의의 문자열을 생성합니다. +echo {1..10} +echo {a..z} +# 시작 값으로부터 끝 값까지의 범위를 출력합니다. + +# 내장 변수 +# 유용한 내장 변수들이 있습니다. +echo "마지막 프로그램의 반환값: $?" +echo "스크립트의 PID: $$" +echo "스크립트에 넘겨진 인자의 개수: $#" +echo "스크립트에 넘겨진 모든 인자: $@" +echo "각각 변수로 쪼개진 스크립트 인자: $1 $2..." + +# echo와 변수의 사용법을 알게 되었으니, +# bash의 기초를 조금 더 배워봅시다! + +# 현재 디렉토리는 `pwd` 명령어로 알 수 있습니다. +# `pwd`는 "print working directory(작업 디렉토리 출력)"의 약자입니다. +# 내장 변수`$PWD`를 사용할 수도 있습니다. +# 이하는 모두 동일합니다. +echo "I'm in $(pwd)" # `pwd`를 실행하여 문자열에 보간 +echo "I'm in $PWD" # 변수를 보간 + +# 터미널이나 결과의 출력물이 너무 많다면 +# 명령어 `clear`를 이용해 화면을 지울 수 있습니다. +clear +# 컨트롤+L 또한 화면을 지울 수 있습니다. + +# 입력 값 읽기 +echo "이름이 뭐에요?" +read Name # 변수 선언이 필요 없다는 데 주목하세요. +echo $Name님, 안녕하세요! + +# 평범한 if 구조도 있습니다. +# 'man test'로 조건문에 대해 더 알아보세요. +if [ $Name != $USER ] +then +    echo "사용자가 아닙니다." +else +    echo "사용자입니다." +fi + +# $Name이 비어 있다면, bash는 위의 조건을 다음과 같이 인식합니다. +if [ != $USER ] +# 이는 문법적으로 유효하지 않습니다. +# 따라서 bash에서 비어 있을 수 있는 변수를 "안전하게" 사용하는 법은 다음과 같습니다. +if [ "$Name" != $USER ] ... +# $Name이 비어 있다면 bash는 +if [ "" != $USER ] ... +# 와 같이 인식하여 예상한 대로 동작합니다. + +# 조건부 실행도 있습니다. +echo "항상 실행" || echo "첫 명령어가 실패해야 실행" +echo "항상 실행" && echo "첫 명령어가 실패하지 않아야 실행" + +# if문과 함께 &&와 ||을 사용하려면, 대괄호가 여러 쌍 필요합니다. +if [ "$Name" == "철수" ] && [ "$Age" -eq 15 ] +then +    echo "$Name이 철수이고 $Age가 15일 때 실행" +fi + +if [ "$Name" == "민희" ] || [ "$Name" == "상민" ] +then +    echo "$Name이 민희이거나 상민일 때 실행" +fi + +# 표현식은 다음 형식으로 표기됩니다. +echo $(( 10 + 5 )) + +# 다른 프로그래밍 언어와는 달리, bash는 셸이기 때문에 현재 디렉토리의 컨텍스트에서 +# 실행됩니다. 현재 디렉토리의 파일과 디렉토리를 ls 명령어로 나열할 수 있습니다. +ls + +# 다음은 실행을 제어하는 옵션의 예시입니다. +ls -l # 모든 파일과 디렉토리를 분리된 줄에 나열 +ls -t # 디렉토리 내용을 마지막으로 수정된 날짜(내림차순)에 따라 정렬 +ls -R # 이 디렉토리와 그 안의 모든 디렉토리에 대해 재귀적으로 `ls` 실행 + +# 이전 명령어의 결과는 다음 명령어에 입력될 수 있습니다. +# grep 명령어는 입력을 주어진 패턴에 따라 필터링합니다. 다음은 현재 디렉토리의 +# .txt 파일을 나열하는 방법입니다. +ls -l | grep "\.txt" + +# `cat`을 이용해 stdout으로 파일을 출력합니다. +cat file.txt + +# `cat`으로 파일을 읽을 수도 있습니다. +Contents=$(cat file.txt) +echo "파일 시작\n$Contents\n파일 끝" + +# `cp`를 이용해 파일이나 디렉토리를 다른 곳으로 복사할 수 있습니다. +# `cp`는 원본의 새로운 버전을 생성하므로 사본을 편집하는 것은 +# 원본에 영향을 주지 않으며 그 반대도 마찬가지입니다. +# 목표 위치에 이미 파일이 있다면 덮어쓰게 됩니다. +cp srcFile.txt clone.txt +cp -r srcDirectory/ dst/ # 재귀적으로 복사 + +# 컴퓨터 간에 파일을 공유하려고 한다면 `scp` 혹은 `sftp`를 사용합니다. +# `scp`는 `cp`와 매우 유사하게 동작하며 +# `sftp`는 더 상호작용적입니다. + +# `mv`로 파일 혹은 디렉토리를 다른 곳으로 이동합니다. +# `mv`는 `cp`와 유사하지만 원본을 삭제합니다. +# 또한 `mv`로 파일의 이름을 바꿀 수도 있습니다. +mv s0urc3.txt dst.txt # sorry, l33t hackers... + +# bash는 현재 디렉토리의 컨텍스트에서 실행되기 때문에, 다른 디렉토리에서 명령어를 +# 실행하고 싶으실 수 있습니다. cd를 이용해 위치를 변경합니다. +cd ~    # 홈 디렉토리로 변경 +cd ..   # 한 디렉토리 위로 이동 +        # (즉 /home/username/Downloads에서 /home/username로) +cd /home/username/Documents   # 특정 디렉토리로 이동 +cd ~/Documents/..    # 아직도 홈 디렉토리... 아닌가?? + +# 서브셸로 디렉토리를 넘어서 작업할 수도 있습니다. +(echo "처음엔 여기 $PWD") && (cd 어딘가; echo "이제는 여기 $PWD") +pwd # 아직도 첫 디렉토리에 있음 + +# `mkdir`로 새 디렉토리를 만듭니다. +mkdir myNewDir +# `-p` 플래그는 필요하다면 해당 디렉토리의 경로 중간에 있는 디렉토리를 생성합니다. +mkdir -p myNewDir/with/intermediate/directories + +# (stdin, stdout, stderr로) 명령어의 입출력을 리디렉션할 수 있습니다. +# stdin의 내용을 ^EOF$까지 읽고 hello.py에 그 내용을 덮어씁니다. +cat > hello.py << EOF +#!/usr/bin/env python +from __future__ import print_function +import sys +print("#stdout", file=sys.stdout) +print("#stderr", file=sys.stderr) +for line in sys.stdin: +    print(line, file=sys.stdout) +EOF + +# stdin, stdoutk, stderr을 다양한 방법으로 리디렉션하여 hello.py를 실행합니다. +python hello.py < "input.in" +python hello.py > "output.out" +python hello.py 2> "error.err" +python hello.py > "output-and-error.log" 2>&1 +python hello.py > /dev/null 2>&1 +# 출력 오류는 이미 파일이 있을 경우 덮어쓰지만, +# 덮어쓰는 대신에 내용에 추가하고 싶다면 ">>"를 사용합니다. +python hello.py >> "output.out" 2>> "error.err" + +# output.out에 덮어쓰고, error.err에 추가하고, 줄을 세기 +info bash 'Basic Shell Features' 'Redirections' > output.out 2>> error.err +wc -l output.out error.err + +# 명령어를 실행하고 그 파일 디스크립터를 출력 (예: /dev/fd/123) +# man fd 참고 +echo <(echo "#helloworld") + +# output.out을 "#helloworld"으로 덮어쓰기 +cat > output.out <(echo "#helloworld") +echo "#helloworld" > output.out +echo "#helloworld" | cat > output.out +echo "#helloworld" | tee output.out >/dev/null + +# 임시 파일을 지울 수 있습니다. ('-i'로 대화식 실행) +# 경고: `rm` 명령어는 되돌릴 수 없습니다. +rm -v output.out error.err output-and-error.log +rm -r tempDir/ # 재귀적으로 삭제 + +# 다른 명령어에서 $()을 이용해 명령어를 치환할 수도 있습니다. +# 다음 명령어는 현재 디렉토리의 파일 및 디렉토리의 수를 표시합니다. +echo "$(ls | wc -l)개 항목이 있습니다." + +# 백틱(``)을 이용할 수도 있지만 이 방식을 이용하면 중첩할 수 없기 때문에 +# $()을 사용하는 것이 더 좋습니다. +echo "`ls | wc -l`개 항목이 있습니다." + +# 자바나 C++의 switch와 비슷하게 동작하는 case 문을 사용할 수 있습니다. +case "$Variable" in +    # 충족시킬 조건을 나열 +    0) echo "0입니다.";; +    1) echo "1입니다.";; +    *) echo "널이 아닌 값입니다.";; +esac + +# for 반복문은 주어진 인자만큼 반복합니다. +# 다음은 $Variable을 세 번 출력합니다. +for Variable in {1..3} +do +    echo "$Variable" +done + +# 혹은 "전통적인 for 반복문" 방식을 쓸 수도 있습니다. +for ((a=1; a <= 3; a++)) +do +    echo $a +done + +# 파일에도 적용될 수 있습니다. +# 다음은 file1과 file2에 'cat' 명령어를 실행합니다. +for Variable in file1 file2 +do +    cat "$Variable" +done + +# 혹은 명령어의 결과에도 이용할 수 있습니다. +# 다음은 ls의 결과를 cat합니다. +for Output in $(ls) +do +    cat "$Output" +done + +# while 반복문 +while [ true ] +do +    echo "반복문 몸체" +    break +done + +# 함수를 정의할 수도 있습니다. +# 정의: +function foo () +{ +    echo "인자는 함수 인자처럼 작동합니다. $@" +    echo "그리고 $1 $2..." +    echo "함수입니다." +    return 0 +} + +# 혹은 단순하게 +bar () +{ +    echo "함수를 선언하는 다른 방법" +    return 0 +} + +# 함수 호출 +foo "My name is" $Name + +# 몇 가지 유용한 명령어를 알아두면 좋습니다. +# file.txt의 마지막 10줄 출력 +tail -n 10 file.txt +# file.txt의 첫 10줄 출력 +head -n 10 file.txt +# file.txt 줄 별로 정렬 +sort file.txt +# 중복되는 줄을 생략하거나 -d를 이용하여 보고 +uniq -d file.txt +# ',' 문자 이전의 첫 열만 출력 +cut -d ',' -f 1 file.txt +# file.txt에서 'okay'를 모두 'great'로 교체 (정규식 호환) +sed -i 's/okay/great/g' file.txt +# file.txt에서 정규식에 맞는 모든 줄을 stdin에 출력 +# 다음 예시는 "foo"로 시작해 "bar"로 끝나는 줄 출력 +grep "^foo.*bar$" file.txt +# "-c" 옵션을 넘겨 줄 번호를 대신 출력 +grep -c "^foo.*bar$" file.txt +# 다른 유용한 옵션 +grep -r "^foo.*bar$" someDir/ # 재귀적으로 `grep` +grep -n "^foo.*bar$" file.txt # 줄 번호 매기기 +grep -rI "^foo.*bar$" someDir/ # 재귀적으로 `grep`하되 바이너리 파일은 무시 +# 같은 검색으로 시작하여 "baz"를 포함하는 줄만 필터 +grep "^foo.*bar$" file.txt | grep -v "baz" + +# 정규식이 아니라 문자열로 검색하고 싶다면 +# fgrep 혹은 grep -F +fgrep "foobar" file.txt + +# trap 명령어로 스크립트에서 신호를 받을 때 명령어를 실행할 수 있습니다. +# 다음 명령어는 셋 중 한 가지 신호를 받으면 rm 명령어를 실행합니다. +trap "rm $TEMP_FILE; exit" SIGHUP SIGINT SIGTERM + +# `sudo`를 통해 슈퍼이용자로 명령어를 실행합니다. +NAME1=$(whoami) +NAME2=$(sudo whoami) +echo "$NAME1였다가 더 강한 $NAME2가 되었다" + +# 'help' 명령어로 내장 문서를 읽을 수 있습니다. +help +help help +help for +help return +help source +help . + +# man으로 매뉴얼을 읽을 수도 있습니다. +apropos bash +man 1 bash +man bash + +# info 명령어로 문서를 읽습니다. (?로 도움말) +apropos info | grep '^info.*(' +man info +info info +info 5 info + +# bash의 info 문서를 읽어 보세요. +info bash +info bash 'Bash Features' +info bash 6 +info --apropos bash +``` diff --git a/ko-kr/bf-kr.html.markdown b/ko-kr/bf-kr.html.markdown index 3d366d7c..5849d2fd 100644 --- a/ko-kr/bf-kr.html.markdown +++ b/ko-kr/bf-kr.html.markdown @@ -1,5 +1,6 @@  ---  language: bf +filename: learnbf-kr.bf  contributors:      - ["Prajit Ramachandran", "http://prajitr.github.io/"]      - ["Mathias Bynens", "http://mathiasbynens.be/"] diff --git a/ko-kr/javascript-kr.html.markdown b/ko-kr/javascript-kr.html.markdown index 9561e80c..619d8104 100644 --- a/ko-kr/javascript-kr.html.markdown +++ b/ko-kr/javascript-kr.html.markdown @@ -2,7 +2,7 @@  language: javascript  category: language  contributors: -    - ["Adam Brenecki", "http://adam.brenecki.id.au"] +    - ["Leigh Brenecki", "https://leigh.net.au"]  translators:      - ["wikibook", "http://wikibook.co.kr"]  filename: javascript-kr.js @@ -18,8 +18,8 @@ lang: ko-kr  그렇지만 자바스크립트는 웹 브라우저에만 국한되지 않습니다. 구글 크롬의 V8 자바스크립트   엔진을 위한 독립형 런타임을 제공하는 Node.js는 점점 인기를 얻고 있습니다. -피드백 주시면 대단히 감사하겠습니다! [@adambrenecki](https://twitter.com/adambrenecki)나  -[adam@brenecki.id.au](mailto:adam@brenecki.id.au)를 통해 저와 만나실 수 있습니다. +피드백 주시면 대단히 감사하겠습니다! [@ExcitedLeigh](https://twitter.com/ExcitedLeigh)나  +[l@leigh.net.au](mailto:l@leigh.net.au)를 통해 저와 만나실 수 있습니다.  ```js  // 주석은 C와 비슷합니다. 한 줄짜리 주석은 두 개의 슬래시로 시작하고, diff --git a/ko-kr/kotlin-kr.html.markdown b/ko-kr/kotlin-kr.html.markdown new file mode 100644 index 00000000..2df4195d --- /dev/null +++ b/ko-kr/kotlin-kr.html.markdown @@ -0,0 +1,376 @@ +--- +language: kotlin +contributors: +    - ["S Webber", "https://github.com/s-webber"] +translators:  +    - ["Alan Jeon", "https://github.com/skyisle"] +lang: ko-kr +filename: LearnKotlin-kr.kt +--- + +Kotlin 은 정적 타입 프로그래밍 언어로 JVM, 안드로이드, 브라우져를 지원하며 Java 와 100% 상호 운용이 가능합니다. +[자세한 내용은 다음을 참고하세요.](https://kotlinlang.org/) + +```kotlin +// 한 줄짜리 주석은 // 로 시작합니다. +/* +여러 줄 주석은 이와 같이 표시합니다.  +*/ + +// "package" 예약어는 자바와 동일하게 사용됩니다. +package com.learnxinyminutes.kotlin + +/* +Kotlin 프로그램의 진입점은 main 이라는 함수명으로 지정됩니다.  +이 함수에 명령행 인수가 배열로 전달됩니다. +*/ +fun main(args: Array<String>) { +    /* +    값을 선언할때는 "var" 또는 "val"이 사용됩니다. +    "var"와는 다르게 "val"로 선언된 변수에는 값을 재할당 할 수 없습니다. +    */ +    val fooVal = 10 // fooVal 에 다른 값을 다시 할당 할 수 없습니다. +    var fooVar = 10 +    fooVar = 20 // fooVar 에는 선언 이후에도 다른 값을 할당 할 수 있습니다 + +    /* +    대부분의 경우, Kotlin 에서는 변수 타입을 판단할 수 있기때문에 명시적으로 지정해 주지 않을 수 있습니다. +    다음과 같이 변수의 타입을 명시적으로 지정할 수 있습니다. +    */ +    val foo: Int = 7 + +    /* +    문자형은 Java와 비슷하게 표시될 수 있습니다. +    이스케이핑에는 백슬래시를 사용합니다. +    */ +    val fooString = "My String Is Here!" +    val barString = "Printing on a new line?\nNo Problem!" +    val bazString = "Do you want to add a tab?\tNo Problem!" +    println(fooString) +    println(barString) +    println(bazString) + +    /* +    Raw 문자열은 쌍따옴표 3개(""")로 표기합니다. +    Raw 문자열에는 줄바꿈이나 모든 다른 문자들을 사용할 수 있습니다.  +    */ +    val fooRawString = """ +fun helloWorld(val name : String) { +   println("Hello, world!") +} +""" +    println(fooRawString) + +    /* +    문자열은 템플릿 표현식을 포함할 수 있습니다. +    템플릿은 달러 기호($)로 시작합니다.  +    */ +    val fooTemplateString = "$fooString has ${fooString.length} characters" +    println(fooTemplateString) + +    /* +    변수가 null 값을 가지려면 이를 명시적으로 선언해야 합니다. +    변수 선언시 타입에 ? 표시를 붙여 nullable 을 표시합니다. +    ?. 연산자를 사용해 nullable 변수에 접근합니다. +    ?: 연산자를 이용해서 변수 값이 null 일때 사용할 값을 지정합니다. +    */ +    var fooNullable: String? = "abc" +    println(fooNullable?.length) // => 3 +    println(fooNullable?.length ?: -1) // => 3 +    fooNullable = null +    println(fooNullable?.length) // => null +    println(fooNullable?.length ?: -1) // => -1 + +    /* +    함수는 "fun" 예약어를 사용해 선언합니다. +    함수명 이후 괄호 안에 인자를 기술합니다. +    함수 인자에 기본 값을 지정할 수도 있습니다. +    함수에 리턴값이 있을 때, 필요한 경우 인자 뒤에 타입을 명시합니다. +    */ +    fun hello(name: String = "world"): String { +        return "Hello, $name!" +    } +    println(hello("foo")) // => Hello, foo! +    println(hello(name = "bar")) // => Hello, bar! +    println(hello()) // => Hello, world! + +    /* +    함수에 가변 인자를 넘기려면 인자에 "vararg" 예약어를 사용합니다.  +    */ +    fun varargExample(vararg names: Int) { +        println("Argument has ${names.size} elements") +    } +    varargExample() // => 인자가 0개 인 경우 +    varargExample(1) // => 인자가 1개인 경우 +    varargExample(1, 2, 3) // => 인자가 3개인 경우 + +    /* +    함수가 단일 표현식으로 이루어진 경우에 중괄호를 생략할 수 있습니다. +    이때 함수 구현부는 = 기호 이후에 기술합니다. +    */ +    fun odd(x: Int): Boolean = x % 2 == 1 +    println(odd(6)) // => false +    println(odd(7)) // => true + +    // 리턴 타입이 유추 가능한 경우 이를 명시하지 않아도 됩니다.  +    fun even(x: Int) = x % 2 == 0 +    println(even(6)) // => true +    println(even(7)) // => false + +    // 함수는 함수를 인자를 받을 수 있고 함수를 리턴할 수 있습니다.  +    fun not(f: (Int) -> Boolean): (Int) -> Boolean { +        return {n -> !f.invoke(n)} +    } +    // 함수는 :: 연산자를 사용해서 다른 함수에 인자로 넘길 수 있습니다.  +    val notOdd = not(::odd) +    val notEven = not(::even) +    // 람다식을 인자로 사용할 수 있습니다.  +    val notZero = not {n -> n == 0} +    /* +    하나의 인자를 가지는 람다식의 선언부와 -> 연산자는 생략될 수 있습니다. +    이때 그 인자명은 it로 지정됩니다. +    */ +    val notPositive = not {it > 0} +    for (i in 0..4) { +        println("${notOdd(i)} ${notEven(i)} ${notZero(i)} ${notPositive(i)}") +    } + +    // "class" 예약어는 클래스를 선언할 때 사용됩니다.  +    class ExampleClass(val x: Int) { +        fun memberFunction(y: Int): Int { +            return x + y +        } + +        infix fun infixMemberFunction(y: Int): Int { +            return x * y +        } +    } +    /* +    새로운 객체를 생성하기 위해서는 생성자를 바로 호출합니다. +    Kotlin 에서는 new 예약어가 없다는 걸 기억하세요. +    */ +    val fooExampleClass = ExampleClass(7) +    // 맴버 함수는 dot 표기로 호출할 수 있습니다.  +    println(fooExampleClass.memberFunction(4)) // => 11 +    /* +    함수 선언에 "infix" 예약어를 사용하면 이 함수를 중위 표현식(infix notation)으로 호출할 수 있습니다  +    */ +    println(fooExampleClass infixMemberFunction 4) // => 28 + +    /* +    데이터 클래스로 데이터만을 가지고 있는 클래스를 손쉽게 선언할 수 있습니다. +    "hashCode"/"equals" 와 "toString" 는 자동으로 생성됩니다. +    */ +    data class DataClassExample (val x: Int, val y: Int, val z: Int) +    val fooData = DataClassExample(1, 2, 4) +    println(fooData) // => DataClassExample(x=1, y=2, z=4) + +    // 데이터 클래스는 copy 함수를 가지고 있습니다.  +    val fooCopy = fooData.copy(y = 100) +    println(fooCopy) // => DataClassExample(x=1, y=100, z=4) + +    // 객체를 여러 변수로 분리할 수 있습니다.  +    val (a, b, c) = fooCopy +    println("$a $b $c") // => 1 100 4 +     +    // "for" 루프에서 변수 분리 하기  +    for ((a, b, c) in listOf(fooData)) { +        println("$a $b $c") // => 1 100 4 +    } +     +    val mapData = mapOf("a" to 1, "b" to 2) +    // Map.Entry 또한 키와 값으로 분리가 가능합니다.  +    for ((key, value) in mapData) { +        println("$key -> $value") +    } + +    // "with" 함수는 JavaScript 의 "with" 구문과 비슷하게 사용됩니다.  +    data class MutableDataClassExample (var x: Int, var y: Int, var z: Int) +    val fooMutableData = MutableDataClassExample(7, 4, 9) +    with (fooMutableData) { +        x -= 2 +        y += 2 +        z-- +    } +    println(fooMutableData) // => MutableDataClassExample(x=5, y=6, z=8) + +    /* +    "listOf" 함수로 리스트를 만들 수 있습니다. +    리스트는 변경 불가능(immutable)하게 만들어져 항목의 추가 삭제가 불가능합니다. +    */ +    val fooList = listOf("a", "b", "c") +    println(fooList.size) // => 3 +    println(fooList.first()) // => a +    println(fooList.last()) // => c +    // 각 항목은 인덱스로 접근이 가능합니다.  +    println(fooList[1]) // => b + +    // 변경가능한(mutable) 리스트는 "mutableListOf" 함수로 만들 수 있습니다.  +    val fooMutableList = mutableListOf("a", "b", "c") +    fooMutableList.add("d") +    println(fooMutableList.last()) // => d +    println(fooMutableList.size) // => 4 + +    // 집합(set)은 "setOf" 함수로 만들 수 있습니다. +    val fooSet = setOf("a", "b", "c") +    println(fooSet.contains("a")) // => true +    println(fooSet.contains("z")) // => false + +    // 맵은 "mapOf" 함수로 만들 수 있습니다. +    val fooMap = mapOf("a" to 8, "b" to 7, "c" to 9) +    // 맵은 키를 통해 그 값에 접근할 수 있습니다. Map values can be accessed by their key. +    println(fooMap["a"]) // => 8 + +    /* +    시퀀스는 지연 평가되는 컬랙션을 말합니다. Sequences represent lazily-evaluated collections. +    "generateSequence" 를 사용해 시퀀스를 만들 수 있습니다. We can create a sequence using the "generateSequence" function. +    */ +    val fooSequence = generateSequence(1, { it + 1 }) +    val x = fooSequence.take(10).toList() +    println(x) // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + +    // 다음은 시퀀스를 사용해서 피보나치 수열을 생성하는 예입니다. +    fun fibonacciSequence(): Sequence<Long> { +        var a = 0L +        var b = 1L + +        fun next(): Long { +            val result = a + b +            a = b +            b = result +            return a +        } + +        return generateSequence(::next) +    } +    val y = fibonacciSequence().take(10).toList() +    println(y) // => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] + +    // Kotlin 은 컬랙션에서 사용할 수 있는 고차(higher-order)함수를 제공합니다. +    val z = (1..9).map {it * 3} +                  .filter {it < 20} +                  .groupBy {it % 2 == 0} +                  .mapKeys {if (it.key) "even" else "odd"} +    println(z) // => {odd=[3, 9, 15], even=[6, 12, 18]} + +    // "for" 루프는 이터레이터를 제공하는 어떤 것과도 함께 사용할 수 있습니다. +    for (c in "hello") { +        println(c) +    } + +    // "while" 루프는 다른 언어들과 동일하게 사용됩니다. +    var ctr = 0 +    while (ctr < 5) { +        println(ctr) +        ctr++ +    } +    do { +        println(ctr) +        ctr++ +    } while (ctr < 10) + +    /* +    "if"는 값을 리턴하는 표현으로 사용될 수 있습니다. +    그래서 Kotlin 에서는 삼항 ?: 연산자가 필요하지 않습니다. +    */ +    val num = 5 +    val message = if (num % 2 == 0) "even" else "odd" +    println("$num is $message") // => 5 is odd + +    // "when"은 "if-else if" 를 대체할때 사용할 수 있습니다. +    val i = 10 +    when { +        i < 7 -> println("first block") +        fooString.startsWith("hello") -> println("second block") +        else -> println("else block") +    } + +    // "when"은 인수와 함께 사용될 수 있습니다. +    when (i) { +        0, 21 -> println("0 or 21") +        in 1..20 -> println("in the range 1 to 20") +        else -> println("none of the above") +    } + +    // "when"은 값을 리턴하는 함수처럼 사용될 수 있습니다. +    var result = when (i) { +        0, 21 -> "0 or 21" +        in 1..20 -> "in the range 1 to 20" +        else -> "none of the above" +    } +    println(result) + +    /* +    객체가 어떤 타입인지를 확인하기 위해 "is" 연산자를 사용할 수 있습니다. +    타입 체크를 통과하면 객체의 명시적인 형변환 없이도 그 타입 값으로 사용될 수 있습니다. +    이를 스마트 변환(Smartcast)이라 부릅니다. +    */ +    fun smartCastExample(x: Any) : Boolean { +        if (x is Boolean) { +            // x is automatically cast to Boolean +            return x +        } else if (x is Int) { +            // x is automatically cast to Int +            return x > 0 +        } else if (x is String) { +            // x is automatically cast to String +            return x.isNotEmpty() +        } else { +            return false +        } +    } +    println(smartCastExample("Hello, world!")) // => true +    println(smartCastExample("")) // => false +    println(smartCastExample(5)) // => true +    println(smartCastExample(0)) // => false +    println(smartCastExample(true)) // => true + +    // 스마트 변환은 when 블럭과도 함께 사용됩니다. +    fun smartCastWhenExample(x: Any) = when (x) { +        is Boolean -> x +        is Int -> x > 0 +        is String -> x.isNotEmpty() +        else -> false +    } + +    /* +    확장(Extensions)을 이용해 클래스에 새로운 기능을 추가할 수 있습니다. +    C#에서의 확장 매서드와 유사합니다. +    */ +    fun String.remove(c: Char): String { +        return this.filter {it != c} +    } +    println("Hello, world!".remove('l')) // => Heo, word! + +    println(EnumExample.A) // => A +    println(ObjectExample.hello()) // => hello +} + +// Enum 클래스는 자바의 enum 타입과 유사합니다. +enum class EnumExample { +    A, B, C +} + +/* +"object" 예약어는 싱클톤 객체를 생성할 때 사용됩니다.  +객체를 새로 생성할 수는 없지만 이름을 가지고 접근해 사용할 수 있습니다. +이는 스칼라의 싱글톤 객체와 유사합니다. +*/ +object ObjectExample { +    fun hello(): String { +        return "hello" +    } +} + +fun useObject() { +    ObjectExample.hello() +    val someRef: Any = ObjectExample // 객체의 이름을 그대로 사용합니다. +} + +``` + +### 더 알아보기 + +* [Kotlin tutorials (EN)](https://kotlinlang.org/docs/tutorials/) +* [Try Kotlin in your browser (EN)](http://try.kotlinlang.org/) +* [A list of Kotlin resources (EN)](http://kotlin.link/) diff --git a/ko-kr/markdown-kr.html.markdown b/ko-kr/markdown-kr.html.markdown index bfa2a877..397e9f30 100644 --- a/ko-kr/markdown-kr.html.markdown +++ b/ko-kr/markdown-kr.html.markdown @@ -25,7 +25,7 @@ lang: ko-kr  ## HTML 요소  HTML은 마크다운의 수퍼셋입니다. 모든 HTML 파일은 유효한 마크다운이라는 것입니다. -```markdown +```md  <!--따라서 주석과 같은 HTML 요소들을 마크다운에 사용할 수 있으며, 마크다운 파서에 영향을  받지 않을 것입니다. 하지만 마크다운 파일에서 HTML 요소를 만든다면 그 요소의 안에서는  마크다운 문법을 사용할 수 없습니다.--> @@ -34,7 +34,7 @@ HTML은 마크다운의 수퍼셋입니다. 모든 HTML 파일은 유효한 마  텍스트 앞에 붙이는 우물 정 기호(#)의 갯수에 따라 `<h1>`부터 `<h6>`까지의 HTML 요소를  손쉽게 작성할 수 있습니다. -```markdown +```md  # <h1>입니다.  ## <h2>입니다.  ### <h3>입니다. @@ -43,7 +43,7 @@ HTML은 마크다운의 수퍼셋입니다. 모든 HTML 파일은 유효한 마  ###### <h6>입니다.  ```  또한 h1과 h2를 나타내는 다른 방법이 있습니다. -```markdown +```md  h1입니다.  ============= @@ -53,7 +53,7 @@ h2입니다.  ## 간단한 텍스트 꾸미기  마크다운으로 쉽게 텍스트를 기울이거나 굵게 할 수 있습니다. -```markdown +```md  *기울인 텍스트입니다.*  _이 텍스트도 같습니다._ @@ -65,14 +65,14 @@ __이 텍스트도 같습니다.__  *__이것도 같습니다.__*  ```  깃헙 전용 마크다운에는 취소선도 있습니다. -```markdown +```md  ~~이 텍스트에는 취소선이 그려집니다.~~  ```  ## 문단  문단은 하나 이상의 빈 줄로 구분되는, 한 줄 이상의 인접한 텍스트입니다. -```markdown +```md  문단입니다. 문단에 글을 쓰다니 재밌지 않나요?  이제 두 번째 문단입니다. @@ -83,7 +83,7 @@ __이 텍스트도 같습니다.__  HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어쓰기로 문단을 끝내고  새 문단을 시작할 수 있습니다. -```markdown +```md  띄어쓰기 두 개로 끝나는 문단 (마우스로 긁어 보세요).    이 위에는 `<br />` 태그가 있습니다. @@ -91,7 +91,7 @@ HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어  인용문은 > 문자로 쉽게 쓸 수 있습니다. -```markdown +```md  > 인용문입니다. 수동으로 개행하고서  > 줄마다 `>`를 칠 수도 있고 줄을 길게 쓴 다음에 저절로 개행되게 내버려 둘 수도 있습니다.  > `>`로 시작하기만 한다면 차이가 없습니다. @@ -103,7 +103,7 @@ HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어  ## 목록  순서가 없는 목록은 별표, 더하기, 하이픈을 이용해 만들 수 있습니다. -```markdown +```md  * 이거  * 저거  * 그거 @@ -111,7 +111,7 @@ HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어  또는 -```markdown +```md  + 이거  + 저거  + 그거 @@ -119,7 +119,7 @@ HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어  또는 -```markdown +```md  - 이거  - 저거  - 그거 @@ -127,7 +127,7 @@ HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어  순서가 있는 목록은 숫자와 마침표입니다. -```markdown +```md  1. 하나  2. 둘  3. 셋 @@ -135,7 +135,7 @@ HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어  숫자를 정확히 붙이지 않더라도 제대로 된 순서로 보여주겠지만, 좋은 생각은 아닙니다. -```markdown +```md  1. 하나  1. 둘  1. 셋 @@ -144,7 +144,7 @@ HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어  목록 안에 목록이 올 수도 있습니다. -```markdown +```md  1. 하나  2. 둘  3. 셋 @@ -155,7 +155,7 @@ HTML `<br />` 태그를 삽입하고 싶으시다면, 두 개 이상의 띄어  심지어 할 일 목록도 있습니다. HTML 체크박스가 만들어집니다. -```markdown +```md  x가 없는 박스들은 체크되지 않은 HTML 체크박스입니다.  - [ ] 첫 번째 할 일  - [ ] 두 번째 할 일 @@ -168,13 +168,13 @@ x가 없는 박스들은 체크되지 않은 HTML 체크박스입니다.  띄어쓰기 네 개 혹은 탭 한 개로 줄을 들여씀으로서 (`<code> 요소를 사용하여`) 코드를  나타낼 수 있습니다. -```markdown +```md      puts "Hello, world!"  ```  탭을 더 치거나 띄어쓰기를 네 번 더 함으로써 코드를 들여쓸 수 있습니다. -```markdown +```md      my_array.each do |item|          puts item      end @@ -182,7 +182,7 @@ x가 없는 박스들은 체크되지 않은 HTML 체크박스입니다.  인라인 코드는 백틱 문자를 이용하여 나타냅니다. ` -```markdown +```md  철수는 `go_to()` 함수가 뭘 했는지도 몰랐어!  ``` @@ -202,7 +202,7 @@ end  수평선(`<hr/>`)은 셋 이상의 별표나 하이픈을 이용해 쉽게 나타낼 수 있습니다.  띄어쓰기가 포함될 수 있습니다. -```markdown +```md  ***  ---  - - - @@ -213,19 +213,19 @@ end  마크다운의 장점 중 하나는 링크를 만들기 쉽다는 것입니다. 대괄호 안에 나타낼 텍스트를 쓰고  괄호 안에 URL을 쓰면 됩니다. -```markdown +```md  [클릭](http://test.com/)  ```  괄호 안에 따옴표를 이용해 링크에 제목을 달 수도 있습니다. -```markdown +```md  [클릭](http://test.com/ "test.com으로 가기")  ```  상대 경로도 유효합니다. -```markdown +```md  [music으로 가기](/music/).  ``` @@ -251,7 +251,7 @@ end  ## 이미지  이미지는 링크와 같지만 앞에 느낌표가 붙습니다. -```markdown +```md    ``` @@ -264,18 +264,18 @@ end  ## 기타  ### 자동 링크 -```markdown +```md  <http://testwebsite.com/>와  [http://testwebsite.com/](http://testwebsite.com/)는 동일합니다.  ```  ### 이메일 자동 링크 -```markdown +```md  <foo@bar.com>  ```  ### 탈출 문자 -```markdown +```md  *별표 사이에 이 텍스트*를 치고 싶지만 기울이고 싶지는 않다면  이렇게 하시면 됩니다. \*별표 사이에 이 텍스트\*.  ``` @@ -284,7 +284,7 @@ end  깃헙 전용 마크다운에서는 `<kbd>` 태그를 이용해 키보드 키를 나타낼 수 있습니다. -```markdown +```md  컴퓨터가 멈췄다면 눌러보세요.  <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Del</kbd>  ``` @@ -292,14 +292,14 @@ end  ### 표  표는 깃헙 전용 마크다운에서만 쓸 수 있고 다소 복잡하지만, 정말 쓰고 싶으시다면 -```markdown +```md  | 1열      | 2열        | 3열       |  | :--------| :-------: | --------: |  | 왼쪽 정렬 | 가운데 정렬 | 오른쪽 정렬 |  | 머시기    | 머시기     | 머시기     |  ```  혹은 -```markdown +```md  1열 | 2열 | 3열  :-- | :-: | --:  으악 너무 못생겼어 | 그만 | 둬 diff --git a/ko-kr/python-kr.html.markdown b/ko-kr/pythonlegacy-kr.html.markdown index ed377a99..978a9f33 100644 --- a/ko-kr/python-kr.html.markdown +++ b/ko-kr/pythonlegacy-kr.html.markdown @@ -1,9 +1,9 @@  --- -language: python +language: Python 2 (legacy)  category: language  contributors:      - ["Louie Dinh", "http://ldinh.ca"] -filename: learnpython-ko.py +filename: learnpythonlegacy-ko.py  translators:      - ["wikibook", "http://wikibook.co.kr"]  lang: ko-kr @@ -441,7 +441,7 @@ Human.grunt() #=> "*grunt*"  # 다음과 같이 모듈을 임포트할 수 있습니다.  import math -print math.sqrt(16) #=> 4 +print math.sqrt(16) #=> 4.0  # 모듈의 특정 함수를 호출할 수 있습니다.  from math import ceil, floor diff --git a/ko-kr/vim-kr.html.markdown b/ko-kr/vim-kr.html.markdown new file mode 100644 index 00000000..76063143 --- /dev/null +++ b/ko-kr/vim-kr.html.markdown @@ -0,0 +1,269 @@ +--- +category: tool +tool: vim +contributors: +    - ["RadhikaG", "https://github.com/RadhikaG"] +translators: +    - ["Wooseop Kim", "https://github.com/linterpreteur"] +    - ["Yeongjae Jang", "https://github.com/Liberatedwinner"] +filename: LearnVim-kr.txt +lang: ko-kr +--- + +[Vim](http://www.vim.org) +(Vi IMproved)은 유닉스에서 인기 있는 vi 에디터의 클론입니다. Vim은 속도와 생산성을 위해 +설계된 텍스트 에디터로, 대부분의 유닉스 기반 시스템에 내장되어 있습니다. 다양한 단축 키를 통해 +파일 안에서 빠르게 이동하고 편집할 수 있습니다. + +## Vim 조작의 기본 + +``` +    vim <filename>   # vim으로 <filename> 열기 +    :help <topic>    # (존재하는 경우에) <topic>에 대한, 내장된 도움말 문서 열기 +    :q               # vim 종료 +    :w               # 현재 파일 저장 +    :wq              # 파일 저장 후 종료 +    ZZ               # 파일 저장 후 종료 +    :q!              # 저장하지 않고 종료 +                     # ! *강제로* :q를 실행하여, 저장 없이 종료 +    :x               # 파일 저장 후 종료 (:wq의 축약) + +    u                # 동작 취소 +    CTRL+R           # 되돌리기 + +    h                # 한 글자 왼쪽으로 이동 +    j                # 한 줄 아래로 이동 +    k                # 한 줄 위로 이동 +    l                # 한 글자 오른쪽으로 이동 + +    # 줄 안에서의 이동 + +    0                # 줄 시작으로 이동 +    $                # 줄 끝으로 이동 +    ^                # 줄의 공백이 아닌 첫 문자로 이동 +     +    Ctrl+B           # 한 화면 뒤로 이동 +    Ctrl+F           # 한 화면 앞으로 이동 +    Ctrl+D           # 반 화면 앞으로 이동 +    Ctrl+U           # 반 화면 뒤로 이동 + +    # 텍스트 검색 + +    /word            # 커서 뒤에 나타나는 해당 단어를 모두 하이라이트 +    ?word            # 커서 앞에 나타나는 해당 단어를 모두 하이라이트 +    n                # 해당 단어를 검색 후 다음으로 나타나는 위치로 이동 +    N                # 이전에 나타나는 위치로 이동 + +    :%s/foo/bar/g    # 파일 모든 줄에 있는 'foo'를 'bar'로 치환 +    :s/foo/bar/g     # 현재 줄에 있는 'foo'를 'bar'로 치환 +    :%s/foo/bar/gc   # 사용자에게 확인을 요구하는, 모든 줄에 있는 'foo'를 'bar'로 치환 +    :%s/\n/\r/g      # 한 종류의 개행 문자에서 다른 종류의 것으로 치환 (\n에서 \r로) + +    # 문자로 이동 + +    f<character>     # <character>로 건너뛰기 +    t<character>     # <character>의 바로 뒤로 건너뛰기  + +    # 예를 들어,   +    f<               # <로 건너뛰기 +    t<               # <의 바로 뒤로 건너뛰기 +     +    # 단어 단위로 이동 + +    w                # 한 단어 오른쪽으로 이동 +    b                # 한 단어 왼쪽으로 이동 +    e                # 현재 단어의 끝으로 이동 + +    # 기타 이동 명령어 + +    gg               # 파일 맨 위로 이동 +    G                # 파일 맨 아래로 이동 +    :NUM             # 줄 수 NUM(숫자)로 가기 +    H                # 화면 꼭대기로 이동 +    M                # 화면 중간으로 이동 +    L                # 화면 바닥으로 이동 +``` + +## 도움말 문서 + +Vim은 `:help <topic>` 명령을 통해 접근할 수 있는 도움말 문서를 내장하고 있습니다. +예를 들어, `:help navigation` 은 당신의 작업 공간을 탐색하는 방법에 대한 문서를 표시합니다! + +`:help`는 옵션 없이도 사용할 수 있습니다. 이는 기본 도움말 대화 상자를 표시합니다. +이 대화 상자는 Vim을 시작하는 것이 보다 용이하도록 도와줍니다. + +## 모드 + +Vim은 **모드**의 개념에 기초를 두고 있습니다. + +- 명령어 모드   - vim은 이 모드로 시작됩니다. 이동과 명령어 입력에 사용합니다. +- 삽입 모드     - 파일을 수정합니다. +- 비주얼 모드   - 텍스트를 하이라이트하고 그 텍스트에 대한 작업을 합니다. +- 실행 모드     - ':' 이후 명령어를 입력합니다. + +``` +    i                # 커서 위치 앞에서 삽입 모드로 변경 +    a                # 커서 위치 뒤에서 삽입 모드로 변경 +    v                # 비주얼 모드로 변경     +    :                # 실행 모드로 변경 +    <esc>            # 현재 모드를 벗어나 명령어 모드로 변경 + +    # 복사와 붙여넣기 + +    y                # 선택한 객체 복사(Yank) +    yy               # 현재 줄 복사 +    d                # 선택한 객체 삭제 +    dd               # 현재 줄 삭제 +    p                # 커서 위치 뒤에 복사한 텍스트 붙여넣기 +    P                # 커서 위치 앞에 복사한 텍스트 붙여넣기 +    x                # 현재 커서 위치의 문자 삭제 +``` + +## vim의 '문법' + +Vim의 명령어는 '서술어-수식어-목적어'로 생각할 수 있습니다. + +서술어     - 취할 동작  +수식어     - 동작을 취할 방식 +목적어     - 동작을 취할 객체 + +'서술어', '수식어', '목적어'의 예시는 다음과 같습니다. + +``` +    # '서술어' +  +    d                # 지운다 +    c                # 바꾼다 +    y                # 복사한다 +    v                # 선택한다 + +    # '수식어' + +    i                # 안에 +    a                # 근처에 +    NUM              # (숫자) +    f                # 찾아서 그곳에 +    t                # 찾아서 그 앞에 +    /                # 문자열을 커서 뒤로 찾아서 +    ?                # 문자열을 커서 앞으로 찾아서 + +    # '목적어' + +    w                # 단어를 +    s                # 문장을 +    p                # 문단을 +    b                # 블록을 +     +    # 예시 '문장' (명령어) + +    d2w              # 단어 2개를 지운다 +    cis              # 문장 안을 바꾼다 +    yip              # 문단 안을 복사한다 +    ct<              # 여는 괄호까지 바꾼다 +                     # 현재 위치에서 다음 여는 괄호까지의 텍스트를 바꾼다 +    d$               # 줄 끝까지 지운다 +``` + +## 몇 가지 트릭 + +        <!--TODO: Add more!--> +``` +    >                # 선택한 영역 한 칸 들여쓰기 +    <                # 선택한 영역 한 칸 내어쓰기 +    :earlier 15m     # 15분 전의 상태로 되돌리기 +    :later 15m       # 위의 명령어를 취소 +    ddp              # 이어지는 줄과 위치 맞바꾸기 (dd 후 p) +    .                # 이전 동작 반복 +    :w !sudo tee %   # 현재 파일을 루트 권한으로 저장 +    :set syntax=c    # 문법 강조를 'C'의 것으로 설정 +    :sort            # 모든 줄을 정렬 +    :sort!           # 모든 줄을 역순으로 정렬 +    :sort u          # 모든 줄을 정렬하고, 중복되는 것을 삭제 +    ~                # 선택된 텍스트의 대/소문자 토글 +    u                # 선택된 텍스트를 소문자로 바꾸기 +    U                # 선택된 텍스트를 대문자로 바꾸기 +     +    # 텍스트 폴딩 +    zf               # 선택된 텍스트 위치에서 폴딩 만들기 +    zo               # 현재 폴딩 펴기 +    zc               # 현재 폴딩 접기 +    zR               # 모든 폴딩 펴기 +    zM               # 모든 폴딩 접기 +    zi               # 폴딩 접기/펴기 토글 +    zd               # 접은 폴딩 삭제 +``` + +## 매크로 + +매크로는 기본적으로 녹화할 수 있는 동작을 말합니다. +매크로를 녹화하기 시작하면, 끝날 때까지 **모든** 동작과 명령어가 녹화됩니다. +매크로를 호출하면 선택한 텍스트에 대해 정확히 같은 순서의 동작과 명령어가 실행됩니다. + +``` +    qa               # 'a'라는 이름의 매크로 녹화 시작 +    q                # 녹화 중지 +    @a               # 매크로 실행 +``` + +### ~/.vimrc 설정 + +.vimrc 파일은 Vim이 시작할 때의 설정을 결정합니다. + +다음은 ~/.vimrc 파일의 예시입니다. + +``` +" ~/.vimrc 예시 +" 2015.10  + +" vim이 iMprove 되려면 필요 +set nocompatible + +" 자동 들여쓰기 등을 위해 파일 명으로부터 타입 결정 +filetype indent plugin on + +" 신택스 하이라이팅 켜기 +syntax on + +" 커맨드 라인 완성 향상 +set wildmenu + +" 대문자를 썼을 때가 아니면 대소문자 구분하지 않고 검색 +set ignorecase +set smartcase + +" 줄넘김을 했을 때 파일에 따른 들여쓰기가 켜져 있지 않다면 +" 현재 줄과 같은 들여쓰기를 유지 +set autoindent + +" 좌측에 줄 번호 표시 +set number + +" 들여쓰기 설정 (개인 기호에 따라 변경) + +" 탭 하나와 시각적으로 같을 스페이스 개수 +set tabstop=4 + +" 편집할 때 탭 하나에 들어갈 스페이스 수 +set softtabstop=4 + +" 들여쓰기 혹은 내어쓰기 작업(>>, <<)을 했을 때 움직일 스페이스 개수 +set shiftwidth=4 + +" 탭을 스페이스로 변환 +set expandtab + +" 들여쓰기와 정렬에 자동 탭 및 스페이스 사용 +set smarttab +``` + +### 참고 자료 + +[(영어) Vim 홈페이지](http://www.vim.org/index.php) + +`$ vimtutor` + +[(영어) vim 입문과 기초](https://danielmiessler.com/study/vim/) + +[(영어) 엄마가 말해주지 않은 Vim의 어두운 구석들 (Stack Overflow 게시물)](http://stackoverflow.com/questions/726894/what-are-the-dark-corners-of-vim-your-mom-never-told-you-about) + +[(영어) 아치 리눅스 위키](https://wiki.archlinux.org/index.php/Vim) diff --git a/ko-kr/yaml-kr.html.markdown b/ko-kr/yaml-kr.html.markdown index b6d1de41..4b1b29d2 100644 --- a/ko-kr/yaml-kr.html.markdown +++ b/ko-kr/yaml-kr.html.markdown @@ -2,7 +2,7 @@  language: yaml  filename: learnyaml-kr.yaml  contributors: -  - ["Adam Brenecki", "https://github.com/adambrenecki"] +  - ["Leigh Brenecki", "https://github.com/adambrenecki"]    - ["Suhas SG", "https://github.com/jargnar"]  translators:    - ["Wooseop Kim", "https://github.com/linterpreteur"] | 
