2017年06月30日

「vim」の種類

linux系OSのテキストエディタ、「vi」と「vim」。
「vi」は、VIsual editorの略。
「vim」は、Vi IMprovedの略。

Wikipediaより抜粋。
  • キーボードのみで操作されることを前提としていたため、キーボードのみですべての操作が可能になっている
  • 他のエディタとは操作方法がまるで異なるため、一通りのテキスト編集作業ができるようになるまで慣れが必要となる。
  • 一旦慣れてしまえばメモ帳などとは比較にならないほどのテキスト編集速度を得ることができるため、数多くのVim愛好家が存在する


「vi」を使いやすいように機能を拡張したものが「vim」。
「vi」は現在ではほとんど使われておらず、「vi」のつもりでも実は「vim」をつかっていたりする。





環境:Ubuntu 16.04

標準でインストールされている vim の確認


Ubuntu では、標準で「vim-tiny」という簡易版がインストールされている。
$ which vi
/usr/bin/vi
$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 5月 26 16:58 /usr/bin/vi -> /etc/alternatives/vi
$ ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 17 5月 26 16:57 /etc/alternatives/vi -> /usr/bin/vim.tiny

「vi」を実行すると、「vim-tiny」が実行される。


起動画面

$ vi


vim-tiny01.png
日本語化はされていない。

詳細情報を確認してみる。
$ vim.tiny --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Small version without GUI. Features included (+) or not (-):
+acl -farsi -mouse_sgr -tag_any_white
-arabic -file_in_path -mouse_sysmouse -tcl
-autocmd -find_in_path -mouse_urxvt +terminfo
-balloon_eval -float -mouse_xterm -termresponse
-browse -folding +multi_byte -textobjects
+builtin_terms -footer -multi_lang -timers
-byte_offset +fork() -mzscheme -title
-channel -gettext -netbeans_intg -toolbar
-cindent -hangul_input +packages -user_commands
-clientserver +iconv -path_extra +vertsplit
-clipboard -insert_expand -perl -virtualedit
-cmdline_compl -job -persistent_undo +visual
+cmdline_hist +jumplist -printer -visualextra
-cmdline_info -keymap -profile -viminfo
-comments -langmap -python -vreplace
-conceal -libcall -python3 +wildignore
-cryptv -linebreak -quickfix -wildmenu
-cscope -lispindent -reltime +windows
-cursorbind -listcmds -rightleft +writebackup
-cursorshape -localmap -ruby -X11
-dialog -lua -scrollbind +xfontset
-diff -menu -signs -xim
-digraphs -mksession -smartindent -xsmp
-dnd -modify_fname -startuptime -xterm_clipboard
-ebcdic -mouse -statusline -xterm_save
-emacs_tags -mouse_dec -sun_workshop -xpm
-eval -mouse_gpm -syntax
+ex_extra -mouse_jsbterm -tag_binary
-extra_search -mouse_netterm -tag_old_static
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -DTINY_VIMRC -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lselinux -lacl -lattr -ldl

「vim」から機能を削ぎ落した簡易版であり、もともとの「vi」とほぼ同じ機能といえる。





インストールできるVimの種類


$ vim
プログラム 'vim' は以下のパッケージで見つかりました:
* vim
* vim-gnome
* vim-tiny
* vim-athena
* vim-athena-py2
* vim-gnome-py2
* vim-gtk
* vim-gtk-py2
* vim-gtk3
* vim-gtk3-py2
* vim-nox
* vim-nox-py2
次の操作を試してください: sudo apt install <選択したパッケージ>

このうち、"-py2" と付いたものは、
VIM は python3 をデフォルトとします

標準のVIMパッケージはpython2ではなくpython3用にビルドされています。つまりpython2インタープリターを必要とするVIMプラグインもはや動作しないということです。この問題に対応するため、たとえばvim-gnome-py2のように、python2をサポートした代替のVIMパッケージを用意しています。これらのパッケージはalternativesシステムを用いて、既定のvimコマンドに設定できます。

・sudo update-alternatives --set vim /usr/bin/vim.gnome-py2
引用:Ubuntu 16.04 LTS (Xenial Xerus) リリースノート(日本語)

ということで、vim種類に対してpython2をサポートがあるだけなので、とりあずは無視しておく。

