xP: implement Readline's M-l, M-u, M-c
This commit is contained in:
parent
e2ef7d668c
commit
ff243c1d11
@ -742,7 +742,7 @@ let Input = {
|
|||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
|
|
||||||
backward: (b, textarea) => {
|
backward: textarea => {
|
||||||
if (textarea.selectionStart !== textarea.selectionEnd)
|
if (textarea.selectionStart !== textarea.selectionEnd)
|
||||||
return false
|
return false
|
||||||
|
|
||||||
@ -756,7 +756,7 @@ let Input = {
|
|||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
|
|
||||||
forward: (b, textarea) => {
|
forward: textarea => {
|
||||||
if (textarea.selectionStart !== textarea.selectionEnd)
|
if (textarea.selectionStart !== textarea.selectionEnd)
|
||||||
return false
|
return false
|
||||||
|
|
||||||
@ -769,6 +769,42 @@ let Input = {
|
|||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
|
|
||||||
|
modifyWord: (textarea, cb) => {
|
||||||
|
let start = textarea.selectionStart
|
||||||
|
let end = textarea.selectionEnd
|
||||||
|
if (start === end) {
|
||||||
|
let len = textarea.value.length
|
||||||
|
while (start < len && /\s/.test(textarea.value.charAt(start)))
|
||||||
|
start++;
|
||||||
|
end = start
|
||||||
|
while (end < len && !/\s/.test(textarea.value.charAt(end)))
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
if (start === end)
|
||||||
|
return false
|
||||||
|
|
||||||
|
const text = textarea.value, modified = cb(text.substring(start, end))
|
||||||
|
textarea.value = text.slice(0, start) + modified + text.slice(end)
|
||||||
|
end = start + modified.length
|
||||||
|
textarea.setSelectionRange(end, end)
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
|
||||||
|
downcase: textarea => {
|
||||||
|
return Input.modifyWord(textarea, text => text.toLowerCase())
|
||||||
|
},
|
||||||
|
|
||||||
|
upcase: textarea => {
|
||||||
|
return Input.modifyWord(textarea, text => text.toUpperCase())
|
||||||
|
},
|
||||||
|
|
||||||
|
capitalize: textarea => {
|
||||||
|
return Input.modifyWord(textarea, text => {
|
||||||
|
const cps = Array.from(text.toLowerCase())
|
||||||
|
return cps[0].toUpperCase() + cps.slice(1).join('')
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
first: (b, textarea) => {
|
first: (b, textarea) => {
|
||||||
if (b.historyAt <= 0)
|
if (b.historyAt <= 0)
|
||||||
return false
|
return false
|
||||||
@ -823,8 +859,11 @@ let Input = {
|
|||||||
if (hasShortcutModifiers(event)) {
|
if (hasShortcutModifiers(event)) {
|
||||||
handled = true
|
handled = true
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
case 'b': success = Input.backward(b, textarea); break
|
case 'b': success = Input.backward(textarea); break
|
||||||
case 'f': success = Input.forward(b, textarea); break
|
case 'f': success = Input.forward(textarea); break
|
||||||
|
case 'l': success = Input.downcase(textarea); break
|
||||||
|
case 'u': success = Input.upcase(textarea); break
|
||||||
|
case 'c': success = Input.capitalize(textarea); break
|
||||||
case '<': success = Input.first(b, textarea); break
|
case '<': success = Input.first(b, textarea); break
|
||||||
case '>': success = Input.last(b, textarea); break
|
case '>': success = Input.last(b, textarea); break
|
||||||
case 'p': success = Input.previous(b, textarea); break
|
case 'p': success = Input.previous(b, textarea); break
|
||||||
|
Loading…
Reference in New Issue
Block a user