ほんじゃらねっと

ダイエット中プログラマのブログ

エディタ浮気性の自分のための、Vimから他のエディタに乗り換えたくなった時にチェックするポイント

f:id:piro_suke:20160825232500j:plain

ライトな言語で開発する時とか、文章を書く時は

テキストエディタとしてVim(KaoriYaさんのWindows版Vim)を長く使用している。

www.kaoriya.net

根が浮気症なので

Spacemacs+EmacsとかSublimeTextとかAtomとかLightTableとか

話題になったエディタには

「これこそ俺が求めていたもの!」

と手を出して使ってみるのだけど、半年後には

「やっぱりVimだな」

ということでVimに戻ってしまう。

そんな感じで新しいエディタを使うのは楽しいのだけど、

使い方を学ぶのに結構時間を使うので、

時間を無駄にしないように、

この条件を満たさないエディタには手を出さない!(どうせVimに戻ってくるから!)

というルールを決めてみる。

続きを読む

新しいパソコンへの移行ついでに仕事用に使ってるアプリ一覧をまとめてみた

会社のノートパソコンの調子が悪くなってきたので、新しいパソコンに移行中です。 環境はWindows7。 色々とアプリをインストールしなおしたりデータを移行したり必要があるので、 整理ついでに開発関連ツール等自分が使っているアプリと最新版入手場所を まとめて記事にしてしまいます。 Microsoft Office等の有償ソフトや自社オリジナルソフトは除いてます。

それにしても移行は面倒ですね。仮想環境を使った方が良いのかな。 Hyper-V環境を作れば移行しやすくなるのだろうか。 物理マシンを仮想環境( Hyper-V )へ移行させる – 準備編

ブラウザ

メインで使用しているのはGoogle Chromeですが、Webアプリの動作検証用に Firefoxも入れてます。

Google ChromeFirefox

解凍ツール

まずは色々ダウンロードしてくる前に解凍ツール。 私はLhazを使って特に不便を感じてませんが、どのアプリがスタンダードなんでしょうね。

Lhaz

テキストエディタ

SublimeTextAtomも入れてみましたが、結局Vimに戻ってます。 今使っているVimがどこで入手したものなのか思い出せないので、ひとまず香り屋版を入れてみます。

Vim - KaoriYa

言語別開発&実行環境

JDK(Java開発環境)を製品開発用、Python(2.7系)とNode.jsを自動化等の自作ツール実行用にインストールします。 Java開発にEclipseも使いますが、最近JavaのPGをしてないので、必要になったら入れます。

Java SE Development Kit 8PythonNode.js

データベースと操作ツール

MySQLもたまに使いますが、PostgreSQLをメインで使っているので、ひとまずこれだけ入れます。 操作ツールはA5:SQLを最近教えてもらって使い始めました。 MySQL、SQLServer、PostgreSQLどれでも接続して操作できるので重宝してます。

PostgreSQL9.3A5:SQL Mk-2 - フリーの汎用SQL開発ツール/ER図ツール

Webアプリ実行環境

Java製Webアプリ実行用にApacheとTomcatを入れます。

Apache2.4Tomcat7

SSH・SCPファイル転送ツール

PuttyとWinSCPを使ってます。 WinSCPにコンソールを起動する機能がついてるけど、 これを使えば Putty入れなくてもいいのかな?インストール時に試してみます。

WinSCPPutty

ソースコード管理ツール

SubversionとMercurialを使っているので、それらに対応したTortoise系アプリを入れます。 TortoiseHgのUIが使いやすいので、できればTortoiseSVNも同じように使えるようにしてほしいです。

TortoiseSVNTortoiseHg

ソースコード比較ツール

WinMergeはレガシーなWebアプリを更新する時の恐怖を和らげてくれます。

WinMerge

画像サイズ一括変換ツール

たまに使います。リサイズ超簡単Proは使い方が簡単で良いです。

リサイズ超簡単!

PDF変換ツール

文書や何やらをPDFに変換したり、PDF文書を統合したりページ移動したりするのに CubePDFシリーズを使ってます。

無料PDF作成・変換フリーソフト CubePDF - CubeSoft無料PDF編集フリーソフト CubePDF Utility - CubeSoft

スケジュール共有ツール

チーム内でのスケジュール共有にGroup Watcherを使ってます。 個人的にはGoogle Calendarを使っているので、Group WatcherからSchedule Watcherを 経由してグーグルカレンダーと同期するツールを経由して連携しています。

Group WatcherSchedule Watcherグーグルカレンダーと同期

Evernote

ノートはEvernoteで管理してます。たまに調子悪くなりますけど、 iPhone、仕事PC、自宅Macで同期できるのはありがたいです。

Evernote

