選択領域がない場合のコピー、カット、ペーストの動作

今まで利用していたテキストエディタの仕様

[イ] コピー時の仕様

(a) 選択領域がある場合、その部分をコピーする
(b) 選択領域がない場合、カーソル行(改行を含む)をコピーする

[ロ] カット時の仕様

(a) 選択領域がある場合、その部分をカットする
(b) 選択領域がない場合、カーソル行(改行を含む)をカットする

[ハ] ペースト時の仕様

(a) [イ]-(b)、[ロ]-(b)でコピー(カット)された内容であれば、
 (1) 選択領域がある場合は、選択解除(削除ではない)
 (2) カーソル位置の上の行にペースト
 (2) カーソルは行頭(=ペーストした内容の直後)へ移動

(c) それ(a)以外の内容であれば、
 (1) 選択領域がある場合は、その内容を削除
 (2) カーソル位置に挿入

で、コピー[イ]とカット[ロ]時については、LREditに組み込んでもらったんだけど、ペースト時[ハ]の仕様は「まぁいっか」とか思って要望を出してなかった。けど、やっぱり指が覚えているらしく、死にそうになったので、実装してみた。

■ キーカスタマイズで実装

def command_Copy(info):
    global lastSeq
    edit = window.activeEditPane().edit
    if edit.selection.direction==0:
        edit.command_Copy(info)
        lastSeq = ctypes.windll.user32.GetClipboardSequenceNumber()
    else:
        edit.command_Copy(info)
        lastSeq = 0

def command_Cut(info):
    global lastSeq
    edit = window.activeEditPane().edit
    if edit.selection.direction==0:
        edit.command_Cut(info)
        lastSeq = ctypes.windll.user32.GetClipboardSequenceNumber()
    else:
        edit.command_Cut(info)
        lastSeq = 0

def command_Paste(info):
    global lastSeq
    edit = window.activeEditPane().edit
    curSeq = ctypes.windll.user32.GetClipboardSequenceNumber()
    if (lastSeq == curSeq):
        window.activeEditPane().edit.command_CursorLineBegin(info)
    window.activeEditPane().edit.command_Paste(info)

window.keymap[KeyEvent(VK_C, MODKEY_CTRL)] = command_Copy
window.keymap[KeyEvent(VK_X, MODKEY_CTRL)] = command_Cut
window.keymap[KeyEvent(VK_V, MODKEY_CTRL)] = command_Paste

■ ソースコードの書換えで実現(lredit_textedit.py)

def command_Copy( self, info ):
    global LastClipSeq
    if self.selection.direction==0:
        if self.doc.mode.copy_line_if_not_selected:
            left = self.selection.cursor().lineBegin()
            right = left.lineEnd().right()
            text = self.getText( left, right )
            ckit.setClipboardText(text)
            LastClipSeq = ctypes.windll.user32.GetClipboardSequenceNumber()
    else:
        text = self.getText( self.selection.left(), self.selection.right() )
        ckit.setClipboardText(text)
        LastClipSeq = 0

        if self.doc.mode.cancel_selection_on_copy:
            cursor = self.selection.cursor()
            self.setCursor(cursor)

def command_Cut( self, info ):
    global LastClipSeq
    if self.selection.direction==0:
        if self.doc.mode.copy_line_if_not_selected:
            left = self.selection.cursor().lineBegin()
            right = left.lineEnd().right()
            text = self.getText( left, right )
            ckit.setClipboardText(text)
            self.modifyText( right, left, text=u"" )
            LastClipSeq = ctypes.windll.user32.GetClipboardSequenceNumber()
    else:
        text = self.getText( self.selection.left(), self.selection.right() )
        ckit.setClipboardText(text)
        LastClipSeq = 0
        self.modifyText( text = u"" )

def command_Paste( self, info ):
    global LastClipSeq
    curSeq = ctypes.windll.user32.GetClipboardSequenceNumber()
    if (LastClipSeq == curSeq):
        self.command_CursorLineBegin(info)
    text = ckit.getClipboardText()
    self.modifyText( text = text )

これもお願いしようかなぁ。

この記事へのコメント

この記事へのトラックバック