vimのコマンド一覧

February 18,2020 11:55 PM
Category:[Linux]
Tag:[Linux, vim]
Permalink

vimのコマンド一覧を作りました。

manコマンドを参考に、コマンドモードのコマンドを中心に網羅しています。

1.モードについて

manコマンドで定義されているvimのモードは、

  • コマンドモード
  • exモード
  • テキスト入力モード
  • ビジュアルモード

です。

「コマンドモード」はカーソルの移動やコピー、検索などvimを効率的に利用するためのメインとなるモードです。

「exモード」は、":"で始まり、置換などで利用します。

ところで、exモードとは何でしょうか。

そもそもviは、exというラインエディタをスクリーンエディタに拡張する形で作られたもので、viでexコマンドを使用するモードを「exモード」といいます。

「テキスト入力モード」は単純に文字を入力するためのモードです。

「ビジュアルモード」は矩形で処理を行うためのモードです。

manにはもうひとつ「オープンモード」が載っていますが、意味が不明なため、ここでは扱っていません。

2.コマンドモードの数字について

3項の表中にある「数字対応」は、コマンド実行前に任意の数字を入力すれば、入力数字分の挙動が行われることを指しています。

ネット上の情報で、コマンドの説明を数字と組み合わせたページはほぼなかったので、こういう機能があることをご存知の方は少ないかもしれません。

例えば、矢印キーでカーソルで移動する際、矢印キーの前に「30」などの数字を入力すれば、一気に30文字分カーソルを移動してくれます。

数字入力に慣れれば、編集作業をより効率的に行えるようになると思います。

3.コマンド一覧