そのため、種類としては以下の通り。
* vim
* vim-gnome
* vim-tiny(標準版)
* vim-athena
* vim-gtk
* vim-gtk3
* vim-nox






vim


単なる「vim」は、「vim.basic」のこと。

起動画面

$ vim


vim-basic01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.basic --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 without GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt -tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
-clientserver +iconv +packages -toolbar
-clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job -perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con -lua +rightleft +writebackup
+diff +menu -ruby -X11
+digraphs +mksession +scrollbind -xfontset
-dnd +modify_fname +signs -xim
-ebcdic +mouse +smartindent -xsmp
+emacs_tags -mouseshape +startuptime -xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop -xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm







vim-athena



vim-athena01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.athena --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 with X11-Athena GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind +xfontset
-dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
システム gvimrc: "$VIM/gvimrc"
ユーザー gvimrc: "$HOME/.gvimrc"
第2ユーザー gvimrc: "~/.vim/gvimrc"
システムメニュー: "$VIMRUNTIME/menu.vim"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_ATHENA -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lXaw -lXmu -lXext -lXt -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -ldl -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm


X11-Athena GUI付き。Xawかな。

「vim」のGUI版は「gVim」
vim-athena02.png

文字化けがあるが、それより気になるのはGUIとして、いまいち美しくない。
vim-athena03.png





vim-gtk


vim-gtk01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.gtk --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 with GTK2 GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
システム gvimrc: "$VIM/gvimrc"
ユーザー gvimrc: "$HOME/.gvimrc"
第2ユーザー gvimrc: "~/.vim/gvimrc"
システムメニュー: "$VIMRUNTIME/menu.vim"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm

GTK2 GUI付き。

「gVim」。
vim-gtk02.png





vim-gtk3


vim-gtk301.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.gtk3 --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 with GTK3 GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
システム gvimrc: "$VIM/gvimrc"
ユーザー gvimrc: "$HOME/.gvimrc"
第2ユーザー gvimrc: "~/.vim/gvimrc"
システムメニュー: "$VIMRUNTIME/menu.vim"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/mirclient -I/usr/include/mircommon -I/usr/include/mircookie -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm

GTK3 GUI付き。

「gVim」。
vim-gtk302.png





vim-gnome


vim-gnome01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.gnome --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 with GTK2-GNOME GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
システム gvimrc: "$VIM/gvimrc"
ユーザー gvimrc: "$HOME/.gvimrc"
第2ユーザー gvimrc: "~/.vim/gvimrc"
システムメニュー: "$VIMRUNTIME/menu.vim"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -D_REENTRANT -DORBIT2=1 -pthread -I/usr/include/libgnomeui-2.0 -I/usr/include/gnome-keyring-1 -I/usr/include/libbonoboui-2.0 -I/usr/include/libxml2 -I/usr/include/libgnome-2.0 -I/usr/include/libbonobo-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/orbit-2.0 -I/usr/include/libgnomecanvas-2.0 -I/usr/include/gail-1.0 -I/usr/include/libart-2.0 -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/x86_64-linux-gnu/gnome-vfs-2.0/include -I/usr/include/gconf/2 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lgnomecanvas-2 -lart_lgpl_2 -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lfontconfig -lfreetype -lgdk_pixbuf-2.0 -lgnomevfs-2 -lgconf-2 -lgthread-2.0 -lgmodule-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm

GTK2-GNOME GUI付き。

「gVim」。
vim-gnome02.png





vim-nox


vim-nox01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.nox --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 without GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt +tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
-clientserver +iconv +packages -toolbar
-clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con +lua +rightleft +writebackup
+diff +menu +ruby -X11
+digraphs +mksession +scrollbind -xfontset
-dnd +modify_fname +signs -xim
-ebcdic +mouse +smartindent -xsmp
+emacs_tags -mouseshape +startuptime -xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop -xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm

GUI無し。




機能の違い


「vim」機能が決定される方法のひとつとして、コンパイル時に指定する方法。
指定しなければ、"normal"となる。

