を使用して先頭の文字を削除するだけでなく\x08
、末尾の文字も削除することはできますか? 前の文字の代わりに次の文字を削除するエスケープ シーケンスはありますか?
delete はどうやら ASCII 127 (16 進数 7F) にマップされているようですが、次のコードは次のようになります。
puts "a\x08b\x7fcd"
生産する
b⌂cd
\x7f はそれに続く 'c' 文字を削除すると思っていましたが、そうではありません。
で実際に何かを削除する\x08
のではなく、「a」を「b」で上書きするだけです。
テレタイプの紙端末を使用していた非常に古い時代を想像してみてください。紙に実際に表示されるのは「a」が印刷されたもので、テレタイプは 1 つのスペースをバックアップし、その上に「b」を印刷します。すべての非印刷 ASCII コードは、テレタイプ紙端末の動作を制御するために発明されました。
それはまさに上記の出力が行うことであり、端末画面のみが前の「a」のピクセルを点灯させたままにしません。
「del」文字は、基本的な端末画面に対してこの特別な意味を持ちません。エディターやシェルなどのプログラムにとっては何かを意味するかもしれませんが、STDOUT にとっては、印刷する別の ascii char にすぎません。
「del」の本来の意味は、この文字を入力として無視することです。次を参照してください。
http://en.wikipedia.org/wiki/Delete_character
STDOUTが次のCHARを出力しないというシグナルとして扱うcharの前に置くことができることは、私が知っていることは何もありません。ただし、xterm などの端末エミュレーション プログラムに出力する場合は、エスケープ コードを使用して多くのことを行うことができます。例を参照してください。
http://ascii-table.com/ansi-escape-sequences-vt-100.php
これらすべての複雑なコードを抽象化するための「標準」ライブラリはncurses
であり、そのうちいくつかの ruby インターフェイスがあります。見る
ここでの主な問題は、標準IO
には短期記憶がないことです。つまり、今後のシンボルに作用する魔法の操作エンティティはありません。次のコード スニペットは、「delete」が最新の方法で提供されたとしても、未来のシンボルについての手がかりがないことを示しています。
> puts "a#{`tput dch1`}b"
# ⇒ ab
本当に「将来のシンボルを削除する」必要があるかどうかにかかわらず、そのためにプレーンな ruby モンキーパッチを使用することをお勧めします。
class String
DEL = '␡'
def postprocess
self.gsub /#{DEL}./, ''
end
end
puts "a␡bc".postprocess
# ⇒ ac
実際、これはあなたの質問に対する直接の回答ではありませんが、ヒントになるかもしれません。
次の文字を削除する別の方法を次に示します。
class String
alias_method :default_initialize, :initialize
alias_method :default_plus, :+
attr_accessor :delnext
def initialize
default_initialize
@delnext = false
end
def +(x)
str = String(x)
str[0] = '' if @delnext
@delnext = false
default_plus str
end
end
これで、次のことができます。
s = 'test string'
s.delnext = true
s += 'test again'
s # => 'test stringest again'
同様に、簡単に実装できますdelprev
:
class String
def delprev
self[self.length - 1] = ''
# self # uncomment if you want delprev to return the new string
end
end
s = 'test string'
s.delprev
s # => 'test strin'