shtaxxx日記

コンピュータアーキテクチャについて研究している研究者の日記や技術紹介

githubでpull requestが来たときの対処法

まず自分の現状のコミットIDを調べておく.

git log

新しいブランチを作成して,相手のブランチを持ってくる.

git checkout -b pull-request master
git pull https://github.com/hishername/project.git branchname

最初に調べたコミットIDを使って,差分をチェックする(もしかしてコミットIDなしでもできる?)

git diff -r 80deaed24b328140c9181050a1536754eedfa8cd --ignore-all-space

masterにマージする.

git checkout master
git merge --no-ff pull-request
git push origin master

screenでタイトルを,コマンド実行中はコマンド名に,でなければ現在のディレクトリ名に自動で設定する

以前にscreenのhardstatusに表示されるウィンドウタイトルを現在実行中のコマンドに設定する方法の記事を書いたが,今回はその更新版.


screenの各ウィンドウのタイトルを,コマンド実行中はそのコマンド名に自動で設定し,そうでなければ現在の作業ディレクトリ名に自動で設定する.

bashtcshの2つのシェルについてその方法は以下の通り.
zshの場合にはおそらく,tcshの場合と同じようにprecmdを設定すれば,同様のことができるはず(未確認).

設定するとこんな感じで,screenのtitleが自動で設定される.
ウィンドウ1ではemacsを,2ではtopをそれぞれ実行中.3では現在workディレクトリにいて,コマンドは実行していない.

bashの場合,PS1とPROMPT_COMMAND変数を設定する.

## .bashrc
if [ $TERM == 'screen' ]; then
    export PS1='\u@\h:\W\$ '
    export PROMPT_COMMAND='echo -ne "\033k\033\0134\033k$(basename $(pwd))\033\\"'
else
    export PS1='\u@\h:\W\$ '
fi

tcshの場合,promptとprecmd変数を設定する.
echo_styleをbothに設定しないとMacなどのBSD系の環境で正しく動作しないため注意.

## .cshrc
if ( $TERM == 'screen' ) then
    set echo_style=both
    set prompt="%n@%m:%c1$ "
    alias precmd 'echo -n "\033k\033\0134\033k`basename ${cwd}`\033\\"'
else
    set prompt="%n@%m:%c1$ "
endif

ちなみに.screenrcはこんな感じ.

## .screenrc
startup_message off

## current command name as window name
shelltitle "$ |bash"

#hardstatus alwayslastline "%-w%{= ck}%n %t%{-}%+w %=%H [%Y-%m-%d %02c:%s]"
hardstatus alwayslastline "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %Y %m/%d %C:%s%a"
hardstatus off

escape ^z^z

termcap * 'G0:S0=\E(%.:E0=\E(B:TY=iso2022'
termcapinfo xterm* ti@:te@
autodetach on
defflow off
crlf off
vbell off
vbell_msg "Bell"

defutf8 on
defkanji utf-8
encoding utf-8 utf-8
defencoding utf-8

bind o focus
bind k kill
bind s split

screen 0
scrollback 4000
screen 1
scrollback 4000

ログインシェルをtcshのままbashを普段使いシェルとして使う

通常はypchsh/chshをすれば良いのだが,ログインシェルを変更ができない場合やしない方が良い場合には,.cshrcを以下の様に設定して,ログイン時にbashを起動する.
Non-interactiveの場合(scpやsshfs)の場合にも正しく動作するようにpromptのチェックを行う.

if ( ! $?prompt ) then
    exit 0
endif

setenv OLDSHELL $SHELL
setenv SHELL /bin/bash
exec /bin/bash --login

emacsでPython+Jediの補完を使う

OSには事情によりCentOS 6.5を想定しているが,Ubuntu等でもほぼ同じ.

各種ソフトウェアインストール

pipをインストールし,その後virtualenvをインストールする.既にインストールされていればスキップ可能.

CentOS (6.5) の場合 (rootで実行)

yum install python27 python3
easy_install pip
easy_install-3.3 pip
pip install virtualenv
pip3 install virtualenv

次に,jediとepcをインストールする

pip3 install jedi epc

 

jediの設定をする

cd .emacs.d/site-lisp/jedi/emacs-jedi
virtualenv-3.4 env

emacs lispを設定する

inits/70-python.el はこんな感じ

;; python-mode with jedi
(add-to-list 'load-path "~/.emacs.d/site-lisp/jedi/emacs-deferred")
(add-to-list 'load-path "~/.emacs.d/site-lisp/jedi/emacs-epc")
(add-to-list 'load-path "~/.emacs.d/site-lisp/jedi/emacs-ctable")
(add-to-list 'load-path "~/.emacs.d/site-lisp/jedi/emacs-jedi")

(autoload 'python "python" nil t)
(autoload 'jedi "jedi" "Jedi for python" t)

(add-hook 'python-mode-hook
          '(lambda ()
             ;; python common 
             (setq python-python-command "python3")
             (setq indent-tabs-mode nil)
             (setq indent-level 4)
             (setq python-indent 4)
             (setq tab-width 4)
             ;; jedi
             (setq jedi:setup-keys t)
             (jedi:setup)
             (define-key jedi-mode-map (kbd "M-TAB") 'jedi:complete)
             (setq jedi:complete-on-dot t)
             (setq jedi:environment-root "env")
             (setq jedi:environment-virtualenv
                   (append python-environment-virtualenv
                           '("--python" "python3")))))

(eval-after-load "jedi"
  '(progn
     (setq jedi:server-command
           (list python-python-command jedi:server-script))))

emacsでGo言語(golang)の補完と定義ジャンプをするにはgocodeとgodefを使う

emacs (24.3) 上でgolang (1.3.3) の補完とコードジャンプを利用する方法をまとめました.
ターミナルのシェルにはbashを使っていますが,他のシェルでも変わらないはず.

PATH各種を設定する

まず,emacs上でexec-pathが$GOPATH (Goコマンドでインストールしたバイナリがあるディレクトリのパス) を含むことを確認する.*scratch*で

exec-path

とタイプしてからC-j (Ctrl + j) とすれば確認できる.

シェルからemacsを起動すれば自動的に$PATHをexec-pathとして取り込むので,予めシェルで$PATHが$GOPATHを含むように設定しておけばOK.

Macなどでアプリケーションのアイコンから直接emacsを起動してしまうとexec-pathに$PATHが取り込まれないので注意.
また,OSX Yosemite上で起動したemacs 24.4では,うまくexec-pathに$PATHを取り込めていない模様.
かたついさんの記事の通りに,exec-path-from-shell を使いましょう.

package.el等でemacsの環境にexec-path-from-shellをインストールし,inits/30-exec-path-from-shell.elを

(exec-path-from-shell-initialize)

と設定.

あとは,シェルの設定をする.bashなら.bashrcに

if [ -x "`which go`" ]; then
    export GOROOT=`go env GOROOT`
    export GOPATH=~/.go
    export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
fi

としておけば良いし,tcshなら.cshrcに

if (-x "`which go`") then
    set GOROOT=`go env GOROOT`
    set GOPATH=~/.go
    set path= ( \
        $GOROOT/bin \
        $GOPATH/bin \
        $path \
        )
endif

としておけば,ターミナルからemacsを起動した際に$PATHがexec-pathに取り込まれる.

もし,$GOPATHの実体となるディレクトリがなければ,作成する.

mkdir -p $GOPATH

gocode, godef, goimportsをインストールする

hgやgitが必要になるかもしれないので,予めインストールしておく.
MacでHomebrewを使っているなら

brew install git hg

Ubuntuでapt-getなら

sudo apt-get install hg git

godefをインストールする.

go get code.google.com/p/rog-go/exp/cmd/godef

gocodeをインストールする.

go get -u github.com/nsf/gocode

goimportsをインストールする.

go get code.google.com/p/go.tools/cmd/goimports

emacs lispの設定

emacsに auto-complete, go-mode, go-autocomplete のパッケージを追加する.
僕はemacs24系でinit-loader.el+package.elを使ってパッケージ管理をしているので,inits/20-package.el がこんな感じになっている.パッケージがなければ自動的にダウンロードし,インストールされる.
init-loader.el+package.elの詳しい使い方はかたついさんの記事を参照しましょう.

(require 'package)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(package-initialize)

(require 'cl)
(defvar installing-package-list
  '(
    auto-complete
    exec-path-from-shell
    gtags
    flymake
    flymake-cursor
    markdown-mode
    markdown-mode+
    python-mode
    epc
    python-environment
    jedi
    jinja2-mode
    go-mode
    go-autocomplete
    scala-mode2
    haskell-mode
    ))

(let ((not-installed (loop for x in installing-package-list
                           when (not (package-installed-p x))
                           collect x)))
  (when not-installed
    (package-refresh-contents)
    (dolist (pkg not-installed)
      (package-install pkg))))

auto-completeの設定をする.inits/50-auto-complete.elはこんな感じ.

(require 'auto-complete)
;(add-to-list 'ac-dictionary-directories "~/.emacs.d/elpa/auto-complete-20130724.1750/dict")
(require 'auto-complete-config)
(ac-config-default)
(global-auto-complete-mode t)

最後に,inits/70-go-mode.elを用意し,go-modeと補完機能を設定する.

;; go-mode
;; In advance, install godef, gocode, and goimports in $GOPATH.
;;   go get code.google.com/p/rog-go/exp/cmd/godef
;;   go get -u github.com/nsf/gocode
;;   go get code.google.com/p/go.tools/cmd/goimports
;; exec-path should include a path to .go/bin.
;; So DO NOT launch an emacs from App icon, DO launch an emacs from terminal (shell).

(autoload 'go-mode "go-mode" nil t)
(eval-after-load "go-mode" '(progn (require 'go-autocomplete)))
(add-hook 'go-mode-hook
          '(lambda()
             (setq gofmt-command "goimports")
             (add-hook 'before-save-hook 'gofmt-before-save)
             (setq c-basic-offset 4)
             (setq indent-tabs-mode t)
             (local-set-key (kbd "M-.") 'godef-jump)
             (local-set-key (kbd "C-c C-r") 'go-remove-unused-imports)
             (local-set-key (kbd "C-c i") 'go-goto-imports)
             (local-set-key (kbd "C-c d") 'godoc)
             (define-key ac-mode-map (kbd "M-TAB") 'auto-complete)))

go-modeの設定の仕方はこちらを参照しました.ありがとうございました.

完成

こんな感じで補完ができるようになったはず.
M-Tabで補完メニューが出て,M-.でカーソルのキーワードの定義にジャンプできる.便利.