タイプ説明vimの種類
tiny多くの機能を無効にしてコンパイル-
small一部の機能を無効にしてコンパイルvim-tiny
big多くの機能を有効にしてコンパイル-
hugeほとんどの機能を有効にしてコンパイルvim
vim-gnome
vim-athena
vim-gtk
vim-gtk3
vim-nox

どのような機能が含まれるかは、feature-list を参照。

GUI版「gVim」の有無
タイプvimの種類
GUI無しvim-tiny
vim
vim-nox
GUI有りvim-gnome
vim-athena
vim-gtk
vim-gtk3



機能比較(「vim-tiny」は機能が限定的なので除く)
少数派の機能設定をマーキング。
"GUI無し版"内で設定が異なる
"GUI有り版"内で設定が異なる
"GUI無し版"と"GUI有り版"で設定が異なる
種類機能
vim
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt -tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
-clientserver +iconv +packages -toolbar
-clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job -perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con -lua +rightleft +writebackup
+diff +menu -ruby -X11
+digraphs +mksession +scrollbind -xfontset
-dnd +modify_fname +signs -xim
-ebcdic +mouse +smartindent -xsmp
+emacs_tags -mouseshape +startuptime -xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop -xpm
+extra_search -mouse_jsbterm +syntax
vim-nox
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt +tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
-clientserver +iconv +packages -toolbar
-clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con +lua +rightleft +writebackup
+diff +menu +ruby -X11
+digraphs +mksession +scrollbind -xfontset
-dnd +modify_fname +signs -xim
-ebcdic +mouse +smartindent -xsmp
+emacs_tags -mouseshape +startuptime -xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop -xpm
+extra_search -mouse_jsbterm +syntax
vim-athena
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind +xfontset
-dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
vim-gtk
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
vim-gtk3
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
vim-gnome
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax


依存するライブラリが異なる違いはあるが「vim-gtk」「vim-gtk3」「vim-gnome」は機能設定としては違いがない。



まとめ


結局、どれをインストールするのかと言うと、「vim」と他のアプリとでクリップボード連携が必要であれば、GUI付きを選ぶしかない(clipboard機能)。
もしストレージの容量がかつかつで、インストール時の容量が気になるのであれば、容量を優先して標準の「vim-tiny」のままでよいだろう。
それ以外は、機能設定として多数派にあたる「vim-gtk」「vim-gtk3」「vim-gnome」のどれか。ウィンドウマネージャがgnomeなら「vim-gnome」、それ以外なら「vim-gtk」「vim-gtk3」。どのGUIが好みかで決定すればよい。『SSH接続がほとんどで、GUIエディタ「gVim」は必要ない』としても大は小を兼ねるの方針でこの3つから選べばよいだろう。
posted by Zorinos at 23:00| Comment(0) | Linux | 更新情報をチェックする

2017年06月29日

git 変更を一時的に退避 stash

git でチェックアウトすると作業ツリーが変更される。

機能追加を行うために、ブランチを切って、チェックアウトして作業していたら、
作業優先度が高いバグ修正を依頼された、という状況はよくある。
機能追加を行っていた作業は、まだ中途半端。一旦、コミットしても良いが、確実に不要となるコミットになってしまう。

このような場合どうするか?

力技でいくなら、機能追加で使っている作業ツリーとは別に、新たなリポジトリを作って別の作業ツリーを用意して、その場所でバグ修正を行うという手もある。
が、簡単な作業ですぐに割り込み作業が終わるなら大丈夫だろう。しかし、もし、いろいろと作業があり過ぎて、頭が朦朧とした状態になり、間違った作業ツリーを更新してしまうかもしれない。そうなると元に戻すのに無駄な時間と労力を使うことになるかもしれない。ヒューマンエラーの温床になるかもしれない。

せっかく git を使っているので、git の能力をもっと活用してスマートに対応したい。





現在の作業を一時的に退避


"new_branch" ブランチで作業していて、別の作業が発生した。
現在の作業(作業ツリーも、ステージングエリアも)を退避する。

$ git stash save

または、"save" を省略して

$ git stash

stashの目印としてメッセージを付与することも可能。

$ git stash save "message"

メッセージをつけておくことで作業を再開するときにわかりやすい。



statusを確認してみる。
$ git status
On branch new_branch
nothing to commit, working directory clean

作業ツリー上には、更新状態の差分が無い状態になった。

