9

を使用して先頭の文字を削除するだけでなく\x08、末尾の文字も削除することはできますか? 前の文字の代わりに次の文字を削除するエスケープ シーケンスはありますか?

delete はどうやら ASCII 127 (16 進数 7F) にマップされているようですが、次のコードは次のようになります。

puts "a\x08b\x7fcd"

生産する

b⌂cd

\x7f はそれに続く 'c' 文字を削除すると思っていましたが、そうではありません。

4

4 に答える 4

8

で実際に何かを削除する\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​​ インターフェイスがあります。見る

ncurses と ruby​​ を扱うのに最適な gem

于 2013-12-13T19:56:47.767 に答える
2

ここでの主な問題は、標準IOには短期記憶がないことです。つまり、今後のシンボルに作用する魔法の操作エンティティはありません。次のコード スニペットは、「delete」が最新の方法で提供されたとしても、未来のシンボルについての手がかりがないことを示しています。

> puts "a#{`tput dch1`}b"
# ⇒ ab

本当に「将来のシンボルを削除する」必要があるかどうかにかかわらず、そのためにプレーンな ruby​​ モンキーパッチを使用することをお勧めします。

class String
  DEL = '␡'
  def postprocess
    self.gsub /#{DEL}./, ''
  end
end

puts "a␡bc".postprocess
# ⇒ ac

実際、これはあなたの質問に対する直接の回答ではありませんが、ヒントになるかもしれません。

于 2013-12-17T06:08:28.010 に答える
0

次の文字を削除する別の方法を次に示します。

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'
于 2013-12-20T14:07:14.857 に答える