以上がインストール予定のツールです。 書きながら、多すぎてげんなりしてきました。

[改訂新版] Microsoft Windows Server 2012 R2 Hyper-V仮想化技術活用ガイド (Software Design Plus)

[改訂新版] Microsoft Windows Server 2012 R2 Hyper-V仮想化技術活用ガイド (Software Design Plus)

Riv.vimプラグインでバックスペースの挙動を調整

Riv.vimの標準の挙動だと、行頭でバックスペースを押すとdeleteと同じ挙動になる。
どうやら、RivSuperBackSpaceコマンドがそういう動きにさせているようだ。
行頭でも通常のバックスペースとして動くようにならないか調査した。


以下のファイルの412行目付近でRivSuperBackSpaceのキー設定をから空に
変更したら挙動を変更できるみたい。

riv.vim/autoload/riv/cmd.vim

変更前

\'type': 'ins', 'mode': 'i', 'maps': ['mq'], 'keys':['<BS>'],

変更後

\'type': 'ins', 'mode': 'i', 'maps': ['mq'], 'keys':[],

Riv.vimプラグインで全角文字を含むリンクも自動リンクされるようにする

VimでreStructuredTextを使えるように、riv.vimを導入した。
https://github.com/Rykka/riv.vim

:RivTitle0

みたいなコマンドでタイトルフォーマットを適用したりできて便利。


ファイルのパスやURLを書くと自動リンクされるので、
ファイル同士の関連付けに使っているのだけど、標準だと全角文字を
含むファイルパスはリンクされない。

日本語ファイル名間でリンクしたかったので、
ソースを変更して対応できないか調べてみた。

ソースを見たところ、riv/ptn.vimの369行目あたりにリンク用の
正規表現が定義されているので、ここを変更したら全角対応できそう。

let file_name = '[[:alnum:]~./][[:alnum:]~:./\\_-]*[[:alnum:]/\\]'

これを

let file_name = '[[:alnum:]~./]\S*[[:alnum:]/\\]'

こう変更したらいけるみたい。

vim設定最新版

他の環境で使えるように最新版の設定をアップしておく。
たいした内容じゃないですよ。


_vimrc

set number
set fenc=utf-8
set fencs=utf-8,iso-2022-jp,euc-jp,cp932
set enc=utf-8
set backupdir=~/tmp/vim
set directory=~/tmp/vim
set nowrap
set tabstop=4
set shiftwidth=4
set magic
set hlsearch      " Switch on search pattern highlighting.
set incsearch
set smartcase
set backspace=2 " Goto previous line when deleted at start of line
set expandtab " Use spaces for tabs
set autoindent
set smartindent
" set cindent
set smarttab
set browsedir=buffer
set whichwrap=b,s,h,l,<,>,[,]
set nocompatible
set laststatus=2
set statusline=%<[%n]%m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).':'.&ff.']['.&ft.']'}\ %F%=%l,%c%V%8P " Show charset and mode on status line
set foldmethod=marker
sy on
filetype plugin indent on
" Most Recent Used plugin settings
let MRU_File='~/_vim_mru_files'
let MRU_Max_Entries=20
let MRU_Window_Height=15
let MRU_Use_Current_Window=1
" Perl settings
let perl_no_extended_vars=1
" Relate unnamed yank and clipboard
set clipboard=unnamed
" auto commands """"""""""""""""""""""""""""""""""""
" Change color when insert mode
augroup InsertHook
autocmd!
autocmd InsertEnter * highlight StatusLine guifg=#ccdc90 guibg=#2E4340
autocmd InsertLeave * highlight StatusLine guifg=#2E4340 guibg=#ccdc90
augroup END
" Python
autocmd FileType python set tabstop=4 shiftwidth=4
autocmd BufEnter *.py setlocal indentkeys+=0#
" HTML
autocmd FileType htmldjango set tabstop=2 shiftwidth=2
autocmd FileType xhtml set tabstop=2 shiftwidth=2
" Javascript
autocmd FileType javascript set tabstop=4 shiftwidth=4


_gvimrc

if has("win32")
set guifont=M+1VM+IPAG_circle:h9
else
set guifont=DejaVu\ Sans\ Mono\ 10
set guifontwide=VL\ ゴシック\ 10
endif
set columns=100
set lines=40
" au GUIEnter * simalt ~x
winpos 0 0
set guioptions+=b
set guioptions-=T
set mousehide     " Hide the mouse when typing text
" colorscheme desert256
colorscheme xoria256
" colorscheme eclipse
" colorscheme chela_light
" colorscheme blackdust
" colorscheme asu1dark
" colorscheme oceandark
" colorscheme sea
" colorscheme ps_color
" colorscheme desert
" colorscheme evening
" colorscheme murphy
" colorscheme darkblue2
" colorscheme mellow

Pythonで1行メモVimスクリプト

先日に引き続きPythonVimに挑戦。
コマンドラインで書き込んだメモをファイルに蓄積していくVimプラグインを書いてみた。
画面に表示している内容とまったく関係ないふとした思いつきを書き込む。


:PyMemoAdd メモ

のような感じで使う。


pymemo.vim

if has('win32')
let s:vim_encoding = "shift_jis"
else
let s:vim_encoding = "utf-8"
endif
if !exists("g:pymemo_filepath")
let g:pymemo_filepath = $HOME . "\\pymemo.txt"
endif
if !exists("g:pymemo_loaded_python_file")
pyfile <sfile>:p:h/pymemo.py
python memo = PyMemo()
let g:pymemo_loaded_python_file=1
endif
command! -nargs=1 PyMemoAdd python memo.add_memo(<q-args>)


pymemo.py

# vim:set fileencoding=utf-8:
# メモ用Vimスクリプト
# 
# 指定されたファイルにどんどんメモを追加する
import vim
import sys
import codecs
import os
import re
import datetime
LINE_HEADER = "*"
UNI_FILE_HEADER = """vim:set filetype=rest:
= PyMemo
====================
"""
DATE_TEMPLATE = "[%Y-%m-%d %H:%M]"
class PyMemo():
def __init__(self):
self.vim_encoding = vim.eval("s:vim_encoding")
self._memo_path = None
def add_memo(self, text):
self._append_to_file(text)
print u"メモを追記しました".encode(self.vim_encoding)
def _enc_command(self, command):
vim.command(command.encode(self.vim_encoding))
def _enc_eval(self, command):
return vim.eval(command.encode(self.vim_encoding))
def _append_to_file(self, line):
day = datetime.datetime.now().strftime(DATE_TEMPLATE)
if not os.path.exists(self._get_memo_path()):
f = open(self._get_memo_path(), "w")
f.write(UNI_FILE_HEADER)
f.write("%s\n\n" % (day,))
else:
f = open(self._get_memo_path(), "a+")
f.write("%s %s %s\n" % (LINE_HEADER, line, day))
f.close()
def _get_memo_path(self):
if self._memo_path == None:
self._memo_path = vim.eval("g:pymemo_filepath")
return self._memo_path

PythonでVim用のファイルブックマークプラグインを作る

初めてのVimスクリプトPythonで書いたが、
ほとんどVimの機能を呼び出しているだけになってしまった...
しかし楽しい。


環境は gVim7 + WinXP + Python2.5 + BeautifulSoup。


:PyBookmarkAdd でカレントバッファのファイルをブックマーク。
:PyBookmarkList でブックマークの一覧表示。Enterでファイルを開く。


以下の2ファイルをpluginsフォルダに配置する。


pybookmarks.vim

if has('win32')
let s:vim_encoding = "shift_jis"
else
let s:vim_encoding = "utf-8"
endif
if !exists('g:pybookmarks_file')
let g:pybookmarks_file = $HOME . "\\pybookmarks.xml"
endif
if !exists("g:pybookmarks_loaded_python_file")
pyfile <sfile>:p:h/pybookmarks.py
python pybookmarks = PyBookmarks()
let g:pybookmarks_loaded_python_file=1
endif
command! PyBookmarkList python pybookmarks.list_bookmark()
command! PyBookmarkAdd python pybookmarks.add_bookmark()
function! s:OpenSearchLine()
python pybookmarks.open_search_line()
endfunction


pybookmarks.py

# vim:set fileencoding=utf-8:
# ファイルブックマーク Vimスクリプト
# 
# XML形式のファイルにブックマークを保存
# BeautifulSoupを使って解析、編集
import vim
import sys
import codecs
import os
import re
import datetime
from BeautifulSoup import *
class PyBookmarks():
def __init__(self):
self.vim_encoding = vim.eval("s:vim_encoding")
self._xml_file = None
self._soup = None
def list_bookmark(self):
bname = "__PYBOOKMARKS__"
winnum = vim.eval('bufwinnr("%s")' % (bname,))
if vim.eval("winnr()") != winnum:
if winnum != "-1":
vim.command("exe %swincmd w" % (winnum,))
self._open_window(bname)
vim.command("setlocal bt=nofile bh=delete noswf")
# Enter時にOpenSearchLineコマンドを呼び出す
vim.command("nnoremap <silent> <buffer> <CR> :call <SID>OpenSearchLine()<CR>")
b = vim.current.buffer
vim.command("redraw!")
vim.command("setlocal modifiable")
line_format = "%s | %s | %s"
# バッファにXMLファイルの内容を一覧表示
idx = 1
soup = self._get_soup()
for bookmark in soup('bookmark'):
bookmark_href = re.escape(bookmark['href'])
self._enc_command('let b:file{%d} = "%s"' % (idx, bookmark_href))
line = line_format % (bookmark['title'], bookmark_href, bookmark['create_date'])
if vim.eval('line("$")') != "1" or vim.eval('getline("1")') != '':
self._enc_command('call append("$", "%s")' % (line,))
else:
self._enc_command('call setline("1", "%s")' % (line,))
idx = idx + 1
vim.command("setlocal nomodifiable")
vim.command("redraw!")
def add_bookmark(self):
path = vim.current.buffer.name
if path is not None:
path = path.decode(self.vim_encoding)
input = 'input("%s", "%s")' % (u'タイトル:', os.path.basename(path))
title = self._enc_eval(input)
if title is not None:
soup = self._get_soup()
title = title.decode(self.vim_encoding)
if title == "":
title = u"無名ブックマーク"
bookmark = Tag(soup, "bookmark")
bookmark['title'] = title
#bookmark.append(title)
bookmark['href'] = path
bookmark['create_date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
soup.bookmarks.append(bookmark)
self._overwrite_xml(soup.prettify())
print u"ブックマークを追加しました".encode(self.vim_encoding)
else:
print u"ファイルまたはディレクトリが開かれていません".encode(self.vim_encoding)
def open_search_line(self):
line_num = vim.eval('line(".")')
bookmark_href = vim.eval('b:file{%s}' % (line_num,))
bookmark_href = re.escape(bookmark_href)
self._eliminate_window(vim.eval('bufname("%")'))
self._open_window(bookmark_href)
def _get_xml_path(self):
if self._xml_file == None:
self._xml_file = vim.eval("g:pybookmarks_file")
return self._xml_file
def _get_soup(self):
if self._soup == None:
xml_file = self._get_xml_path()
if os.path.exists(xml_file):
f = open(xml_file)
bxml = f.read()
f.close()
self._soup = BeautifulStoneSoup(bxml, fromEncoding="UTF-8", selfClosingTags='bookmark')
else:
self._soup = BeautifulStoneSoup('<?xml version="1.0" encoding="UTF-8"?>\n<bookmarks></bookmarks>', selfClosingTags='bookmark')
return self._soup
def _overwrite_xml(self, contents):
xml_file = self._get_xml_path()
f = open(xml_file, "w")
f.write(contents)
f.close()
def _enc_command(self, command):
vim.command(command.encode(self.vim_encoding))
def _enc_eval(self, command):
return vim.eval(command.encode(self.vim_encoding))
def _open_window(self, filepath):
self._eliminate_window(filepath)
cmd = "new"
if vim.eval('expand("%:p") == "" && &modified == 0 && !has("vim_starting")') == "1":
cmd = "edit"
#vim.command('silent exe "%s ++enc=%s ++ff=&ff %s"' % (cmd, "utf-8", filepath))
self._enc_command('silent exe "%s %s"' % (cmd, filepath))
def _eliminate_window(self, name):
"""指定したバッファ名のウィンドウをすべて閉じる"""
nr = vim.eval('bufwinnr("%s")' % (name,))
while nr != "-1":
vim.command('%swincmd w' % (nr,))
if self._safe_close() == 0:
break
nr = vim.eval('bufwinnr("%s")' % (name,))
def _safe_close(self):
retval = 0
if vim.eval('&modified') != "-1":
vim.command('silent! enew')
if self._get_win_num() > 1:
vim.command("close")
retval = 1
return retval
def _get_win_num(self):
winnum = 1
nr = vim.eval('winnr()')
vim.command('silent! exe "wincmd \\<C-w>"')
while nr != vim.eval('winnr()'):
winnum = winnum + 1
vim.command('silent! exe "wincmd \\<C-w>"')
return winnum


下記のサイトのVimスクリプトを参考にさせていただきました。
http://sworddancer.funkyboy.jp/howm_vim/
http://www.vim.org/scripts/script.php?script_id=165

PythonでVim拡張


同じモノを作り続けると飽きるので、気分転換にVimscriptを書き始めた。
自分のエディタが拡張できるのはかなり楽しい。
ひとまず登録、変更、削除、一覧表示ができるようにファイルブックマークプラグインでも作る。


ん、これはVimscriptを書いているのではなく、PythonVimプラグインを書いている、ということか。



Web+DBプレスにEmacs特集が載っててまた浮気心でクラクラしたけど、EmacsにあってVimにない機能は自分で作ってみても良いのではないかと思い直した。
PythonにはEmacsよりもVimではないかという気もすることだし。