git_stash01.png





退避した内容を確認する


$ git stash list

stash@{0}: WIP on new_branch: 44470bb new_branch 追加2
stash@{1}: On new_branch: stash確認2
stash@{2}: On new_branch: stash確認

この場合、stash には3つの変更が保存されていることがわかる(上が新しい保存)。

stash操作時に、メッセージを付与しなかった場合は、
: WIP on <stashしたブランチ>: <親コミットのハッシュ> <コミットコメント> となり、
メッセージを付与した場合は、
: On <stashしたブランチ>: <メッセージ> となる。

変更が保存されていれば安心。他のブランチをチェックアウトして作業できる。




退避した作業を復元する


最新のstash(stash@{0})を復元するには、

$ git stash pop

$ git status
On branch new_branch
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)

modified: index.html

no changes added to commit (use "git add" and/or "git commit -a")

変更内容が復元できた。

stash のリストを確認すると、
$ git stash list
stash@{0}: On new_branch: stash確認2
stash@{1}: On new_branch: stash確認

3つあったリストが2つに減っている。


"git stash pop" を行うと、復元したstashは削除されることに注意。
git_stash02.png


最新(stash@{0})以外の内容を復元するには、stash名を指定する。

$ git stash pop stash@{1}




stashした中身を確認したいときなど、復元するが stash からは削除したくない(残しておきたい)ときには、"pop" の代わりに "apply" を使う。

$ git stash apply

最新(stash@{0})以外の場合は、同様にstash名を指定すればよい。

$ git stash apply stash@{1}







退避した内容を削除する


"git stash apply" は復元後に、stashに残ったままになる。
個別にstash内容を削除するには、"drop" を使う。

$ git stash drop stash@{1}

stash名を指定しなければ、最新(stash@{0})が削除される。

$ git stash drop



stashを全削除する場合は、

$ git stash clear



不要なstashを残したままにすると、どれが必要なものなのかわからなくなり、無駄な労力が発生するのでこまめに整理すること。






ステージングエリアの内容の復元について


ステージングエリアの内容を退避し、復元する場合、
"--index" オプションを指定しないとステージングエリアに復元されないことに注意。

$ git stash pop stash@{0} --index

※"pop" でも "apply" でも同じ。




ファイルを追加した場合の退避について


作業ツリー上でファイルを追加した状態の場合、このままstash しても追加ファイルはgit管理下ではなってないので、退避されないことに注意。
中途半端な状態でファイルが残ったままとなるので、以降の作業で邪魔になったり、退避したものだと勘違いし削除してしまうと復元ができない。

ファイルを追加した場合は、stash する前に、ステージングエリアに移動させて、git管理下に置いてから、stash すること。



または、"-u" オプションをつけると追跡していないファイルも退避してくれるので、
ステージエリアに移動させなくても、追加ファイルを stash できる。

$ git stash -u








違うブランチで間違って作業をしていたとき


作業をしていてコミットしようとしたら、違うブランチで作業していたことに気づいてしまったようなシチュエーションでも、stash は使える。
一旦、stash して、目的とするブランチへ切り替えてから復元する。
stash にはこのような使い方もできる。






まとめ


割り込み的な作業を行わず、集中して作業できると良いが、うまくいかないこともあるので、切り替えながら進めないといけないこともしばしば。そのような場合に、目の前の作業をきれいに切り替えることで、すっぱりと頭の切り替えにもなる stash は便利。git の便利な機能をうまく使って、ヒューマンエラーを起こさないように、効率よく作業を進めたい。


gitをインストール
gitサーバーのセットアップ
git ブランチについて
git ブランチを合流するマージ
git ブランチを付け替える
git コミット履歴を変更する
git コミットを取り消す
git 変更をリセットする
git リモートでの操作
git ファイルの追跡
git リリース準備
git リモートブランチを追加
git チェックアウトをもっと便利に使う
git プロジェクトの構成
git 変更をpatchファイルにする
git コンフリクトに対処する
git 失敗したときの復元
posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする

2017年06月28日

git ブランチについて

git については、ここや、ここで触れた。
今回は、git に不可欠なブランチについてさらっと触れてみたい。

git の origin とは