モード変更
コマンド意味
iテキスト入力モードに変更(カーソル位置に文字を挿入)
Iテキスト入力モードに変更(行の先頭文字に文字を挿入)
aテキスト入力モードに変更(カーソル直後に文字を挿入)
Aテキスト入力モードに変更(カーソルの行末に文字を挿入)
oテキスト入力モードに変更(カーソルの下行に空行を挿入)
Oテキスト入力モードに変更(カーソル行に空行を挿入)
sテキスト入力モードに変更(カーソル位置をクリアして文字を挿入)
Sテキスト入力モードに変更(カーソル行をクリアして文字を挿入)
ESCコマンドモードに変更
:exモードに変更
Ctrl+vビジュアルモードに変更
カーソル移動(コマンドモード)
コマンド意味数字対応
←(またはh)左に1文字移動
→(またはl)右に1文字移動
↓(またはj)下に1行移動
↑(またはk)上に1行移動
-上に1行移動
+下に1行移動
改行下に1行移動
Ctrl+e1行前にスクロール
Ctrl+y1行後ろにスクロール
スペース右に1文字移動
Ctrl+f1ページ先へ
Ctrl+b1ページ前へ
Ctrl+d半ページ先へ
Ctrl+u半ページ前へ
H画面の一番上に移動
L画面の一番下bに移動
$行末に移動
0(ゼロ)行頭に移動
^カーソル行の空白除く先頭文字に移動
_カーソル行の空白除く先頭文字に移動
ggファイルの先頭に移動
Gファイルの末尾に移動
M画面中央の空白以外の先頭文字に移動
w次の単語に移動
m+1文字カーソルの位置をマーキング
'マーキング位置の行の先頭文字にジャンプ
`マーキング位置にジャンプ
編集(コマンドモード)
コマンド意味数字対応
xカーソル上の文字を1文字削除
Xカーソルの直前の文字を1文字削除
Dカーソル上の文字から行末まで削除
dwカーソル上の文字から空白までの文字を削除
dd行削除
yy行コピー
ywカーソル位置から次の空白までコピー
pカーソル行の下にペースト
ywの後であればカーソル行にペースト
Pカーソル行にペースト
.直前のコマンドを再実行
uアンドゥ
Uカーソル行の変更をすべてアンドゥ
Ctrl+rリドゥ
rカーソル上の文字を上書き
Rカーソル上以降の文字を上書き
Jカーソル行と次の行を連結
&直前の置換を繰り返し
~大文字小文字変換
検索(コマンドモード)
コマンド意味
/+検索文字後方検索
?+検索文字前方検索
n再検索(直前の検索と同方向)
N再検索(直前の検索と逆方向)
%カーソル上の文字に対応するペア文字
(カッコやブラケットなど)に移動
ファイル操作(コマンドモード)
コマンド意味
:w上書き保存
:w!強制上書き保存
:wq上書き保存と終了
:wq!強制上書き保存と終了
ZZ強制上書き保存と終了
:e再読み込み
:e!強制再読み込み
その他(コマンドモード)
コマンド意味
Ctrl+g情報表示(ファイル名,現在行など)
Ctrl+l画面のクリアと再描画
置換(exモード)
コマンド意味
:set number行番号表示
:set nonumber行番号非表示
:%s/文字列/置換文字列/g文字列を置換文字列に一括置換
Comments [0] | Trackbacks [0]

シェルスクリプトで動作するコマンドラインインタフェース

February 12,2020 11:55 PM
Category:[bash]
Tag:[bash, Linux]
Permalink

シェルスクリプトで動作するコマンドラインインタフェースを作りました。

1.はじめに

Linuxにログインしたターミナル上では、標準入力した文字列(コマンドライン)を編集することができます。また矢印キーでコマンド履歴を表示・編集することもできます。

が、シェルスクリプトを起動したあとの標準入力を、同じように編集したり、コマンド履歴を表示することはできません。

ネットを探しましたが同じようなものがみつかりませんでした。

ということで、シェルスクリプト上でコマンドラインを編集できるスクリプトを作ってみました。

このスクリプトでできるコマンドラインインタフェースは下記です。

  • Ctrl+a:カーソルを先頭に移動
  • Ctrl+b:カーソルを1文字左に移動
  • Ctrl+d:カーソル上の文字を削除
  • Ctrl+e:カーソルを末尾に移動
  • Ctrl+f:カーソルを1文字右に移動
  • Ctrl+k:カーソルより後方の文字を削除
  • Ctrl+u:カーソルより前方の文字を削除
  • Backspace:カーソルの左側の文字を削除
  • 上矢印:ヒストリ呼び出し
  • 下矢印:ヒストリ呼び出し
  • 左矢印:カーソルを1文字左に移動
  • 右矢印:カーソルを1文字右に移動
  • リターン:コマンド実行

スクリプトを任意の名称で保存して実行すると、スクリプトで定義したプロンプトを表示して標準入力待ちになります。

ご自身のスクリプトに合うよう、適当に組み込んでください。

不具合・改善等があれば適宜アップデートしていきます。

CentOS 7で動作確認しています。環境によっては期待通り動作しない可能性があります。予めご了承ください。

2.スクリプト

#!/bin/bash
 
# Copyright (c) 2020 www.koikikukan.com
 
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom
# the Software is furnished to do so, subject to the following
# conditions:
 
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
 
history -r /root/.bash_history
 
# プロンプト
PROMPT="# "
 
PROMPT_LENGTH=${#PROMPT}
CURSOL_INIT_POS=$((PROMPT_LENGTH + 1))
COMMAND=''
LENGTH=0
COUNTER=0
POS=${CURSOL_INIT_POS}
 
function _history_update() {
    tput cub 1000
    tput dl 1
    COMMAND=`history | tail -$COUNTER | head -1 | sed -re "s/^\s+[0-9]+\s{2}//"`
    echo -n "${PROMPT}$COMMAND"
    LENGTH=${#COMMAND}
    POS=$((LENGTH + CURSOL_INIT_POS))
}
 
echo -n "${PROMPT}"
while IFS= read -r -n1 -s char; do
    case $char in
    $'\x1b')
        read -r -n2 -s rest
        char+="$rest"
        case $char in
        $'\033\x5b\x41')
            HISTORY_COUNT=`history|wc -l`
            if [ $COUNTER -le $HISTORY_COUNT ]; then
                COUNTER=$((COUNTER + 1))
                _history_update
            fi
        ;;
        $'\033\x5b\x42')
            if [ $COUNTER -gt 0 ]; then
                COUNTER=$((COUNTER - 1))
                _history_update
            fi
        ;;
        $'\033\x5b\x43')
            COMMAND_POS=$((LENGTH + PROMPT_LENGTH))
            if [ ${COMMAND_POS} -ge ${POS} ]; then
                tput cuf 1
                POS=$((POS + 1))
            fi
        ;;
        $'\033\x5b\x44')
            if [ ${POS} -gt ${CURSOL_INIT_POS} ]; then
                tput cub 1
                POS=$((POS - 1))
            fi
        ;;
    esac
    ;;
 
    $'\x08')
        if [ ${POS} -gt ${CURSOL_INIT_POS} ]; then
            LEFT_LENGTH=$((POS - CURSOL_INIT_POS))
            if [ ${LENGTH} -gt ${LEFT_LENGTH} ]; then
                TMP=$((LEFT_LENGTH - 1))
                COMMAND=`echo "${COMMAND}" | sed -e "s/^\(.\{${TMP}\}\).\(.*\)$/\1\2/"`
            else
                DEL=${COMMAND: -1}
                COMMAND="${COMMAND/%${DEL}/}"
            fi
            tput dl 1
            tput cub 1000
            echo -n "${PROMPT}${COMMAND}"
            if [ ${LENGTH} -gt ${LEFT_LENGTH} ]; then
                tput cub 1000
                POS2=$((POS - 2))
                tput cuf ${POS2}
            fi
            POS=$((POS - 1))
            LENGTH=$((LENGTH - 1))
        fi
    ;;
 
    $'\0a')
        history -s "${COMMAND}"
        echo
        if [ -n "$COMMAND" ];then
            eval "${COMMAND}"
        fi
        LENGTH=0
        COMMAND=''
        POS=$CURSOL_INIT_POS
        echo -n "${PROMPT}"
    ;;
 
    $'\ca')
        if [ ${POS} -gt ${CURSOL_INIT_POS} ]; then
            tput cub 1000
            tput cuf ${PROMPT_LENGTH}
            POS=$CURSOL_INIT_POS
        fi
    ;;
 
    $'\cb')
        if [ ${POS} -gt ${CURSOL_INIT_POS} ]; then
            tput cub 1
            POS=$((POS - 1))
        fi
    ;;
 
    $'\cd')
        TMP=$((LENGTH + PROMPT_LENGTH))
        if [ ${POS} -le ${TMP} ]; then
            LEFT_LENGTH=$((POS - CURSOL_INIT_POS))
            if [ ${POS} -ne ${CURSOL_INIT_POS} ]; then
                COMMAND=`echo "${COMMAND}" | sed -e "s/^\(.\{${LEFT_LENGTH}\}\).\(.*\)$/\1\2/"`
            else
                COMMAND="${COMMAND:1}"
            fi
            tput dl 1
            tput cub 1000
            echo -n "${PROMPT}${COMMAND}"
            if [ ${LENGTH} -gt ${LEFT_LENGTH} ]; then
                tput cub 1000
                POS2=$((POS - 1))
                tput cuf ${POS2}
            fi
            LENGTH=$((LENGTH - 1))
        fi
    ;;
 
    $'\ce')
        COMMAND_POS=$((LENGTH + PROMPT_LENGTH))
        if [ ${COMMAND_POS} -ge ${POS} ]; then
            tput cub 1000
            tput cuf $COMMAND_POS
            POS=$((COMMAND_POS+1))
        fi
    ;;
 
    $'\cf')
        COMMAND_POS=$((LENGTH + PROMPT_LENGTH))
        if [ ${COMMAND_POS} -ge ${POS} ]; then
            tput cuf 1
            POS=$((POS + 1))
        fi
    ;;
 
    $'\ck')
        LEFT_LENGTH=$((POS - CURSOL_INIT_POS))
        if [ ${LENGTH} -gt ${LEFT_LENGTH} ]; then
            COMMAND=`echo "${COMMAND}" | sed -e "s/^\(.\{${LEFT_LENGTH}\}\).*$/\1/"`
        else
            continue
        fi
        tput dl 1
        tput cub 1000
        echo -n "${PROMPT}${COMMAND}"
        LENGTH=$((POS - CURSOL_INIT_POS))
    ;;
 
    $'\cu')
        LEFT_LENGTH=$((POS - CURSOL_INIT_POS))
        RIGHT_LENGTH=$((LENGTH - LEFT_LENGTH))
        if [ ${POS} -gt ${CURSOL_INIT_POS} ]; then
            COMMAND=`echo "${COMMAND}" | sed -e "s/^.*\(.\{${RIGHT_LENGTH}\}\)$/\1/"`
        else
            continue
        fi
        tput dl 1
        tput cub 1000
        echo -n "${PROMPT}${COMMAND}"
        tput cub 1000
        tput cuf $PROMPT_LENGTH
        POS=$CURSOL_INIT_POS
        LENGTH=$((RIGHT_LENGTH))
    ;;
 
    *)
        LEFT_LENGTH=$((POS - CURSOL_INIT_POS))
        if [ ${LENGTH} -gt ${LEFT_LENGTH} ]; then
            COMMAND=`echo "${COMMAND}" | sed -e "s/^\(.\{${LEFT_LENGTH}\}\)/\1$char/"`
        else
            COMMAND="${COMMAND}$char"
        fi
        tput dl 1
        tput cub 1000
        echo -n "${PROMPT}${COMMAND}"
        if [ ${LENGTH} -gt ${LEFT_LENGTH} ]; then
            tput cub 1000
            tput cuf ${POS}
        fi
        POS=$((POS + 1))
        LENGTH=$((LENGTH + 1))
    ;;
    esac
done

3.ライセンス

本スクリプトはMITライセンスです。

Comments [0] | Trackbacks [0]

Excelの$の意味

February 6,2020 11:55 PM
Category:[Excel]
Tag:[Excel, Office]
Permalink

Excelの"$"の意味について調べてみました。

Excelの"$"は「絶対参照」を意味します。

例えば、次のような縦方向に日付を入れたスケジュール表があります。

縦方向に日付を入れたスケジュール表

今日の日付に色を付けたい場合、条件付き書式に

=($A2=TODAY())

を記載します(詳細は「Excelで今日の日付の列に色をつける方法」を参照)。

条件付き書式

逆に、横方向に日付を入れたスケジュール表があります。

横方向に日付を入れたスケジュール表

今日の日付に色を付けたい場合、条件付き書式に

=(B$1=TODAY())

と記載します。

条件付き書式

つまり、前者の"$A2"はセルの列を固定したい場合、後者の"B$1"は行を固定したい場合に使います。

行と列の両方を固定したい場合は、

$A$1

のように記述します。

たとえば、下記の例ではA1~A3の合計をA4セルに

=SUM(A1,A3)

で表示しています。

セルのコピー

このA4セルをB6セルにコピーすると、セルの式が、

=SUM(B3,B5)

に自動的に書き換えられ、B3~B5セルの合計を表示します。

セルのコピー

A4セルの結果をそのまま表示させたければ、A4セルの式を

=SUM($A$1,$A$3)

にします。

セルのコピー

これでB6セルにコピーしても、A4セルの値が保持されます。

セルのコピー

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages