Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all 5729 articles
Browse latest View live

WSL+tmux+vimでクリップボードを(ある程度)共有する

$
0
0

はじめに

VimとTmuxをターミナルとシステムクリップボードと連携させようとしたとき、
Macユーザー向けの情報は結構出てくるが、WSL向けの情報があまりなかったので。
あとVimのビルドでハマったので。
こちらの動画は分かりやすいので、先にご覧いただくとよいかもしれません。

環境

  • ローカル環境

    • Windows 10
    • WSL(Ubuntu 18.04)
    • tmux 2.6
  • リモート環境

    • GCE(CentOS 7.6.1810)
  • 共通

    • Vim

概要

WSL, tmux, vimを使う際にシステムクリップボードを共有するため、以下のような作業を行いました。

  • vim
    • featureのうちclipboardを有効にするため、GUIサポート有でソースからビルド
  • tmux
    • tpmとtmux-yankの導入
  • VcXsrv
    • 新規インストールと.zshrcへの設定追加
  • リモート環境とのシステムクリップボード共有
    • sshの設定変更で可能。ただし、自分のマシンとネットワークが貧弱でリモート接続が我慢できないほど遅くなることがわかったので設定を戻した

vim

まず、使用中のvimのバージョンを確認(vim --version)して、

  1. vimの種類(tiny, normal, hugeなど)がHuge version without GUI
  2. clipboard機能が無効(-clipboard)

などとなっている場合、システムクリップボードがうまく働きません。
vimをソースからビルドする際に、オプションの設定で機能のON/OFFが設定できるようなので、ソースからビルドすることで対応しました。
以下の画像は、チェックする箇所です(ビルド後にキャプチャしているので値は修正後のものです)

qiita2 - コピー.JPG

ソースからビルドする前に、依存するリポジトリのインストールをします。
試行錯誤しながら行った際のコマンドなどで、不要なものも含まれているかもしれません。
また、ローカル環境はUbuntu、リモート環境はCentOsなので微妙にコマンドが違います。

#centos:sudo yum install python-devel python36-devel
sudo yum install gtk2 gtk2-devel
sudo yum install xorg-x11-server-devel
sudo yum install ruby ruby-devel
sudo yum-builddep vim-X11
sudo yum -y groupinstall "X Window System"#ubuntu:sudo apt build-dep vim
sudo su -c"grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list"sudo apt update
sudo apt build-dep vim
sudo apt-get install python-dev python3-dev
sudo apt-get install xorg-dev libgtk2.0-dev

メイク

sudo./configure--with-features=huge \--enable-multibyte\--enable-gpm\--enable-cscope\--enable-fontset\--enable-fail-if-missing\--enable-pythoninterp=dynamic \--enable-python3interp=dynamic \--enable-rubyinterp=dynamic \--enable-gui=auto \--enable-gtk2-check\--with-x

ハマったポイントとしては、

centosで上記コマンドを実行する際に、--with-xオプションがどうしても通らない
→X11用のパッケージを片っ端からインストールするも通らない
→よくよくエラーメッセージを見ると、--with-xオプションの依存関係を判定する部分に(cache)の文字がある
→configure実行時に設定によってはキャッシュをすることができるようになっている
→vim/src/auto以下のconfig.cacheを削除し、configure再実行で通った

その後、makeとmake installをします。

sudo make
sudo make install

インストール後、.vimrcなど設定は特にいじる必要はありませんでした。

tmux

以下の記事を参考に、tpmとtmux-yankを入れました。(ついでにtmux-resurrectも)

【tmux】tpmでplugin管理して快適ターミナル生活

設定は以下を追加しました。

.tmux.conf
# List of plugins
set -g @plugin'tmux-plugins/tpm'set -g @plugin'tmux-plugins/tmux-sensible'set -g @plugin'tmux-plugins/tmux-yank'set -g @plugin'tmux-plugins/tmux-resurrect'# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run -b'~/.tmux/plugins/tpm/tpm'

VcXsrv

実はこちらはもともとインストールしてあったので、設定の確認だけ行いました。
インストールから行う方は、以下の記事が参考になるかと思います。

WSL上のvimでクリップボードを共有する方法

.zshrcに以下の文言も追加しました。(bashなどを使っている方も同様です)

# VcXsrv setting
export DISPLAY=localhost:0.0

リモート環境とのやりとり

こちらによれば、sshのconfigに

    ForwardX11 yes
    ForwardX11Trusted yes

と追加し、リモート環境にxselインストールやaliasの設定などをするとありますが、自分の環境ではxselなどは不要でした。
ただ、上記ForwardX11の設定をするとssh接続時の動作が遅くなってしまい(特にvimをリモート環境で開くときに顕著)逆にストレスになったので、適用はしませんでした。
環境要因だと思いますので、試していただいてもよいと思います。

おわりに

半日ほど作業にかかってしまったのですが、ふとした時にコピペできないストレスがなくなったので長い目で見ればよい結果をもたらすだろうと思います。
あとはmakeをちゃんと理解しないとなあと痛感しました。。。

その他の参考情報

Vim の種類 (Vim family)
vimでclipboardを+にしたいけどならない人向け
[vim] config.cacheが悪さをした
How to build vim from sources with GUI support?
Redhat系Linux(CentOS7)にVim8をインストールする方法いろいろ


vimrcの設定について

$
0
0

個人的なvimの設定メモ。
訳あってプラグインは入れていません。
内容は初心者向けです。

バージョン

環境バージョン
Vim7.4
CentOS7.2

.vimrcを作成

まずはホームディレクトリに.vimrcを作成します。
この.vimrcは、
vimをデフォルトから使いやすいように設定することができるファイルのことです。

$ vim ~/.vimrc

普段は隠れているので、ll -laとかで表示します。

$ ll -la

中身の設定もろもろ

.vimrc
syntax enable                                                                                                   
set fenc=utf-8"-----カーソル・移動関連 -----setnumber " 行番号
set virtualedit=onemore " 行末から1文字先までカーソルを移動可能
set showmatch " 閉じ括弧入力時に対応する開き括弧に移動する
set whichwrap=b,s,h,l,<,>,[,],~ " カーソルの左右移動で行末から次の行頭へ移動する
set cursorline " カーソルラインをハイライトする

"-----検索関連-----set incsearch " インクリメンタルサーチ
set ignorecase " 大文字小文字の区別しない
set smartcase " もし検索パターンに大文字があれば大文字小文字を区別する
set hlsearch " 検索結果のハイライトする

"-----タブ・インデント関連-----set smartindent " スマートインデント 
set tabstop=4 " タブの空白数
set autoindent " 改行時のインデントを継続する
set expandtab " タブの挿入時に空白を入れる
set shiftwidth=4 " smartindentで増減する幅

"-----表示関連 -----set laststatus=2 " ステータスラインを常に表示
set wildmode=list:longest " コマンドのTabで補完する
set ruler " ステータスラインにカーソル位置表示する

設定が完了したら、
:wpで閉じると設定が反映されます。

参考

https://qiita.com/ahiruman5/items/4f3c845500c172a02935

Ubuntu18.04にvim8.1+python+ruby+luaプラグイン環境を構築するぜ

$
0
0

基本は下記の記事と同じです。

centOS7x64にvim8.1+lua+pythonプラグイン環境を構築するぞ

ただ、Ubuntuだと勝手が違う箇所が結構あったので修正版というか補足記事です。Ubuntuだとデフォルトでvim8.0が入っているのでええな~と思っていたら、各種のプラグインは全然入っていなかったので結局自分でコンパイルしなくてはいけませんでしたw

