Action

Select 1 more word (Left)

Posted by @ComplexPoint, Last update over 6 years ago

Select current word,
or extend the selection Leftward by one more word.

Steps

  • script

    (() => {
        'use strict';
    
        // main :: IO ()
        const main = () =>
            expandSelnByWord(true, true);
    
    
        // GENERIC FUNCTIONS ----------------------------------
    
        // Tuple (,) :: a -> b -> (a, b)
        const Tuple = (a, b) => ({
            type: 'Tuple',
            '0': a,
            '1': b,
            length: 2
        });
    
        // concatMap :: (a -> [b]) -> [a] -> [b]
        const concatMap = (f, xs) => [].concat.apply([], xs.map(f));
    
        // splitAt :: Int -> [a] -> ([a],[a])
        const splitAt = (n, xs) => Tuple(xs.slice(0, n), xs.slice(n));
    
    
        // SELECTION EXTENSIONS  ------------------------------
    
        // expandSelnByWord :: () -> IO ()
        const expandSelnByWord = (blnMultiWord, blnLeft) => {
            const
                e = editor,
                tplSeln = e.getSelectedRange(),
                tplLine = e.getSelectedLineRange(),
                strLine = e.getTextInRange(...tplLine),
                intPosn = tplSeln[0],
                xy = splitAt(
                    intPosn - tplLine[0],
                    strLine
                ),
                [dl, dr] = concatMap(
                    x => x !== null ? (
                        [x[0].length]
                    ) : [0], //
                    [/\b[\S]*$/.exec(xy[0]), /^[\S]*\b/.exec(xy[1])]
                );
            return (tplSeln[1] === 0 || dl > 0 && dr > 0) ? (
                e.setSelectedRange(intPosn - dl, dl + dr),
                'extended'
            ) : blnMultiWord ? (
                additionalWord(
                    blnLeft, tplSeln, tplLine, strLine
                )
            ) : 'No further';
        };
    
        // additionalWord :: Bool -> (Int, Int) -> (Int, Int)
        //                                          -> String -> IO ()
        const additionalWord = (blnLeft, tplSeln, tplLine, strLine) => {
            const
                e = editor,
                s = blnLeft ? (
                    strLine.slice(0, tplSeln[0] - tplLine[0])
                ) : strLine.slice(tplSeln[0] - tplLine[0] + tplSeln[1]),
                m = blnLeft ? (
                    /\b\S+\s*$/.exec(s)
                ) : /^\s*\S+\b/.exec(s),
                d = m ? m[0].length : 1;
    
            return (
                e.setSelectedRange(
                    tplSeln[0] - (blnLeft ? d : 0),
                    tplSeln[1] + d
                ),
                m ? 'extending' : (() => {
                    const
                        tplNew = e.getSelectedRange(),
                        blnFinished = blnLeft ? (
                            tplNew[0] < 1
                        ) : tplNew[0] + tplNew[1] >= e.getText().length;
                    return blnFinished ? (
                        'Finished'
                    ) : expandSelnByWord(true, blnLeft);
                })()
            );
        };
    
        // MAIN ---
        return main();
    })();
    

Options

  • After Success Nothing
    Notification None
    Log Level Error
Items available in the Drafts Directory are uploaded by community members. Use appropriate caution reviewing downloaded items before use.