ブランチの話の前に、"origin" について。
これは、リモートブランチのサーバ名のこと。

以下のようにすると、"origin" がどこを指しているかわかる。

$ git config --list

remote.origin.url=gitserver:~/git/project1.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*







git の ブランチ とは


git で管理する作業履歴を示すもの。コミットしていくと履歴が増えるが、その履歴を繋いでいく構造がブランチ。
git_branch01.png



木の枝のように、枝分かれさせ管理することが可能。
git_branch02.png



初期のブランチの状態を見てみる。

$ git branch

* master

"master" とある。これがデフォルトのブランチ。最初にコミットすると作成される。

"origin/master" と表現された場合は、リモートリポジトリ(origin)の "master" ブランチを示している。


ちなみに、デフォルトで "master"ブランチは存在するが、必ずしもブランチ名称を"master"とする必要はない。
例えば、project1開発で git を運用したとして、"master"の名称を変えて見る。

$ git branch -m master project1

$ git branch
* project1

"master" ではなく、"project1" ブランチになった。これで運用しても良い。






新しいブランチをつくる


ひとつのブランチから、枝分かれさせ、新しいブランチを作る。
これを「ブランチを切る」ともいう。

新しいブランチ "new_branch" という名称で作ってみる。

$ git branch new_branch

$ git branch
* master
new_branch

新しく "new_branch" が存在した。
"*"(アスタリスク) がついているブランチが現在の作業ツリーの状態を示している。
上記では "master" ブランチで作業している状態だとわかる。


ここでファイルを変更してcommitすると、"master"ブランチの履歴に追加される。
一方の"new_branch"は影響しない。



"new_branch"で作業を行うためには、作業ツリーを切り替える。
この操作を チェックアウトと言う。

$ git checkout new_branch

Switched to branch 'new_branch'


$ git branch
master
* new_branch


ここでファイルを変更してcommitすると、今度は、"new_branch"ブランチの履歴に追加され、一方の"master"は影響しない。
git_branch03.png



"$ git branch" で示される、"*"(アスタリスク)は、現在チェックアウトされているブランチとも言える。



ここでブランチのイメージを修正しておこう。
「ブランチ」という名称なので、木の幹・枝のイメージで記述したのだが、コミットというのは、直近のコミット(親コミット)へのポインタが格納され、それをつなげていくことで変更履歴が構築される。下図のように矢印は直近のコミットを指す向きほうが正しく表現している。そして「ブランチ」は最新のコミットを指すポインタのことなので、「ブランチ」というのはコミット位置に当てるのが良いだろう。
git_branch04.png
図で書くとこうなるのだが、変更履歴の表現として心情的に「古い」→「新しい」へと向かわせたいので、以降も矢印の向きは古いコミットから新しいコミットへつなげていくことにする。




それから「ブランチを切る」というのは、最新のコミットを指すポインタを新しく作ることなので、ブランチを切った直後はこのようになる。
git_branch05.png
その後、コミットするとブランチ(ポインタ)が最新コミットを指すように自動的に更新される。
git_branch06.png


話を少し戻して、チェックアウトの状態の管理はどうなっているのか?
これは "HEAD" というポインタで示される。
"master" ブランチをチェックアウトしたのであれば、"HEAD" は、"master" を指すポインタになっている。
git_branch07.png






ブランチのマージ


ブランチを切る理由はいろいろある。
機能を追加する際に、機能がきちんと動作するまで分離するとか、不具合修正が完了するまで分離するとか。
こういう理由でブランチを切って分岐させたのであれば、それは一時的な分岐であり、いつかは本流に戻してあげないと本来の目的に達しない。
git のブランチ管理には、ブランチを切った先での変更を共有することができる。
この操作には、"merge" コマンドを使う。この操作は変更を共有する側で作業をする。

ただし、ブランチした後、分岐元にcommitがあるか・ないかでマージ動きが変わる。

分岐元で変更がなかった場合


git_branch08.png
"new_branch" ブランチを "master" ブランチにマージする。
この場合、単純に "master"ブランチ(= ポインタ)を挿げ替えるだけ。
"master" ブランチをチェックアウトし実行する。

$ git merge new_branch

Updating 76eb1f6..693e085
Fast-forward
index.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

