Emacs で yank したものが違っていた

Emacs で C-y を押して kill した内容を yank したとき、

  • あれ、これと違う!

ということがある。こんなときは、すぐに M-y (yank-pop) してみると、yank したいものに巡り合えるかもしれない。

kill した内容は順に kill-ring に保存されており、

  • yank は最新の kill の内容を、
  • 直後に yank-pop すると、その次に新しい kill の内容を、
  • また、直後に yank-pop すると、そのまた次に、、、

と、順に以前のものを戻してくれる。

コントロールの背景を透過色にする

コントロールの背景を透過色にするには、

  • コントロールの BackColor プロパティに Color.Transparent を設定する。

f:id:tt195361:20150619115302p:plain

using System;
using System.Drawing;
using System.Windows.Forms;

namespace TransparentLabel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            checkBox1.BackColor = Color.Transparent;
            radioButton1.BackColor = Color.Transparent;
            label1.BackColor = Color.Transparent;
            button1.BackColor = Color.Transparent;
        }
    }
}

Button は、FlatStyle プロパティが Flat と Popup のとき、透過色になった。

DataGridView の行や列に区切りを入れる

DataGridView の行や列に区切りを入れるときは、

を設定する。

using System;
using System.Windows.Forms;

namespace DataGridViewDividerWidthSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for (Int32 columnIndex = 0; columnIndex < 3; ++columnIndex)
            {
                String name = String.Format("カラム {0}", columnIndex + 1);
                dataGridView1.Columns.Add(name, name);
            }

            for (Int32 rowIndex = 0; rowIndex < 3; ++rowIndex)
            {
                dataGridView1.Rows.Add();
            }

            dataGridView1.Columns[1].DividerWidth = 2;
            dataGridView1.Rows[1].DividerHeight = 2;
        }
    }
}

f:id:tt195361:20150618105236p:plain

DataGridView の描画が遅いときに気をつけること

DataGridView で、

のプロパティが、自動に設定されているとき、

  • 行や列の追加
  • セルに値を設定

すると、描画が遅くなる。

以下の例では、50 x 50 で 9.2 秒かかった。

f:id:tt195361:20150612082645p:plain

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace DataGridViewSizeModeAndSpeed
{
    public partial class Form1 : Form
    {
        private const int ColumnCount = 50;
        private const int RowCount = 50;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var sw = new Stopwatch();
            sw.Start();

            // サイズ設定が自動のとき、行や列を追加したり、セルに値を設定すると、実行が遅くなる。
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;

            AddColumns();
            AddRows();
            SetValues();

            sw.Stop();
            label1.Text = String.Format("所要時間: {0}", sw.Elapsed);
        }

        private void AddColumns()
        {
            for (int index = 0; index < ColumnCount; ++index)
            {
                AddColumn(index + 1);
            }
        }

        private void AddColumn(int columnNumber)
        {
            var column = new DataGridViewColumn();
            column.Name = columnNumber.ToString();
            column.CellTemplate = new DataGridViewTextBoxCell();
            dataGridView1.Columns.Add(column);
        }

        private void AddRows()
        {
            for (int index = 0; index < RowCount; ++index)
            {
                dataGridView1.Rows.Add();
            }
        }

        private void SetValues()
        {
            for (int columnIndex = 0; columnIndex < ColumnCount; ++columnIndex)
            {
                for (int rowIndex = 0; rowIndex < RowCount; ++rowIndex)
                {
                    String value = String.Format("{0}-{1}", columnIndex + 1, rowIndex + 1);
                    dataGridView1[columnIndex, rowIndex].Value = value;
                }
            }
        }
    }
}

順番を、

  1. 自動サイズ設定しない。
  2. 行や列を追加、セルに値を設定。
  3. 自動サイズ設定する。

に変更すると、描画時間は 0.15 秒になった。

f:id:tt195361:20150612083603p:plain

        private void Form1_Load(object sender, EventArgs e)
        {
            var sw = new Stopwatch();
            sw.Start();

            // 行や列を追加したり、セルに値を設定するときは、自動サイズ設定しない。
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

            AddColumns();
            AddRows();
            SetValues();

            // 自動でサイズを設定するのは、行や列を追加したり、セルに値を設定した後にする。
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;

            sw.Stop();
            label1.Text = String.Format("所要時間: {0}", sw.Elapsed);
        }

Emacs での長方形の範囲の取り扱い

Emacs では長方形の範囲を取り扱える。

たとえば以下のようなテキストで、左にある日付の部分を、右に移動したいとすると、

f:id:tt195361:20150609180859p:plain

'1. C-@ や C-SPC (set-mark-command) で角にマークを付けて、
'2. 長方形の対角にカーソルを移動し、
'3. M-x copy-rectangle-to-register で、長方形の範囲の内容を、たとえばレジスタ a にコピーする。

f:id:tt195361:20150609180923p:plain

'4. M-x delete-rectangle で、長方形の範囲を削除し、

f:id:tt195361:20150609181101p:plain

'5. 長方形を挿入する位置へカーソルを移動し、
'6. M-x insert-register で、'3 で内容を保存したレジスタ a を指定する。

f:id:tt195361:20150609181114p:plain

Emacs のキーボードマクロ

テキスト編集で同じ操作を繰り返すなら、Emacsキーボードマクロ が便利。

例えば、以下のような内容の各行をダブルクォートで囲むとすると、

f:id:tt195361:20150609085310p:plain

  1. C-x ( → キーボードマクロ定義開始。ステータス行に "Defining kbd macro..." と表示される。
  2. 繰り返す操作を入力。ここでは、
    1. " → ダブルクォート入力
    2. C-e → 行の最後に移動
    3. " → ダブルクォート入力
    4. C-n → 次の行に移動
    5. C-a → 行の最初に移動
  3. C-x ) → キーボードマクロ定義終了。ステータス行に "Keybord macro defined" と表示される。

f:id:tt195361:20150609085319p:plain

定義したキーボードマクロを実行するには C-x e を入力。繰り返し実行するには C-u (universal-argument) を使う。C-u 1 0 C-x e で 10 回実行してみるとこうなる。

f:id:tt195361:20150609085326p:plain