事前準備

vim8.0のアンインストール

sudo apt list --installed | grep vim

上の検索結果でヒットしたvim関連のパッケージを全部削除してください。

必要なパッケージのインストール

  • perl
  • python2.7関連
  • python3.7.3
  • ruby2.6.3
  • lua5.3

perlパッケージのインストール

これが無いと、vimのコンパイルに失敗して涙目になります。

sudo apt install libperl-dev

python2.7関連パッケージの追加インストール

sudo apt install python2.7-dev python2.7-doc

pyenvを使ってpython3.7.3をインストール

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo'export PYENV_ROOT="$HOME/.pyenv"'>> ~/.bashrc
echo'export PATH="$PYENV_ROOT/bin:$PATH"'>> ~/.bashrc
echo'eval "$(pyenv init -)"'>> ~/.bashrc
source ~/.bashrc
pyenv -v
pyenv install--list | grep 3.7
CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.3
pyenv global 3.7.3

rbenvを使ってruby2.6.3をインストール

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo'export PATH="$HOME/.rbenv/bin:$PATH"'>> ~/.bashrc
source ~/.bashrc
rbenv -v
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
sudo ~/.rbenv/plugins/ruby-build/install.sh
rbenv install-l | grep 2.6
rbenv install 2.6.3
rbenv global 2.6.3
echo'eval "$(rbenv init -)"'>> ~/.bashrc
source .bashrc
ruby -v

lua5.3のインストール

sudo apt install lua5.3 liblua5.3-dev

vim8.1のインストール

make installする前に、lua, python2 and python3, rubyが'+'になっているかを確認すること!!

cd /tmp
git clone https://github.com/vim/vim
cd vim
sudo ./configure  --enable-fail-if-missing--with-features=huge  --disable-selinux--enable-luainterp--enable-perlinterp--enable-pythoninterp=dynamic  --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/  --enable-python3interp=dynamic  --with-python3-config-dir=/home/ユーザ名/.pyenv/versions/3.7.3/lib/python3.7/config-3.7m-x86_64-linux-gnu  --enable-rubyinterp=dynamic  --with-ruby-command=/home/ユーザ名/.rbenv/shims/ruby  --enable-cscope--enable-fontset--enable-multibytevi_cv_path_python3=/home/ユーザ名/.pyenv/shims/python3.7
sudo make 

# ↓↓↓make installする前に、lua, python, rubyが'+'になっているかを確認すること↓↓↓
./src/vim --version# ↑↑↑make installする前に、lua, python, rubyが'+'になっているかを確認すること↑↑↑sudo make install

終わり~

失敗した場合

ビルドに失敗したら、以下のコマンドで全てをなかったことにしましょう

sudo rm-rf /usr/bin/vim
sudo rm-rf /usr/local/share/vim
cd /tmp/vim/src
sudo make distclean

#vim でキーワード検索した状態でファイルを開く ( vim -c '/KEYWORD/' example.txt )

Vimのカラースキーム(Alduin)をどうしてもIDEで使いたかったから自作した

$
0
0

はじめに

僕はVimでAlduinというカラースキームを愛用しています。
https://github.com/AlessandroYorba/Alduin

このカラースキームが個人的にドツボ過ぎて、他のエディタやIDEでも、このカラースキームを使いたいくらいです。

ですが、TwilightやMonokaiほどメジャーでないため、当然他のIDEでは採用されず、IDEを使う時は、Alduinを使いたいという気持ちを封じ泣く泣くそれっぽいカラースキームを使ってました。

でも、やっぱり使いたかったのでもう作っちゃうことにしました。
仕事では基本PHPStormを使用しているため、PHPStorm含めJetBrains社のIDEで使うことを目的に制作しました。

どうやって作ったか

PHPStormのカラースキーム設定でDarcuraを複製し、複製したカラースキームの配色をせこせこ変更しまくりました。

Alduinで使用されている色は以下の通り

alduin.vim
"-------------------------------------|-----------------------------------------"   BASIC        HEX                  |      BASIC         HEX                 |"-------------------------------------|-----------------------------------------"   Foreground   #dfdfaf              |      Selection     #af8787             |"   Background   #1c1c1c              |      Selected Text #dfdfaf             |"   Bold         #ffffff              |                                        |"   Links        #af0000              |                                        |"-------------------------------------|-----------------------------------------"-------------------------------------|-----------------------------------------"   CURSOR       HEX                                                           |"-------------------------------------|-----------------------------------------"   Cursor       #dfdfaf              |                                        |"   Cursor Text  #000000              |                                        |"-------------------------------------|-----------------------------------------"-------------------------------------|-----------------------------------------"   NORMAL       HEX          XTERM   |      BRIGHT       HEX          XTERM   |"-------------------------------------|-----------------------------------------"   Black        #1c1c1c      0       |      brBlack      #878787      8       |"   Red          #af5f5f      1       |      brRed        #af5f5f      9       |"   Green        #87875f      2       |      brGreen      #87875f      10      |"   Yellow       #af875f      3       |      brYellow     #af875f      11      |"   Blue         #878787      4       |      brBlue       #878787      12      |"   Magenta      #af8787      5       |      brMagenta    #af8787      13      |"   Cyan         #87afaf      6       |      brCyan       #87afaf      14      |"   White        #dfdfaf      7       |      brWhite      #dfdfaf      15      |"-------------------------------------|-----------------------------------------

これと、vimscriptに記載されているhighlight文を参考にしました。(参照)

結果

本家Alduin
SS 2019-05-16 19.49.52.png

今回作ったカラースキーム
SS 2019-05-16 20.13.30.png

わりと良い感じ!

感想

制作自体はコード書かないで画面操作でできたので半日くらいで終わったのですが、地味な作業すぎてメンタル削れました。

実際に使ってみて思いましたが、やはり自分の好きなカラースキームを使用すると意欲といい効率といい色々な面でプラスに働いている気になるので、見た目大事だなぁと思いました。

ただ、PHPのコードベースで作成したので、PHPのコード編集する時は上手く本家っぽくなるんですが、他の言語でも本家みたくイカしてるかって言ったら…って感じです。

あと、カラースキーム作ってる人の頭の中を見てみたい。よくこんな良い物作れるなぁ。

今回作ったカラースキームを、GitHubにアップしました。
https://github.com/irnak4t/alduin-for-jetbrains

気になって使ってみようかなって思っていただいた方や、同じAlduin好きの方等、是非使ってみてください。

vimで検索する際のコマンド

$
0
0
/[検索文字列]下方向に、[検索文字列]の検索を行う。
?[検索文字列]上方向に、[検索文字列]の検索を行う。
n/や?で検索を行った後に、順方向に次の検索結果にジャンプする。
N/や?で検索を行った後に、逆方向に次の検索結果にジャンプする。
*カーソル位置の単語を下方向に検索する。/[カーソル位置の単語]と同じ動作。
#カーソル位置の単語を上方向に検索する。?[カーソル位置の単語]と同じ動作。

ワンキー括弧閉じスクリプトのその後

$
0
0

随分前にこんなスクリプトを書いていたんですけど…lintを通すとあちこちに変なところも見つかるし、vim弄り倒してる間に色々と覚えたテクニックもあるのでそろそろ書き直してあげてもいいのかな…ということで、ちょっくら弄ってみました。

括弧閉じにスクリプトを使うのは間違っているのか?

closer.vim
scriptencoding utf-8function! Closer() abort
    let bracketList ={}let bracketList['open']=filter(split(&matchpairs,'[:,]'),'v:key % 2 == 0')let bracketList['close']=filter(split(&matchpairs,'[:,]'),'v:key % 2 == 1')let isFound =0let pos = getcurpos()while search('['.escape(substitute(&matchpairs,'[:,]','','g'),'\.*^$]~/').'"'''.']','bW')>0let foundBracket = matchstr(getline('.'),'.',col('.')-1)if foundBracket ==# ''''call searchpair('''','','''','bW')elseif foundBracket ==# '"'call searchpair('[^\\]/zs"','','"','bW')elselet idx =match(bracketList.close, foundBracket)if idx >-1call searchpair(                        \ escape(bracketList.open[idx],'/.*^$]~\'),                        \'',                        \ escape(bracketList.close[idx],'/.*^$]~\'),                        \'bW')elselet isFound =1breakendifendifendwhilecall setpos('.', pos)return isFound ? bracketList.close[match(bracketList.open, foundBracket)]:''endfunctionfunction!s:closeFromNormal(isBang) abort
    let @c= Closer()if @c!=# ''&& a:isBang==# '!'
        execute 'normal "cPl'else
        echo @c!=# '' ? 'Bracket : '.@c:'No bracket to close.'endifendfunction

command!-bang Closer calls:closeFromNormal('<bang>')

inoremap <expr><Plug>(closer_main) Closer()

当スクリプトムラあり!

改めてこのスクリプトの馴れ初めなんですが、「マルチバイトの括弧を変換を介さずに入力する」のが目的で、業界でよく使われるlexima的な補完を目指していないものです。というわけで打ち込んだ括弧を先行して閉じるのではなく、多少不細工でもいいからカーソル位置より前にある括弧を探して、それを補完するようになっています。実際にやっていることは…

  • 認識したい括弧をさかのぼって探す。
  • 見つかった括弧の方向を確認する。
  • 閉じる側の括弧なら対応する括弧に飛んで更にさかのぼる
  • 閉じていなければ元の場所に戻って対応する括弧を挿入する

という…なんで強調する必要があるんですかねえ?

気軽に「対応する括弧に飛んで」…と書いてありますが、残念ながら対応している括弧が実際に対応を意図した括弧かどうかは全く判断していません。具体的にこのスクリプト自身で想定されるケースを試すと正規表現やそのエスケープのために使われる]や、対応する括弧に開閉の方向がない'"などによって正常な動作をしません…が、そもそもの意図がスクリプトの為ではないので、括弧の対応レベルが浅い平文では問題なく対応する括弧が入手出来るので問題ありません。そもそも一番書きたいスクリプトがvimscriptの自分にとっては、ダブルクォートの問題が山のように積み重なっているので…うn

最近Vimに取り込まれた大規模パッチに関する備忘録

$
0
0

最近2カ月ほどの間に、Vimに変更量1000行以上の大規模なパッチ(Windows関連)をいくつか取り込んでもらえたので、備忘のため記録を残しておこうと思います。

Wide版APIの有効化とANSI版APIの削除

  • 8.1.1081: MS-Windows: cannot use some fonts
  • 8.1.1091: MS-Windows: cannot use multi-byte chars in environment var (関連: 8.1.1104)
  • 8.1.1103: MS-Windows: old API calls are no longer needed

今まで、Windows版Vimでは、'encoding'の設定に応じて、ANSI版APIを使用したり、Wide版 (Unicode版) APIを使用したりしていました。しかしANSI版APIはWin9x用のAPIであり、対応OSがWinXP以降になったVim 8.1では本来必要ありませんでした。ただ、Wide版APIを使うには、UTF-8/UTF-16等のエンコーディング変換が必要なことから、ANSI/Wide両方のコードが残ったままとなっており、コードが複雑化していました。

しばらく前の 8.1.0805 ~ 8.1.0811 でマルチバイト機能が常に有効化されるようになりました。これにより、エンコーディング変換機能が常に有効化されたことから、ANSI版APIの完全削除が可能となりました。そこで、ANSI APIの使用を取りやめ、Wide APIに置き換えたのが上記のパッチです。

これにより、現在のコードページでは使用できない文字をフォント名や環境変数に使用することができるようになったり、ソースコードが大幅にシンプルになりました。今後、Windows向けに新たにパッチを書くのも楽になるでしょう。

VIMDLL機能

VIMDLL機能本体と、追加のバグ修正

  • 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
  • 8.1.1239: key with byte sequence containing CSI does not work
  • 8.1.1269: MS-Windows GUI: multibyte chars with a 0x80 byte do not work
  • 8.1.1301: when compiled with VIMDLL some messages are not shown
  • 8.1.1304: MS-Windows: compiler warning for unused value

事前準備のためのパッチ

  • 8.1.1060: MS-Windows: get_cmd_args() is no longer needed
  • 8.1.1102: Win32 exe file contains unused code
  • 8.1.1104: MS-Windows: not all environment variables can be used
  • 8.1.1185: mapping for CTRL-X is inconsistent

VimのDLL化 for Windows」で議論された機能を実現したものです。Unix版Vimは、vimとgvimは全く同一のバイナリとなっており、実行ファイルの名前を変えるだけで、CUI版かGUI版かの動作を変更できるようになっています。一方、Windows版Vimは、ソースコードの大半は同一ではあるもののそれでも多数の #ifdefでコードは分かれており、実行ファイルは完全に別になっていました。これを、共通部分をDLLにまとめることで、合計ファイルサイズを減らそうというものです。

かつては、Borland版に(別の)VIMDLL機能というものが含まれており、スタブのgvim.exeと本体のvim32.dllをビルドできるようになっていました。ただ、CUIとGUIを統一したDLLをビルドするものではなく、VIMDLL機能に特段のメリットはありませんでした。しかも現在ではVIMDLL機能はビルドできなくなってしまっていたため、8.1.1066で一旦廃止されました。

今回は、関連する数百箇所の #ifdefをすべて見直して、CUIとGUIのコードを(スタートアップ部分以外は)完全に統一した上で、Borland版のコードを一部再利用することで、DLL化を再実現しました。また、かつてのVIMDLL機能とは異なり、Visual C++とMinGWの両方に対応しています。こうして以下のメリットが生まれました。

  • gvim.exe と vim.exe の合計ファイルサイズの削減
    DLLを含めても元の約半分。
  • gvim.exe と vim.exe 同時使用時の合計メモリサイズ削減
    同一のDLLを利用するため、メモリが共有されるので。
  • vim -g機能の実現
    -gオプションを指定して vim.exe を起動すると、自動的に gvim.exe に制御を移してGUIを起動する。
  • 合計ビルド時間の半減
    gvim.exe と vim.exe の両方をビルドする必要がないため。

なお、VIMDLL機能はデフォルトでは無効化されています。ビルド時に VIMDLL=yesを指定することで有効化できます。

Borland C++対応の削除

  • 8.1.1306: Borland support is outdated and doesn't work

元々は、別の人が立てたPRだったのですが、放置されてしまっていたため、私が掘り起こしてマージしてもらいました。

現在のWindows版Vimは、Visual C++とMinGWでビルドできるようになっていますが、かつてはBorland C++ 5.5でもできるようになっていました。しかし、Borlandを使う人がいなくなってしまい、いつの間にかビルドできなくなってしまっていました。Borland C++の後継としては、Embarcadero C++も公開されていますが、これに対応させようという人もいませんでした。そのため、Borland向けのコードをすべて削除することになりました。これにより余計な #ifdefが削減され、コードがきれいになりました。


Itermの設定

$
0
0

vimの設定の覚書。

.vimrc

vimの先駆者たちから設定を拝借しました。

以下の記事を参照
https://qiita.com/morikooooo/items/9fd41bcd8d1ce9170301
http://mimaken.hatenablog.com/entry/2016/12/19/105721

~/.vimrc
" setting"文字コードをUFT-8に設定set fenc=utf-8" バックアップファイルを作らないset nobackup
" スワップファイルを作らないsetnoswapfile" 編集中のファイルが変更されたら自動で読み直すset autoread
" バッファが編集中でもその他のファイルを開けるようにset hidden
" 入力中のコマンドをステータスに表示するset showcmd


" 見た目系" 行番号を表示setnumber" 現在の行を強調表示set cursorline
" 現在の行を強調表示(縦)set cursorcolumn
" 行末の1文字先までカーソルを移動できるようにset virtualedit=onemore
" インデントはスマートインデントset smartindent
" ビープ音を可視化set visualbell
" 括弧入力時の対応する括弧を表示set showmatch
" ステータスラインを常に表示set laststatus=2" コマンドラインの補完set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk
" シンタックスハイライトの有効化
syntax enable


" Tab系" 不可視文字を可視化(タブが「▸-」と表示される)set list listchars=tab:\▸\-" Tab文字を半角スペースにするset expandtab
" 行頭以外のTab文字の表示幅(スペースいくつ分)set tabstop=2" 行頭でのTab文字の表示幅set shiftwidth=2" 検索系" 検索文字列が小文字の場合は大文字小文字を区別なく検索するset ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索するset smartcase
" 検索文字列入力時に順次対象文字列にヒットさせるset incsearch
" 検索時に最後まで行ったら最初に戻るset wrapscan
" 検索語をハイライト表示set hlsearch
" ESC連打でハイライト解除
nmap <Esc><Esc>:nohlsearch<CR><Esc>

カラースキーム(Iceberg)の設定

githubからファイルを取得して指定のフォルダへ保存。

$mkdir-p ~/.vim/colors
$ git clone https://github.com/cocopon/iceberg.vim
$mv ~/iceberg.vim/colors/iceberg.vim  ~/.vim/colors

vimの設定ファイルにカラースキームの設定を記述

~/.vimrc
syntax oncolorscheme iceberg

以上で見易いvimライフが送れます。

Ack.vim で最初の検索結果を自動でウインドウに開かないようにする

$
0
0

はじめに

Vim 上で grep 検索をかけるとき、ack.vimを使っているのですが、自動で最初の検索結果がウインドウで開いてしまうのに違和感を感じていました。

その挙動を OFF にする方法を調べたので、この記事に簡単にまとめます。

tl;dr

:Ackの代わりに :Ack!を使うだけで OK でした。

:help Ackの結果を引用します。!をつけることで、最初の検索結果にジャンプする挙動を OFF に出来るようです。

:Ack[!] [options] {pattern} [{directory}]                               *:Ack*

    Search recursively in {directory} (which defaults to the current
    directory) for the {pattern}.  Behaves just like the |:grep| command, but
    will open the |Quickfix| window for you. If [!] is not given the first
    occurrence is jumped to.

より便利にするために

自動で最初の検索結果をウインドウに開く挙動を OFF にする方法はわかったのですが、定常的にこの挙動を OFF にしたいと思っていました。

どうすればいいかを調べたところ、 Ack.vim の READMEに Tips が載っていたので、引用します。

以下を自分の .vimrcに書くと良いとのことでした。

cnoreabbrev Ack Ack!
nnoremap <Leader>a:Ack!<Space>

以下、それぞれのコマンドの意味を調べました。

cnoreabbrev Ack Ack!について

cnoreabbrevは、分解すると以下のような意味になります。

  • c:コマンドラインモード
  • nore: 非再帰的
  • abbrev:短縮入力

つまり、コマンドラインモードで Ackと入力したら、自動で Ack!と補完されるようになります。

nnoremap <Leader>a :Ack!<Space>について

nnoremapは、分解すると以下のような意味になります。

  • n:ノーマルモード
  • noremap:非再帰的

<Leader>a :Ack!<Space>は、<Leader>aと入力すると、:Ack!<Space>という入力に変換します。

終わりに

インストールしているだけのプラグインでも、少し調べることで便利な使いかたを知れたり、vim のコマンドについて知ることができたりして良いなと思ってます。

簡単にではありますが、コツコツ調べていきたいなと思います。

参考 URL

CursorColumn color not working

$
0
0

iterm2 iceberg

set cursorline
highlight CursorLine gui=underline ctermbg=Black
set cursorcolumn
highlight CursorColumn ctermbg=Black

アニメーションで学ぶVim入門 ~精選10機能~

$
0
0

はじめに

本記事では vim の使い方を学ぶために、コマンドとキーだけではなく、GIF画像によるアニメーションを利用し、使い方をイメージしやすいようにしました。使用頻度が高い機能を精選10機能とし、その他の便利機能も整理しました。また今後も、便利な vim の機能があれば、記事に追加する予定です。

本記事の構成

章名内容
第1章精選10機能これだけを学べば vim が使えるようになります
第2章便利機能vim の便利な機能を紹介します
-付録vim の単体機能を整理しました

第1章 精選10機能

① 新規のファイルを作成する

1-1.gif

  1. vim 新規ファイル名」で新規ファイルを開く。
  2. i」でInsert Modeに移る。
  3. 本文を入力する。
  4. Esc」でNomarl Modeに移る。
  5. :wq」でファイルを保存する。
  6. cat 新規ファイル名」でファイルの中身を確認する。

② 既存のファイルを編集する

1-2.gif

  1. vim 既存ファイル名」で既存ファイルを開く。
  2. i」でInsert Modeに移る。
  3. 編集する。
  4. Esc」でNomarl Modeに移る。
  5. :wq」でファイルを保存する。
  6. cat 既存ファイル名」でファイルの中身を確認する。

③ 1行を削除する

1-3.gif

  1. 削除する行にカーソルを移動する。
  2. dd」で削除する。

④ 複数行を削除する

1-4.gif

  1. 削除する先頭行にカーソルを移動する。
  2. 「削除する行数 + dd」で削除する。

⑤ 行単位でヤンク&ペーストする

1-5.gif

  1. ヤンクする行にカーソルを移動する。
  2. yy」でヤンクする。
  3. p」でペーストする。

⑥ 行単位でカット&ペーストする

1-6.gif

  1. カットする行にカーソルを移動する。
  2. dd」でカットする。
  3. p」でペーストする。

⑦ undo / redo

1-7.gif

  1. u」で undo する。
  2. Ctrl-r」で redo する。

⑧ 置換する

1-8.gif

  1. :%s/ + 置換前文字列 + / + 置換後文字列 + /g」で置換する。

⑨ 検索する

1-9.gif

  1. / + 検索文字列」で検索する。
  2. n」で後方検索する。
  3. N」で前方検索する。

⑩ 画面をスクロールする

4-1.gif

  1. Ctrl-f」で下にスクロールする。
  2. Ctrl-b」で上にスクロールする。

第2章 便利な機能

① すべての行頭に接頭語を追加する

2-1.gif

  1. Ctrl-v」で矩形選択する。
  2. G」で最終行まで選択する。
  3. I」で Insert Mode に移る。
  4. 接頭語を入力する。
  5. Esc」で Normal Mode に移る。

② すべての行末に接尾語を追加する