"master" ブランチは、"new_branch" ブランチと同じコミットを示すようになった。
git_branch09.png
これを "fast-forward" マージという。



分岐元で変更があった場合


git_branch10.png
"new_branch" ブランチを "master" ブランチにマージする。コマンドは "fast-forward" マージと同じ。
"master" ブランチをチェックアウトし実行する。

$ git merge new_branch


コミットログをグラフ表示にして確認する。
$ git log --graph
* commit 674649a321b87801de0afea9389a162a66cac60d
|\ Merge: d7af236 5230eda
| | Author: hoge hogehoge
| | Date: San Jun 25 20:00:00 2017 +0900
| |
| | Merge branch 'new_branch'
| |
| | Merge new_branch -> master
| |
| * commit 5230eda9e7070b084e250852ec1f29bcc65e0870
| | Author: hoge hogehoge
| | Date: San Jun 25 19:00:00 2017 +0900
| |
| | new_branch 追加2
| |
| * commit 71950fae9396a54bbf255b8466f3f15e93e76051
| | Author: hoge hogehoge
| | Date: San Jun 25 18:00:00 2017 +0900
| |
| | new_branch 追加1
| |
* | commit d7af236ea4c844862eaafb38fbd99e951a34dda3
| | Author: hoge hogehoge
| | Date: San Jun 25 18:30:00 2017 +0900
| |
| | master branch 追加2
| |
* | commit 8673bdfb53790b7dc42a8a9ecf24491641c868f9
|/ Author: hoge hogehoge
| Date: San Jun 25 11:00:00 2017 +0900
|
| master branch 追加1
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| master branch.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.

ログを見ると、両方の変更履歴を取り込んだマージコミットが作成されている。
"master" ブランチは、このマージコミットを指している。
fast-forward マージでは、このマージが行われないためログ上にマージコミットが出てこない。
git_branch11.png


マージ操作については、こちらでより詳しく説明する。



まとめ


ブランチの統合についてはもっといろいろあり奥が深い。
今回は「ブランチとは」という点で触れたかったので、表面をさらっと流した。
何気なく使っていたので、以外にわかってなかった点もあったが、自分なりにもやもやしたところが晴れて、納得できた。


gitをインストール
gitサーバーのセットアップ
git 変更を一時的に退避 stash
git ブランチを合流するマージ
git ブランチを付け替える
git コミット履歴を変更する
git コミットを取り消す
git 変更をリセットする
git リモートでの操作
git リリース準備
git リモートブランチを追加
git チェックアウトをもっと便利に使う
git プロジェクトの構成
git 変更をpatchファイルにする
git コンフリクトに対処する
git 失敗したときの復元
posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする

2017年06月26日

Ubuntu メモリキャッシュクリア

現在のメモリの使用状況を確認してみる。

$ free -h

             total       used       free     shared    buffers     cached
Mem: 3.5G 756M 2.7G 1.1M 44M 479M
-/+ buffers/cache: 232M 3.3G
Swap: 3.6G 0B 3.6G




Linuxのメモリ使用についてよくわかっていなかったので調べてみた。

Linuxのページキャッシュについて


まずキャッシュとは、データへのアクセスを速くするために、より高速な記憶装置に一時的に保存する仕組み。
で、ページキャッシュとは、
  • CPUはストレージから直接読むことはできない
  • そのため、ストレージのデータを一旦メモリにロードしてから読み込む
  • Linuxは一度ストレージから読みだしたデータは可能な限りメモリにキャッシュし、次回以降の読み込みが高速に行われる
  • Linuxは、メモリ領域をページという単位(ページの大きさははCPUの種類で異なる)で管理する
  • メモリ上に読みだしたデータのキャッシュのことを「ページキャッシュ」と呼ぶ


(補足)
freeコマンドで見ると、cached で示されるページキャッシュと buffers で示されるバッファキャッシュが存在する。 ページキャッシュはファイルシステムに対するキャッシュであり、ファイル単位でアクセスするときに使用されるキャッシュ。 もうひとつのバッファキャッシュは、ブロックデバイスを直接アクセスするときに使用されるキャッシュになる。



