oh-my-zsh 테마 변경 및 설정 (alias, agnoster 멀티라인, 사용자명 숨김처리)

|

oh-my-zsh 프롬프트에 기본으로 표시되는 사용자 이름 삭제하기

  • 작은 화면에서 명령어를 입력할 때 기본으로 표시되는 사용자 이름이 자리를 차지해서 불편할 때가 많았다.
  • zsh에서 기본으로 표시되는 Leeui-MacBook-Pro 같은 부분을 삭제하려면 .zshrc 파일에 아래 내용을 추가한다.

$ vim ~/.zshrc

prompt_context() {
  if [[ "$USER" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then
    prompt_segment black default "%(!.%{%F{yellow}%}.)$USER"
  fi
}

  • 수정 후 source ~/.zshrc 를 통해 재실행 하면 바로 적용된다.
  • prompt_context(){} 로 비워두면 프롬프트에 표시되는 유저 이름이 모두 숨김처리된다. ```python

$ vim ~/.zshrc

prompt_context() { }

<center>
 <figure>
 <img src="/assets/post-img/etc/zsh.png" alt="views">
 <figcaption>사용자 이름을 숨김처리한 agnoster 테마(멀티라인 적용) </figcaption>
 </figure>
 </center>

## word jumps 활성화 하기
- 기본적으로 oh-my-zsh에서는 `option + 방향키` 조합의 단어별 이동이 불가능하다. 이를 수정하려면 별도의 설정수정이 필요하다.
- iTerm -> Preferences -> Profiles -> Keys 로 이동한다.
- `+` 버튼을 누르고 아래 설정을 추가한다.

```shell
# Option + right
⌥→
Send Escape Sequence
f
# Option + left
⌥←
Send Escape Sequence
b

Syntax highlighting

# 설치
$ brew install zsh-syntax-highlighting

# ~/.zshrc 에 아래 문구 추가
source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

oh-my-zsh 테마변경

  • .zshrc 파일에서 테마를 수정할 수 있다.
  • 파일경로
cd ~
❯ ls -al
❯ atom .zshrc
  • 기본 테마로 robbyrussell이 설정되어 있다. 더 다양한 테마는 이곳에서 확인할 수 있다. 나는 Pure 테마를 사용하다가 기본 테마를 다시 사용하고 있다.
ZSH_THEME="robbyrussell"

agnoster 테마 및 멀티라인 적용하기

agnoster 테마

  • agnoster : git 사용자에게 편리한 ZSH 테마
  • Solarized dark 테마 색상이 잘 어울린다.
  • 폰트 깨짐을 해결하기 위해서 Powerline-patched font 설치가 필요하다.
  • iterm, terminal 환경설정으로 들어가, 컬러 테마를 Solarized dark로, 서체를 Meslo LG S Regular for Powerline으로 변경한다.

멀티라인 적용

  • 쉘에서 긴 명령어를 입력할 때 화면이 작으면 명령 커서가 자꾸 오른쪽으로 밀려나는 현상이 발생했다. 특히 사용중인 agnoster 테마는 싱글라인으로 표시되어 이러한 문제가 더 자주 발생했는데, 이를 해결하기 위해 멀티라인으로 변경하는 방법을 찾아보았다. 감사하게도 한국어로 번역된 자료가 있었다.

  • 적용해 보니 투박하게 생긴 삼각형 커서를 바꾸고 싶어서 pure 테마의 커서 모양을 적용해 보았다.
  • agnoster.zsh-theme 에 추가한 전체코드는 아래와 같다. (멀티라인, 커서변경)

## Main prompt
build_prompt() {
  RETVAL=$?
  prompt_status
  prompt_virtualenv
  prompt_context
  prompt_dir
  prompt_git
  prompt_bzr
  prompt_hg
  prompt_newline # 멀티라인 적용
  prompt_end
}

# 멀티라인 적용, 커버모양 변경
prompt_newline() {
  if [[ -n $CURRENT_BG ]]; then
    echo -n "%{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR
%(?.%F{$CURRENT_BG}.%F{red})❯%f"

  else
    echo -n "%{%k%}"
  fi

  echo -n "%{%f%}"
  CURRENT_BG=''
}

views
agnoster 테마 멀티라인 적용모습

alias 추가

  • 긴 명령어를 줄임말로 간편하게 사용할 수 있다.
  • 내 경우는 장고에서 runserver 할때 Error: That port is already in use. 에러가 발생할 때마다 $ sudo lsof -t -i tcp:8000 | xargs kill -9를 매번 입력하여 해결했었다. 너무 길어서 외우기가 힘들어 이번 기회에 alias를 추가하였다.
  • .zshrc 파일에서 alias를 추가할 수 있다.
# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"

# custom alias 추가
alias kp="sudo lsof -t -i tcp:8000 | xargs kill -9"
  • 설정 저장 후, source ~/.zshrc 를 통해 재실행
  • 이제 터미널에서 kp만 입력하면 긴 명령어를 입력하지 않아도 된다.

그 밖의 유용한 플러그인

level 2. 두 정수 사이의 합

|

출처

문제

adder함수는 정수 a, b를 매개변수로 입력받습니다. 두 수와 두 수 사이에 있는 모든 정수를 더해서 리턴하도록 함수를 완성하세요. a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요. 예를들어 a가 3, b가 5이면 12를 리턴하면 됩니다.

a, b는 음수나 0, 양수일 수 있으며 둘의 대소 관계도 정해져 있지 않습니다.

풀이 (python)

def adder(a, b):
	if a == b:
		return a
	elif a < b:
		return sum(list(range(a, b+1)))
	else:
		return sum(list(range(b, a+1)))


# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( adder(3, 5))

다른사람 풀이

def adder(a, b):
    if a > b : a, b = b, a
    return sum(list(range(a, b+1)))

배운점

  • if 조건 : 실행 이렇게도 사용할 수 있다.
  • a, b = b, a 와 같이 두 변수의 값을 바꿀 수 있다.

level 2. 이상한 문자 만들기

|

level 2. 이상한 문자 만들기

출처

문제

toWeirdCase함수는 문자열 s를 매개변수로 입력받습니다. 문자열 s에 각 단어의 짝수번째 인덱스 문자는 대문자로, 홀수번째 인덱스 문자는 소문자로 바꾼 문자열을 리턴하도록 함수를 완성하세요. 예를 들어 s가 “try hello world”라면 첫 번째 단어는 “TrY”, 두 번째 단어는 “HeLlO”, 세 번째 단어는 “WoRlD”로 바꿔 “TrY HeLlO WoRlD”를 리턴하면 됩니다.

주의 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단합니다.

풀이 (python)

1

map을 활용해서 풀었다.

def toWeirdCase(s):
    def change(t):
        result = ""
        for i, v in enumerate(t):
            if i % 2:  # 홀수
                result += v.lower()
            else:  # 짝수
                result += v.upper()
        return result
    return ' '.join(list(map(change, s.split())))


# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : {}".format(toWeirdCase("try hello world")));

2

def toWeirdCase(s):    
	s = s.split()
	i = 0
	j = 0
	while i < len(s):
		for j, v in enumerate(s[i]):
			if j % 2 == 1:
				s[i] = s[i][:j] + s[i][j:].replace(v, v.lower(), 1)
			else:
				s[i] = s[i][:j] + s[i][j:].replace(v, v.upper(), 1)
		i += 1       
	return ' '.join(s)


# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : {}".format(toWeirdCase("try hello world")));

다른사람 풀이

def toWeirdCase(s):    
  return ' '.join(''.join([c.upper() if i % 2 == 0 else c.lower() for i, c in enumerate(w)]) for w in s.split())

배운점

  • 문자열은 인덱스를 통해서 문자열 일부를 수정 교체 할 수 없다.
  • 문자열을 수정하려면 replace를 하거나, + 연산자를 사용해야 한다.
  • 3항 연산자를 잘 활용하자 A if 조건 else B

170312_TIL

|

오늘 한 일

  • 간단한 알고리즘 문제를 풀었다. 3항연산자 를 잘 활용해야겠다는 생각이 다시 들었다.
  • 점프투 파이썬에서 변수 부분을 읽었다. 아래와 같은 변수 선언 방식을 잘 활용하고 싶다는 생각이 들었다.
    a, b = ('hello', 'world')
    a = b = 0
    [a, b] = [1, 2]
    
  • 첫 장고 개인프로젝트에 수업에서 배운 탬플릿 확장을 적용해 보았다. 항상 궁금했던 부분이 해결되는 기분이었다. 특히 jekyll로 블로그를 처음 시작했을때 미리 만들어진 템플릿을 수정해서 적용했었다. 그때 봤었던 기본 골격 html과 각 메뉴별 확장 html의 연관성을 이번 템플릿 확장을 통해서 이해할 수 있었다. 장고의 내장 폼인 User Form을 커스터마이징 해서 로그인 화면과 회원가입 화면을 새롭게 꾸며보았다. 새로운 기능을 추가 할 때마다 배우는게 정말 많다고 느낀다.

내일 할 일

  • 장고 강의 듣기

django 06. 두번째 장고앱 16 - 정적파일, 템플릿 확장, 어드민 템플릿 변경

|

파이썬 웹 프로그래밍 - Django로 웹 서비스 개발하기

static 파일관리와 템플릿 확장에 대해서 알아본다.

참고문서

정적파일

css 파일 만들기

  • polls/static/polls/style.css
a {
    color: red;
    text-decoration: none;
}

body {
    background: white url("images/background.gif") no-repeat right bottom;
}

css 파일 적용


{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

settings.py 수정

# collectstatic 명령 수행시 모든 static 파일을 static 폴더에 모아준다.
# 나중에 서버에 배포할때 정적 파일을 특정 디렉토리 아래에 묶어 놓을 수 있다.
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

collectstatic 명령 수행 및 변경사항 확인

$ python manage.py collectstatic

어드민 템플릿 변경

settings.py 수정

INSTALLED_APPS = [
    'polls',  # 어드민 앞에 입력한다.
    'django.contrib.admin',
    # ...
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        # ...
    }
]

장고 기본 디렉토리 확인

>>> import django
>>> print(django.__path__)

polls/templates/admin/base_site.html 생성

  • 원본 파일은 django/contrib/admin/templates 에 저장되어 있음

{% extends "admin/base.html" %}

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">투표 관리자</a></h1>
{% endblock %}

{% block nav-global %}{% endblock %}


템플릿 확장하기 (extends)

  • templates/polls/base.html 생성

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
  <title>Django Polls Example</title>

  <!-- Bootstrap -->
  <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

  <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->
</head>
<body>
  <div class="container">
    <nav class="navbar navbar-default">
      <div class="container-fluid">
        <div class="navbar-header">
          <span class="navbar-brand">Polls Example</span>
        </div>
        <ul class="nav navbar-nav">
          <li><a href = "{% url 'polls:index' %}">투표</a></li>
          <li class="navbar-right"><a href = "{% url 'admin:index' %}">관리자</a></li>
        </ul>
      </div>
    </nav>
    <div>
      {% block content %}
      {% endblock %}
    </div>
  </div>
  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <!-- Include all compiled plugins (below), or include individual files as needed -->
  <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js></script>
  </body>
  </html>
  

나머지 페이지들 수정



{% extends 'polls/base.html' %}

{% block content %}
    <!--
        ohter html here
    -->
{% endblock content %}