2-2.gif

  1. Ctrl-v」で矩形選択する。
  2. G」で最終行まで選択する。
  3. $」で行末を選択する。
  4. A」で Insert Mode に移る。
  5. 接尾語を入力する。
  6. Esc」で Normal Mode に移る。

③ インデントを増減する

2-3.gif

  1. インデントを増やす行を選択する。
  2. 「増やすインデント数 + >」でインデントを増やす。
  3. インデントを減らす行を選択する。
  4. 「減らすインデント数 + <」でインデントを増やす。

④ 大文字小文字を変換する

2-4.gif

  1. 小文字にしたい箇所を選択する。
  2. u」で小文字に変換する。
  3. 大文字にしたい箇所を選択する。
  4. U」で大文字に変換する。

⑤ 改行を削除する

2-5.gif

  1. 改行を削除したい行を選択する。
  2. J」で改行を削除する。

付録

Mode の切り替え

Normal Mode

4-31.gif

コマンド動作
EscNormal Mode に移る

4-32.gif

コマンド動作
Ctrl-[Normal Mode に移る

Insert Mode

4-33.gif

コマンド動作
iカーソルの位置から Insert Mode に移る

4-34.gif

コマンド動作
aカーソルの直後から Insert Mode に移る

4-35.gif

コマンド動作
I行頭から Insert Mode に移る

4-36.gif

コマンド動作
A行末から Insert Mode に移る

4-37.gif

コマンド動作
sカーソル上の文字を削除してから Insert Mode に移る

4-38.gif

コマンド動作
cwカーソル上から単語末までを削除してから Insert Mode に移る

4-39.gif

コマンド動作
ciwカーソル上の単語を削除してから Insert Mode に移る

4-40.gif

コマンド動作
ci"ダブルクォーテーションの内部を削除して Insert Mode に移る

4-41.gif

コマンド動作
citHTMLタグの内部を削除して Insert Mode に移る

4-42.gif

コマンド動作
Sカーソルがある行を削除してから Insert Mode に移る

4-43.gif

コマンド動作
Cカーソルがある位置から行末までを削除してから Insert Mode に移る

4-44.gif

コマンド動作
oカーソルがある行の下に新たな行を追加して Insert Mode に移る

4-45.gif

コマンド動作
Oカーソルがある行の上に新たな行を追加して Insert Mode に移る

Visual Mode

4-46.gif

コマンド動作
vVisual Mode に移る

4-47.gif

コマンド動作
V行単位の選択をして Visual Mode に移る

4-48.gif

コマンド動作
Ctrl-v矩形選択をして Visual Mode に移る

Command Mode

4-49.gif

コマンド動作
:Command Mode に移る

Normal Mode

画面スクロール

4-1.gif

コマンド動作
Ctrl-f1画面、下にスクロールする
Ctrl-b1画面、上にスクロールする

4-2.gif

コマンド動作
Ctrl-d半画面、下にスクロールする
Ctrl-u半画面、上にスクロールする

4-3.gif

コマンド動作
Ctrl-e1行、下にスクロールする
Ctrl-y1行、上にスクロールする

4-4.gif

コマンド動作
zzカーソルがある行を画面中央になるようにスクロールする

カーソル移動

4-5.gif

コマンド動作
h
j
k
l

4-6.gif

コマンド動作
w単語単位で後方に移動する
b単語単位で前方に移動する

4-7.gif

コマンド動作
0行頭に移動する
^文頭に移動する
$行末に移動する

4-8.gif

コマンド動作
gg先頭行(1行目)に移動する
数字 + gg"数字"行目に移動する
G最終行に移動する

4-9.gif

コマンド動作
Shift-]下方の空行に移動する
Shift-[上方の空行に移動する

4-10.gif

コマンド動作
%対応する括弧に移動する

4-11.gif

コマンド動作
H画面上の一番上の行に移動する
M画面上の真ん中の行に移動する
L画面上の一番上の行に移動する

削除

4-12.gif

コマンド動作
x文字を削除する

4-18.gif

コマンド動作
Dカーソルがある位置から行末まで削除する

4-13.gif

コマンド動作
diwカーソルがある単語を削除する

4-14.gif

コマンド動作
di"ダブルクオートの内部を削除する

4-15.gif

コマンド動作
ditHTMLタグの内部を削除する

4-16.gif

コマンド動作
ddカーソルがある行を削除する

4-17.gif

コマンド動作
数字 + ddカーソルがある位置から下方の"数字"分の行を削除する

ヤンク&ペースト

4-19.gif

コマンド動作
yiwカーソルがある位置の単語をヤンクする

4-20.gif

コマンド動作
yi"ダブルクォーテーションの内部をヤンクする

4-21.gif

コマンド動作
yitHTMLタグの内部をヤンクする

4-22.gif

コマンド動作
yyカーソルがある位置の行をヤンクする

4-23.gif

コマンド動作
数字 + yyカーソルがある位置から下方の"数字"分の行をヤンクする

4-22.gif

コマンド動作
p行は下方に、単語は右方にペーストする

4-24.gif

コマンド動作
P行は上方に、単語は左方にペーストする

4-25.gif

コマンド動作
数字 + p行は下方に、単語は右方に"数字"分の行/単語をペーストする

4-26.gif

コマンド動作
gv直前の選択範囲を再選択する

検索

4-27.gif

コマンド動作
/ + 文字列文字列を上から検索する
nカーソルより下側にある検索候補に移動する
Nカーソルより上側にある検索候補に移動する

4-28.gif

コマンド動作
? + 文字列文字列を下から検索する
nカーソルより下側にある検索候補に移動する
Nカーソルより上側にある検索候補に移動する

4-29.gif

コマンド動作
*カーソル上の単語を下方に検索
#カーソル上の単語を上方に検索

undo / redo

4-30.gif

コマンド動作
uundo
Ctrl-rredo

インクリメント / デクリメント

4-50.gif

コマンド動作
Ctrl-aカーソルの位置にある数字を増やす
Ctrl-xカーソルの位置にある数字を減らす

インデント

4-51.gif

コマンド動作
==インデントを調整する

4-52.gif

コマンド動作
>>インデントを増やす
<<インデントを減らす
数字 + >>現在のカーソルから数字分の下の行のインデントを増やす
数字 + <<現在のカーソルから数字分の下の行のインデントを減らす

4-53.gif

コマンド動作
選択 + 数字 + >選択した行を"数字"分だけインデントを増やす
選択 + 数字 + <選択した行を"数字"分だけインデントを減らす

Insert Mode

インデント

4-54.gif

コマンド動作
ctrl-tインデントを増やす
ctrl-dインデントを減らす

Visual Mode

選択

4-55.gif

コマンド動作
viwカーソル上の単語を選択する

4-56.gif

コマンド動作
vi"ダブルクォーテーションの内部を選択する

4-57.gif

コマンド動作
vitHTMLタグの内部を選択する

全選択

4-71.gif

コマンド動作
gg + V + Gファイル全体を選択する

Replace Mode

上書き

4-58.gif

コマンド動作
r + 文字任意の"文字"を上書きする

4-59.gif

コマンド動作
R + 文字列任意の"文字列"を上書きする

Command Mode

保存 / 終了

4-60.gif

コマンド動作
:wファイルを保存する

4-61.gif

コマンド動作
:w + filename"filename"名でファイルを保存する

4-62.gif

コマンド動作
:q編集を終了する

4-63.gif

コマンド動作
:q!編集を強制終了する

置換

4-64.gif

コマンド動作
:s/before/afterカーソルの行にある最初の"before"を"after"に置換する

4-65.gif

コマンド動作
:s/before/after/gカーソルの行にある"before"をすべて"after"に一括置換する

4-66.gif

コマンド動作
:%s/before/after/gファイルのすべての"before"を"after"に一括置換する

4-67.gif

コマンド動作
:%s/^/prefixファイル全体のすべての行の先頭に"prefix"を追加する

4-68.gif

コマンド動作
:%s/$/suffixファイル全体のすべての行の末尾に"suffix"を追加する

4-69.gif

コマンド動作
:%s;/var/home;/usr/homeパス名などを置換するときは、"/"でなく、";"を区切り文字に使用する

削除

4-70.gif

コマンド動作
:g/文字列/d"文字列"を含んでる行を削除する

Version

$ vim --version
VIM - Vi IMproved 8.0
Huge version without GUI.

参考サイト

VimのGoogle翻訳プラグイン作りました

$
0
0

こんにちわ。
ゴリラ.vimを運営しているゴリラです。

みなさんはプラグイン使っていますか?
ぼくはプラグイン使っていますが、全然作ったことがないので初めて実用的なものを作りました。

普段OSSのソースを読んだり、作ったOSSのREADMEを英語で書いたりするのですが、
英語力がないため都度ブラウザを開いてGoogle翻訳を使ってはVimに戻る日々でした。

画面の切り替えは時間ロスなのでVim上で翻訳できるプラグインを作りました。

このプラグインがあればVimは翻訳エディタへと生まれ変わります。
どうぞお試して下さい。

機能

状況に応じて、次のことができます。

  1. 動的に翻訳する
  2. 選択した範囲を翻訳する
  3. 現在行翻訳する

どれも多分よく使うと思います。
設定項目は次になります。

" 翻訳元言語letg:translate_source="en"" 翻訳先言語letg:translate_target="ja"" 翻訳結果ウィンドウのサイズletg:translate_winsize=10

動的に翻訳する

:AutoTranslateModeToggleで動的に翻訳するモードに切り替えます。
再度実行するとモードがOFFにになります。
自動翻訳モードになると、バッファ上の文字が全て翻訳されます。

翻訳の契機は<CR>になっていて、改行するとその行を翻訳します。

:AutoTranslateModeToggle!では、翻訳元と翻訳先の言語が入れ替わった状態でモードを切り替ります。

ぼくは自動翻訳READMEを書く時に日本語が変になっていないかを確認するときに使います。
控えめに言って、便利です。

選択した範囲を翻訳する

ビジュアルモードで選択した状態で:Translateで翻訳できます。
こちらはソースのコメントを読む時などに便利です。

ちなみに、:Translate!で翻訳元と翻訳先の言語がに入れ替わります。
控えめに言って、便利です。

仕組み

翻訳API

一番大事な翻訳処理ですが、
GAS1LanguageAppクラスを使用しています。

GASではプロジェクトをウェブアプリとして公開することができます。
HTTPリクエストはdoPost(e)doGet(e)を用意することで受け取りことが可能です。

HTTPリクエストJSONを取得し、それをもとにLanguageAppクラスで翻訳してその結果を返却します。
こうすることで簡易の翻訳APIを作ることができます。

ちなみに、次が翻訳APIの処理になります。

functiondoPost(e){varp=JSON.parse(e.postData.getDataAsString());if(p.text==""){returnContentService.createTextOutput("text is empty");}if(p.source==""){returnContentService.createTextOutput("source is empty");}if(p.target==""){returnContentService.createTextOutput("target is empty");}vartranslatedText=LanguageApp.translate(p.text,p.source,p.target);returnContentService.createTextOutput(translatedText);}

ちなみに、プラグインが使用しているAPIのEndpointは次になります。
bash
https://script.google.com/macros/s/AKfycbywwDmlmQrNPYoxL90NCZYjoEzuzRcnRuUmFCPzEqG7VdWBAhU/exec

次のようにcurlコマンドでJSONをPOSTすれば翻訳結果が返ってきます。
gjoはゴリラ製OSSの一つでkey=value形式で引数を渡すことで簡単にJSON文字列を生成できます。

$ curl -L https://script.google.com/macros/s/AKfycbywwDmlmQrNPYoxL90NCZYjoEzuzRcnRuUmFCPzEqG7VdWBAhU/exec -d$(gjo text="my name is gorilla"source=en target=ja)私の名前はゴリラです⏎

翻訳CLI

翻訳APIがあればそれに本文と翻訳する言語のオプションを渡すだけです。
もともとVim scriptのみでHTTP通信を行い、翻訳するつもりでしましたが、
Goの勉強もしたいためCLIを作りそれをVimで呼び出す仕組みにしました。

CLIに関してはGoの標準パッケージnet/httpを使用して、
引数で渡したオプションと本文をJSONに変換し翻訳APIをコールしています。

typepoststruct{Textstring`json:"text"`Sourcestring`json:"source"`Targetstring`json:"target"`}// translate languagefunctranslate(text,source,targetstring)(string,error){postData,err:=json.Marshal(post{text,source,target})iferr!=nil{return"",err}req,err:=http.NewRequest(http.MethodPost,*endpoint,bytes.NewBuffer([]byte(postData)))req.Header.Set("Content-Type","application/json")client:=&http.Client{}resp,err:=client.Do(req)iferr!=nil{return"",err}deferresp.Body.Close()body,err:=ioutil.ReadAll(resp.Body)iferr!=nil{return"",err}returnstring(body),nil}

Vimプラグイン

Vimのプラグインはautoloadpluginディレクトリがあります。
それぞれの違いは次になります。

ディレクトリ説明
autoload使用するときに初めて読み込まれるスクリプトファイルを置く
pluginVim起動時に読み込まれるスクリプトファイルを置く

基本的に読み込みに時間がかかるスクリプトはautoloadに置きますが、今回はとくに重たい処理をするわけではないのでpluginディレクトリのみで物足ります。

プラグインのメイン処理についてざっくり紹介していきます。

CLI実行コマンド生成

まずCLIの実行コマンドを生成します。
ban!のことを指していて!のときは翻訳元・先の設定を逆転させています。

let source_ = get(g:, "translate_source", "en")ではグローバルスコープの設定値がなければ、デフォルト値をを取得するようにしています。
targetの処理も同様になります。

" create gtran command with text and bangfunction!s:create_cmd(text, bang) abort
    ifa:text==""returnendiflet source_ = get(g:,"translate_source","en")let target = get(g:,"translate_target","ja")let cmd =["gtran","-text=".a:text,"-source=".source_,"-target=".target]ifa:bang=='!'let cmd =["gtran","-text=".a:text,"-source=".target,"-target=".source_]endifreturn cmd
endfunction

コマンド実行

job_startで外部コマンドを非同期で実行します。
Vimでは外部コマンドを実行する方法として、system()systemlist()がありますが、
これらは実行が完了するまでVimを操作できないので、翻訳を待ちながらその間に作業をしたいためjob_start()にしました。

job_startではオプションを指定することができます。

callbackで指定したcallback関数ではコマンド実行結果の出力を取得します。
callback関数では出力の行数分呼ばれるので、s:result変数に結果を格納していきます。

exit_cbで指定したcallback関数ではコマンド実行完了後に呼び出されるので、
s:resultに格納した結果出力をバッファに出力する処理を実装しています。

" translatefunction! translate#translate(bang, line1, line2,...) abort
    let ln ="\n"if&ff =="dos"let ln ="\r\n"endiflets:result=[]letstart=a:line1letend=a:line2ifs:current_mode==s:real_time_modeletstart=1letend= getpos("$")[1]let cmd =s:create_cmd(s:getline(start,end, ln,a:000),s:bang)elselet cmd =s:create_cmd(s:getline(start,end, ln,a:000),a:bang)endif

    echo "Translating..."let job = job_start(cmd,{                \"callback":function("s:tran_out_cb"),                \"exit_cb":function("s:tran_exit_cb"),                \})endfunction" get command resultfunction!s:tran_out_cb(ch, msg) abort
    call add(s:result,a:msg)endfunction" set command result to translate window bufferfunction!s:tran_exit_cb(job, status) abort
    calls:create_tran_window()call setline(1,s:result)calls:focus_window(bufnr(s:currentw))
    echo ""endfunction

ざっくりですがプラグインが動く仕組みについて紹介しました。
もっと知りたい方はぜひソースを読んでみてください。
大したことしていないので読みやすいと思います。

既知の問題点

lexima.vimでは<CR>のマッピングがあるので、
leximaが入っていると自動翻訳が動かなくなります。

この問題を修正する予定です。

今後について

現在プラグインはVimのみ対応しているのでNeoVimでも動くようにしたいと考えています。
また、NeoVimで実装されたフロートウィンドウを使用して翻訳結果をポップアップウィンドウとして表示させ方がより便利かなと思っています。

最後に

Vimを始めたてのころにセッション管理のプラグインを作ったことがありましたが、正直よくわかりませんでした。
はじめてちゃんとプラグインを作って、まだまだ知らないことがたくさんあるなぁと実感しました。

ただ、Vim scriptはbashと似ていて個人的にそんなにとっつきにくい印象はなく楽しかったです。

このきっかけに今後もプラグインをコツコツ作っていこうと思えました。

次のプラグインは電車乗り換え乗案内.vimを作ります。
乞うご期待!


  1. Google Apps Script 

golangのテスト機能を使って競プロを快適にテストしてみる

$
0
0

はじめに

最近少しずつgolangで競技プログラミングを始めた駆け出しの競技プログラマです。
競プロを組んでると思うのが、プログラムを作って例題でテストして…と進めていくと毎回コンソールで値を入れてチェックというのが面倒くさく感じます。
色々調べた結果、golangのテスト機能を使えば簡単にテストできることがわかったのでテスト用ソースセットをつくってみました!

なお、ソースは以下にあります。
https://github.com/Atoyr/CompetitiveProgramming

実装

※こちらの記事を参考にして作成しました
競プロのテストを「go test」でやりたかったので作った - Qiita
Go言語で標準入出力をスタブする方法 - Qiita

golangのテストの実行については、様々な記事がありますので、本記事では割愛します。

仕組み

テストソースはmain_test.goになります。
このファイルに標準入力と標準出力を記載してgo testを実行するとmain.goのmainをテストしてくれます。
具体的には以下のようになっています。
- 問題の入力を文字列配列で各行ごとに設定
- 問題の出力を文字列で設定
- 問題の入力を標準入力の形でmain関数に渡して、標準出力の結果を生成する
- 標準出力の結果と問題の出力を比較

ね、簡単でしょ

どないなっとんのこれ

このテストで肝となるのは、標準入力、標準出力の扱いになります。
golangには標準入出力をスタブする機能があるので、それを使って結果を取得します。

入出力は以下の関数で実行します。
第一引数に標準入力をスペース区切りで、第二引数のfuncでmain関数を受け取ります。
戻り値は標準出力とエラーメッセージです。
エラーメッセージはエラーが発生していなければ空文字です。

funcstubio(inbufstring,ffunc())(string,string){inr,inw,_:=os.Pipe()outr,outw,_:=os.Pipe()errr,errw,_:=os.Pipe()orgStdin:=os.StdinorgStdout:=os.StdoutorgStderr:=os.Stderrinw.Write([]byte(inbuf))inw.Close()os.Stdin=inros.Stdout=outwos.Stderr=errwoutC:=make(chanstring)errC:=make(chanstring)deferclose(outC)deferclose(errC)gofunc(){varbufstrings.Builderio.Copy(&buf,outr)outr.Close()outC<-buf.String()}()gofunc(){varbufstrings.Builderio.Copy(&buf,errr)errr.Close()errC<-buf.String()}()f()os.Stdin=orgStdinos.Stdout=orgStdoutos.Stderr=orgStderroutw.Close()errw.Close()return<-outC,<-errC}

テストする標準入力および標準出力は別途typeを作成して対応しています。
今回はatcoderのチュートリアル1問目の標準入力、標準出力を入れています。
A - Welcome to AtCoder

typetestValuestruct{arg[]stringansstring}funcgetTests()[]testValue{testValues:=[]testValue{testValue{[]string{"1","2 3","test",},"6 test"},testValue{[]string{"72","128 256","myonmyon",},"456 myonmyon"},}returntestValues}

テスト本体は以下になります。
テストデータを取得してmain関数を実行、結果を比較してNGの場合のみエラーメッセージを出します。
これで間違っていた場合でも、mainの実行結果がわかるので対応できます。
また、そもそもmain関数でエラーが発生してもメッセージを表示するようにしています。
ただ、main関数が無限ループになっている場合は結果が帰ってきません。まずいですよ!

funcTest_main(t*testing.T){tests:=getTests()fori,tt:=rangetests{si:=strconv.Itoa(i)t.Run("Case "+si,func(t*testing.T){ret,err:=stubio(strings.Join(tt.arg," "),main)iferr!=""{t.Errorf("error func: %s ",err)}ans:=fmt.Sprintf("%s\n",tt.ans)ifret!=ans{t.Errorf("Unexpected output: '%s' Need: '%s'",ret,ans)}})}}

テストを実行できるmain関数を用意しておく

競プロというんだから手早くソースを書きたい気持ちがあります。
なので、毎回使う機能はあらかじめ宣言しておきます。
自分は入力関連の関数をあらかじめ宣言しています。

自分はnextInt()nextString()という関数を用意して、空白区切の文字をint型やstring型で簡単に取り込みできるようにしています。

実際に使ってみる

使う際には、main.goのmain関数内に実際の処理を記載します。
あとは標準入力、標準出力をmain_test.goに記載してテストを実行すればOKです。
テストはコマンドラインやシェルからgo testを実行してください。
gotest1.gif

おまけ

vimを使うとすごく早くテストできます。
必要なプラグインはvim-goになります。
様々な記事で使い方が書いてあるはずなので、ここでは割愛します。

使い方はmain.gomain_test.goのあるディレクトリでvimを開いて、ソースコードを記載。
最後に:GoTestとやってあげればOKです。
gotest2.gif

NGのパターンはぜひ自分で試してみてください。
(gif作ったら容量オーバーでアップできなかったのは内緒。)

これが一番早いと思います。

C++ Builder > Vim > Borland C++5.5対応のコードがあったようだ | 過去の実装の除去 | Neovim

$
0
0

VimにかつてあったBorland C++対応コード

現在のWindows版Vimは、Visual C++とMinGWでビルドできるようになっていますが、かつてはBorland C++ 5.5でもできるようになっていました。しかし、Borlandを使う人がいなくなってしまい、いつの間にかビルドできなくなってしまっていました。Borland C++の後継としては、Embarcadero C++も公開されていますが、これに対応させようという人もいませんでした。そのため、Borland向けのコードをすべて削除することになりました。

過去の実装の除去

壊れた実装は不要なものである。正しい。

一方で、過去に誰かがした仕事を足掛かりとして、将来別の誰かが何かをすることもある。

Git上で消えた#ifdefは、その存在自体を最新版では気づかないことが多い。
Embarcadero C++で実装をしようとする人が現れた時は「ゼロ」からのスタートになる。
(今はC++ BuilderでClang(古いバージョン)も使えるようになっているので、そういう人が現れるか不明ではあるが)

Borland C++の実装(壊れているが)が残っていた場合、その情報を読み解き、「この部分を変更すればいいだろう」と作業が短縮されることもあるかもしれない。一方で、残ることでそれを使わない人にとっては「ソース可読性へ悪影響」でしかない。

難しいところ。

Neovim

上記のように、長い歴史を持つVimのコードの可読性や変更困難性を検討した結果生まれたプロジェクトがNeovimだと認識している。

https://neovim.io/

https://neovim.io/charter/

Neovim is a refactor, and sometimes redactor, in the tradition of Vim (which itself derives from Stevie). It is not a rewrite but a continuation and extension of Vim.

neovimはスクラッチからコードを実装する?(あるいは大規模なリファクタをする?)ことで、長い歴史を持つVimの複雑なコードをシンプルなものへと変えようとしている、と認識している。

neovimが今後どれくらい支持されるか不明であるが、そういう動きもある。


自分用勉強メモ10日目

$
0
0

tips

ブラウザでUser Agentを変更したいとき

CTFの問題を解いていて,User AgentをGooglebotに偽装したかった.
Firefoxだとアドオンを入れる必要があるらしい.
Chromeで変更する手順を見つけたので参考にした.

参考:Google ChromeでUserAgentを変更する

  1. Developer Toolsを開く (右クリックで「検証」)
  2. More ToolsからNetwork conditionsを開く
  3. select automaticallyのチェックを外す
  4. 好きなUserAgentに変える

Ubuntu19.04でvimのシンタックスハイライトが機能しなかった

Ubuntuが最小構成でインストールされていた場合,Vimも最小構成になっていた.
自分の場合はaptでVimをインストールし直したらシンタックスハイライトが使えるようになった.

# apt install vim

調べた知識

バイナリ解析で役に立つツール

pwntools

CTF用のPythonライブラリ.
pip install pwnでインストールできる.
p32という関数を使えば,数値を32bitのリトルエンディアンに変換してくれる.
例:p32(0x11223344)

checksec

実行ファイルのセキュリティ機構を表示してくれるシェルスクリプト.
以下からダウンロードできる.
slimm609/checksec.sh

gdb-peda

gdbの拡張版.
以下からインストールできる.
longld/peda

readelf

Linuxのコマンド.
ELFの情報を表示する.

rp++

実行ファイル中のROP Gadgetを表示する.
以下からダウンロードできる.
0vercl0k/rp

ELFのセキュリティ機構

RELRO(RELocation Read-Only)

ELFのセクションを読み込み専用にする.
以下の2つがある.

  • Partial RELRO
  • Full RELRO

GCCのデフォルトではpartialになっている.
partialであればGOT上書き攻撃が可能.

カナリア

SSP(Stack Smashing Protector)というものがある.
ローカル変数とリターンアドレスの間にカナリア(canary)と呼ばれる値を設定し,関数終了時にそれが変更されているかどうかをチェックする.
これにより,スタックオーバーフローが発生していないか確認できる.

NXビット(No eXecute)

メモリをコード領域とデータ領域に分け,後者に特別なビットを付与し,実行されることを防ぐ.
WindowsではDEP(Data Execution Prevention)という.

PIE(Position-Independent Executable)

実行コード内のアドレス参照をすべて相対アドレスで行う.
これにより,実行ファイルがメモリ上のどこに展開されても正常に実行できる.

ASLRとの違い

ランダム化する部分が異なる.

  • ASLR: 共有ライブラリやスタック
  • PIE: 実行ファイル

Vimでサンプル書くときのsyntax設定

$
0
0

たまに、Vimでjsonのサンプルを書きたかったりする。
使い捨てのサンプルなのでファイルに起こすほどのものでないとき、 terminalから vimコマンドでそのまま編集を開始するのだけれど、そうするとsyntax highlightが設定されない。

ちょっと調べたら簡単に設定できたので覚え書き。

下記2つのコマンドでOKみたい。

:syntax enable
:set filetype=json

:syntax enableでsyntaxを有効にし、 :set filetype=jsonで、ファイルタイプを指定する。

:set filetype=pyとかにするとpythonのsyntax highlightがあたるとおもう。

ローカルVimからAWSファイルを編集する

$
0
0

サーバーのファイルを触るときにいつものシンタックスとかプラグインが適応されておらず不便さを感じていた

ネットで調べたら出来るらしいので vim.jpの師匠方に相談したら丁寧に教えてくれたので共有

configファイルの作成

現状、vimでは鍵の指定をした接続が出来ないので~/.ssh配下にconfigファイルを作成する

$ mkdir ~/.ssh
$ touch ~/.ssh/config

作成したconfigファイルに接続情報を書き込む

Host sample
    HostName ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com
    User xxxx
    IdentityFile ~/.ssh/xxxx.pem
    TCPKeepAlive yes
    IdentitiesOnly yes
名前意味
Hostアクセス時に宣言するホスト名
HostNameホストのアドレスかorアドレス
Userユーザ名
IdentityFile秘密鍵のパス
TCPKeepAlive接続状態を継続するかどうか
IdentitiesOnlyIdentityFileの要否

実行

以下コマンドでリモートファイルをローカルのVimで編集することが出来る

$ vim scp://sample//file/to/path

ローカルのシンタックスとかプラグインが既に適応されているので便利
ますますVim愛が増してしまいそうだ

E21: Cannot make changes, 'Modifiable' is offが出た。

$
0
0

コマンドモードで:set modifiable を入力したら編集できるようになった。

環境:Mac

unite-colorscheme で Vim のカラースキームを動的に変更する

$
0
0

はじめに

Vim で開発していて、気分を変えるために普段と違うカラースキームに切り替えたいと思うことがたまにあります。

今までは.vimrc から直接設定変更していましたが、unite-colorschemeが便利そうだったので紹介します。

unite-colorscheme とは

unite-colorschemeは、Vim 上で使える統合インターフェイスである Unite.vim でカラースキームを切り替えることができるプラグインです。

インストール

Unite.vim と unite-colorscheme をインストールします。以下は dein.vim の例です。

call dein#add('Shougo/unite.vim')call dein#add('ujihisa/unite-colorscheme')

使い方

:Unite colorschemeと実行すると、設定できるカラースキーム候補が表示されます。

そこからカラースキームを選択すると、カラースキームが切り替わります。

以下のようにオプションを追加すると、選択中もカラースキームがプレビューで切り替わるようになります。

:Unite colorscheme-auto-preview

実行すると以下のようにカラースキームをプレビューしながら切り替えることができます。

May-25-2019 10-07-47.gif

カラースキームをブラックリスト登録

:help unite-colorschemeでヘルプを確認できます。

候補に表示させたくないカラースキームを、ブラックリストに登録する事ができるようです。
以下、ヘルプから抜粋します。

letg:unite_colorscheme_blacklist=[        \'blue','darkblue','delek','evening',        \'desert','elflord','koehler','morning',        \'murphy','pablo','peachpuff','ron',        \'slate','torte','zellner']

おわりに

気分に応じてカラースキームを切り替えるのが簡単になりました。別途プラグインの内部処理も勉強がてら読んでみようと思います。

Viewing all 5729 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>