ページキャッシュの簡単な流れとしては、
  1. データにアクセスする処理が発生
  2. それはページキャッシュ上に無い
    (キャッシュ上にデータがあれば、ストレージにアクセスせずキャッシュのデータを使う)
  3. メモリに空き領域がある
    (メモリ上に空きが無ければ、ストレージから読み出したデータをキャッシュするため、古いキャッシュを捨て、新しいキャッシュを構築する)
  4. ストレージから読み出し、新しいキャッシュを構築する



つまり、データにアクセスするということは、ページキャッシュを構築することになる。
Linuxは空いているメモリをページキャッシュに使おうとするので、時間とともにページキャッシュは増加していく。そして、ページキャッシュは新たなストレージへのアクセスがあっても、メモリが必要にならない限り解放しない。




利用可能なメモリ量


おおよその利用可能なメモリの量は、freeコマンドで表示される1行目(Mem: )のfreeの値ではなく、2行目(-/+ buffers/cache:)のfreeの値を確認する。
2行目のfreeは、1行目のfreeにbuffersとcachedを加えた値。

これは、上述の通り、バッファ(buffers)とキャッシュ(cached)が使用している値も結果的には空きメモリとして使用できるため。
1行目のfreeだけ見て、少ないと思うようなことがあっても、2行目を確認してみると問題ないことが多い。
ページキャッシュは必要が無ければメモリ解放しないが、一方で、ページキャッシュは使って無ければ、すぐに破棄することは可能。つまり破棄できない領域と破棄できる領域がある。
freeコマンドの2行目のfreeには、この破棄できない領域のキャッシュも含まれている。


破棄可能なキャッシュを確認してみる。vmstatコマンドを使う。

$ vmstat -a

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
0 0 0 3091364 101108 373116 0 0 86 101 83 150 3 0 95 2 0


"-a" オプションで、メモリキャッシュの アクティブ "active" (利用中のため開放できない領域)と、非アクティブ "inact" (最後に利用されてから一定時間が経過しているので廃棄できる領域)の内訳を確認できる。


利用可能なメモリ量を算出するなら、freeコマンドで確認したMem行のfreeと、vmstat -aコマンドで確認したinactが実際に利用可能なメモリ量になる。



メモリキャッシュのクリア


これまでの内容で、キャッシュは空きメモリの一部と見れるので、これらが増加したからといってメモリを圧迫している訳ではないので、無理やり解放させる必要は無い。キャッシュはアクセス高速化のためなので、むしろ有益です。
ただ、パフォーマンス測定の場合は素の状態で正しく計測したいので、クリアしたほうが良い。

キャッシュの解放をコマンドからできる(Linuxカーネル 2.6.16以降)。

$ echo 3 > sudo /proc/sys/vm/drop_caches

または

$ sudo sysctl -w vm.drop_caches=3



数字は解放したいメモリを示す。
1: ページキャッシュ解放
2: dentry、inode 解放
3: ページキャッシュ、dentry、inode 解放

ページキャッシュがまだストレージへ同期されていない分を Dirty cache という。
この操作では、Dirty cahce は解放の対象外となる。

解放する前に、syncコマンド使って、Dirty cache を書き出してから、
解放を行うことで、より効果的な開放が行える。

$ sync
$ echo 3 > sudo /proc/sys/vm/drop_caches


posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする

2017年06月24日

Ubuntu インストールしたらやること:Rubyをインストール

プログラム言語Rubyをインストールする。
Ubuntu標準で提供されているのは安定版のため、最新版を入れれるように、PPAリポジトリを追加してインストールする。Rubyにはバージョンごとの違いがあるので、切り替えて使えるように、"ruby-switch" を利用をする。


インストール


端末で実行する。
PPAリポジトリを追加。

$ sudo add-apt-repository ppa:brightbox/ruby-ng

$ sudo apt-get update


まず、"ruby-switch" をインストール

$ sudo apt-get install ruby-switch



後は、インストールしたいバージョンのRubyを指定。

$ sudo apt-get install ruby2.3

$ sudo apt-get install ruby2.4







インストールされているRubyの一覧


$ ruby-switch --list

ruby2.3
ruby2.4


現在、設定されているRubyを確認。

$ ruby -v

ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]






Rubyのバージョン切替


$ sudo ruby-switch --set ruby2.4

$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux-gnu]
posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする